I18n for Your Web application

43
i18n のののの Web のののののののののののの のの @ryokdy

Transcript of I18n for Your Web application

Page 1: I18n for Your Web application

i18n のはなしWeb アプリケーションを国際化

門屋 亮@ryokdy

Page 2: I18n for Your Web application

自己紹介• サイボウズ株式会社 勤務• 手がけた製品– サイボウズ ガルーン– サイボウズ Office– サイボウズ デヂエ – サイボウズ メールワイズ など

Page 3: I18n for Your Web application

世界の主要言語 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)

Page 4: I18n for Your Web application

どうでもいい話Internationalization国際化( i18n) は、ソフトウェアに技術的な変更を加えることなく多様な言語や地域に適合できるようにする、ソフトウェア設計の工程である。Localization地域化( L10N )は、地域固有の構成部品や翻訳テキストを追加することによって、ソフトウェアを特定の地域や言語に適合させる工程である。

Page 5: I18n for Your Web application

国際化 ≠ 多言語化

Page 6: I18n for Your Web application

What language do you speak?

Accept-Language: en-us,en;q=0.7,ja;q=0.3

できれば英語で。なかったら日本語でいいよ!

Page 7: I18n for Your Web application

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

Page 8: I18n for Your Web application

ロケールてなに ?

RFC 3066 で定義言語 (ISO639)   +  地域 (ISO3166)

たとえば  ja_JP

詳しくはこちらにCLDR (Common Locale Data Repository)

http://cldr.unicode.org/

Page 9: I18n for Your Web application

Script Code

sr_Latn_RSセルビアのラテン表記セルビア語

az_Cyrl_AZアゼルバイジャンのキリル表記アゼルバイジャン語

zh_Hans_CN中国の簡体字中国語

zh_Hant_HK香港の繁体字中国語

Page 10: I18n for Your Web application

日本のひらがな日本語

Ja_HIRA_JP

Page 11: I18n for Your Web application

localization (en_US, en_CA) vs. localisation (en_GB, en_AU)

Page 12: I18n for Your Web application

とりあえずはこれで。。en = en_USzh = zh_CN

Page 13: I18n for Your Web application

なにはさておき HTML5

<html lang="ja"><head><meta charset="UTF-8">

Page 14: I18n for Your Web application

日本語しか考慮しない実装

<div>新しいメッセージが<%= @items.count %>件あります!

</div>

Page 15: I18n for Your Web application

<span><%= I18n.t :newmessage, :count => @items.count %>

</span>

Page 16: I18n for Your Web application

日本語リソース

ja: newmessage: “ 新しいメッセージが ${count}件あります!”

Page 17: I18n for Your Web application

英語リソース

en: newmessage: one: “You got a new message!” other: “You got ${count} new messages!”

Page 18: I18n for Your Web application

For Japanese<div style="font: 30px ' MS Pゴシック '"> 上海</div>For Chinese<div style="font: 30px 'SimHei'"> 上海</div>

フォントによって表記が変わる

Page 19: I18n for Your Web application
Page 20: I18n for Your Web application

左へ受け流す言葉

Page 21: I18n for Your Web application
Page 22: I18n for Your Web application

受け流したくない場合

body {  direction:rtl;  unicode-bidi:bidi-override;}

Page 23: I18n for Your Web application

「カ゛」と「ガ」は同じ文字

AU+0041

U+030ACOMBINING RING ABOVE

NFC 正規化→

ÅU+00C5

カU+30AB

U+3099COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK

NFC 正規化→

ガU+30AC

評価する前に正規化が必要

Page 24: I18n for Your Web application

「ガ」と「ガ」は同じ文字?

カU+FF76 U゙+FF9E

NFKC 正規化→

ガU+30AC

㍉U+3349

NFKC 正規化→

ミリU+30DF U+30EA

⑳U+2473

NFKC 正規化→

20U+0032 U+0030

検索キーなど正規化しておいた方がいい場合がある

Page 25: I18n for Your Web application

数字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

Page 26: I18n for Your Web application

いちいち調べてられん

ICU のライブラリを使いますhttp://userguide.icu-project.org/

Page 27: I18n for Your Web application

かんたんかんたん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) {}

Page 28: I18n for Your Web application

でもこれってまずいんじゃ。。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

Page 29: I18n for Your Web application

そう

CSV ファイルをカンマ区切りに

できない。

Page 30: I18n for Your Web application

ちなみに

CSV ファイルを UTF-8 で入出力するのもアウト。

Page 31: I18n for Your Web application

日付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

Page 32: I18n for Your Web application

当然 ICU で。

DateFormat format = DateFormat.getDateTimeInstance( DateFormat.FULL, DateFormat.FULL, locale);try { System.out.println(format.format(new Date()));} catch (Exception e) {}

Page 33: I18n for Your Web application

細かい日付のフォーマットは

きにしない。和暦?なにそれ!

Page 34: I18n for Your Web application

全部 CLDR に定義されてます!

Page 35: I18n for Your Web application

タイムゾーン• UTC + 0 (イギリス、ポルトガル)• UTC + 9 (日本)• UTC + 8:45 (オーストラリア)• UTC – 0:25 ( 1916 年までアイルランドで採用)

• UTC + 4:51 ( 1955 年までボンベイで採用)

• UTC + 14 (キリバス)

Page 36: I18n for Your Web application

Tz(Olson) database

• ほとんどの OS やプログラミング言語で採用

• 世界各地域の標準時( time zone 、タイムゾーン)情報をボランティアの共同作業により収録したデータ

• 2011 年 10 月から ICANN と IANA の管理へ移行。–今は IANA タイムゾーン DB ともいうらしい

Page 37: I18n for Your Web application

めっちゃ更新されてる

Page 38: I18n for Your Web application

なんで?

Page 39: I18n for Your Web application

Daylight saving time がむずい• 年によって開始 /終了日が異なる• ブラジルでは毎年開始 1 か月くらい前に発表

• 同じ国でも地域によって適用されないところがある

• 同じ予定を複数のタイムゾーンで共有するようなシステムは死ねる

• 特に複数国の DST が被っているような予定– Google カレンダーはがんばっている。

Page 40: I18n for Your Web application

未来の予定を作成後にタイムゾーンのルールが変更されたらどうなる?

Page 41: I18n for Your Web application

毎日 15:00 からおやつの予定。 DST 期間中はどうなる?

東京〜ニューヨーク間で毎週 AM10:00 にミーティングの予定を作成。ニューヨークが DST 期間中になるとどうなる?

Page 42: I18n for Your Web application

24時間以上時刻差のあるタイムゾーンでの終日予定はどうなる??

Page 43: I18n for Your Web application

まとめ• 国際化にはある程度割り切りが重要• とりあえず ICU 使っとけばいい• 予定共有の国際化はハマる