人気ブログランキング | 話題のタグを見る
node.js + expressにおける多言語化の考察
目的:
本稿はnode.js+expressにおいて多言語化をどのようにするか考察する。

サンプル:
http://needtec.sakura.ne.jp/release/node_globalization_sample.zip

このサンプルはログイン画面とユーザ登録画面について、多言語化対応できるように実装している。
Sequelizeのエラーメッセージについては、対応できていない




基本的な考え方:
特定のファイルのみにメッセージ情報を記述する。
メッセージ情報とは、エラー時に出力するメッセージだったり、ボタンのタイトルだったりする。
ここではroutes/message.jsonがこの役割を担っている。

message.jsonの内容:

{
"message": {
"error": {
"NotfoundUser": "ユーザ名(%s)は存在しないかパスワードが間違っています.",
"DatabaseError": "データベースの接続に失敗しました。<BR>%s",
"DuplicateError": "%s:%sはすでに登録されています"
}
},
"view": {
"login": {
"title" : "ログイン",
"linkToRegister": "新規登録",
"email": "メールアドレス",
"password": "パスワード",
"doLogin": "ログイン"
},
"register": {
"title" : "ユーザ登録",
"email": "メールアドレス",
"password": "パスワード",
"passwordConfirm": "確認用パスワード",
"doRegister": "新規登録",
"MissmatchPassword": "入力したパスワードが一致しません",
"Success": "ユーザの登録に成功しました。"
}
},
"model": {
"User": {
"username": "メールアドレス",
"password": "パスワード"
}
}
}


多言語化対応を行う場合は、このmessage.jsonと同様のファイルを対応言語分用意して、切り替えればよい。


Ajaxのエラーメッセージの多言語化

Ajaxの戻り値をJSONで返す場合を考えてみる。
この場合はサーバ側でエラーメッセージを構築して帰してやればよい。
この際、重要なのは、ロジック中に直接文字を記述せずに、かならず、コードを指定してやる必要があるということだ。
この例ではcommon.getMessageにコードを指定し、エラーメッセージを作成している。

router/login.jsより

var data = {};
if (result) {
data = {result: true};
req.session.user = email;
data = {
result: true
};
} else {
data = {
result: false,
error: common.getMessage('error',
'NotfoundUser',
[email])
};
}
res.contentType('application/json');
var json = JSON.stringify(data);
res.send(json);




routes/common.jsより

var util = require('util');
var message = require('./message.json');
/**
* メッセージの取得
* @param {string} category カテゴリ名
* @param {string} id ID
* @param {Array} args 引数の配列
*/
function _getMessage(category, id, args) {
var msg = message.message[category];
if (msg) {
if (msg[id]) {
var param = [msg[id]];
param = param.concat(args);
return util.format.apply(this, param);
}
}
return util.format('category:%s id:%s args:%s' ,category, id, args);
}


Viewにおけるメッセージの構築
ボタンのタイトルやラベルの文字を多言語化するには、レンダリングするさいに、ビューで必要なメッセージをすべて渡せばよい

routes/register.jsより


exports.register = function(req, res){
res.render('register',
{ message: common.getViewMessage('register') });
};



routes/common.jsより

function _getViewMessage(category) {
var msg = message.view[category];
if (msg) {
return msg;
} else {
return {};
}
}


views/register.jade

doctype html
html
head
title #{message.title}
link(rel='stylesheet', href='/stylesheets/style.css')
link(rel='stylesheet', href='/javascripts/lib/msgbox/msgBoxLight.css')
script(type='text/javascript', src='/javascripts/lib/jquery-1.11.1.min.js')
script(type='text/javascript', src='/javascripts/lib/msgbox/jquery.msgBox.js')
script(type='text/javascript', src='/javascripts/src/ui_util.js')
script(type='text/javascript', src='/javascripts/src/register.js')
body
h2 #{message.title}
form(action='/login/doRegister' method='POST')#registerForm
div #{message.email}.
input(type='text', name='email', placeholder='#{message.email}')
div #{message.password}.
input(type='password' name='password', placeholder='#{message.password}')
div #{message.passwordConfirm}.
input(type='password' name='passwordConfirm', placeholder='#{message.passwordConfirm}')
div
button #{message.doRegister}
div#message(style='display:none')
- for(var key in message) {
div(id='#{key}') #{message[key]}
-}



最後のループで隠し領域にすべてのメッセージを記述している。
これにより、クライアントサイドのJavaScriptでも以下のようにして、メッセージを使用することができる。


/**
* メッセージの取得
*/
function _getMessage(id) {
return $('#message').find('#' + id).text();
}
console.log(_getMessage('Success'));


by mima_ita | 2014-06-08 00:09 | node.js
<< seleniumを使ってJav... sequelizeによるマイグ... >>



実験ですお

by mima_ita
検索
カテゴリ
最新の記事
.NET4.5におけるasy..
at 2014-07-02 00:46
.NETでTwitterを検..
at 2014-06-29 00:49
Redmineのプラグインで..
at 2014-06-28 03:29
IO.popenのwrite..
at 2014-06-28 03:25
RedmineのWikiでU..
at 2014-06-28 03:16
以前の記事
最新のトラックバック
その他のジャンル
ブログパーツ