アヌキテクチャずロヌカリれヌションに関するアコヌディオン

JavaScriptロヌカラむズ 過去6か月の間に、クヌルな〜100行のフレヌムワヌクを䜜成する方法に関する倚くの蚘事がありたした。 単䞀のフレヌムワヌクではなく〜2000行を蚘述する方法に関するタックルストヌリヌ。



背景



技術的な郚分に移る前に、問題の歎史に぀いお知りたいず思いたす。 「なぜ」ずいう質問に察しお、 この蚘事は良い答えを提䟛したす。 ロヌカリれヌションずむンタヌナリれヌションずは 、Anton Nemtsevが゚カテリンブルクのDUMPで講挔したした。 アレクサンダヌ・ゞェラシモフは、Frontend Dev Confでミンスクでタむポグラフィに぀いおプレれンテヌションを行いたした。 BadooのAlexander TevosyanがMoscowJS の倚蚀語サむトのレむアりト機胜に぀いお語り、同僚のGleb Deikaloが倚段階翻蚳に぀いお曞いおいたす。 テキスト自䜓を簡単に翻蚳できるように曞く方法は、Translation Forum RussiaカンファレンスのHyperbatonに関するKristina Yaroshevichのレポヌトで既に議論されおいたす。さらに、 Pavel Doroninは同様のトピックに぀いお曞きたした。



Hyperbatonずは䜕ですか
ハむパヌバトンはスピヌチの図です 。 最初は、なぜ䌚議をパンず呌ぶのか長い間考えおいたした。 䞀般に、公開されたレポヌトを確認するこずをお勧めしたす。 蚀語孊者以倖にずっおも興味深いものがたくさんありたす。 たずえば、 Maxim Ilyakhov



Habréでは、ロヌカラむズに関連するさたざたなトピックに関する倚くの蚘事を芋぀けるこずができたす。 AlconostやABBYYなどの倧䌁業は、パックで曞き蟌みたす。





䞊蚘の蚘事ずレポヌトは倚くの質問に答えたす。 しかし、コヌドの線成の問題は郚分的にしか説明されおいたせん。 それでも、はい、私の本JavaScriptでのシュルレアリスムでは、ロヌカラむズロゞックずそのDOMでの動䜜に぀いお郚分的に説明したした。 しかし、コヌドずその䞀般的な構造に぀いおもう少し説明するずきが来たした。



はじめに



なぜクラむアントに



それはすべお私たちが解決しようずしおいる問題に䟝存しおいたす。 私たちがサむトに぀いお話しおいる堎合、サヌバヌはこちらのほうが優れおいたす。 このアプリケヌションの堎合、クラむアントにむンフラストラクチャを展開するこずをお勧めしたす。 䞀方では、クラむアントはオフラむンで䜜業できたす。 䞀方、クラむアントがロヌカルファむルを䜿甚する堎合、サヌバヌリク゚ストを削枛したす。 さらに、サヌバヌがない堎合や、サヌバヌ開発者の時間が非垞に高䟡であるため、このタスクの䞀郚ずしおそれを費やすこずは意味がありたせん。



なぜjavascriptで



フロント゚ンド開発者ずしお、HTMLたたはCSSを遞択できたす。 HTMLの䜿甚方法は、個人的には想像できたせん。 ロヌカリれヌションタスクの䞀郚ずしおCSSを機胜させる方法は、Anton Lunev http://habrahabr.ru/post/121075/ によっお曞かれたした。 しかし、最初のケヌスず2番目のケヌスでは、JavaScriptが提䟛する柔軟性ず機䌚を倱っおいたす。



既補のものは䜕ですか



stackoverflowを備えたさたざたな30行の機胜、およびBadoo、Yandex、Alconostなどからの内郚ツヌルずは別に、珟時点ではいく぀かの非垞に蚱容可胜な゜リュヌションがありたす。





翻蚳ストレヌゞに関するアコヌディオン



特定の蚀語のフレヌズの翻蚳が蚘述される倉数がありたす。 さらに、アプリケヌション党䜓で、フレヌズ自䜓を䜿甚する代わりに、察応する倉数が眮き換えられたす。 したがっお、倉数の倀を倉曎するこずにより、アプリケヌション党䜓の蚀語を倉曎できたす。



JavaScriptロヌカラむズ



たずえば、ゲヌム「Zhmuriki」では、すべおのフレヌズの翻蚳を別の倉数に翻蚳しお曞き留めたした CARL VARIABLES少なくずもグロヌバルではないのは良いこずです 。 倉数の操䜜は、次の2぀の堎合にうたく機胜したす。





最初のケヌスでは、リ゜ヌスを削枛し、メモリの制限を満たすためにすべおを厳しく保存する必芁がありたす。 このような状況で優れた論理アヌキテクチャを展開するこずは、垞に可胜ではありたせん。



2番目のケヌスでは、誀っおパラメヌタヌを切り替える可胜性さえも陀倖しようずしおいたす。 同じスロットマシンを芋るず、負ける可胜性はすべお特定の囜の法埋によっお厳しく芏制されおいたす。 したがっお、ロシアに米囜向けの機械があり、ブルガリアにハンガリヌ向けの機械がある堎合は陀倖されたす。



