[轉]AngularJs 多語言的使用 angular-translate


本文轉自:http://www.tuicool.com/articles/zeymimB

隨着世界各地Web訪問量的增加,作為開發者的我們也在不斷讓應用國際化、本地化。當用戶訪問我們的應用時,他應該能夠在運行時立即切換語言環境。

鑒於我們正在開發的是AngularJS客戶端應用,尤其不希望用戶必須刷新頁面或者訪問一個完全不同的URL。當然,AngularJS可以很容易地調整那些國際化讀者的本機語言環境,或許通過為不同語言生成不同模板的方式為應用提供服務。

然而,這個過程可能會很麻煩,當我們想要改變應用的布局時會發生什么情況?每個獨立的模板都需要重新構建和部署。而這個過程應該是很簡單才對。

今天就來說說這個    “angular-translate”  

你可以使用angular-translate來替代創建新模板的方式,這個AngularJS模塊為你的應用提供了i18n(國際化)服務。angular-translate要求創建一個JSON文件,它描述每種語言的翻譯數據。然后它只會在必要時從服務器延遲加載特定語言的翻譯數據。 

angular-translate庫自帶了很多內置指令和過濾器,這讓我們的應用國際化變得簡單。我

們一起來學習一下。

  1. 安裝:安裝的方式有很多也很簡單,你如果使用nodejs的話你可以使用Bower(前端包管理器),如果你不熟悉可以google它的使用。當然最簡單的是你直接下載下來引入進來。但是你需要確保你的這個類庫放在angularjs之后,這個我想也不必多說了:

    <script src="path/to/angular.js"></script> <script src="path/to/angular-translate.js"></script>

    最后一項要點是,在你的應用中必須將angular-translate聲明為一個加載依賴:

    var app = angular.module('myApp', ['pascalprecht.translate']);

    現在已經准備好使用angular-translate組件來翻譯你的應用了。

  2. 使用方法:安裝好angular-translate后,將它聲明為應用的依賴,這樣才可以用它來翻譯應用程序的內容。首先,需要提供翻譯數據,這樣應用才能真正地說一種新的語言。這一步可以通過使用最新的$translateProvider服務配置$translate服務實現。培養應用使用一種新的語言很簡單。只需在應用上使用config函數,為應用提供不同的語言翻譯(比如英語、德語、希伯來語等)。首先,需要將$translateProvider注入到配置函數中,就像這樣:

    angular.module('angularTranslateApp', ['pascalprecht.translate']) .config(function($translateProvider) {  //  翻譯會放到這里 });

    要添加一種語言,必須讓$translateProvider找到一個翻譯表格,這是一個JSON對象,它包含將要翻譯為具體值的消息(鍵)。使用翻譯表格時允許我們將翻譯數據編寫為一個簡單的JSON文件,以便從遠程加載或者在編譯時設置,比如:

    {
      "name":"hello AngularJs" }

    在翻譯表格中,鍵(key)表示一個翻譯ID,而其值表示某種語言特定的翻譯數據。現在,先給應用添加一個翻譯表格。$translateProvider提供了一個叫做translations()的方法來處理它。     

    app.config(function($translateProvider) {
     $translateProvider.translations({   "headline": "Hello there, This is my awesome app!",   "intro": "And it has i18n support!"  }); });

    有了這個翻譯表格之后,應用就可以使用angular-translate了。由於這是在配置期間添加的翻譯表格,因此在angular-translate的組件被實例化時就能訪問到這個翻譯表格了。

    先切換到應用的模板部分。要將鍵綁定給視圖很簡單,只需添加翻譯數據到視圖層即可。使用translate過濾器時,甚至不必接觸控制器或者服務,或者無需擔心視圖層:因為你可以從任何控制器或者服務中解耦翻譯邏輯,並且無需接觸業務邏輯代碼就能讓視圖可替換。

    從根本上說,translate過濾器的工作原理就像這樣:

    <h2>{{'HEADLINE' | translate }}</h2> <p>{{'INTRO_TEXT' | translate}}</p>

    現在可以翻譯視圖層中的內容了,並且還避免了翻譯邏輯污染控制器邏輯;然而,即使我們不使用angular-translate也能得到完全相同的結果,因為在這個示例應用中只涉及一種語言。

  3. 同時多個語言的支持:上面的代碼事例你已經看到一種語言的設置了,如果同時多個語言呢?我可能需要自己設置使用那個語言的場景,上面的就不再適合了,這個插件也是為我們提供這樣的功能的。話不多說了直接看代碼就一目了然了

    app.config(function($translateProvider) {
     $translateProvider.translations('en', {   HEADLINE: 'Hello there, This is my awesome app!',   INTRO_TEXT: 'And it has i18n support!'  }) .translations('de', {   HEADLINE: 'Hey, das ist meine großartige App!',   INTRO_TEXT: 'Und sie unterstzt mehrere Sprachen!'  }); }); 

    ok,上面的例子非常的簡介明了,多個支持就這么的簡單。如果說你要動態設置呢?這個什么時候切換怎么搞呢?比如上面的代碼我進來是顯示那個呢?是英語還是德語呢?

    要設置首選語言,你可以使用$translateProvider.preferredLanguage()方法。這個方法會告訴angular-translate哪種已注冊語言是應用默認應該使用的語言。它要求使用一個語言鍵值作為參數,這個參數指向某個翻譯表格。現在,我們來告訴應用應該使用英語作為默認語言:

    app.config(function($translateProvider) {
     $translateProvider.translations('en', {   HEADLINE: 'Hello there, This is my awesome app!',   INTRO_TEXT: 'And it has i18n support!'  })  .translations('de', {   HEADLINE: 'Hey, das ist meine gro?artige App!',   INTRO_TEXT: 'Und sie unterstzt mehrere Sprachen!'  });  $translateProvider.preferredLanguage('en'); });

    ok,上面已經解決了我們在多個語言的時候默認使用那個的方法,那么動態設置呢?怎么搞呢我們繼續往下看,要在運行時切換到一種新語言,必須使用angular-translate的$translate服務。它有一個use()方法,這個方法要么返回一個當前正在使用的語言對應的語言鍵,或者傳遞一個語言鍵作為參數,這個參數會讓angular-translate使用該參數對應的語言。     

    為了感受一下如何在真實的應用中運用這一功能,我們可以添加兩個表示譯文的翻譯ID,稍后添加到HTML模板中的按鈕會用到這兩個ID:代碼片段還是上面的那個啊,

    app.config(function($translateProvider) {
     $translateProvider.translations('en', {   HEADLINE: 'Hello there, This is my awesome app!',   INTRO_TEXT: 'And it has i18n support!'  })  .translations('de', {   HEADLINE: 'Hey, das ist meine gro?artige App!',   INTRO_TEXT: 'Und sie unterstzt mehrere Sprachen!'  });  $translateProvider.preferredLanguage('en'); });

    接下來,我們要使用$translate服務和它的use()方法在控制器上實現一個方法以便在運行時改變語言。為此,要將$translate服務注入到應用的控制器中,然后添加一個函數給它的$scope對象:

    app.controller('TranslateController', function($translate, $scope) {  $scope.changeLanguage = function(langKey) {   $translate.use(langKey);  } });

    接着,我們通過為每種語言添加一個按鈕的方式在HTML模板中反映這一變化。還必須在每個按鈕上設置一個ng-click指令在運行時調用改變語言的函數。

    <div ng-controller="TranslateController">  <button ng-click="changeLanguage('de')" translate="BUTTON_TEXT_DE"></button>  <button ng-click="changeLanguage('en')" translate="BUTTON_TEXT_EN"></button> </div>

    ok,這樣就把剛才我拋出的問題都解決了。

  4. 最后說下動態加載語言Angular的$http服務,我們可以通過$translateProvider的registerLoader方法來動態加載語言。首先,需要安裝angular-translate-loader-url擴展來設置loader-url服務,它要求有一個后端服務器通過處理lang參數的方式返回JSON數據。如果你已經有一個處理帶lang      參數路由的后端程序,那么可以像這樣使用     

    Bower安裝loader-url服務:

    bower install angular-translate-loader-url

    同樣你不想這么安裝你去github自己下載引入也是一樣的,同理需要引入到文件中放到angularjs的下面。

    ok,具體的使用這里就不多說了,你可以自己搜索這個插件去看官方的具體文檔這里就不再贅述了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM