LoginSignup
49
42

More than 5 years have passed since last update.

expressで国際化!i18n-nodeを使おう

Posted at

はじめに

Railsの国際化の記事は多いのですがexpressがあまりない悲しみ。基本的な流れはそんなに変わらないと思いつつ置いときます。こちらの環境はNode.JS 0.12.x + express4.9です。

express4のアプリを多言語化する

まずはi18nを入れましょう。githubのリポジトリ名はi18n-nodeですが、npm名はi18nです。

npm install i18n

このとき、app.jsの参考設定は下記の通りです。

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)があるとエラーするので注意しましょう。

locales/ja.jsonの一部抜粋.
    "addresses": {
        "Addressee": "送付先",
        "Name ": "お名前",
        "Address": "ご住所",
        "Phone": "お電話番号",
        "E-Mail": "E-Mail"
    },

swigを利用してviewに記載する場合は{{ __('addresses.E-Mail')}}のような形になります。

localeをマニュアル設定したい

普通にやるのであればget.locale(req)で取った値を利用しますが、今は英語がいい、今は日本語がいいなどあると思いますので、その場合はreq.session.locale内の値を変更します。

route/localechange.js(名前は適当).
  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を引いてくるのをお忘れなく。レッツ国際化対応!

おまけ:よくある動かないシーン

セッションを変更しているはずなのに言語が切り替わらないような場合、ほとんどの場合辞書ファイルの不具合です。変な場所にカンマがあったりコロンがなかったりなど、今一度確認してみましょう。

49
42
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
49
42