JavaScriptでアプリ開発していたとき・・・
こういう条件で多言語対応(i18n = internationalization)したい場面がありました。
- そこまで労力をかけたくない、
- サーバー側でアレコレしたくない、
- SEO的なことも考えなくていい、
- クライアント側で翻訳したい、
- でも自動翻訳とか使いたくない
そこでいいライブラリないかなと探していると・・・
Glottologist という良さ気なのを発見!
なんと1つのJSONファイルを用意すれば、多言語化対応ができるらしいです。
使ってみたら超便利だったので、
ここでは Glottologist でJavaScriptから多言語化するやり方 をまとめました。
このページの目次
手順1.まずは glottologist.js を読み込み
このライブラリは次のGitHubページからダウンロードできます。
▼ arguiot/Glottologist
必要なのは glottologist.min.js だけな模様
▼ CDN読み込みなら次のscriptタグを書けばOK
1 2 |
<!-- Glottologist読み込み --> <script src="https://unpkg.com/glottologist"></script> |
ちなみにページロード時に即翻訳なら head タグ内で読み込みがベストです。
逆に多言語化(i18n)を重視しないなら body タグ最後でもOKです。
手順2.多言語化するテキスト要素に glot-model クラス付与
お次はHTML側での設定。
翻訳テキストに glot-model 属性を付与していきます。
例えばリスト要素を作り、その中のテキストを翻訳したいなら・・・
各要素への glot-model 属性の付け方はこんな感じですね。
▼ リスト要素のHTML例
1 2 3 4 5 6 7 8 9 10 11 |
<ul> <li><span glot-model="label_eclair"> ECLAIR </span></li> <li><span glot-model="label_kitkat"> KITKAT </span></li> <li><span glot-model="label_oreo"> OREO </span></li> </ul> |
このようにテキスト要素を span とかで囲み、 glot-model に翻訳識別子を指定するだけ
ちなみに用途ごとに接頭辞をつけると分かりやすいかもしれません。
▼ 翻訳識別子前につける接頭辞例
- ラベル(テキスト全般) : label_
- ボタン : btn_
- プレースホルダー : hint_
- テキスト入力欄 : input_
名前の付け方はいろいろ工夫すればいいと思います。
手順3.翻訳用ファイル(JSON)を用意する
次に翻訳ファイルの用意
1つのJSONファイルを作るだけで英語・日本語などに複数対応できます。
その作り方は次のような感じ
たとえば作成ファイル名を glot-data.json としましょう。
その場合、 glot-model 属性 に対応する以下のJSONを作成していきます。
▼ 実際に作成した JSONファイルの内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "label_eclair": { "en": "Eclair", "ja": "エクレア" }, "label_kitkat": { "en": "KitKat", "ja": "キットカット" }, "label_oreo": { "en": "Oreo", "ja": "オレオ" } } |
HTMLで glot-model 属性の値を持つキーを作り、そのなかに "en" とか "ja" みたいな各言語ごとの翻訳テキストを定義していけばいいだけです。
手順4.翻訳ファイルを読み込み多言語化コード実行
あとは今用意したJSONを読み込み、翻訳を実行するだけです。
- Glottologistオブジェを作成
- JSONファイルを import メソッドから読み込み
- 読み込み後に render メソッドで翻訳実行
実際に試してみたコードはコチラ!
1 2 3 4 5 6 |
window.addEventListener('DOMContentLoaded', function(){ var glot = new Glottologist(); glot.import("data.json").then(() => { glot.render(); }); }); |
そして実際のページを開いて見ると・・・
見事に多言語化されてました!
たった1つのJSONで多言語化できるのは便利ですね。
補足.ちなみにローカルから翻訳JSONを読み込むには
ただしこのライブラリ、1つ問題があります。
それは Glottologist#import からローカルファイルが読み込めないこと
実際にローカルからJSON読み込みすると、次のエラーが出てしまうんです。
1 |
glottologist.min.js:1 Fetch API cannot load file:///C:/example/html/glot-dict.json.js. URL scheme must be "http" or "https" for CORS request. |
CROSポリシー違反でこういうエラーが出る模様・・・
この解決策は script を動的に読み込むテクニックを使うことですね。
▼ ちょうどこの記事で解説したやつ
実際に このテクニック+一工夫 すれば、ローカルJSONでも読み込みできます。
そのやり方は次の通り
1.まず JS としてJSONを定義
▼ glot-dict.json.js として作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
const GLOT_DICT_JSON = { "label_eclair": { "en": "Eclair", "ja": "エクレア" }, "label_kitkat": { "en": "KitKat", "ja": "キットカット" }, "label_oreo": { "en": "Oreo", "ja": "オレオ" } } |
2.scriptを動的に読み込んで翻訳
▼ こんなコード
1 2 3 4 5 6 7 8 9 10 11 |
var glot = new Glottologist(); var script = document.createElement("script"); script.type = "text/javascript"; script.src = "file:///C:/example/html/glot-dict.json.js"; script.onload = function(){ Object.keys(GLOT_DICT).forEach(function(key, idx){ glot.assign(key, this[key]); }, GLOT_DICT); glot.render(); }; document.body.appendChild(script); |
もしローカルファイルから 翻訳したい場合は、このコードを試してみてください。
蛇足.多言語化(i18n)する別の方法
最後に蛇足。
多言語化(i18n)するなら、次みたいな方法 もあります。
▼PHP+gettext による多言語化(i18n)マニュアル
▼ JavaScriptからGoogle翻訳を使えるAPI
サーバー側で多言語化するなら PHP + gettext が確実ですね。(面倒だけど・・・)
ここまでのまとめ
以上、JavaScriptで本格的に多言語化対応するやり方でした。
ただし、この方法は次の目的なら使うのはNGです。
- 日本以外でもSEO集客がしたい
- 検索流入をもっと増やしたい
SEO的な事情があるなら、PHP+gettext のやり方 をオススメします。