ゲヌム「Zhmuriki」はVKontakteで動䜜し、䞊蚘の制限のいずれにも該圓したせん。 圌女の䟋では、ロヌカリれヌションシステムのコヌドずアヌキテクチャの品質が䜕の圹割も果たさないこずを明確に瀺しおいたす。 はい、誰かがコヌドをリファクタリングしたり、新しい機胜を远加したりするのは䞍䟿かもしれたせん。 はい、おそらくこのアプロヌチはより倚くのバグに぀ながるでしょう。 しかし、事実は、補品です。生産では、お金をもたらし、誰もが幞せです。



各フレヌズを新しい倉数に保存するこずはあたり䟿利ではなく、通垞、翻蚳自䜓は別の構成ファむルに転送されたす。 そのため、ほずんどのロヌカリれヌションシステムの開発者は、JSONやXMLなどの情報の保存に䞀般的な圢匏を䜿甚するこずを奜みたす。 通垞、ほずんどのJavaおよびPython開発者はXMLを䜿甚し、フロント゚ンド開発者はJSONを䜿甚したす。 慣れおいる人がいたす 暙準圢匏により、1぀のプログラミング蚀語のコンテキストずたったく異なる蚀語のコンテキストの䞡方で、たったく異なるロヌカリれヌションシステムに同じ翻蚳を簡単に䜿甚できたす。



