黄网站网址视频_97视频网站入口_jizz免费观看视频_黄在线观看在线播放720p_三级福利视频_女人爱爱视频_hbad中文字幕

15321250321
010-86462584

APP開(kāi)發(fā) > APP學(xué)院 > 手機(jī)程序開(kāi)發(fā)

手機(jī)APP開(kāi)發(fā)國(guó)際化

2022-05-29

?本文反過(guò)來(lái)試圖強(qiáng)調(diào)手機(jī)APP開(kāi)發(fā)國(guó)際化部分的主要問(wèn)題,該部分一方面對(duì)最終用戶影響最大,另一方面對(duì)日常編碼影響很大——界面翻譯。盡管在本文中我們將分析如何在手機(jī)APP開(kāi)發(fā)中實(shí)現(xiàn)國(guó)際化,但提供的大多數(shù)問(wèn)題和可能的解決方案都可以手機(jī)APP于不同的開(kāi)發(fā)環(huán)境。

按鍵命名

開(kāi)發(fā)多語(yǔ)言手機(jī)APP時(shí)面臨的首要難題之一是為鍵選擇最合適的命名約定,這將代表要翻譯的文本。

有一種誘惑是要么保持鍵短,從而在需要參考翻譯信息時(shí)減少打字量,要么保持它們長(zhǎng)而深的嵌套,從而具有明確定義的結(jié)構(gòu)。然而,做空通常不是一個(gè)好主意。盡管人們不必記住某些翻譯的長(zhǎng)路徑,但它通常會(huì)導(dǎo)致看起來(lái)笨拙的長(zhǎng)鍵名,這必須支持所需的區(qū)分。考慮以下稍微夸張的示例:

en-GB: dashboard_main_table_headers_first_name: First name

很容易被分割成

en-GB: dashboard: main_table_headers: first_name: First name

另一方面,過(guò)于嵌套的鍵可能會(huì)變得曲折且難以記憶,實(shí)際上許多級(jí)別可以很容易地省略而不會(huì)引入歧義,例如

en-GB: dashboard show: view: main_section: table: headers: first_name: First name

通過(guò)去除一些不必要的關(guān)卡并將其中的一些關(guān)卡合二為一,我們可以很容易地實(shí)現(xiàn)合理的解決方案。

en-GB: dashboard: show: table_headers: first_name: First name

關(guān)于密鑰創(chuàng)建要問(wèn)的第二個(gè)問(wèn)題是密鑰中實(shí)際包含的內(nèi)容。答案可能是:“只要是直觀的、明確的,并且可以讓您高效地查找和編寫翻譯”。這種結(jié)構(gòu)的示例可能如下所示:

例如

en-GB: customer: products: show: label_price: Price

最后一級(jí)的命名應(yīng)該是一致的,每次我們必須這樣做的時(shí)候不要過(guò)多地考慮如何命名特定的鍵。顯然,我們可能需要在翻譯中添加一些公共分支,以存儲(chǔ)在命名空間等之間共享的鍵。仍然具有良好定義的命名約定肯定會(huì)提高依賴于翻譯的繁重手機(jī)APP的效率。

翻譯文件結(jié)構(gòu)

在小型手機(jī)APP中,沒(méi)有必要準(zhǔn)備比每種語(yǔ)言一個(gè)更多的語(yǔ)言環(huán)境文件。盡管如此,隨著手機(jī)APP的增長(zhǎng),翻譯文件變得難以維護(hù)和管理——因此,經(jīng)過(guò)深思熟慮的語(yǔ)言環(huán)境文件樹可能是避免這種問(wèn)題之王的一種方法。作為額外的獎(jiǎng)勵(lì),為同一手機(jī)APP的特定模塊分發(fā)翻譯包會(huì)更容易。

翻譯文件結(jié)構(gòu)的一些示例

Module name based ..yml ..yml #Shared

例如

invoicing admin.en-GB.yml admin.da-DK.yml admin.en-GB.yml admin.da-DK.yml
Namespace / Role name based ..yml ..yml #Shared

或者

admin invoicing.en-GB.yml invoicing.da-DK.yml invoicing.en-GB.yml invoicing.da-DK.yml
l ..yml ..yml #Shared

