i18nしてますか?(2)
どうも、鹿島和郎(かしまかずお)です。今回も引き続き、i18n関係の話をしようかと思います。話題は一応前回予告したとおりLocaleです。Localeは日本語だとロケールと書くのが一般的のようです(ロカールと書く人もいるみたいですが、ここではロケールで統一します)。
■What's LOCALE?
さて、ロケールとは何でしょう。UNIX系のOSを触っている人であれば、LANGとかLC_ALLなんて環境変数に馴染みがあるかもしれません。Windowsだとコントロールパネルから「地域と言語のオプション」みたいなのが選べるかと思います。大雑把に言うと、それらで設定できる項目(あるいはそれを切り替える仕組み)をロケールと呼びます。
前回、i18nによって具体的には以下のような項目が切り替え可能になる、という話をしましたが、これがまさにロケールの仕組みによって実現されているものです。
- 言語(日本語、英語)
- 地域(日本、アメリカ、イギリス)
- 通貨(¥、$、€、£)
- 日付の表記形式(yyyy/mm/dd、mm/dd/yyyy)
- 文字コード(UTF-8、EUC-JP、ISO-8859-1)
- そのほか
■UNIX系OSの場合
ロケールについてもう少し具体的に見てみましょう。UNIX系OSとWindowsでは仕組みが大きく異なりますので、まずはUNIX系OSでの話をします。
UNIX系OSでは、後述するロケール名("ja_JP.UTF-8"など)をLC_ALLまたはLANGという環境変数に設定することで、ロケールの設定・切り替えができます。実はLC_ALL以外にもLC_*という環境変数がいくつかあるのですが、それに関しては別の機会で触れようと思います。
ロケール名は、以下のような形を取ります。
language[_territory][.codeset][@modifier]
- language(言語)
- territory(地域≒国)
- codeset(文字コード)
- modifier(修飾子=通貨、そのほか)
[ ]で囲まれているのはオプションですので、以下はすべて有効なロケールです。
ja、ja_JP、ja_JP.UTF-8、ja.UTF-8、fr_FR@euro
日本にいるとあまり意識しないかもしれませんが、1つの国で複数の言語が使われていたり、1つの言語が複数の国で使われていたりしますので、言語と国は(そのほかの項目も)個別に設定できるようになっています。
細かい手順などは今後説明しようと思いますが、例えば、アプリのメッセージを英語に翻訳する際、
- 「英語」で1つの言語とする場合 → enに対応する翻訳ファイルを用意
- 「アメリカ英語」「イギリス英語」を分ける場合 → en_US、en_GBに対応する翻訳ファイルを用意
という形になります(若干不正確ですが、大雑把にはこんなものと考えてください)。
さて、理屈だけの説明だと分かりにくいかもしれませんので、実際にロケールを変えるとどうなるのか、シェルからいくつかコマンドを試してみましょう(bash以外を使っている人は、環境変数の設定の所を適宜置き換えてください)。
$ LANG=en_US date
Thu Jul 29 19:11:47 PDT 2010
$ LANG=fr_FR date
jeudi 29 juillet 2010, 19:23:04 (UTC-0700)
$ LANG=fr_FR ls xx
ls: ne peut accéder xx: Aucun fichier ou répertoire de ce type
大体、感じはつかめてもらえたかと思います。
※余談:国と言語
ちょっと余談ですが、「国際化」の英単語を「i18n」と略さないでちゃんと綴ろうとした場合、アメリカとイギリスでは以下のような違いがあります(略すとどっちの国でも意識せずに使えるので便利ですね)。
- internationalisation(英)
- internationalization(米)
英語の場合、大ざっぱにはアメリカ英語とイギリス英語と分かれていますが(Wikipediaに詳しい説明がありますので、興味のある方は読んでみてください)、カナダ、オーストラリアなどほかの国でもそれぞれ特色があります。わたしが以前住んでいたカナダでは、綴りはイギリス英語に近いですが、発音や使う言葉などはアメリカ英語に近いと思います。
複数の国・地域で使われている言語は、公用語に限っても、英語、フランス語、スペイン語、アラビア語、中国語、ドイツ語、イタリア語などたくさんありますが、逆に1つの国で複数の公用語を持つ国もインドなど沢山あります。
例えばインドの場合、OS、言語によってサポートされているロケールの数に違いがありますが、en_IN(英語)、hi_IN(ヒンディー語)を始めとして多数のロケール名が存在します。インド英語は独自の単語・言い回しとかもあるでしょうし、en_USと分かれているとメリットがありそうです。
カナダの場合は英語と「フランス語」が公用語です。カギカッコつきで「フランス語」と書いた理由なんですが、カナダでのフランス語はフランスやそのほかヨーロッパ諸国でのフランス語とは大きく違うのです。独自の単語がけっこうありますし、発音がかなり違うので、フランスのTVとかでカナダ人の「フランス語」が流れる時には字幕が付くんだとか(未確認です)……。ロケールでfr_FRとfr_CAを区別できると、こういう時にも便利ですよね。
ちなみにキーボード配列もfr_FRとfr_CAでは大きく違います。éなどのアクセントつきのアルファベットを入力したい場合、QWERTYに慣れている一般的な日本人は、fr_CAのキーボード配列の方が分かりやすいです。
■Windowsの場合
Windowsの場合ですが、OSのロケールの設定はコントロールパネルから行えます。Windowsのバージョンによって若干違いますが、XPの場合は以下から設定できます。
「コントロールパネル」→ 「地域と言語のオプション」→ 「地域オプション」タブ→ 「標準と形式」内のプルダウン
言語を変更してからコマンドプロンプトを立ち上げ、dateコマンドなどを実行すると違いが分かるかと思います。
○日本語
C:\Documents and Settings\kashima>date /t
2010/08/03
C:\Documents and Settings\kashima>time /t
17:00
○英語(米国)
C:\Documents and Settings\kashima>date /t
08/03/2010 Tue
C:\Documents and Settings\kashima>time /t
05:00 PM
○スペイン語(メキシコ)
C:\Documents and Settings\kashima>date /t
03/08/2010
C:\Documents and Settings\kashima>time /t
05:00 p.m.
※また余談
「17時」のように24時間単位で時間を表す方法は一部の国ではあまり一般的ではなく、英語ではmilitary timeなんて呼びます。その名の通り、軍隊などで使われるからです。
■まとめ
今回はロケールについて、UNIX系OSとWindowsの具体例を交えて説明しました。次回からはプログラムからロケールを扱う方法について説明していきます。
それではまた。