93

我是擁有20多名開發人員的團隊成員。每個開發人員都在單獨的模塊上工作(接近10個模塊)。在每個模塊中,我們可能有至少50點CRUD的形式,這意味着我們目前有近500 添加按鈕保存按鈕編輯按鈕字符串和標籤本地化和全球化的最佳實踐

但是,因爲我們希望我們的全球化應用,我們需要能夠在我們的應用程序中翻譯文本。例如,無處不在,對於法國用戶來說,單詞add應該變成ajouter

我們到現在爲止所做的是,對於UI或表示層中的每個視圖,我們都有一個翻譯鍵/值對的字典。然後在渲染視圖時,我們使用這個字典翻譯需要的文本和字符串。然而,這種方法,我們已經有500 附近500個詞典中加入。這意味着我們違反了DRY本金。另一方面,如果我們集中常見的字符串,比如把加上在一個地方,並要求開發者在任何地方使用它,我們會遇到不確定字符串是否已經在集中字典中定義的問題或不。其他

一個選項可能是有沒有翻譯詞典,並使用在線翻譯服務,如谷歌翻譯,必應翻譯等

,我們已經遇到的另一個問題是,交付項目的脅迫下一些開發商按時不記得翻譯鍵。例如,對於添加按鈕的文本,開發者已經使用添加而另一個開發

什麼是最好的做法,或對全球化和本土化最知名的方法應用程序的字符串資源?

+1