等等……您甚至可以將語(yǔ)言包放在不同的目錄中。在大多數(shù)情況下,對(duì)于大多數(shù)情況來(lái)說(shuō),一層嵌套感覺(jué)就足夠了。這取決于您選擇哪種方法,并且最適合給定的手機(jī)APP。

擺脫未使用的翻譯

持續(xù)的開(kāi)發(fā)、升級(jí)、重構(gòu)等通常會(huì)導(dǎo)致翻譯文件中出現(xiàn)孤立的翻譯分支,除非非常注意保持一切潮流。無(wú)論如何,有時(shí)我們想檢查我們的翻譯文件是否有點(diǎn)太大。第一個(gè)想法是掃描源代碼中的鍵并將其與語(yǔ)言環(huán)境文件中的任何內(nèi)容進(jìn)行比較——之后,只需刪除代碼中未提及的所有鍵。這實(shí)際上有兩個(gè)缺點(diǎn)。

第一個(gè)是如果使用鍵繼承或者某些鍵不是從主手機(jī)APP代碼而是從某些庫(kù)等調(diào)用的。這顯然會(huì)導(dǎo)致刪除正在使用的鍵。第二種情況產(chǎn)生相同的效果,并且是由調(diào)用鍵時(shí)使用字符串插值引起的。

為了解決這個(gè)問(wèn)題,我們可能會(huì)嘗試啟用密鑰記錄并讓手機(jī)APP運(yùn)行(最好在生產(chǎn)環(huán)境中)。啟用此機(jī)制并運(yùn)行完整的測(cè)試套件也會(huì)有很大幫助(取決于測(cè)試覆蓋率)。這種通過(guò)掃描源代碼增強(qiáng)的方法應(yīng)該為我們提供幾乎(如果不是全部)在手機(jī)APP中使用的完整密鑰,我們可以將其與龐大的翻譯文件進(jìn)行比較。

用于記錄翻譯鍵的簡(jiǎn)單代碼

module I18n  module Registry    protected    def lookup(locale, key, scope = \[], options = {})      @log ||= Logger.new(File.join(Rails.root, 'log', 'i18n_registry.log'))      @log.info key      super    end  endendI18n::Backend::Simple.send :include, I18n::Registry

尋找缺失的翻譯

就像查找未使用的翻譯一樣,我們可以通過(guò)某種注冊(cè)表來(lái)增加源代碼掃描。這次我們可以將我們的解決方案基于 Rails I18n 提供的 exception_handler 鉤子

I18n.exception_handler = lambda do |exception, locale, key, options|  @log ||= Logger.new(File.join(Rails.root, 'log', 'missing_translations.log'))  case exception    when I18n::MissingTranslationData      @log.info key      options\[:rescue_format] == :html ? exception.html_message : exception.message    end  else    raise exception  endend

添加新翻譯

在開(kāi)發(fā)過(guò)程中向翻譯文件添加翻譯是最沒(méi)有生產(chǎn)力的任務(wù)之一。在使用兩種或多種語(yǔ)言的手機(jī)APP中尤其如此。但是,使用 exception_handler 的強(qiáng)大功能,我們可以自動(dòng)化這個(gè)密鑰創(chuàng)建過(guò)程。

當(dāng)?shù)谝淮握{(diào)用缺少的翻譯鍵時(shí),這可能會(huì)在每種語(yǔ)言的翻譯文件中生成該鍵,根據(jù)鍵名自動(dòng)創(chuàng)建翻譯等。我們甚至可以調(diào)用一些服務(wù),它會(huì)自動(dòng)將通用翻譯大致翻譯成不同的語(yǔ)言. 實(shí)際上提供了一個(gè) gem 允許這樣做,所以不要在此處粘貼代碼,而是查看它的 github 存儲(chǔ)庫(kù)。

委派翻譯工作

除非團(tuán)隊(duì)有一些專門的翻譯,否則將翻譯委托給一些外部資源是很常見(jiàn)的,比如客戶、客戶的員工、外包翻譯等。在所有情況下,都必須開(kāi)發(fā)某種翻譯過(guò)程的方法。

直接編輯文件 可能會(huì)有些尷尬且不易處理,尤其是對(duì)于不熟悉翻譯文件語(yǔ)法的翻譯人員。小的縮進(jìn)變化或一些特殊的符號(hào)移除甚至?xí)?dǎo)致手機(jī)APP無(wú)法啟動(dòng)。這是最便宜的開(kāi)始方式。

