1. 程式人生 > >淺析 AngularJS 全球化最優方案(六)

淺析 AngularJS 全球化最優方案(六)

本節是最後一節關於AngularJS的國際化和本地化方案討論,具體會和大家聊下目前有哪些第三方庫,以及優缺點。

首先談談國際化,AngularJS自帶國際化支援,提供了一些語言的國際化資原始檔檔案,具體的覆蓋面,大家可以去官網查詢。

下面聊聊怎麼使用這些資原始檔,一般來說會分靜態載入和動態載入,靜態載入可以使用預繫結、單獨載入。預繫結是將國際化資原始檔和 AngularJS 庫檔案進行合成,比如在Linux 裡面可以使用:

cat angular.js i18n/angular-locale_de-ge.js > angular_de-ge.js

也可以單獨載入,在index.html裡面新增引用:

<html ng-app>

<head>

  ….

   <script src="angular.js"></script>

   <script src="i18n/angular-locale_de-ge.js"></script>

   ….

</head>

</html>

除靜態載入,當然也可以使用 grunt 做模板渲染。但是通常情況下,會使用動態載入方式:
    <!-- i18n -->
    <script type="text/javascript"
            src="lib/angular/i18n/<%= (new com.hero.admin.ui.i18n.JSResourceResolver("lib/angular/i18n","angular-locale_")).geti18NFile(request) %>">
    </script>

引入AngularJS提供的資原始檔後,在具體的實現中可以使用過濾器對原始資料進行國際化處理:

<!document html>
<html ng-app>
  <head>
    <meta charset="utf-8">
    <title>locale test</title>
    <script src="../../build/angular.js"></script>
    <script src="../../build/i18n/angular-locale_de.js"></script>
    <script>
      function AppCntl($scope){
        $scope.input = 234234443432;
      }
    </script>
  </head>
  <body ng-controller="AppCntl">
    <input type="text" ng-model="input"><br>
    date: {{input | date:"medium"}}<br>
    date: {{input | date:"longDate"}}<br>
    number: {{input | number}}<br>
    currency: {{input | currency }}
  </body>
</html>
以上是國際化部分,基本的國際化點這樣實現是沒有問題的,如果有一些特殊的國際化點,AngularJS 國際化資原始檔沒有提供,可以參考包含IBM cldr的相關JS庫。

AngularJS 在本地化的支援中,常用的第三方庫有angular i18n, angular-translate 和angular-gettext。這幾個庫的特點如下:

Angular i18n:

  • 在專案設計的時候就需要考慮到國際化。
  • 此庫是絕對的 “angular way”,100%的國際化處理都是在前端完成。
  • 使用i18n的過濾器和指令。
  • 使用內聯替換
  • 支援單複數
  • 支援性別區分的替換
  • 有第三方翻譯流程處理工具:grunt-angular-localization
參考資料:
  • https://docs.angularjs.org/guide/i18n
  • https://www.youtube.com/watch?v=6I_rONDvHq0

Angular-translate:

  • 基於key-value模式的本地化方式
  • 使用國際化的過濾器和指令
  • 插值服務,Non-angular style,使用變數替換
  • 支援單複數
  • 可以獨立獲取瀏覽器 Locale,但存在Bug
  • 支援非同步載入和同步載入
參考資料:
  • https://angular-translate.github.io/
  • https://www.youtube.com/watch?v=9CWifOK_Wi8
Angular-gettext
  • 自動使用value當做字串的key
  • 提供指令碼自動採取需要翻譯的字串
  • 插值服務,使用angular style
  • 支援指令和過濾器以及直接使用JS呼叫服務
  • 支援單複數
  • 支援上下文翻譯
  • 支援添加註釋
  • 第三方工具較多
參考資料:
  • https://angular-gettext.rocketeer.be/
第3種方案有其獨特的優點,但是在實際使用過程中也發現有一些問題:
  • source 中有換行的情況,抽取後使用了grunt 的指令碼htmlmin壓縮了html檔案,這樣會導致呼叫時key匹配不上的問題,解決方案是儘量使用規範的html書寫格式,刪除不必要的換行。
  • "&gt; &lt;"等字元包含在文字中時,提取到po檔案時會自動轉成明文“<>”,這樣是翻譯完後,會導致key無法匹配的問題,解決方案是做升級,在高版本中已經有相應的機制,會在替換函式裡面加轉義機制,如果是老版本只能重寫此函式,但是建議升級,不要本地維護這個庫。
至此,AngularJS 的國際化和本地化就告一段落,接下來會給大家分享Unicode Bidi Algorithm的一些知識。