#blog2navi()
*NativeScriptでの多言語対応 [#ed961f89]
~NativeScriptで多言語対応アプリを作る場合、以下のプラグインを使用します。~
[[nativescript-localization:https://www.npmjs.com/package/nativescript-localize]]
~このプラグインの特徴は以下の通りです。
-- app.tsで2行記述しておけばどこでも使える(XML)。
-- OSの言語に合わせて言語を選択する。(動的変更はiOSのみ対応)~
本当は動的に変更したいのですが、そこは「Androidはまだ未対応」とのことなので、対応されるのを待ちましょう・・・。
** ファイルの構成 [#q4b6b632]
~appディレクトリの下に&inlinecode{i18n};というディレクトリを作り、そこに言語毎のファイルを置きます。
app
+-i18n
+- en.default.json
+- ja.json
~ファイル名に「default」を付けると、適当な言語ファイルが無いときにそれが選択されます(上記の例ではOSの設定がフランス語の場合、英語が選択されます)。~
それぞれのファイルの中身は以下の通りです。~
~
■en.default.json
#code(php){{{
{
"app.name": "My App",
"ios.info.plist": {
"NSLocationWhenInUseUsageDescription": "This will be added to InfoPlist.strings"
},
"hello.world": "Hello World !",
"action": {
"back": "Back"
}
}
}}}
~
■ja.json
#code(php){{{
{
"hello.world": "こんにちわ 世界 !",
}
}}}
** 実装 [#x6d0a465]
~アプリに適用するには、app.tsでプラグインを読み込みます。
#code(php){{{
import * as localize from "nativescript-localize";
app.setResources({ L: localize });
}}}
~
~xml内で、以下のように使用します。
#code(php){{{
<Label text="{{ L('hello.world') }}" />
}}}
~
~プログラム内で使用する場合は以下です。
#code(php){{{
import { localize } as localize from "nativescript-localize";
console.log(localize('hello.world'));
}}}
~
~ちなみに上記の例では、日本語環境では「こんにちわ 世界 !」、その他の言語環境では「Hello World !」と表示されます。&inlinecode{ja.json};に定義が無い&inlinecode{action.back};であれば、何語の環境でも「Back」が表示されます。
** app-root.xmlへの適用 [#v57f8ee9]
~[[TabView:https://www.nsdocjp.work/6/ui/components/tab-view.php]]や[[BottomNavigation:https://www.nsdocjp.work/6/ui/components/bottom-navigation.php]]を使用している場合、app-root.xmlにそれらの定義が書かれていると思います。~
~
■app-root.xml
#code(php){{{
<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
#code(php){{{
<BottomNavigation id="bottom_navigation" class="ns-dark" loaded="onLoaded">
:
}}}
~
■app-root.ts
#code(php){{{
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を効かす
}
}}}
~
以上
#htmlinsert(twitterbutton.html)
RIGHT:Category: [[[NativeScript>日記/Category/NativeScript]]] - 17:11:06
----
#htmlinsert(20191128_localization.html)
----
RIGHT:&blog2trackback();
#comment(above)
#blog2navi()