開(kāi)發(fā) 專門的翻譯界面 可能很誘人,但需要深思熟慮。如果外部服務(wù)不能提供例如所需的訪問(wèn)控制,則可能值得在內(nèi)部開(kāi)發(fā)一些東西。在這種情況下 ,可以使用37signals 的 Tolk 作為基礎(chǔ)。瀏覽 github 以獲取其他共享解決方案,以免從頭開(kāi)始重新發(fā)明輪子。

在大多數(shù)情況下,基于SaaS的解決方案 似乎是最好的解決方案——旨在與翻譯團(tuán)隊(duì)合作,可以大大減少問(wèn)題的數(shù)量、花費(fèi)的時(shí)間并促進(jìn)本地化手機(jī)APP的過(guò)程。對(duì)于翻譯 rails 手機(jī)APP,目前有兩個(gè)主要參與者:rails-only  LocaleApp 和更通用 的 WebTranslateIt。請(qǐng)查看它們的功能并確定最適合您的功能。

下一步

手機(jī)APP國(guó)際化的許多方面在本文中甚至都沒(méi)有涉及——它涵蓋了在手機(jī)APP開(kāi)發(fā)期間處理翻譯的方面——然而,這是所有未來(lái) i18n 相關(guān)任務(wù)的基礎(chǔ)。因此,選擇最適合您的方法,讓您的手機(jī)APP使用另一種語(yǔ)言。

客服QQ:121446412 聯(lián)系電話:15321250321

京ICP備17026149號(hào)-1

版權(quán)所有@2011-2022 北京天品互聯(lián)科技有限公司 公司地址:北京市海淀區(qū)上地信息路甲28號(hào)B座(二層)02D室-010號(hào)

