I18n for Your Web application
-
Upload
kadoya-ryo -
Category
Technology
-
view
327 -
download
0
Transcript of I18n for Your Web application
i18n のはなしWeb アプリケーションを国際化
門屋 亮@ryokdy
自己紹介• サイボウズ株式会社 勤務• 手がけた製品– サイボウズ ガルーン– サイボウズ Office– サイボウズ デヂエ – サイボウズ メールワイズ など
世界の主要言語 Top 10 母語人口 公用語人口
1 中国語 (1,000) 1 英語 (1,400)
2 英語 (350) 2 中国語 (1,000)
3 スペイン語 (250) 3 ヒンディー語 (700)
4 ヒンディー語 (200) 4 スペイン語 (280)
5 アラビア語 (150) 5 ロシア語 (270)
6 ベンガル語 (150) 6 フランス語 (220)
7 ロシア語 (150) 7 アラビア語 (170)
8 ポルトガル語 (135) 8 ポルトガル語 (160)
9 日本語 (120) 9 マレー語 (160)
10 ドイツ語 (100) 10 ベンガル語 (150)
どうでもいい話Internationalization国際化( i18n) は、ソフトウェアに技術的な変更を加えることなく多様な言語や地域に適合できるようにする、ソフトウェア設計の工程である。Localization地域化( L10N )は、地域固有の構成部品や翻訳テキストを追加することによって、ソフトウェアを特定の地域や言語に適合させる工程である。
罠
国際化 ≠ 多言語化
What language do you speak?
Accept-Language: en-us,en;q=0.7,ja;q=0.3
できれば英語で。なかったら日本語でいいよ!
Enabled Locales for java.util and java.text Functionality
Language Country Locale IDArabic Saudi Arabia ar_SA
Chinese (Simplified) China zh_CN
Chinese (Traditional) Taiwan zh_TW
Dutch Netherlands nl_NLEnglish Australia en_AUEnglish Canada en_CA
English United Kingdom en_GB
English United States en_USFrench Canada fr_CAFrench France fr_FRGerman Germany de_DEHebrew Israel iw_ILHindi India hi_INItalian Italy it_ITJapanese Japan ja_JPKorean South Korea ko_KRPortuguese Brazil pt_BRSpanish Spain es_ESSwedish Sweden sv_SE
Thai (Western digits) Thailand th_TH
Thai (Thai digits) Thailand th_TH_TH
ロケールてなに ?
RFC 3066 で定義言語 (ISO639) + 地域 (ISO3166)
たとえば ja_JP
詳しくはこちらにCLDR (Common Locale Data Repository)
http://cldr.unicode.org/
Script Code
sr_Latn_RSセルビアのラテン表記セルビア語
az_Cyrl_AZアゼルバイジャンのキリル表記アゼルバイジャン語
zh_Hans_CN中国の簡体字中国語
zh_Hant_HK香港の繁体字中国語
日本のひらがな日本語
Ja_HIRA_JP
localization (en_US, en_CA) vs. localisation (en_GB, en_AU)
とりあえずはこれで。。en = en_USzh = zh_CN
なにはさておき HTML5
<html lang="ja"><head><meta charset="UTF-8">
日本語しか考慮しない実装
<div>新しいメッセージが<%= @items.count %>件あります!
</div>
<span><%= I18n.t :newmessage, :count => @items.count %>
</span>
日本語リソース
ja: newmessage: “ 新しいメッセージが ${count}件あります!”
英語リソース
en: newmessage: one: “You got a new message!” other: “You got ${count} new messages!”
For Japanese<div style="font: 30px ' MS Pゴシック '"> 上海</div>For Chinese<div style="font: 30px 'SimHei'"> 上海</div>
フォントによって表記が変わる
左へ受け流す言葉
受け流したくない場合
body { direction:rtl; unicode-bidi:bidi-override;}
「カ゛」と「ガ」は同じ文字
AU+0041
U+030ACOMBINING RING ABOVE
NFC 正規化→
ÅU+00C5
カU+30AB
U+3099COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
NFC 正規化→
ガU+30AC
評価する前に正規化が必要
「ガ」と「ガ」は同じ文字?
カU+FF76 U゙+FF9E
NFKC 正規化→
ガU+30AC
㍉U+3349
NFKC 正規化→
ミリU+30DF U+30EA
⑳U+2473
NFKC 正規化→
20U+0032 U+0030
検索キーなど正規化しておいた方がいい場合がある
数字Country Locale Positive
NumberNegative Number
日本 ja_JP 1,234.567 -1,234.567
アメリカ en_US 1,234.567 -1,234.567
スイス de_CH 1’234.567 -1’234.567
フランス fr_FR 1 234,567 -1 234,567
マケドニア mk_MK 1.234,567 (1.234,567)
ドイツ de_DE 1.234,567 -1.234,567
スウェーデン sv_SE 1 234,567 −1 234,567
かんたんかんたんULocale locale = new ULocale("en_US");double myNumber = 1234.56;NumberFormat format = NumberFormat.getInstance(locale);try {
System.out.print(((DecimalFormat) format).toPattern()
+ " -> " + format.format(myNumber));} catch (Exception e) {}
でもこれってまずいんじゃ。。Country Locale Positive
NumberNegative Number
日本 ja_JP 1,234.567 -1,234.567
アメリカ en_US 1,234.567 -1,234.567
スイス de_CH 1’234.567 -1’234.567
フランス fr_FR 1 234,567 -1 234,567
マケドニア mk_MK 1.234,567 (1.234,567)
ドイツ de_DE 1.234,567 -1.234,567
スウェーデン sv_SE 1 234,567 −1 234,567
そう
CSV ファイルをカンマ区切りに
できない。
ちなみに
CSV ファイルを UTF-8 で入出力するのもアウト。
日付Country Locale DateTime Full DateTime Short
日本 ja_JP2009 年 10 月 24 日日曜日 16 時 23 分 58 秒 JST
09/10/24 16:23
アメリカ en_USSunday, October 24, 2009 4:23:58 PM Japan Time
10/24/09 4:23 PM
中国 zh_CN200910 月 24 日星期日 下午 04 时 23 分 58 秒 日本 09-10-24 下午 4:23
ロシア ru_RU среда, 24 ноября 2009 г. 18:23:00 Японское стандартное время 24.10.09 16:23
スペイン es_ESdomingo 24 de octubre de 2009 16H23'58" Japón
24/10/09 16:23
当然 ICU で。
DateFormat format = DateFormat.getDateTimeInstance( DateFormat.FULL, DateFormat.FULL, locale);try { System.out.println(format.format(new Date()));} catch (Exception e) {}
細かい日付のフォーマットは
きにしない。和暦?なにそれ!
全部 CLDR に定義されてます!
タイムゾーン• UTC + 0 (イギリス、ポルトガル)• UTC + 9 (日本)• UTC + 8:45 (オーストラリア)• UTC – 0:25 ( 1916 年までアイルランドで採用)
• UTC + 4:51 ( 1955 年までボンベイで採用)
• UTC + 14 (キリバス)
Tz(Olson) database
• ほとんどの OS やプログラミング言語で採用
• 世界各地域の標準時( time zone 、タイムゾーン)情報をボランティアの共同作業により収録したデータ
• 2011 年 10 月から ICANN と IANA の管理へ移行。–今は IANA タイムゾーン DB ともいうらしい
めっちゃ更新されてる
なんで?
Daylight saving time がむずい• 年によって開始 /終了日が異なる• ブラジルでは毎年開始 1 か月くらい前に発表
• 同じ国でも地域によって適用されないところがある
• 同じ予定を複数のタイムゾーンで共有するようなシステムは死ねる
• 特に複数国の DST が被っているような予定– Google カレンダーはがんばっている。
未来の予定を作成後にタイムゾーンのルールが変更されたらどうなる?
毎日 15:00 からおやつの予定。 DST 期間中はどうなる?
東京〜ニューヨーク間で毎週 AM10:00 にミーティングの予定を作成。ニューヨークが DST 期間中になるとどうなる?
24時間以上時刻差のあるタイムゾーンでの終日予定はどうなる??
まとめ• 国際化にはある程度割り切りが重要• とりあえず ICU 使っとけばいい• 予定共有の国際化はハマる