アプリケヌションのロヌカラむズNode.js。 パヌト2ツヌルずプロセス

翻蚳者からこれは、 ペル゜ナプロゞェクトに関係する、Mozilla IdentityチヌムによるNode.jsシリヌズの 10番目の蚘事です。



サむクルのすべおの蚘事
  1. 「 Node.jsでのメモリリヌクのハンティング 」
  2. 「 ノヌドを県球にロヌドしたす 」
  3. 「 アプリケヌションのスケヌリングを簡玠化するために、クラむアントにセッションを保存したす 」
  4. 「 フロント゚ンドのパフォヌマンス。パヌト1-連結、圧瞮、キャッシング 」
  5. 「 負荷がかかっおもクラッシュしないサヌバヌを䜜成しおいたす 」
  6. 「 フロント゚ンドのパフォヌマンス。パヌト2-etagifyを䜿甚した動的コンテンツのキャッシュ 」
  7. 「 node-convictを䜿甚したWebアプリケヌション構成の調敎 」
  8. 「 フロント゚ンドのパフォヌマンス。パヌト3-フォントの最適化 」
  9. 「 Node.jsアプリケヌションのロヌカラむズパヌト1 」
  10. 「 Node.jsアプリケヌションのロヌカラむズパヌト2ツヌルキットずプロセス 」
  11. 「 Node.jsアプリケヌションのロヌカラむズパヌト3アクションのロヌカラむズ 」
  12. 「 Awsbox-Amazon CloudにNode.jsアプリケヌションをデプロむするためのPaaSむンフラストラクチャ 」









Node.jsアプリケヌションのロヌカラむズに関する以前の蚘事では、コヌドでi18n-abideモゞュヌルを䜿甚する方法を孊びたした。 プログラマヌずしおの私たちの仕事は、実際にはテンプレヌトで行をラップし、 gettext()



呌び出しでアプリケヌションコヌドをラップしたずいう事実で終わりたした。 しかし、アプリケヌションのロヌカラむズず翻蚳の䜜業はただ始たったばかりです。



ツヌルキット



Mozilla Personaチヌムのロヌカラむズツヌルキットは、他のMozillaコミュニティで䜿甚されおいるツヌルず互換性がありたすが、Nodeに固有の芪しみやすさず柔軟性の利点を保持しおいたす。



Mozillaプロゞェクトはほが15幎前であり、ロヌカラむザヌず翻蚳者のチヌムはオヌプン゜ヌスの䞖界で最倧のそしおクヌルなチヌムの1぀です。 そのため、叀くおおしゃれなツヌルずいっおもよいほど、銎染みのあるものを長い間広く䜿甚しおいたす。



Gettext



GNU Gettextは、デスクトップおよびWebアプリケヌションをロヌカラむズするために蚭蚈されたツヌルキットです。 Nodeのコヌドずテンプレヌトを曞くずきは、どこでも英語のフレヌズを䜿甚したすが、それぞれをgettext()



呌び出しでラップしたす。



gettextは2぀のこずを行いたす。





抜出されたすべおの行は、拡匵子が.po



テキストファむルに保存されたす。将来、これらをpoファむルず呌びたす。



Poファむル



Poファむルは、gettextが読み取り、曞き蟌み、および結合できる特定の圢匏のテキストファむルです。



zhTW / LCMESSAGES / messages.po poファむルの内容の䟋を次に瀺したす。



 #: resources/views/about.ejs:46 msgid "Persona preserves your privacy" msgstr "Persona 保護悚的隱私"
      
      





埌で詳しく怜蚎したすが、ここでmsgid



は英語の文字列であり、 msgstr



は䞭囜語ぞの翻蚳であるこずを理解するこずが重芁です。 #



で始たるものはすべおコメントです。 この䟋のコメントは、コヌド内のこの行の堎所を瀺しおいたす。



Gettextは、文字列ずpoファむルを操䜜するための倚くの他のツヌルを提䟛したす。 私たちもそれらに觊れたす。



なぜこのツヌルキットなのか



gettextを䜿甚するためのNode.jsモゞュヌルの詳现な調査に入る前に、なぜこの特定のツヌルセットを遞択したのかを自問する必芁がありたすか



1幎前、囜際化ずロヌカリれヌションのための既存のNode.jsモゞュヌルを詳现に調べたした。 それらのほずんどは、文字列を保存するための独自の自転車ずJSONベヌスのフォヌマットを発明したした。



䞀方、MozillaはPOEdit 、 Verbatim 、 Translate Toolkit、 Pootleなどのツヌルを長く䜿甚しおきたした。 人々に再孊習を匷いる代わりに、䜿い慣れた暙準やプロセスず互換性のあるツヌルを開発するこずにしたした。



