はじめに
Railsの国際化の記事は多いのですがexpressがあまりない悲しみ。基本的な流れはそんなに変わらないと思いつつ置いときます。こちらの環境はNode.JS 0.12.x + express4.9です。
express4のアプリを多言語化する
まずはi18nを入れましょう。githubのリポジトリ名はi18n-nodeですが、npm名はi18nです。
npm install i18n
このとき、app.jsの参考設定は下記の通りです。
var app = express();
var express = require('express');
var session = require('express-session');
var i18n = require("i18n");
//・・・中略・・・
// i18nの利用設定
i18n.configure({
// 利用するlocalesを設定。これが辞書ファイルとひも付きます
locales: ['ja', 'en'],
defaultLocale: 'ja',
// 辞書ファイルのありかを指定
directory: __dirname + "/locales",
// オブジェクトを利用したい場合はtrue
objectNotation: true
});
app.use(i18n.init);
// manualでi18nセッション管理できるように設定しておきます
app.use(function (req, res, next) {
if (req.session.locale) {
i18n.setLocale(req, req.session.locale);
}
next();
});
辞書ファイル('/locales'以下)についてはオブジェクト利用OKにしていくと入れ子が使えて便利です。末尾にカンマ(この例だと "E-Mail": "E-Mail",
になっていたらNG)があるとエラーするので注意しましょう。
"addresses": {
"Addressee": "送付先",
"Name ": "お名前",
"Address": "ご住所",
"Phone": "お電話番号",
"E-Mail": "E-Mail"
},
swigを利用してviewに記載する場合は{{ __('addresses.E-Mail')}}
のような形になります。
localeをマニュアル設定したい
普通にやるのであればget.locale(req)
で取った値を利用しますが、今は英語がいい、今は日本語がいいなどあると思いますので、その場合はreq.session.locale
内の値を変更します。
router.get('/:locale', function(req, res, next){
req.session.locale = req.params.locale;
res.redirect('back');
});
あとは、変更範囲が広いなどの場合にgetLocale(req)の値を使ってテンプレートの出しわけをする、などにも展開できます。route内で利用する場合は
var i18n = require('i18n');
var locale = i18n.getLocale(req);
のようにi18nを引いてくるのをお忘れなく。レッツ国際化対応!
おまけ:よくある動かないシーン
セッションを変更しているはずなのに言語が切り替わらないような場合、ほとんどの場合辞書ファイルの不具合です。変な場所にカンマがあったりコロンがなかったりなど、今一度確認してみましょう。