_ NativeScriptでの多言語対応
NativeScriptで多言語対応アプリを作る場合、以下のプラグインを使用します。
nativescript-localization
このプラグインの特徴は以下の通りです。
- app.tsで2行記述しておけばどこでも使える(XML)。
- OSの言語に合わせて言語を選択する。(動的変更はiOSのみ対応)
本当は動的に変更したいのですが、そこは「Androidはまだ未対応」とのことなので、対応されるのを待ちましょう・・・。
_ ファイルの構成
appディレクトリの下にi18nというディレクトリを作り、そこに言語毎のファイルを置きます。
app
+-i18n
+- en.default.json
+- ja.json
ファイル名に「default」を付けると、適当な言語ファイルが無いときにそれが選択されます(上記の例ではOSの設定がフランス語の場合、英語が選択されます)。
それぞれのファイルの中身は以下の通りです。
■en.default.json
1
2
3
4
5
6
7
8
9
10
11
| { "app.name": "My App", "ios.info.plist": { "NSLocationWhenInUseUsageDescription": "This will be added to InfoPlist.strings" }, "hello.world": "Hello World !", "action": { "back": "Back" } }
|
■ja.json
1
2
3
| { "hello.world": "こんにちわ 世界 !",}
|
_ 実装
アプリに適用するには、app.tsでプラグインを読み込みます。
1
2
3
| import * as localize from "nativescript-localize"; app.setResources({ L: localize });
|
xml内で、以下のように使用します。
1
| <Label text="{{ L('hello.world') }}" />
|
プログラム内で使用する場合は以下です。
1
2
3
| import { localize } as localize from "nativescript-localize"; console.log(localize('hello.world'));
|
ちなみに上記の例では、日本語環境では「こんにちわ 世界 !」、その他の言語環境では「Hello World !」と表示されます。ja.jsonに定義が無いaction.backであれば、何語の環境でも「Back」が表示されます。
_ app-root.xmlへの適用
TabViewやBottomNavigationを使用している場合、app-root.xmlにそれらの定義が書かれていると思います。
■app-root.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| <BottomNavigation id="bottom_navigation" class="ns-dark"> <TabStrip> <TabStripItem class="navigation__item"> <Label text="{{ L('tab.home') }}" /> <Image src="font://" class="fas" /> </TabStripItem> <TabStripItem class="navigation__item"> <Label text="{{ L('tab.browse') }}" /> <Image src="font://" class="fas" /> </TabStripItem> <TabStripItem class="navigation__item"> <Label text="{{ L('tab.search') }}" /> <Image src="font://" class="fas" /> </TabStripItem> </TabStrip> <TabContentItem> <Frame defaultPage="home/home-page" /> </TabContentItem> <TabContentItem> <Frame defaultPage="browse/browse-page" /> </TabContentItem> <TabContentItem> <Frame defaultPage="search/search-page" /> </TabContentItem></BottomNavigation>
|
しかし、実はこのままでは言語が展開してくれません。bindingしなければ文言が置き換わらないからです。
従って、以下のようにloadedイベントでbindingをしてあげる必要があります。
■app-root.xml
1
2
| <BottomNavigation id="bottom_navigation" class="ns-dark" loaded="onLoaded"> :
|
■app-root.ts
1
2
3
4
5
6
7
| import { Page } from "tns-core-modules/ui/page/page";import { EventData } from "tns-core-modules/data/observable"; export function onLoaded(args: EventData) { let page = <Page>args.object; page.bindingContext = {}; // localizationを効かす}
|
以上
こちらは製造業のローカライゼーション。グローバル化でも現地に合わせるローカライゼーションが必要というお話のようです。何をするにしてもターゲットを拡げるには手間がかかりますね・・・。
|
|