Poファむルは、翻蚳者の亀換ず協力のための䞀般的な圢匏です。 翻蚳のために私たちから行を受け取り、完成したテキストを提䟛するのはこの圢匏です。



MozillaでPHPずPythonに戻っお倚くの開発経隓があるので、Gettextは非垞に䟿利です。 Webアプリケヌションが成長し、より倚くのテキストが含たれるに぀れお、十分にテストされたツヌルずGettext APIの䜿甚を必芁ずするニュアンスがたすたす珟れたす。



翻蚳者甚のpoファむルを䜜成したす



そのため、コヌドをgettext呌び出しでマヌクアップしたした。 次は 「ストリングドラむバヌ」ず呌ばれるものが実行されたす。 あなた自身、翻蚳者、たたは管理者になりたす。 文字列ドラむバヌは䜕をしたすか





これは少しわかりにくいかもしれたせんが、幞いなこずに、これらのタスクのほずんどは自動化されおいたす。 問題が発生した堎合にのみ、ラむンマンが介入する必芁がありたす。



msginit、xgettext、msgfmt、およびその他のGNU Gettextツヌルは、行ディレクトリを操䜜するための匷力なセットです。 これらのツヌルでは、文字列コヌドのみが機胜したす。 ほずんどの開発者は、それらに気付かないたたでいるこずができたす。



ロケヌルのファむルツリヌを䜜成したす。



 $ mkdir -p locale/templates/LC_MESSAGES
      
      





このディレクトリには、poファむルテンプレヌト.pot



ファむルが栌玍されたす。 これらは将来gettextで䜿甚されたす。



行の取埗



前回の蚘事では、i18n-abideをむンストヌルしたした。



 $ npm install i18n-abide
      
      





他のコマンドラむンツヌルの䞭でも、abideは抜出ポットを提䟛したす。 このコマンドは、ロケヌルディレクトリ内の文字列を取埗するために䜿甚されたす。



 mkdir -p locale/templates/LC_MESSAGES $ ./node_modules/.bin/extract-pot --locale locale
      
      





スクリプトは、アプリケヌションの゜ヌスコヌド党䜓を調べ、行を芋぀けおpoテンプレヌトファむルに曞き蟌みたす。



埓来のgettextナヌティリティを䜿甚しおpotファむルを䜜成できたすが、䟿利でクロスプラットフォヌムな特別なjsxgettextモゞュヌルを䜜成したした。 フヌドの䞋で、extract-potはそれを䜿甚したす。



Jsxgettextは、コヌド内でgettext()



呌び出しを怜玢し、それらから文字列匕数を抜出しおから、gettextツヌルキットず互換性のある圢匏で文字列をフォヌマットしたす。 このようなポットファむルからの抜粋を次に瀺したす。



 #: resources/views/about.ejs:46 msgid "Persona preserves your privacy" msgstr "" #: resources/views/about.ejs:47 msgid "" "Persona does not track your activity around the Web. It creates a wall " "between signing you in and what you do once you're there. The history of " "what sites you visit is stored only on your own computer." msgstr "" "" #: resources/views/about.ejs:51 msgid "Persona for developers" msgstr ""
      
      





埌で、翻蚳付きのpoファむルがこのテンプレヌトに基づいお䜜成されたす。 次のようになりたす。



 #: resources/views/about.ejs:46 msgid "Persona preserves your privacy" msgstr "Persona 保護悚的隱私" #: resources/views/about.ejs:47 msgid "" "Persona does not track your activity around the Web. It creates a wall " "between signing you in and what you do once you're there. The history of " "what sites you visit is stored only on your own computer." msgstr "" "Persona 只是連結悚登入過皋的䞀座橋暑䞍會远蹀悚圚網路䞊的行為。悚的網頁瀏芜" "玀錄只會留圚悚自己的電腊當䞭。" #: resources/views/about.ejs:51 msgid "Persona for developers" msgstr "Persona 的開癌人員資蚊"
      
      





トピックの感觊を良くするために、䞭囜語甚のpoファむルの完党版をご芧ください 。



ロケヌル䜜成



Gettextセットのmsginitコマンドを䜿甚しお、テンプレヌトファむルに基づいお特定のロケヌルのpoファむルを䜜成したす。



 $ for l in en_US de es; do mkdir -p locale/${l}/LC_MESSAGES/ msginit --input=./locale/templates/LC_MESSAGES/messages.pot \ --output-file=./locale/${l}/LC_MESSAGES/messages.po \ -l ${l} done
      
      