黄网站网址视频_97视频网站入口_jizz免费观看视频_黄在线观看在线播放720p_三级福利视频_女人爱爱视频_hbad中文字幕
亚洲一区二区在线观看视频| 亚洲自拍偷拍九九九| 国产福利一区二区三区视频在线| 亚洲国产成人av| 亚洲男人的天堂在线aⅴ视频| 2019国产精品| 欧美一级久久久| 欧美精品xxxxbbbb| 欧美在线free| 91蜜桃免费观看视频| 成人精品在线视频观看| 国产成人av影院| 国产一区二区h| 国产一区二区看久久| 久久99精品久久久久久久久久久久| 午夜精品成人在线视频| 午夜精品久久久久久久久| 午夜视频在线观看一区| 性做久久久久久| 亚洲成人1区2区| 性感美女久久精品| 五月天丁香久久| 亚洲成人tv网| 日本亚洲三级在线| 毛片基地黄久久久久久天堂| 蜜臀va亚洲va欧美va天堂| 美国精品在线观看| 国产在线日韩欧美| 国产91精品在线观看| 成人污污视频在线观看| 91视频精品在这里| 在线免费观看日本欧美| 欧美在线免费观看视频| 3d动漫精品啪啪一区二区竹菊 | 日本久久一区二区三区| 欧美亚洲国产怡红院影院| 欧美偷拍一区二区| 日韩一区二区免费高清| 久久精品一区二区三区四区| 国产精品美女久久久久久久 | 最新热久久免费视频| 亚洲日本va在线观看| 亚洲男同1069视频| 日韩一区精品字幕| 国模无码大尺度一区二区三区| 国产精品白丝av| 91在线观看成人| 欧美日本一道本在线视频| 精品久久久久久久久久久久久久久 | 国产女人18毛片水真多成人如厕| 国产精品国产三级国产三级人妇 | 国产精品三级电影| 亚洲综合自拍偷拍| 免费成人美女在线观看| 国产a区久久久| 在线观看av一区| 久久这里只有精品6| 亚洲精品视频一区| 久久精品国产成人一区二区三区| 成人午夜激情视频| 91精品国产91久久久久久一区二区 | 91色porny蝌蚪| 911国产精品| 久久你懂得1024| 夜色激情一区二区| 国产高清精品在线| 欧美三级在线播放| 国产性色一区二区| 亚洲成av人片在线| 成人午夜激情影院| 日韩欧美一区电影| 亚洲乱码国产乱码精品精的特点| 美国毛片一区二区三区| 色婷婷一区二区| 26uuu精品一区二区| 艳妇臀荡乳欲伦亚洲一区| 国产成人综合网站| 欧美一区二区三区四区五区 | 亚洲v日本v欧美v久久精品| 国产成人精品一区二| 欧美精品视频www在线观看| 国产精品久久免费看| 精品中文字幕一区二区小辣椒| 91蜜桃视频在线| 欧美激情一区在线观看| 免费高清视频精品| 91国在线观看| 国产精品五月天| 精品一区二区免费看| 欧美男男青年gay1069videost| 中文字幕一区二区视频| 韩国三级在线一区| 欧美一区二区三区在线观看视频| 99视频国产精品| 久久无码av三级| 一区二区三区丝袜| 狠狠色伊人亚洲综合成人| 日本高清视频一区二区| 久久九九久精品国产免费直播| 午夜精品久久久久久不卡8050| 91免费版在线| 国产精品视频观看| 国产精品一区二区三区网站| 制服丝袜激情欧洲亚洲| 亚洲国产视频一区| 色综合一区二区| 中文字幕一区二区三区不卡 | 国产嫩草影院久久久久| 国产精品视频九色porn| 视频一区国产视频| 日本道色综合久久| 国产精品成人在线观看 | 99精品黄色片免费大全| 久久久久国产精品厨房| 中文子幕无线码一区tr| 国产凹凸在线观看一区二区| 91精品国产综合久久香蕉的特点| 欧美高清激情brazzers| 国产精品日韩精品欧美在线| 国模娜娜一区二区三区| 欧美日韩在线播放一区| 亚洲精品乱码久久久久| 成人激情视频网站| 成人教育av在线| 91精品国产综合久久久久| 亚洲国产日日夜夜| 欧美大黄免费观看| 欧美日韩美少妇| 国产亚洲欧洲一区高清在线观看| 黑人巨大精品欧美黑白配亚洲| 亚洲免费观看高清完整版在线观看 | 欧美mv日韩mv| 国产宾馆实践打屁股91| 国产精品久久久久毛片软件| www.综合网.com| 尤物av一区二区| 亚洲精品一线二线三线无人区| 亚洲男人的天堂在线aⅴ视频 | 亚洲精品免费看| 精品成人佐山爱一区二区| 欧美日韩国产高清一区| 91久久精品国产91性色tv| 成人视屏免费看| 成人网在线播放| 粉嫩久久99精品久久久久久夜| 激情文学综合丁香| 日韩电影免费一区| 一区二区三区中文字幕精品精品| 韩国女主播一区| 中文字幕一区免费在线观看| 久久久精品免费网站| 久久婷婷一区二区三区| 亚洲色图色小说| 亚洲欧洲日韩av| 26uuu国产一区二区三区| 精品国产麻豆免费人成网站| 91精品国产综合久久小美女| 在线观看亚洲一区| 在线成人小视频| 欧美一级片在线| 91精品国产综合久久香蕉麻豆| 欧美色图免费看| 亚洲综合免费观看高清在线观看| 一区二区三区波多野结衣在线观看| 亚洲国产精品麻豆| 欧美日韩国产欧美日美国产精品| 在线亚洲一区观看| 日韩色在线观看| 国产精品成人免费| 久久精品国产精品亚洲综合| av男人天堂一区| 欧美一区二区福利视频| 国产精品国产自产拍高清av王其 | 99视频精品免费视频| 亚洲私人影院在线观看| 美腿丝袜在线亚洲一区| 国产福利一区二区三区视频在线| 欧美日韩一区二区三区不卡| 精品国产成人在线影院| 亚洲在线一区二区三区| 国内久久婷婷综合| 欧美精品第1页| 一区二区日韩电影| 国产成人免费视频一区| 欧美一区二区视频在线观看2020| 综合欧美一区二区三区| 国产美女精品人人做人人爽| 欧美一级日韩免费不卡| 午夜a成v人精品| 欧美吻胸吃奶大尺度电影| 1024国产精品| 99精品欧美一区二区三区小说| 国产三级精品三级| 国产风韵犹存在线视精品| 精品欧美黑人一区二区三区| 青娱乐精品在线视频| 91精品黄色片免费大全| 轻轻草成人在线| 日韩三级视频在线看| 全部av―极品视觉盛宴亚洲|
收縮
  • 15321250321