あいつの日誌β

働きながら旅しています。

express で国際化したい

あらすじ

そろそろ最初から国外を視野に入れてサービスを始めるご時世のようです。

準備

mkdir practice-i18 && cd $_
npm init --yes
echo 'node_modules' > .gitignore
git init && git add . && git commit -m 'initial commit'
npm install express i18n --save
npm install supertest power-assert --save-dev

以下は個人的な設定

echo '**/node_modules/'  > .eslintignore
curl -sO https://raw.githubusercontent.com/nodejs/node/master/.eslintrc
sed -i -e 's/require-buffer: /# require-buffer: /' .eslintrc
sed -i -e 's/new-with-error: /# new-with-error: /' .eslintrc
git add .eslintignore .eslintrc && git commit -am 'use eslint'

国際化した例

create app.js:

'use strict';
const express = require('express');
const i18n = require('i18n');

const app = express();

i18n.configure({
  locales: ['ja', 'en'],
  queryParameter: 'lang',
  directory: __dirname + '/locales'
});

app.use(i18n.init);

app.get('/', (req, res) => {
  console.log(res.locals.locale);
  res.send(res.__('Hello World'));
});

if (!module.parent) {
  app.listen(3000, () => {
    console.log('Example app listening on port 3000!');
  });
}
module.exports = app;

create test_app.js:

/*global describe, it */
'use strict';

const assert = require('power-assert');
const request = require('supertest');
const app = require('../app');

describe('GET /', function() {

  it('returns english', function(done) {
    request(app)
    .get('/')
    .expect(200)
    .end((err, res) => {
      assert.ok(res.text === 'Hello World');
      done();
    });
  });

  it('returns japanese', function(done) {
    request(app)
    .get('/?lang=ja')
    .expect(200)
    .end((err, res) => {
      assert.ok(res.text === 'こんにちは世界');
      done();
    });
  });
});

create locales/en.json:

{
  "Hello World": "Hello World"
}

create locales/ja.json:

{
  "Hello World": "こんにちは世界"
}

動作確認

mocha で実行すると queryParams に応じて lang が指定されます。デフォルトだと en が指定されます。

ブラウザ経由で実行するとブラウザの言語設定に応じて app.localse.locale の値が反映されるので queryParams を指定しない場合はその値が使用されると思います。

おしまい