国際化対応のアプリを作る事になった
調べた感じだとクロスプラットフォーム開発環境で更新されているものは少なくなっていた。
Unityだとバイナリが無駄にデカいので今回はflutterで行う事にしました。
flutterの言語はdartで、C++/C#, kotlin, javaに似ているので比較的に入りやすい言語な感じですね。
国際化対応する場合も比較的使いやすい機能が公式(flutter_localizations)であるのですが、各言語毎にファイル(ARB)を作ると管理が面倒くさいので、個人的には表形式で管理したい。
調べたところ、fast_i18nというライブラリが良さそうですが、開発はslangに移行しているようなのでslangを使用することにしました。
jsonやyamlでも管理できますが、今回はCSVです。
CSVにする理由
CSVにする理由は幾つかありますが大ざっぱに纏めると以下になります。
- 言語ファイルは、エンジニア以外にも編集してもらいたい
エンジニア以外にjsonやyamlで入力してくださいとは言いにくい - 言語毎に入力者は別の人なのでデータのコンフリクトを考えると共同編集できるようにしたい(GoogleSpreadSheet)
- CSVならEXCELやSpreadSheetから持ってこれるので編集も管理も容易になる
今回はSpreadSheetをpythonからGoogleAPIでCSVに書き出した後「flutter pub run slang」を実行するにした - 未対応のワードの抽出は、slangの機能にあるが、CSVの様な一覧性があれば抜けは見れば分かるので見落としは少ないはず
言語一覧の表示に使うリストをどうするか?
さて、本題の言語一覧の表示に使うリストをどうするかです。
とりあえず他の人はどうしているか知る為に、幾つかのサイトでみると……。
ふむふむ。
こんな感じで使用可能言語一覧をハードコードしてドロップダウンリストに表示するコートが多そうな印象です。
{
"en" : "English",
"ja" : "日本語",
}
うむむ。
自分があっているかどうか分からないものをコードで管理したくない。
出来れば分からないものは分かる人にお願いしたい。
という事でデータを基に表示するようにしたい。
slangのデータをビルドすると、i18n.g.dart(変換後のソースファイル名)にAppLocaleというenum型があります。
都合が良い事に、enumの要素から言語クラスに紐づいています。
後は、紐づいたクラスで特定のキー(今回はlanguage)の値を取得できれば…
言語選択時に表示する表示項目を作っておく(i18n.csv)
key | en | ja | ... |
---|---|---|---|
language | English | 日本語 | ... |
コードにするとこんな感じ
var languages = {};
for(var value in AppLocale.values) {
languages[value.languageCode] = value.build().language;
}
print(languages);
print(languages)の結果
{
en: English,
ja: 日本語
}
という事で、無事データから表示するようにできました。
めでたし、めでたし。