狠狠撸

狠狠撸Share a Scribd company logo
pixivとL10N/i18n
うさみけんた@tadsan
2014-06-06 pixiv社内勉強会
お前谁よ
お前谁よ
? うさみけんた a.k.a Zonu.EXE(ぞ)
? 2012年に自宅警備職を廃業いたしました
? 時代の波に乗れてなくてEmacsとVimで開発…
? 仕事では地味なボトルネックを殺して回ったり
? プログラミング言語すきです
? Swingの良いとこどり感は良いですね
scripter = ->(*args){ ->{ puts args.join("n") } }	
title = ->(text) { "『#{text}』n" }	
paragraph = ->(*args){ args.join("n") + "n" }	
chara = ->(name) { ->(text){ "#{name}「#{text}」"} }	
ryu = chara[:リュウ]; tak = chara[:たかし]	
script = scripter[title[:俺より強い奴に、会いに行く],	
paragraph[:ピンポーン, ryu[:こんにちは], tak[:はいどなた]],	
paragraph[ryu[:いまちょっといいですか], tak[:これから出かけます]],	
paragraph[ryu[:午後出勤ですか?], tak[:はい]],	
paragraph[ryu[:強そうですね], tak[:なにがですか]],	
paragraph[ryu[:態度が]],	
paragraph[:リュウは、自分より強そうな奴に、会いにいったのだった。?完]	
]	
script[]
クロージャを使ったDSL
はじめに
用語説明
L10N: Localization (ろーからいぜーしょん)