的[雜談](http://www.youtube。 com/watch?v = uXS_-JRsB8M)[Alex Sexton](http://alexsexton.com/),主題爲[客戶端國際化](http://www.youtube.com/watch?v=uXS_-JRsB8M) )來自JS歐盟會議是一個好的開始。 –

回答

44

據我所知,有一個名爲localeplanet的本地化和國際化在JavaScript好的庫。此外,我認爲它是本地的,並且不依賴於其他庫(例如,jQuery的)

這裏是圖書館的網站:http://www.localeplanet.com/

還看這篇文章由Mozilla,你可以找到客戶端翻譯非常好的方法和算法:http://blog.mozilla.org/webdev/2011/10/06/i18njs-internationalize-your-javascript-with-a-little-help-from-json-and-the-server/

所有的公共部分文章/庫是他們使用i18n類和get方法(在某些方面還定義了一個較小的函數名稱,如_),用於檢索/轉換keyvalue。在我的解釋中,key表示要翻譯的字符串,而value表示翻譯後的字符串。
然後,您只需要一個JSON文檔來存儲keyvalue's。

例如:

var _ = document.webL10n.get; 
alert(_('test')); 

而且這裏的JSON:

{ test: "blah blah" } 

我相信使用當前流行的庫解決方案是一個不錯的辦法。

+1

沒有冒犯,但這不是Afshin已經嘗試過的嗎?他的問題是不同的開發人員難以記住要使用哪些密鑰。我同意你所描述的方法是可行的。我不明白這是怎麼回事。感謝偉大的鏈接順便說一句。 – Spock

12

jQuery.i18n是一個輕量級的jQuery插件,用於在您的網頁中實現國際化。它允許您在'.properties'文件中打包自定義資源字符串,就像在Java Resource Bundles中一樣。它根據瀏覽器報告的語言或語言加載和分析資源包(.properties)。

更多地瞭解這個看一看的How to internationalize your pages using JQuery?

36

當你面對解決的一個問題(坦白地說,誰不 這些天?),基本策略通常採取我們電腦的人 被稱爲「分而治之」。它去像這樣:

  • 將特定問題概念化爲一組較小的子問題。
  • 解決每個小問題。
  • 將結果組合成特定問題的解決方案。

但「分而治之」不是唯一可能的策略。我們還可以採取更通用的方法:

  • 將特定問題概念化爲更常見問題的特例。
  • 以某種方式解決一般問題。
  • 適應一般問題的解決方案的具體問題。

- 埃裏克利珀

我相信很多解決方案已經存在於服務器端語言,如ASP.Net/C#這個問題。

我列出了一些問題問題的主要方面

  • :我們只需要爲所需的語言

    解決方案加載數據:爲此我們節省數據到每種語言的單獨文件

ex。 res.de.js,res.fr.js,res.en.js,res.js(默認語言)

  • 問題:每一頁的資源文件應該被分開,所以我們只得到了我們的數據需要

    解決方案:我們可以使用一些工具已經存在像 https://github.com/rgrove/lazyload

  • 問題:我們需要一個鍵/值對結構保存我們的數據

    解決方案:我建議JavaScript對象而不是字符串/字符串空氣。 我們可以從智能感知受益於IDE

  • 問題:一般成員應存放在一個公共文件和所有網頁應該訪問這些

    解決方案:爲此,我做一個文件夾中的根Web應用程序名爲Global_Resources和存儲全局文件爲每個子文件夾的文件夾中,我們把它命名爲「Local_Resources」

  • 問題:每個子系統/子文件夾/模塊成員應覆蓋其範圍

    的Global_Resources成員

    解決方案:我認爲是文件的每個

應用程序結構

root/ 
    Global_Resources/ 
     default.js 
     default.fr.js 
    UserManagementSystem/ 
     Local_Resources/ 
      default.js 
      default.fr.js 
      createUser.js 
     Login.htm 
     CreateUser.htm 

的文件中的相應代碼:

Global_Resources/default.js

var res = { 
    Create : "Create", 
    Update : "Save Changes", 
    Delete : "Delete" 
}; 

Global_Resources/default.fr.js

var res = { 
    Create : "créer", 
    Update : "Enregistrer les modifications", 
    Delete : "effacer" 
}; 

所需語言的資源文件應該從Global_Resource選擇在網頁加載 - 這應該是對所有加載的第一個文件頁面。

UserManagementSystem/Local_Resources/default。JS

res.Name = "Name"; 
res.UserName = "UserName"; 
res.Password = "Password"; 

UserManagementSystem/Local_Resources/default.fr.js

res.Name = "nom"; 
res.UserName = "Nom d'utilisateur"; 
res.Password = "Mot de passe"; 

UserManagementSystem/Local_Resources/createUser.js

// Override res.Create on Global_Resources/default.js 
res.Create = "Create User"; 

UserManagementSystem/Local_Resources /的createUser。 fr.js

// Override Global_Resources/default.fr.js 
res.Create = "Créer un utilisateur"; 

manager.js文件(最後這個文件應該是負載)

res.lang = "fr"; 

var globalResourcePath = "Global_Resources"; 
var resourceFiles = []; 

var currentFile = globalResourcePath + "\\default" + res.lang + ".js" ; 

if(!IsFileExist(currentFile)) 
    currentFile = globalResourcePath + "\\default.js" ; 
if(!IsFileExist(currentFile)) throw new Exception("File Not Found"); 

resourceFiles.push(currentFile); 

// Push parent folder on folder into folder 
foreach(var folder in parent folder of current page) 
{ 
    currentFile = folder + "\\Local_Resource\\default." + res.lang + ".js"; 

    if(!IsExist(currentFile)) 
     currentFile = folder + "\\Local_Resource\\default.js"; 
    if(!IsExist(currentFile)) throw new Exception("File Not Found"); 

    resourceFiles.push(currentFile); 
} 

for(int i = 0; i < resourceFiles.length; i++) { Load.js(resourceFiles[i]); } 

// Get current page name 
var pageNameWithoutExtension = "SomePage"; 

currentFile = currentPageFolderPath + pageNameWithoutExtension + res.lang + ".js" ; 

if(!IsExist(currentFile)) 
    currentFile = currentPageFolderPath + pageNameWithoutExtension + ".js" ; 
if(!IsExist(currentFile)) throw new Exception("File Not Found"); 

希望它能幫助:)

+5

我不喜歡這種方法的唯一的事情是本地化和開發是緊密耦合的......所以當一個英文(無論默認是什麼)字符串被添加時,剩下的語言必須通過代碼進行更新。我寧願用某種類型的翻譯文件中的工具創建JSON。仍然很好的代表! –

+0

有人可以解釋我downvote? –