Flutterを多言語化するには、実際にアプリに表示するテキストを各言語に翻訳した「arbファイル」が必要です。
翻訳方法はいろいろありますが、Googleスプレッドシートを使うと「GOOGLETRANSLATE関数(翻訳関数)」とその他の簡単な関数を組み合わせて、ほぼ自動でarbファイル用のテキストが完成します。
スプレッドシートに丸ごとコピペするだけで使える数式のフォーマットを公開していますので、ご自由にお使いください。
(翻訳の精度やその他トラブルに責任は負えません。自己責任でお使いください。)
arbの作成時だけでなく、その後の追加・修正の管理にも役立つと思います。
ここで作成する文字リソースは、「Flutter Intl」と「flutter_localizations」を前提にしています。
これらのツールの導入方法・使い方はこちらを参照
- Flutter : 3.27.1
- Dart : 3.6.0
- Intl : 1.18.5-2023.2
- flutter_localizations
コピペで完成:翻訳リソースの作り方
まずは、Googleスプレッドシートを開いてください。
新規作成でも、シートのみの新規作成でもOKです。
下記が、Googleスプレッドシートの計算式のテキスト(フォーマット)です。
key ja =CONCATENATE(B1, "_先頭大文字") =CONCATENATE(B1, "_他") =CONCATENATE(B1, "_完成") en =CONCATENATE(F1, "_先頭大文字") =CONCATENATE(F1, "_他") =CONCATENATE(F1, "_完成")
yes はい =concatenate(UPPER(left(B2,1)),MID(B2,2,len(B2)-1)) =CONCATENATE(CHAR(34), $A2, CHAR(34),": ",CHAR(34), if(D2="", C2, D2), CHAR(34), ",") =GOOGLETRANSLATE($B2,$B$1,F$1) =concatenate(UPPER(left(F2,1)),MID(F2,2,len(F2)-1)) =CONCATENATE(CHAR(34), $A2, CHAR(34),": ",CHAR(34), if(H2="", G2, H2), CHAR(34), ",")
no いいえ =concatenate(UPPER(left(B3,1)),MID(B3,2,len(B3)-1)) =CONCATENATE(CHAR(34), $A3, CHAR(34),": ",CHAR(34), if(D3="", C3, D3), CHAR(34), ",") =GOOGLETRANSLATE($B3,$B$1,F$1) =concatenate(UPPER(left(F3,1)),MID(F3,2,len(F3)-1)) =CONCATENATE(CHAR(34), $A3, CHAR(34),": ",CHAR(34), if(H3="", G3, H3), CHAR(34), ",")
cancel キャンセル =concatenate(UPPER(left(B4,1)),MID(B4,2,len(B4)-1)) =CONCATENATE(CHAR(34), $A4, CHAR(34),": ",CHAR(34), if(D4="", C4, D4), CHAR(34), ",") =GOOGLETRANSLATE($B4,$B$1,F$1) =concatenate(UPPER(left(F4,1)),MID(F4,2,len(F4)-1)) =CONCATENATE(CHAR(34), $A4, CHAR(34),": ",CHAR(34), if(H4="", G4, H4), CHAR(34), ",")
confirm 実行しますか? =concatenate(UPPER(left(B5,1)),MID(B5,2,len(B5)-1)) =CONCATENATE(CHAR(34), $A5, CHAR(34),": ",CHAR(34), if(D5="", C5, D5), CHAR(34), ",") =GOOGLETRANSLATE($B5,$B$1,F$1) =concatenate(UPPER(left(F5,1)),MID(F5,2,len(F5)-1)) Are you sure? =CONCATENATE(CHAR(34), $A5, CHAR(34),": ",CHAR(34), if(H5="", G5, H5), CHAR(34), ",")
delete 削除 =concatenate(UPPER(left(B6,1)),MID(B6,2,len(B6)-1)) =CONCATENATE(CHAR(34), $A6, CHAR(34),": ",CHAR(34), if(D6="", C6, D6), CHAR(34), ",") =GOOGLETRANSLATE($B6,$B$1,F$1) =concatenate(UPPER(left(F6,1)),MID(F6,2,len(F6)-1)) =CONCATENATE(CHAR(34), $A6, CHAR(34),": ",CHAR(34), if(H6="", G6, H6), CHAR(34), ",")
この上記テキストをコピーして、一旦、何か別のエディタなどにペーストします。
エディタにペーストしたテキストを再度コピーし直して、Googleスプレッドシートの「A1」に貼り付けてください。
サンプルとして、2言語(日本語と英語)と、5行分の文字列が入っています。
他のエディタを通さずにそのままスプレッドシートに貼り付けると、タブ文字がスペースに変換されて、うまくいきません。
シートの構成と使い方
このスプレッドシートでは、「B列」に入力した日本語をもとにして、「F列」の英語を自動翻訳しています。
自動翻訳には「GOOGLETRANSLATE関数」を使っています。
最終的に日本語arbファイルに必要なのは「E列」の「ja_完成」の2行目以降です。
Android Studioで開いた「intl_ja.arb」ファイルの{ }
の中に貼り付けてください。
英語は「I列」の「en_完成」が完成形です。
こちらも日本語と同様に、「I列」の2行目以降を「intl_en.arb」ファイルの{ }
の中に貼り付けて使ってください。
以下で、詳しく説明します。
「GOOGLETRANSLATE関数」は、インターネットにつながっていないと動きません。
また、一度に大量のセルを翻訳しようとすると、使用制限のエラーが出る可能性があります。
その場合は、ファイルを分けるなどの対策をしてみて下さい。
翻訳関数は、Googleスプレッドシートでは以前からありましたが、Excelでは2024年7月に「TRANSLATE() 」という翻訳関数が登場しました。
各言語共通で使用する「key」:「A列」
「A列」の「key」は、Flutterから文字列を呼び出すときのプロパティ名になるキーワードです。
見出し行(1行目)の「key」という文字は、JSONコードの仕上がりには影響しません。
他の文字に変更したければ、変えてもOKです。
翻訳元の言語:「B〜E列」
「B列」〜「E列」で、一つ目の言語を作成しています。
ここでは、日本語が入っています。
この一番目で入力した言語が、他の言語を作成するときの翻訳の元にもなります。
「B列」:「言語コード」と「表示文字列」
「B列」の1行目は、この列に入力する言語の「言語コード(ISO 639-1)」です。
ここでは「日本語」を表す「ja」を入力しています。
2行目以降には、1行目の言語コードで表示する文字列(Flutterアプリに実際に表示する文字列)を入力します。
「C列」:「B列」の先頭を大文字変換
「C列」では、「B列」のテキストの先頭のみを大文字に変換する数式が入っています。
この例のような日本語だけなら、大文字変換は必要ありませんが、日本語でも先頭にアルファベットが来る場合や、「B列」に日本語以外を設定する場合にも備えて入れときました。
「D列」:「C列」の自動計算のテキストを書き換える
「D列」は、「C列」で自動計算されたテキストではなく、別の表記をしたい場合に自由に入力できる列です。
「D列」に入力があると、「C列」の値は使われず、「D列」の値が使われます。
「E列」:完成した記述
「E列」では、「A〜D列」の値を参照して、最終的なJSONコードを作成しています。
この列の2行目以降の値をコピーして、「intl_ja.arb」ファイルの{ }
の中に貼り付ければ、多言語表記の日本語文字リソースの完成です。
JSON形式では、行の先頭は2字下げする慣習があったり、最終行の行末には,
(カンマ)はつけないというルールがあります。
コピーした文字リソースの最終行にはカンマがありますが、Android Studioで「intl_ja.arb」ファイルにペーストする場合は、コード補完機能で、JSONのルールが適用されるように自動で補ってくれます。
細かな体裁は気にせずにペーストして大丈夫です。
もし、文法エラーがある場合は、赤い線でエラー表示されます。
もとの言語から翻訳:「F〜I列」
「F〜I列」では、英語のテキストを作成しています。
「F列」の1行目に、「B1の言語(日本語)」から翻訳して表示したい言語コードを入力します。
(ここでは「en(英語)」)
すると、「GOOGLETRANSLATE()」関数が、英語に翻訳したテキストが「F列」に表示されます。
「G〜I列」は、日本語の「C〜E列」と同様の数式で自動計算しています。
「I列」の完成形を、「intl_en.arb」ファイルの{ }
の中にコピペして使用してください。
3言語目以上の文字リソースの作り方
サンプルでは「日本語」をもとに「英語」を作成しましたが、もし3言語目以降を作成する場合は、英語の列(「F〜I列」)をコピーして、「J列」以降に貼り付けます。
「J列」の1行目に、作成したい言語の「言語コード」を入力してください。
3言語目以降を「J列」以降に作成していくと、シートが横長になって見渡しが悪くなるかもしれませんが、各言語間で定義の作成モレを防ぐためには、ひとつにシートで管理するのがオススメです。
Android Studioではコード補完はしてくれますが、全ての言語で必要なキーが揃っているかどうかのチェックはされません。
でも翻訳の数が大量になると、エラーになる場合があるので、そのときはファイルを分けるなどの対策をしてみてください。
arbファイル作成時の注意
arbファイルはテキストファイルなので、Android Studioとは全く関係のないテキストエディタで作って、flutterプロジェクトのフォルダにファイルごと配置することもできます。
その際は、言語コードの入力間違いなど、ファイル名の付け間違いに注意してください。
Flutterに導入するパッケージ・プラグインによって、命名規則が決まっています。
間違わずにファイルを作るためには、Android Studioのメニューバーから[Tools]>[Flutter intl]>[Add locale]を実行してファイルを作るのがオススメです。
メニューから作成すると、言語コードを入れるだけで中身の空っぽの{}
だけの入ったarbファイルが作られます。
もし言語コードが間違って入力された場合は、エラーではじかれるので安心です。
[Tools]>[Flutter intl]というメニューは、
「Flutter Intl」というプラグインをインストールすると表示されます。
arbファイルの形式
今更ですが、arbファイルの形式についても少し触れておきます。
- 全体を
{ }
で囲む - ひとつの文字列ごとに「”(キーとなるワード)”:”(表示する文字列)”」で定義する
- 各行はカンマ
,
で区切る - 最終行には
,
はつけない
arbファイルは、JSON形式で記述します。
全体を{ }
で囲んで、その中に「キー」となるワードと、そのキーで表示される「文字列」の組み合わせを1行ずつ記述します。
各行はカンマ,
で区切りますが、最終行には,
はつけません。
日本語ならこんな
{
"yes": "はい",
"no": "いいえ"
}
英語なら、こんな
{
"yes": "Yes",
"no": "No"
}
コメント