他の方法で行った人はかなりいたす。 そのため、RubyはYMLの䜿甚を奜み、フラッシャヌはXLIFF、C`shniki-PO圢匏を奜みたす。たずえば、l20n.orgのメンバヌは、タグず属性を持぀独自の圢匏を考え出したした。 それらを簡単に芋おみたしょう。



Yml



YMLはXMLに䌌おおり、人間が読めるだけです。 RegExpsを明瀺的に保存するこずもできたす。



それは



<translation> <hello>, !</hello> </translation>
      
      





次のようになりたした



 translation: hello: ", !"
      
      





PO



䞻にフリヌ゜フトりェアのロヌカラむズに䜿甚されたす。 簡単です。 開発者は、gettextなどの関数ですべおの行をラップし、これらの行が翻蚳のキヌになりたす。 翻蚳がない堎合、元の文字列が眮き換えられたす。



 msgid "Hello, World!" msgstr ", !"
      
      





なぜなら 䞊蚘の圢匏はどれもネむティブではなく、フロント゚ンドレンダリングに䟿利です。 ゲヌム「Valley of Sweets」の翻蚳付きファむルの䟋



JavaScriptロヌカラむズ



JavaScriptでJSON圢匏を䜿甚する堎合、䞀郚のロヌカリれヌションシステムはネストされたプロパティをサポヌトしたせん。 䞊蚘のようなファむルの䟋を芋るこずができたす。 これには、明癜な翻蚳構造が必芁です。 ほずんどのロヌカリれヌションシステムでは、このような問題はなく、䞊蚘のコヌドは簡単に倉換できたす。



それは



 { ... "inviteFriend": " ", "inviteFriend2Lines": "<br> ", "InviteFriend2Lines": "<br> ", ... }
      
      





次のようになりたした



 { ... "invite": { "friends": { "line1": " ", "line2": "<br> " }, "friend": "<br> ", ... }
      
      





このアプロヌチにより、翻蚳の構造がより明確になりたす。 フレヌズ識別子は「invite.friends」ずいう圢匏を取り、次の圢匏の関数によっおJSONオブゞェクトから匕き出されたす。



 function getProperty (json, key) { key = key.split(/[\.]+/gim); for (var i = 0, l = key.length; i < l; i++) { var propertyName = key[i]; if (!json[propertyName]) { return null; } json = json[propertyName]; } return json; }
      
      





次のステップは、この構造にケヌスを反映させるこずです。 数字が必芁な堎合がありたす。 兞型的な䟋「リンゎ2個」、「リンゎ1個」、「リンゎなし」。 すでに䞊蚘のl20nの人たちは、このような問題を解決したした。



 <brandShortName { *nominative: "Aurora", genitive: "Aurore", dative: "Aurori", accusative: "Auroro", locative: "Aurori", instrumental: "Auroro" }>
      
      





そしお、Angularを䜿甚する人は次のように曞きたす。



 {{numMessages, plural, one {   } two {   } other {   } }}
      
      





たずえば、数字やケヌスの考えはたったく捚おたした。 これ





リンゎの叀兞的な問題は、絵文字で解決できたす。 以䞋に䟋を瀺したす。



JavaScriptロヌカラむズ

レッドアラヌトでのナニットの䜜成



JavaScriptロヌカラむズ

MineCraft Inventory



おそらくこれは特定のゲヌム構築ですが、通垞のSPAアプリケヌション管理パネル、ナヌティリティなどでは、そのようなカりンタヌを垞に正しく、ケヌスなしで衚瀺するこずもできたした。



JavaScriptロヌカラむズ

バナヌシステムでの統蚈のクむック衚瀺



JavaScriptロヌカラむズ

CosmoSimゲヌムでは、パラメヌタヌは数字ず絵文字で衚瀺されたす。



もちろん、それが奜きかどうかにかかわらず、問題を解決しなければならない堎合が倚くありたす。 そのような堎合は、おそらくPavel Doroninによる蚘事か、「...」の束葉杖でしょう。Replace /.../ gim、 "...";



テンプレヌトの問題は䜕ですか



問題は、特定のテンプレヌトを䜜成するオプションがすぐに普遍的ではなくなるこずです。 ナニバヌサルテンプレヌトはありたせん。 このオプションを自動化するず、コンテンツに関係なく、すべおの行が正芏衚珟によっお凊理されお倉数が怜玢されたす。 これは倚くの䜙分な䜜業です。 これを回避し、最初にデヌタ内のテンプレヌトで行をマヌクするず、保存する必芁があるデヌタの量が増えたす。 したがっお、テンプレヌトの操䜜は垞に「正しい翻蚳」察2぀の怅子のある謎です。 「システムのシンプルさず汎甚性。」



HTMLアコヌディオン



翻蚳の保存に぀いおはすでに説明したしたが、今床はHTMLに切り替えたす。 以䞋に曞かれたほずんどすべおのものはすでに「JavaScriptのシュルレアリスム」ずいう本にあり、NemnotsvずTevosyanは存圚しなかったものを持っおいたした。



HTMLペヌゞのレむアりトに぀いお話す堎合は、䜕らかの方法でDOM芁玠をマヌクする必芁がありたす。DOM芁玠の内郚のテキストは翻蚳が必芁です。 原則ずしお、開発者はさたざたな属性を芁玠に割り圓お、この属性に翻蚳IDを蚘述したす。 䟋



 <!-- angular-translate --> <p translate="hello">, !</p> <!-- i18next (http://i18next.com/) --> <p data-i18n="hello">, !</p> <!-- l20n (http://l20n.org/) --> <p data-l10n-id="hello">, !</p> <!-- jquery.localize.js (https://github.com/coderifous/jquery-localize) --> <p data-localize="hello">, !</p>
      
      





しかし 識別子ずそれが適甚されるタグによっお取埗された翻蚳オブゞェクトを分析する人はほずんどいたせん。 これが行われない堎合、次のようなタスク





など 束葉杖によっお決定されるか、たったく決定されたせん。 䞍適切なシステムを遞択するこずで䞍快感を芚える状況の䟋は、次のコヌドです。



 <img src="scheme_ru.png" alt=" " title="    2114" translate="id__"/> <input type="text" placeholder="  " value=" " translate="id__"/> <link rel="stylesheet" type="text/css" href="css/ru.css" translate="id__"/>
      
      





ロヌカリれヌションシステムでは、受け取った翻蚳のタむプずHTML芁玠のタむプを区別したす。 したがっお、タむプ文字列 "scheme_en.png"の翻蚳を受け取り、HTML芁玠IMGを持っおいるため、ほずんどの堎合、src属性を倉曎する必芁があるず想定できたす。 INPUT芁玠を䜿甚する堎合、プレヌスホルダヌ属性の翻蚳ずLINKタむプがそれぞれ必芁になる可胜性が高く、他のパラメヌタヌが指定されおいない堎合はhref属性を眮き換えたす。 さらに、芁玠を操䜜するためのルヌルが定矩されおいない、たたはあいたいな状況では、「オブゞェクト」タむプの翻蚳を䜿甚し、そのプロパティを列挙するこずで、䜜業しおいるタグの属性に倀を割り圓おたす。 䞊蚘の䟋の翻蚳を怜蚎しおください。



 { "id__": { "src": "scheme_uk.png", "alt": " ", "title": "  і  2114", }, "id__": { "placeholder": "і  ", "value": " " }, "id__": "css/ua.css" }
      
      





タグの属性を倉曎する機䌚があるので、さたざたな囜のグルヌプのむンタヌフェヌスを倉曎する問題の解決にスムヌズに進みたす。 すでに䜕床も蚀われおいるように、「ロヌカラむズ、これはテキストの翻蚳だけでなく、特定の囜の文化的特城ぞの補品の適合でもありたす。」 したがっお、スタむルを自動的に切り替えお写真を倉曎する機胜が必芁です。



少し痛み



コメントず蚘事で繰り返し、私はあなたが囜の旗ず絵文字を衚瀺すべきでないずいう意芋を聞いた。 人が䜕かを知らない堎合、圌は垞に英語をオンにしおそれを理解したす。 この芳点に匷く反察したす。 事実、私は英語をあたり知らないずいうこずです。 悪い翻蚳は、䞍圚よりも私にずっおはるかに優れおいたす。 私のような人がたくさんいたす。



ゞョヌゞアたたはむスラ゚ルにたったく同じ男がいるずしたす。 これはこの囜では普通の平均的な人です。 圌はあなたがグルゞア語やむディッシュ語を芋るのずほが同じ方法で英語を芋るでしょう。 以䞋は、小さなHTMLゲヌムのスクリヌンショットです。 ボタンの絵文字が衚瀺されない堎合、蚀語切り替えメニュヌにどのような詊みがありたすか 蚀語に旗が付いおいなかった堎合、50か囜語のスキスクを芋お、どれくらい長く苊痛を感じたすか



JavaScriptロヌカラむズ



ミラヌリングするこずを忘れないでください



これに぀いお倚くのこずが蚀われおいるので、远加するものはありたせん。 芁玠を構成したしたか 必ずrtl.cssを添付しおください rtl-cssに圹立ちたす。 ロヌカリれヌションシステムのすべおのRTLをリストしたす。 圌女は、どの堎合に接続する必芁があるかを知っおいる必芁がありたす。



JavaScriptロヌカラむズ



たずえば、次のように



 LanguageApplication({ rightRules: [ "module/button/button__right.css", "module/popup_text/popup_text__right.css", "module/progress_bar/progress_bar_right.css", "module/popup_window/popup_window__right.css", "module/popup_window/popup_window__animation_elements_right.css", "js/applications/language/language__right.css", "css/right.css" ] });
      
      





アヌキテクチャアコヌディオン



翻蚳を保存するための可胜な圢匏を簡単に説明し、HTMLで少し突っ蟌んだので、少し苊痛を加えるこずができたす。 いい質問です。ロヌカラむズが䞀般的な方法でどのように機胜するかを芋おみたしょう。



ロシア語ず英語の2぀のファむルがありたす。 User-Agentを䜿甚しお、ナヌザヌの蚀語を刀別し、最初の蚀語たたは2番目の蚀語のいずれかを接続したす。



JavaScriptロヌカラむズ



簡単な䜜業で、すべおが矎しく明確です。 ロヌカリれヌションシステムには、この原則に基づいたデモが衚瀺されたす。 しかし、それは私たちずは異なっおいたした。 耇数のモバむルポヌタルが同じモゞュヌルから組み立おられたした。 ポヌタルは䌌おいたしたが、䞀郚のセクションは異なっおいたした。 ゲヌムを䞀方で、曞籍をもう䞀方で販売したした。䞡方で曲を賌入できたす。 さたざたなオンラむントヌナメントずチャンピオンシップがありたした。 ロシアでのみ実斜されたものもあれば、CIS党䜓で実斜されたものもありたした。 リ゜ヌスを生成しないために、翻蚳はいく぀かのファむルに分割されたした。 特定のモバむルポヌタルごずに、これらの翻蚳の組み合わせは異なりたした。 なぜなら ロシア語版ず英語版のセクションの数が䞀臎しなかったそしお半分のケヌスが䞀臎しなかった堎合、1぀の組み合わせの翻蚳数も1぀のポヌタル内で蚀語から蚀語に倉曎されたした。



JavaScriptロヌカラむズ



図には䜕が芋えたすか たくさんのファむル。 たた、ファむルの各バンドルには、アセンブリ内の必芁な翻蚳の数、順序、およびバヌゞョンを説明する構成ファむルが必芁です。



JavaScriptロヌカラむズ



「すごい これですべおが正垞になりたした」私はその瞬間に考えたした。 しかし、ご想像のずおり、これは旅の始たりに過ぎたせんでした。 半幎埌、私は心理テストの適甚に関する仕事を始めたした。 すべおがかなり平凡ですテストを遞択し、質問に答え、壁に心理的な胞のサむズを公開したす。 すべおは問題ありたせんが、ロシアではそのようなテストはすでに満杯です。 しかし、いく぀かのチェコ共和囜やクロアチアでは。 人口が少なく、プログラマヌも少ない。 小さい垂堎は、倧きなプレヌダヌにずっお魅力的ではありたせん。 したがっお、ロシア向けの「最高のテスト」を䜜成しお、1億4600䞇人たで、たたは400䞇人たでが䜏んでいるクロアチアに぀いおも同じように勝぀こずができたす。 今埌、プロゞェクトは倱敗したず蚀いたすが、開発段階では、これはただ明らかではありたせんでした。



JavaScriptロヌカラむズ



䜕がありたすか アプリケヌションの公開時点で玄30のテスト。 各テストは序論であり、玄10の質問ず少なくずも3぀の結論です。 このすべおに3぀の蚀語が掛けられたす。 合蚈30 *1 + 10 + 3* 3 =少なくずも2000文字のボリュヌムを持぀耇雑な構造の90の翻蚳。 アプリケヌションが「シュヌト」する堎合、テストの数は2、3回増加し、転送の数は少なくずも5倍になりたす。 ナヌザヌがすべおの蚀語のすべおのテストに合栌しなくおも、1ペヌゞのアプリケヌションがあるこずを芚えおおく必芁がありたす。 そしお、このアプリケヌションはゆっくりですが着実にメモリを消費し、新しいテストのたびに消えおしたいたす。



テストで䜕が飛ぶ 倚くの異なるファむルがテストずずもに到着したす。 それらの1぀は、倉換構成です。 このテストが利甚可胜なすべおの蚀語に぀いお説明しおいたす。 アドレスはそこに曞き蟌たれ、そこから察応する翻蚳がロヌドされたす。



なぜなら 私たちのアプリケヌションはモゞュヌルで構成されおおり、むンタヌフェヌスの翻蚳が個別であり、各テストの翻蚳が個別であるこずは明らかです。 前述のように、これによりリ゜ヌスを再利甚する機䌚が埗られたす。



JavaScriptロヌカラむズ



画像を芋お、「テスト翻蚳」パッケヌゞが「むンタヌフェヌス翻蚳」パッケヌゞにどのように到着したかを芋おください。 ロヌカリれヌションシステムは䜕をしたすか そうです、2぀の構成を組み合わせ、3番目の構成を取埗したす。 そしお、最終構成を流通させた埌、圌女は今必芁な翻蚳に぀いお考え始めたす。 圌女がすべおを考えおロヌドするず、結果を再床結合しお、出力に単䞀のJSONを取埗したす。 JSONがフレヌズの最終的な翻蚳を圢成するのはこのためです。



JavaScriptロヌカラむズ



煙草を吞っお、グレブ・デむカロに「挚拶」をする時が来たした。グレブ・デむカロは、前述のように、「倚段階翻蚳」に぀いお曞いおいたす。 構成ず翻蚳を組み合わせるこずで、圌の蚘事で説明したものず同じマルチステヌゞを実珟できたす。 このためだけに、異なる蚀語のフレヌムワヌク内の翻蚳を所定の順序でマヌゞする必芁がありたす。



思い出に戻りたしょう。 蚭定ファむルを䞊䞋に塗り぀ぶし、それらが結合される順序がわかったので、テストの完了埌にメモリのクリアを詊みるこずができたす。 これを行うには、ダりンロヌドしたパッケヌゞずそれが远加した翻蚳を削陀する必芁がありたす。 次に、最終的な翻蚳で残りを結合したす。



JavaScriptロヌカラむズ



良いこずが刀明したした。 これで、翻蚳のブロック党䜓をメモリからロヌドおよびアンロヌドできたす。 しかし、隣の郚眲の同僚は、より簡単で簡単な解決策を提案したした。テスト翻蚳を1぀の倉数に曞くこずです。 したがっお、埌続の各テストの翻蚳は、以前の翻蚳を䞊曞きしたす。 そのずきたでに、䞊蚘のすべおがすでに2回実装されおいたこずは残念です。



なぜ2぀ 構成ファむルの構造を説明したずきに間違っおいたからです。 システムはオンラむンずオフラむンの䞡方の䜜業に共通である必芁があるこずを䞊蚘ですでに曞きたした。 オフラむンで䜜業する堎合、JSファむルを盎接接続するこずによっおのみ翻蚳をアップロヌドできたす。 この初期化ファむルは、デヌタオブゞェクトを提䟛したす。 なぜなら 将来、それを削陀する予定です。IDでオブゞェクトに眲名する必芁があり、同じIDを構成ファむルに保存する必芁がありたす。 翻蚳IDのリストを受け取った構成を削陀するず、リク゚ストでダりンロヌドされたすべおの翻蚳も削陀されたす。 構成ファむルの構造を次のように説明したした。



 { id: "id ", translations: { ru: { b: "/lang/b.js", a: "/lang/a.js" } } }
      
      





「AからBぞの転送」たたは「BからAぞ」の曎新を誰がロヌルしたすか 運が良ければ「A to B」ですが、圌はこれを行う矩務はありたせん。 構造は配列ではないため、順序は重芁ではありたせん。 さらに、別の間違いは、ファむルがアップロヌドされた順序がビルド順序に圱響するこずでした。 したがっお、私はやり盎す必芁がありたした



 { id: "id ", translations: { ru: [ { id: "b", url: "/lang/b.js" }, { id: "a", url: "/lang/a.js" } ] } }
      
      





これはロヌカリれヌションシステムですか いいえ、これは構成読み蟌みシステムです。 私が犯したもう1぀の間違いは、最初のバヌゞョンではホテルクラスに割り圓おなかったこずです。 䞀般に、かなりの数の個別のクラスずモゞュヌルが取埗されたす。







ほずんどの「既補」ロヌカリれヌションモゞュヌルでは、これはそうではありたせん。 なんで おそらくそれらを曞く人はめったに䜿甚しないからでしょう。



興味深い事実

JSのロヌカラむズシステムサむトはいずれもロヌカラむズされおいたせん。


カヌル ロヌカラむズを䜜成したずき、少なくずもそれを自分で䜿甚したした カヌル自身が䜿甚



オンデマンドでのみDOMを曎新したす



すべおのロヌカリれヌションシステムに、蚀語を切り替えおDOMツリヌを曎新する個別の方法があるわけではありたせん。 すべおの翻蚳の準備ができた盎埌に操䜜を完了する必芁がある堎合、これは困難を匕き起こす可胜性がありたす。 たた、倚くの実装では、各翻蚳ファむルの読み蟌みが完了した埌にDOMツリヌが曎新されたす。 たずえば、蚀語を「アルメニア語」に切り替えたした。 システムは、3぀の翻蚳ファむルのロヌドを開始したす。メむンむンタヌフェヌス、蚭定、プラグむンの翻蚳です。 このような状況では、DOMを曎新するのは1回だけですリストの最埌のファむルのロヌドが終了した埌。



英語、motherf **カヌ 話せたすか



これでロヌカラむズの準備ができたしたか いや これで、このシステムを取り巻くむンフラストラクチャを決定する準備ができたした。 翻蚳を含むファむルの圢匏ず構造はプログラマヌが決定し、その内容は翻蚳者たたはプロゞェクトマネヌゞャヌが決定したす。 これらの人々は、情報ストレヌゞの遞択された構造に粟通しおいるだけでなく、それを受け入れお理解しようずする詊みを攟棄するかもしれたせん。 JSONオブゞェクトの匕甚笊を簡単に削陀したり、XMLのタグを誀っお削陀したりする可胜性がありたす。さらに、䞀般的に倚くのナヌザヌがMicrosoft WordDOCX圢匏のファむルを䜿甚するこずを奜みたす。



むンフラストラクチャのタスクは、管理者にロヌカラむズ甚のツヌルを提䟛するだけでなく、翻蚳の安定性ずアセンブリず曎新の容易さを保蚌するこずでもありたす。 ロヌカリれヌションシステムは、倚くの堎合、むンフラストラクチャ゚ラヌや䞍足に悩たされたす。 翻蚳でファむルを曎新し、それらを最新の状態に保぀のは非垞に耇雑であるため、倚くの堎合、1぀たたは耇数の蚀語が無効になりたす。



Mushroom Warゲヌムのマネヌゞャヌは、Excelスプレッドシヌトを䜿甚しお翻蚳を凊理したす。翻蚳はパヌサヌによっお凊理され、XMLドキュメントに倉換されたす。XMLドキュメントは、ロヌカリれヌションシステムがプロゞェクトをビルドするために䜿甚したす。



JavaScriptロヌカラむズ



Evilibriumのメンバヌは、ファむルを盎接操䜜しないこずを決定し、Googleドキュメントでたったく同じタブレットを䜜成したした。 ロゞックは単玔です-翻蚳者にリンクを送信するこずは、ファむルを送信するよりも簡単です。 したがっお、誰もがオンラむンで翻蚳を行い、組み立お䞭にタブレットは同じ方法でダりンロヌドされ、目的のXMLに解析されたす。



JavaScriptロヌカラむズ



珟時点では、翻蚳を扱うための倚くのオンラむンサヌビスがありたす。 誰かが良く、誰かが悪いが、ほずんど党員が翻蚳者たたは翻蚳者のグルヌプずやり取りするタスクに察凊したす。 たた、ほずんどのサヌビスは、アプリケヌションを自動的に翻蚳する機胜を提䟛したす。 このトピックに関するむンタヌネット䞊の倚くの蚘事がありたすが、 この蚘事はボタンアコヌディオンに関するものなので、独自の翻蚳プログラムを䜜成しないのは眪です。



続行する前に、私が思うに、自動翻蚳が正垞である理由に぀いお少し説明したいず思いたす。 第䞀に、䞀連のルヌル単玔、簡朔、盎接的な語順などに埓っおテキストを蚘述する堎合、自動翻蚳は90の粟床に達する可胜性がありたすKristina Yaroshevichのレポヌトを参照。第二に、ほずんどのアプリケヌションでは、オヌプン、クロヌズ、保存、ロヌド、新しいゲヌム、終了、次ぞ、キャンセルなど、かなり暙準的で䞍十分なフレヌズのセットが䜿甚されたす。間違っお翻蚳するのは非垞に困難です。第䞉に、あなたず私は、ロシア語のネむティブスピヌカヌずしお、たくさんのrozumіtibagato mov slovyanskogo movno grupiを持っおいたす。そのため、翻蚳者がいなくおも翻蚳の重倧な゚ラヌをチェックできたす。しかし、これは私の個人的な意芋です。䟋えば、Pavel Doroninは圌の蚘事で、正反察の意芋を堅持したした。



次のアプリケヌションをロヌカラむズするために、翻蚳を含むファむルをカットする必芁がありたした。翻蚳を送ったフリヌランサヌは、垞にJSONを壊しおいたした。すぐに、JSONの代わりに、プレヌンテキストを送信し始めたした。最初の近䌌では、タスクはフリヌランサヌのテキストから有効なオブゞェクトを取埗するこずでした。このタスクのために、2りィンドりアプリケヌションが膝の䞊に䜜成されたした入力のテキスト、出力のJSON。テキストをフレヌズに分割する方法は䟋を芋おみたしょう



TEXTAREAのテキスト



  1  2
      
      





普通の人が芋おいるように



  1  2
      
      





プログラマヌが芋おいるように



  1\n  2
      
      





いいねテキストを分割できるシンボルがありたす。たた、それは隠されたシンボルであり、翻蚳者は誀っおそれを壊したり拭いたりするこずはできたせん少なくずもほずんどの堎合。 splitを介しおテキストを配列に倉換し、それをオブゞェクトに眮き換えたす。これをJSON.stringifyに送り蟌み、必芁な有効なファむルを取埗したす。



JavaScriptロヌカラむズ



なぜならJSONテンプレヌトは異なる堎合がありたす。別のファむルに配眮するこずをお勧めしたす。そしお、それを別のファむルに入れたので、JSONだけでなく生成するように教えおもいいですかこれらの考えに基づいお、「テンプレヌト生成」機胜を線集できる別のりィンドりをプログラムに远加したした。入力では、翻蚳されたフレヌズの配列を受け取り、出力では、JSON、XML、たたは他の䜕かを返したす。



JavaScriptロヌカラむズ



次のアプリケヌションの翻蚳が必芁になったずき、䜕らかの自動翻蚳機を固定すれば、倧幅に節玄しお翻蚳の量を増やすこずができるず思いたした。すぐに蚀っおやった。これで、プログラムはテキストを取埗し、それを䞀連の蚀語に翻蚳し、最終的な有効なJSONを生成できたす。



JavaScriptロヌカラむズ



その埌、JSONフットクロスをJavaScriptファむルにカットするスクリプトを曞き始めたした。その埌、圌は考えお、代わりにNodeJSに小さなロヌカルサヌバヌを䜜成したした。次に、Yandex.Translatorから次の転送を受信した埌、プログラムはノヌドにデヌタを送信し始め、必芁なファむルをその堎でカットしたした。



結果は非垞に満足しおいたす。さお、小さなゲヌムには玄45〜50の蚀語の暙準翻蚳が付属し始めたした。したがっお、ロヌカリれヌションは重芁な堎所ではないが、快適な远加であるいく぀かの小さな補品がリリヌスされたした。



テストの結果、同じ堎所で自動翻蚳が誀っおいるこずがわかりたした。たずえば、「戻る」ずいう単語は、「前」たたは「トム」ずしお翻蚳されたす「20幎前」の意味。なぜならフレヌズは同じ束葉杖が珟れ始めおいた。ある時点で、それらを削陀しお蟞曞を远加するこずにしたした。そのため、プログラムには3番目のりィンドりがありたす。



JavaScriptロヌカラむズ



これで、蟞曞には次のようなフィヌルドが含たれたした。



 { ru: { en: { "": "Back" ...
      
      





なぜなら蟞曞の远加䞭に、アプリケヌションを少しリファクタリングするこずを決め、その埌倚くの倉曎を加えたした。同時に、ロヌカラむズに぀いおもっず読むこずにしたした。その瞬間、Denis Lukyanovの蚘事「゜フトりェアロヌカリれヌションのための7぀のオンラむンサヌビスの抂芁」に出䌚い、この間ずっず自転車を曞いおいるこずに気付きたした...



さお、あなたは䜕ができたすか、自転車は自転車です。原則から、私はそれを終えるこずを決め、最埌の仕䞊げをしたした。これで、ノヌドはすぐに翻蚳を倚数の圢匏JS、JSON、XML、PO、YML、CSVにカットし始め、これらのファむルを「クリヌン」ず「ダヌティ」の2぀のフォルダヌに保存したした。 「ダヌティ」フォルダヌ内のファむルを倉曎するず、ディクショナリ内の「同期」をクリックでき、ノヌドは怜出された違いに応じおディクショナリを自動的に生成したす。珟圚、同期は半分の圢匏でのみ機胜したす。プログラムをいじり続けるかどうかは明確ではありたせん。サむトに



JavaScriptロヌカラむズ



アクセスしお、その倖芳を確認したり、ダりンロヌドしたりするこずもできたす蚭定のファむルぞのリンク。少なくずも10人が継続する必芁があるために登録を解陀した堎合、私はそれを思い出させたす。さらにいく぀かの機胜が必芁です





理想的には起こりたせん
1週間前にこの蚘事を曞きたしたが、䞊蚘の自転車のリファクタリングを止めるこずはできたせん。私は1぀を曞き盎し、もう1぀を曞き盎したした。3぀目の問題が修正されるたで、誰にも芋せるこずはできたせん。䞀般に、これは実甚的なプロトタむプず芋なされたす。


ロヌカラむズなしのロヌカリれヌション



ロヌカリれヌションシステムは、たず、特定の定数セットの倀の制埡システムです。その䞭で遞択された蚀語は、これらのセットを切り替えるこずができるキヌです。キヌを1か所で倉曎するこずにより、アプリケヌション党䜓で定数を倉曎したす。そしお、この考えに気付いおいるなら、倚分ロヌカリれヌションシステムの可胜性を異なる角床から芋おください。システムを非暙準的に䜿甚するいく぀かのケヌスを䞀緒に芋おみたしょう。



アプリケヌションの倖芳を倉曎する



JavaScriptロヌカラむズ



䜜業では、同じモゞュヌルセットを䜿甚しお、コンテンツを販売する䞀般的なモバむルサむトを䜜成したす。パヌトナヌごずに、アむコンのセットも含むいく぀かのスタむルを倉曎したす。さらに、䌑日やプロモヌションでは、特定のサむトの倖芳を倉曎しお、タヌゲットオヌディ゚ンスに適したムヌドを䜜成したすたずえば、新幎のスタむルや「バレンタむンデヌ」を称えるテヌマ。同じレむアりトテンプレヌトを䜿甚するには、それらからむメヌゞアドレスを削陀する必芁がありたした。このような各画像に特定の識別子を付け、JSONオブゞェクト内のすべおのアドレスを察応するキヌで曞き留めたした。システムが機胜するためには、珟圚の構成ずテヌマに基づいお、すべおの写真を珟圚のアドレスに自動的に登録する特定のメカニズムが必芁でした。だからこのメカニズムは、䞀方で蚭定を受け取り、他方で特定の識別子で倀を返す必芁がありたす。たた、DOMが既に圢成されおいる堎合は、DOMツリヌを調べお、マヌクされたすべおの画像を自分で曎新できるようにしたいず思いたす。説明したシステムの機胜は䜕も思い出させたせんか



画像アドレスを持぀JSONオブゞェクトの䟋



 { header: { menu: { normal: "/images/201409/menu__normal.png", hover: "/images/201409/menu__hover.png" }, search: "/images/201407/search__blue.png" }, ... footer: { icon: "/images/201408/question.png", up: "/images/201407/up.png" } }
      
      





JavaScriptロヌカラむズ



このような䞀察䞀のメカニズムは、ロヌカリれヌションシステムのロゞックを繰り返したす。もしそうなら、なぜそれを䜜成するのですかロヌカリれヌションモゞュヌルにこの䜜業を匷制するこずができたす。蚀語倀ずしお目的のトピックの名前のみを䜿甚したす。さらに、前述のように、ロヌカラむズシステムはプラグむンスタむルのアドレスを倉曎するこずもできたす。これは、プラグむンCSSコヌドを含む制埡を取埗するこずを意味したす。同じ蚭定ファむル内で翻蚳ず蚀語を混圚させたくない堎合は、OOPなしで行うこずはできたせん。OOPは、異なる目的1぀は翻蚳をロヌルし、もう1぀はスタむルのためにロヌカラむズの2぀のむンスタンスを䜜成する方法の質問に答えたす。



数匏の係数の倉曎



ゲヌム機甚の゜フトりェアを開発するUnicum瀟のプログラマヌも、ロヌカリれヌションファむルに数孊的係数を含めお賞金を蚈算したした。これは、ゲヌムの法埋が゜フトりェアを䜿甚する囜によっお倧きく異なる堎合があるためです。したがっお、たずえば、スロットマシンの賞金の平均割合は、60から95の範囲で倉動する可胜性がありたす。



さらに、さたざたな難易床のゲヌムを開発する堎合、ロヌカリれヌションシステムを䜿甚しお、ゲヌムのバランスに圱響する係数を保存し、すばやく倉曎するこずもできたす。



ストヌリヌの倉曎



ゲヌムのプロットがグラフずしお蚘述され、JSONオブゞェクトずしお保存され、オブゞェクトのマヌゞ操䜜を実行できるロヌカリれヌションシステムに枡される堎合、メむンストヌリヌラむンにパッチず远加を䜜成できたす。ただし、耇数のストヌリヌラむン自䜓を䜜成し、ゲヌムの開始時にそれらをランダムに遞択するこずもできたすキヌは「遞択された蚀語」ではなく、「遞択されたプロット」です。



ゲヌムルヌルの倉曎



ブラックゞャックずポむントゲヌムの違いは䜕ですかあたりない。䞻な違いは、デッキではなく36枚のカヌドの数です。オンラむンブラックゞャックを曞いた堎合半幎前に曞いたように、JSONでデッキを詰め蟌み、ロヌカリれヌションシステムのむンスタンスに入れお、蚭定にオプション「ルヌルの切り替え」を远加したす。手銖を軜く動かすだけのロヌカリれヌションシステムが、ゲヌムルヌルを遞択するシステムに倉わりたした。



たずめず結論



JavaScript





アセンブリシステムに぀いお考えたす。





Denis Lukyanovの完成品を遞択したす。



レむアりト時





rtl-cssを䜿甚し、Alexander Tevosyanを芋おください。



テキスト





Pavel Doroninを読みたす。



テキストで、次を削陀したす。





Kristina Yaroshevichを衚瀺したす。



远加





情報スタむルの堎合





章を䜿甚したす。線 、Maxim Ilyakhovを芋お、スクリヌンショットを準備しおください。



いく぀かの利点



蚀語ずその名前
 { ar: "عرؚي", //  az: "Azərbaycan", //  be: "і", //  bg: "", //  bs: "Bosanski", //  ca: "Català", //  cs: "ČeÅ¡tina", //  da: "Dansk", //  de: "Deutsch", //  el: "ΕλληΜικά", //  en: "English", //  es: "Español", //  et: "Eesti", //  fa: "فارسی", //  fi: "Suomi", //  fr: "Français", //  he: "עבךית", //  hr: "Hrvatski", //  hu: "Magyar", //  hy: "Հայ", //  ja: "日本語", //  id: "Indonesian", //  is: "LjóðmÊli", //  it: "Italiano", //  ka: "ქართული", //  kk: "Ққ", //  ko: "한국얎", //  ky: "", //  lt: "Lietuvių", //  lv: "LatvieÅ¡u", //  mk: "", //  ms: "Melayu", //  mt: "Malti", //  nl: "Nederlandse", //  no: "Norsk", //  pl: "Polski", //  pt: "Portuguesa", //  ro: "Română", //  ru: "", //  sk: "Slovenskej", //  sl: "Slovenski", //  sq: "Shqiptare", //  sr: "", //  sv: "Svenska", //  tg: "Ò·Ó£", //  th: "à¹„àž—àž¢", //  tr: "TÃŒrk", //  tt: "", //  uk: "ї", //  vi: "Việt nam", //  zh: "䞭囜" //  }
      
      








All Articles