i18n : Internationalization
(いんたーなしょならいぜーしょん)
L10N: Localization (ろーからいぜーしょん)
(えるじゅーえぬ)
!
(いんたーなしょならいぜーしょん)
(あいじゅーはちえぬ)
詳しくはWikipediaでもお読みください
http://en.wikipedia.org/wiki/Internationalization_and_localization
http://ja.wikipedia.org/wiki/%E5%9B%BD%E9%9A%9B%E5%8C
%96%E3%81%A8%E5%9C%B0%E5%9F%9F%E5%8C%96
L10N: Localization (ろーからいぜーしょん)
(えるじゅーえぬ) → 地域化
!
(いんたーなしょならいぜーしょん)
(あいじゅーはちえぬ) → 国際化
辫颈虫颈惫と颈18苍
辫颈虫颈惫と濒10苍/颈18苍
辫颈虫颈惫と濒10苍/颈18苍
pixivの文言数:
およそ2000*9言語
日本語
英語
フランス語
韓国語
ロシア語
タイ語
簡体字中国語
繁体字中国語
スペイン語
辫颈虫颈惫と濒10苍/颈18苍
文字セット
文字の方向性
文言
数値書式(小数点,桁区切りなど)
日時書式(年月日/暦)
日時情報の時差
通貨情報
Unicode
BiDiは考慮しない
各文言を翻訳
サポートしない
対応
JST
JPY
実装方法
かなり适当
よくある実装
自然言語文を言語リソースに分割する
!
? よくある多言語化の実現方法はこれ
? 実装例… ありすぎて枚挙に暇がない!
? GNU gettext
? rails-i18n
现在の辫颈虫颈惫
<form>	
<legend>%!IDまたはパスワードを忘れてしまった%</legend>	
<dl>	
<dt>%!忘れた内容% %!(ほげほげ)%</dt>	
<dd><ul><li>%!pixiv IDを忘れた%</li>	
<li>%!パスワードを忘れた%</li></ul></dd>	
<dt>%!メールアドレス%</dt>	
<dd><input name="mail_address" type="text" /></dd>	
</dl>	
<p>%!※忘れてしまったものを選択し、登録メールアドレスを入力して送信してくだ
さい。%</p>	
<p>%!メールアドレスがご不明な場合は<a href="/support.php">サポート窓
口</a>までご連絡ください。%</p>	
<button type="submit">%!送信%</button>	
</form>
テンプレート
<form>	
<legend>%!IDまたはパスワードを忘れてしまった%</legend>	
<dl>	
<dt>%!忘れた内容% %!(ほげほげ)%</dt>	
<dd><ul><li>%!pixiv IDを忘れた%</li>	
<li>%!パスワードを忘れた%</li></ul></dd>	
<dt>%!メールアドレス%</dt>	
<dd><input name="mail_address" type="text" /></dd>	
</dl>	
<p>%!※忘れてしまったものを選択し、登録メールアドレスを入力して送信してくだ
さい。%</p>	
<p>%!メールアドレスがご不明な場合は<a href="/support.php">サポート窓
口</a>までご連絡ください。%</p>	
<button type="submit">%!送信%</button>	
</form>
テンプレート
Smarty prefilter!
return array(	
...	
'IDまたはパスワードを忘れてしまった'=>'Forgot your pixiv ID or password?'	
'忘れた内容' => 'Which did you forget?',	
'pixiv IDを忘れた' => 'Forgot pixiv ID',	
'パスワードを忘れた' => 'Forgot password',	
'メールアドレス' => 'E-mail address',	
'※忘れてしまったものを選択し、…'=>'Select an option, enter your register…'	
'メールアドレスがご不明な場合…' =>'For mail address issues, please conta…'	
'送信' => 'Submit',	
...	
);
Lang/en.php
%!IDまたはパスワードを忘れてしまった%	
%!忘れた内容%	
%!pixiv IDを忘れた%	
%!パスワードを忘れた%	
%!メールアドレス%	
%!※忘れてしまったものを選択し、…%	
%!メールアドレスがご不明な場合…%	
%!送信%	
%!(ほげほげ)%
置換
?Forgot your pixiv ID or password?	
?Which did you forget?	
?Forgot pixiv ID	
?Forgot password	
?E-mail address	 	
?Select an option, enter your register…	
?For mail address issues, please conta…	
?Submit	
?(ほげほげ) ←配列にないので同じ文字列が返る
<form>	
<legend>Forgot your pixiv ID or password?</legend>	
<dl>	
<dt>Which did you forget? (ほげほげ)</dt>	
<dd><ul><li>Forgot pixiv ID</li>	
<li>Forgot password</li></ul></dd>	
<dt>E-mail address</dt>	
<dd><input name="mail_address" type="text" /></dd>	
</dl>	
<p>Select an option, enter your registered email address, and
click “Send”.</p>	
<p>For mail address issues, please contact use through our <a
href="/support.php">support center</a>.</p>	
<button type="submit">%!Submit%</button>	
</form>
置換後
単純置換では?
困るパターン
辫颈虫颈惫と濒10苍/颈18苍
日时の国际化
辫颈虫颈惫と濒10苍/颈18苍
長らくメンテナンスさ
れてなかったが、最近
rails-i18nの定義を流
用して各言語対応した
タグ翻訳
(Attack on Titan)
辫颈虫颈惫と濒10苍/颈18苍
日本語以外で入力された
文字列がよしなに正規化される!
実装方法
return array(	
...	
'attack on titan' => '進撃の巨人', // en	
'avance de dikxion' => '進撃の巨人', // es	
'????????????' => '進撃の巨人', // th	
'进击的巨?人' => '進撃の巨人', // zh	
'進擊的巨人' => '進撃の巨人', // zw-tw	
'??? ??' => '進撃の巨人', // ko	
...	
);
CorrectTag.php
超原始的
特徴
実装は超単純
利用者の入力を正規化して配列からとるだけ
実行時のパフォーマンスも良好
!
!
そもそもタグに利用される語彙と翻訳の概念
のミスマッチを人間が吸収する必要があり、
メンテナンスコストが過剰に高い。
欠点
連想配列のキーである性質上、完全一致する
必要があり、表記揺れに極端に弱い。
翻訳者が歴史的経
緯を知らない場合
間違ってるわけでは
ないが正しくもない
例: 偽春菜問題
(「偽春菜」はソフトウェ
アの正式名称ではないが、
中国語圏では「伺か」など
を「偽春菜」と呼称する)
!
↑この説明も正確じゃない
// 翻訳者によって方針が一貫しない	
'aoharu railway' => '青春鉄道', // en	
'aoharu tetsudo' => '青春鉄道', // fr	
!
// 日本語の長音表記	
'heisuke toudou' => '藤堂平助', // en	
'heisuke tōdō' => '藤堂平助', // es
まとめ:
pixivはインテリジェントな
機構で国際化されてるわけ
ではない!!1

More Related Content

辫颈虫颈惫と濒10苍/颈18苍