Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
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 ID
Arabic                    Saudi Arabia       ar_SA
Chinese (Simplified)      China              zh_CN
Chinese (Traditional)     Taiwan             zh_TW
Dutch                     Netherlands        nl_NL
English                   Australia          en_AU
English                   Canada             en_CA
English                   United Kingdom     en_GB
English                   United States      en_US
French                    Canada             fr_CA
French                    France             fr_FR
German                    Germany            de_DE
Hebrew                    Israel             iw_IL
Hindi                     India              hi_IN
Italian                   Italy              it_IT
Japanese                  Japan              ja_JP
Korean                    South Korea        ko_KR
Portuguese                Brazil             pt_BR
Spanish                   Spain              es_ES
Swedish                   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_US
zh = 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>
I18n for Your Web application
左へ受け流す言葉
I18n for Your Web application
受け流したくない場合


body {
  direction:rtl;
  unicode-bidi:bidi-override;
}
「カ゛」と「ガ」は同じ文字

         U+030A
A        COMBINING RING
                           NFC正規化   Å
U+0041                        →     U+00C5
         ABOVE


         U+3099
         COMBINING
カ        KATAKANA-
                           NFC正規化   ガ
U+30AB                        →     U+30AC
         HIRAGANA VOICED
         SOUND MARK




     評価する前に正規化が必要
「ガ」と「ガ」は同じ文字?
カ        ゙        NFKC正規化   ガ
U+FF76   U+FF9E       →     U+30AC


㍉                 NFKC正規化   ミリ
U+3349                →     U+30DF U+30EA

⑳                 NFKC正規化   20
U+2473                →     U+0032 U+0030




検索キーなど正規化しておいた方
   がいい場合がある
数字
                    Positive    Negative
Country   Locale
                    Number      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
いちいち調べてられん


 ICUのライブラリを使います
http://userguide.icu-project.org/
かんたんかんたん
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) {}
でもこれってまずいんじゃ。。
                   Positive    Negative
Country   Locale
                   Number      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
                   2009年10月24日日曜日
日本        ja_JP                                        09/10/24 16:23
                   16時23分58秒JST
                   Sunday, October 24,
アメリカ en_US                                             10/24/09 4:23 PM
                   2009 4:23:58 PM Japan Time
                   200910月24日星期日
中国        zh_CN                                        09-10-24 下午4:23
                   下午04时23分58秒 日本

ロシア       ru_RU    среда, 24 ноября 2009 г. 18:23:00   24.10.09 16:23
                   Японское стандартное время

                   domingo 24 de octubre de 2009
スペイン es_ES                                       24/10/09 16:23
                   16H23'58" Japón
当然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使っとけばいい
• 予定共有の国際化はハマる

More Related Content

I18n for Your Web application