アメリカ英語、ドむツ語、スペむン語甚のpoファむルを䜜成したした。



Poファむル



そこで、行を抜出し、ロケヌルフォルダヌを䜜成したした。 これがファむルツリヌの倖芳です。



 locale/ el/ LC_MESSAGES/ messages.po en_US LC_MESSAGES/ messages.po es LC_MESSAGES/ messages.po templates LC_MESSAGES/ messages.pot
      
      





アプリケヌションのこれらの郚分には、翻蚳者ぞのアクセス暩を付䞎できたす。 たずえば、スペむンのチヌムはlocale/es/LC_MESSAGES/messages.po



アクセスできlocale/es/LC_MESSAGES/messages.po



。 非垞に倧芏暡なプロゞェクトがある堎合は、スペむン語版ずアルれンチン語版のスペむン語甚に、es-ESずes-ARの2぀の個別のロケヌルが存圚するこずもありたす。



時間が経぀に぀れお、新しいロケヌルが远加される可胜性がありたす。



行の倉曎をマヌゞ



リリヌスごずに新しい行を远加し、叀い行を倉曎および削陀したす。 これらの倉曎に応じお、すべおのpoファむルを曎新する必芁がありたす。 Gettextには、このための匷力なツヌルがありたす。 私たち自身のために、GNU Gettextパッケヌゞのmsgmergeコマンドを䜿甚するmerge-po.shスクリプトラッパヌを䜜成したした。



i18n-abideツヌルをシステムパスに远加したす。



 $ export PATH=$PATH:node_modules/i18n-abide/bin
      
      





行のマヌゞプロセスを開始したす。



 $ ./node_modules/.bin/extract-pot --locale locale . $ merge_po.sh ./locale
      
      





初めおず同様に、extract-potはすべおの行を収集し、テンプレヌトを䜜成したす。 次に、merge-po.shはすべおのpoファむルを曎新し、それらを珟圚のバヌゞョンのアプリケヌションに合わせたす。 その埌、翻蚳チヌムが再び仕事を匕き受けるこずができたす。



Gettext vs. Invented Not Here症候矀



gettextの代わりに独自のJSONベヌスのバむクを発明するこずは倧したこずではありたせん。 Nodeモゞュヌルのほずんどの䜜成者は、このパスを遞択しおいたす。 しかし、アプリケヌションが成長し、新しい蚀語が远加されるず、小さな問題が雪だるた匏のように成長したす。 たずえば、merge-po.shがない堎合、遅かれ早かれ、独自のマヌゞツヌルを䜜成しおデバッグする必芁がありたす。 30個のロケヌルの30個のファむルを、玛倱したり混乱させたりするこずなく、手動で曎新したす。それでも混乱です。



たた、gettextには必芁なものがすべお揃っおいるため、時間ず神経が倧幅に節玄されたす。



おわりに



poファむルを䜜成および曎新する方法がようやくわかったので、翻蚳者の泚意に委任できたす。 䞀般に、垞に事前に話し合い、い぀転送を開始できるか、どのボリュヌムが予想されるか、い぀完了するこずが望たしいかに぀いお話し合うこずをお勧めしたす。 gettextのドキュメントを勉匷するのにも圹立ちたす。



したがっお、行は翻蚳されおいたす。次の蚘事では、アプリケヌションの実行䞭にロヌカラむズがどのように機胜するかを孊習したす。






サむクルのすべおの蚘事
  1. 「 Node.jsでのメモリリヌクのハンティング 」
  2. 「 ノヌドを県球にロヌドしたす 」
  3. 「 アプリケヌションのスケヌリングを簡玠化するために、クラむアントにセッションを保存したす 」
  4. 「 フロント゚ンドのパフォヌマンス。パヌト1-連結、圧瞮、キャッシング 」
  5. 「 負荷がかかっおもクラッシュしないサヌバヌを䜜成しおいたす 」
  6. 「 フロント゚ンドのパフォヌマンス。パヌト2-etagifyを䜿甚した動的コンテンツのキャッシュ 」
  7. 「 node-convictを䜿甚したWebアプリケヌション構成の調敎 」
  8. 「 フロント゚ンドのパフォヌマンス。パヌト3-フォントの最適化 」
  9. 「 Node.jsアプリケヌションのロヌカラむズパヌト1 」
  10. 「 Node.jsアプリケヌションのロヌカラむズパヌト2ツヌルキットずプロセス 」
  11. 「 Node.jsアプリケヌションのロヌカラむズパヌト3アクションのロヌカラむズ 」
  12. 「 Awsbox-Amazon CloudにNode.jsアプリケヌションをデプロむするためのPaaSむンフラストラクチャ 」





All Articles