<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>I18N Blog</title>
	<atom:link href="http://blog.kokusaika.jp/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.kokusaika.jp</link>
	<description>Internationalization tips and others by Kokusaika JP</description>
	<lastBuildDate>Tue, 10 Jan 2012 11:07:53 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>新年のスタートはゆっくりと</title>
		<link>http://blog.kokusaika.jp/2012/01/10/haste_makeswaste/</link>
		<comments>http://blog.kokusaika.jp/2012/01/10/haste_makeswaste/#comments</comments>
		<pubDate>Tue, 10 Jan 2012 11:04:28 +0000</pubDate>
		<dc:creator>Y. S.</dc:creator>
				<category><![CDATA[CEO]]></category>

		<guid isPermaLink="false">http://blog.kokusaika.jp/?p=805</guid>
		<description><![CDATA[<p></p>
<p>新年明けましておめでとうございます。</p>
<p>新年がスタートする１月はなんとなくのんびりムードでゆったりのスタート。会社が始まったかと思うと成人の日で連休になって、最初の１０日はあっという間に過ぎ行く。５日から会社はスタートしたのだけれど、なんとなく今週がやっと本格的なスタートといった気分である。</p>
<p>これが、外資系グローバルIT企業で OS の開発チームにいたときは、決まって１月にリリースがあって、１月にのんびりできたためしがない。しかも、USの皆さんはクリスマス休暇は長めに休むものの、新年のスタートはとても早い。2日とか3日から働いていて、メールがバンバン飛んできたりする。まあ、今やそれも懐かしい思い出であるわけだが、会社を経営する立場になると休みが多いのも考えものである。世の中が眠っているということは、その間ビジネスが発生しないからである。寝ている間にチャリンチャリンという、そんなおいしい話は残念ながら私のまわりにはなさそうである。</p>
<p>それで、ゆっくりまったりでは良くないと、いつもの仕事をがんばり始めるとせっかくの機会を逃してしまう。ここは、ゆっくりスタートのついでに、普段なかなかできない計画というものに着手するのがよい。</p>
<p>一年の計は元旦にありと言うが、１月のゆっくりムードのときに少し視線を先において、自分やチームや家族や会社の先々のことを考えてみるとよさそうである。</p>
<p>最近のソーシャルの世界、twitter や facebook などでは自分のまわりの人の動きが目に入ってしまうので、自分のペースをつかむのが難しくなってしまっているのではないかと思う。ちょっと無理してしまっている人が多いんじゃないかな？</p>
<p>少しそういう世界から目線をはずして自分自身のペースで考えをめぐらせてみてはいかがだろう。</p>
<p>せいては事をし損じる。
Haste [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-medium wp-image-807" title="120104-095713" src="http://blog.kokusaika.jp/wp-content/uploads/2012/01/120104-0957131-225x300.jpg" alt="" width="225" height="300" /></p>
<p>新年明けましておめでとうございます。</p>
<p>新年がスタートする１月はなんとなくのんびりムードでゆったりのスタート。会社が始まったかと思うと成人の日で連休になって、最初の１０日はあっという間に過ぎ行く。５日から会社はスタートしたのだけれど、なんとなく今週がやっと本格的なスタートといった気分である。</p>
<p>これが、外資系グローバルIT企業で OS の開発チームにいたときは、決まって１月にリリースがあって、１月にのんびりできたためしがない。しかも、USの皆さんはクリスマス休暇は長めに休むものの、新年のスタートはとても早い。2日とか3日から働いていて、メールがバンバン飛んできたりする。まあ、今やそれも懐かしい思い出であるわけだが、会社を経営する立場になると休みが多いのも考えものである。世の中が眠っているということは、その間ビジネスが発生しないからである。寝ている間にチャリンチャリンという、そんなおいしい話は残念ながら私のまわりにはなさそうである。</p>
<p>それで、ゆっくりまったりでは良くないと、いつもの仕事をがんばり始めるとせっかくの機会を逃してしまう。ここは、ゆっくりスタートのついでに、普段なかなかできない計画というものに着手するのがよい。</p>
<p>一年の計は元旦にありと言うが、１月のゆっくりムードのときに少し視線を先において、自分やチームや家族や会社の先々のことを考えてみるとよさそうである。</p>
<p>最近のソーシャルの世界、twitter や facebook などでは自分のまわりの人の動きが目に入ってしまうので、自分のペースをつかむのが難しくなってしまっているのではないかと思う。ちょっと無理してしまっている人が多いんじゃないかな？</p>
<p>少しそういう世界から目線をはずして自分自身のペースで考えをめぐらせてみてはいかがだろう。</p>
<p>せいては事をし損じる。<br />
Haste makes waste.</p>
<p>新年のスタートはゆっくりと参りましょう。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kokusaika.jp/2012/01/10/haste_makeswaste/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PFS (A present from Steve)</title>
		<link>http://blog.kokusaika.jp/2011/10/07/pfs-a-present-from-steve/</link>
		<comments>http://blog.kokusaika.jp/2011/10/07/pfs-a-present-from-steve/#comments</comments>
		<pubDate>Fri, 07 Oct 2011 12:06:43 +0000</pubDate>
		<dc:creator>Y. S.</dc:creator>
				<category><![CDATA[CEO]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[気になること]]></category>

		<guid isPermaLink="false">http://blog.kokusaika.jp/?p=795</guid>
		<description><![CDATA[[...]]]></description>
			<content:encoded><![CDATA[<p>申し訳ありません、このコンテンツはただ今　<a href="http://blog.kokusaika.jp/feed/?lang=en">English</a>　のみです。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kokusaika.jp/2011/10/07/pfs-a-present-from-steve/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>サマーインターンシップ</title>
		<link>http://blog.kokusaika.jp/2011/09/13/summerinternship/</link>
		<comments>http://blog.kokusaika.jp/2011/09/13/summerinternship/#comments</comments>
		<pubDate>Tue, 13 Sep 2011 06:22:32 +0000</pubDate>
		<dc:creator>Y. S.</dc:creator>
				<category><![CDATA[CEO]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[気になること]]></category>
		<category><![CDATA[考察]]></category>

		<guid isPermaLink="false">http://blog.kokusaika.jp/?p=787</guid>
		<description><![CDATA[[...]]]></description>
			<content:encoded><![CDATA[<p>申し訳ありません、このコンテンツはただ今　<a href="http://blog.kokusaika.jp/feed/?lang=en">English</a>　のみです。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kokusaika.jp/2011/09/13/summerinternship/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>知らない間にディスカウントセール</title>
		<link>http://blog.kokusaika.jp/2011/08/06/unintentional_discount_sale/</link>
		<comments>http://blog.kokusaika.jp/2011/08/06/unintentional_discount_sale/#comments</comments>
		<pubDate>Sat, 06 Aug 2011 04:48:04 +0000</pubDate>
		<dc:creator>Y. S.</dc:creator>
				<category><![CDATA[CEO]]></category>
		<category><![CDATA[Joomla!]]></category>
		<category><![CDATA[World Wide Navi]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[l10n]]></category>
		<category><![CDATA[気になること]]></category>
		<category><![CDATA[考察]]></category>
		<category><![CDATA[i18n tool]]></category>
		<category><![CDATA[online store]]></category>
		<category><![CDATA[paypal]]></category>

		<guid isPermaLink="false">http://blog.kokusaika.jp/?p=771</guid>
		<description><![CDATA[<p>国際化JPのオンラインストア  ( http://store.kokusaika.jp/global/ ) を主にスタディとテストの目的でオープンしてから約一年が経つ。多言語で、PayPalを使って多通貨が使えるストアとして誕生した。それからずっとウェブに掲載した価格には全く注意を払ってこなかった。というのも、Webから注文が入ってもすべて円での支払であり、海外の会社からでも日本の支店経由で円での支払いだったのである。</p>
<p>今週、国際化JPのグローバルオンラインストアから注文が入り、そのお客さんは即座にPayPalで支払を行った。 かっこいい! 簡単でスピーディ。PayPalからの通知メールでその注文の支払がUSドルですでに行われたことがわかった。すばらしい! わくわくした。</p>
<p>それでその後、PayPalのアカウントを開き、我々もグローバルエコノミーの一員であることを思い知った。</p>
<p>アカウントに送金された円の金額は、同じ製品を日本で円で販売している価格よりもずっと少なかったのである。なんてこったい！ペイパルの手数料は約3%. [...]]]></description>
			<content:encoded><![CDATA[<p>国際化JPのオンラインストア  ( <a title="Kokusaika JP global online store" href="http://store.kokusaika.jp/global/" target="_blank">http://store.kokusaika.jp/global/</a> ) を主にスタディとテストの目的でオープンしてから約一年が経つ。多言語で、PayPalを使って多通貨が使えるストアとして誕生した。それからずっとウェブに掲載した価格には全く注意を払ってこなかった。というのも、Webから注文が入ってもすべて円での支払であり、海外の会社からでも日本の支店経由で円での支払いだったのである。</p>
<p>今週、国際化JPのグローバルオンラインストアから注文が入り、そのお客さんは即座にPayPalで支払を行った。 かっこいい! 簡単でスピーディ。PayPalからの通知メールでその注文の支払がUSドルですでに行われたことがわかった。すばらしい! わくわくした。</p>
<p>それでその後、PayPalのアカウントを開き、我々もグローバルエコノミーの一員であることを思い知った。</p>
<p>アカウントに送金された円の金額は、同じ製品を日本で円で販売している価格よりもずっと少なかったのである。なんてこったい！ペイパルの手数料は約3%. これは手頃だ。差額の原因は、&#8221;STORONG YEN&#8221;である。我々はしばらくの間、知らない間にディスカウントセールを実施していたようなものである。<span id="more-771"></span></p>
<p>今回の海外のお客様が本当に短い期間で&#8221;ダウンロード-評価-購買&#8221;のサイクルを実施したことは誇らしく思う。なんとたったの１週間である。日本の会社ではまずあり得ない。そう、今すぐ海外を目指すべきかもしれない。</p>
<p>国際化JPの製品はエンジニアや翻訳者が仕事を素早くこなすことを手助けする。そんな製品の購入もやはり素早くなくっちゃ。素早くて価格も安い、もう国際化JPのグローバルオンラインストアに走って行ってUSドルでお買い物、これしかないね！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kokusaika.jp/2011/08/06/unintentional_discount_sale/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript 国際化プログラミング</title>
		<link>http://blog.kokusaika.jp/2011/06/20/javascript-i18n/</link>
		<comments>http://blog.kokusaika.jp/2011/06/20/javascript-i18n/#comments</comments>
		<pubDate>Mon, 20 Jun 2011 07:10:44 +0000</pubDate>
		<dc:creator>J. O.</dc:creator>
				<category><![CDATA[Tips]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://blog.kokusaika.jp/?p=731</guid>
		<description><![CDATA[<p>JavaScriptはブラウザによって実行されるクライアント向けスクリプト言語ですが、その国際化の標準的な仕様はありません。
ここでは、一般的なポイント、および主要なライブラリを使った国際化について説明します。</p>
ロケール、書式、タイムゾーン
<p>JavaScriptの一般的なプログラミングでの国際化のポイントを以下に挙げます。
.NET AjaxライブラリやjQuery、その他固有のライブラリの情報については各情報リソースを参照ください。</p>

ユーザーロケール(言語と地域)の判定
ユーザーの使用する言語や住んでいる地域によって、書式やメッセージを切り替えたい場合、そのユーザーのロケール(言語と地域の情報)を取得する必要があります。
JavaやPHPといった通常のプログラミング言語には、これらの情報を取得する関数がありますが、JavaScriptにはこれらと等価のものはありません。
一般的なJavaScriptのプログラミングでは、ユーザーの使用するブラウザの言語情報から言語を取得します。
例えば、ユーザーの使っているFirefoxが日本版か英語版かということです。
この情報は、殆どのブラウザにおいて、設定画面で変えられる言語設定の情報ではないことに注意が必要です。
以下は、ブラウザの言語情報から言語コードを切り出す簡単なコードです。</p>
<p>function wwnaviGetLang(){
return (navigator.userLanguage&#124;&#124;navigator.browserLanguage&#124;&#124;navigator.language).substr(0,2);
}</p>
<p>このコードは、日本語版ブラウザを使っているユーザーの言語は日本語ということを意味します。
OSの言語設定や、サーバーにアクセスする時のHTTPリクエストに入れられる言語情報などは、反映されないことに注意が必要です。</p>
<p>地域については、上記のコードの2文字目以降にセットされている場合もありますが、保障はありません。
なお、後述のUTCとの時差によって代表的なものを取得することはできますが、これも正確な判定ではありません。</p>
<p>*ブラウザの言語設定を反映させたい場合には、jQuery-Browser-Languageという、リモートホストにアクセスし、HTTPリクエストの言語を抽出する(ブラウザの言語設定を認識する)jQueryライブラリがあります。
<p>以下はそのライブラリを使ったサンプルコードです。</p>
<p>$.browserLanguage(function( language , acceptHeader ){
var l  = acceptHeader; l = l.substring(0,2);
alert(l); // これはHTTPリクエストヘッダーを解析し、
// &#8216;en&#8217;, &#8216;ja&#8217;&#8230;といったブラウザ言語設定と同じ値を返します。
});</p>
日付、通貨などの書式
JavaやPHPといった主要なプログラミング言語には、ロケールに沿った書式変換をする関数、クラスがありますが、JavaScriptにはそういった関数はありません。
もし、ユーザーの言語情報などによって書式を切り替えたい場合は、そういった処理を作りこむ必要があります。
これらを全言語分作成するのは大変ですが、.NET AjaxやjQueryなどのライブラリにはそういった汎用ライブラリが用意されています。</p>
<p>(※jQueryには、日付、通貨などの多言語用ライブラリとしてGlobがあります。)</p>
<p>例えば、日付や通貨を書式変換して表示している個所は、固定の書式が使われていないか確認し、切り替えの必要がある場合は、上記のようなライブラリを使うことをお勧めします。</p>
<p>書式については、文字列の書式や文化固有の表現も参照してください。
ユーザーのタイムゾーンを取得する
JavaScriptには、タイムゾーンを取得する関数はありませんが、UTC(世界標準時間)とクライアントPCの時計の時差を求める関数があります。
これにより、サーバーの共通時間を各クライアントPCの時間に変換するといった処理ができます。</p>
<p>また、UTCとの時差から、代表的なユーザーの地域を特定することができます。
以下は、UTC(世界標準時間)とクライアントPCの時計の時差を時間単位で求めるコードです。</p>
<p>function getTzOff() {
var date = new Date();
return tzoff = ( date.getHours() &#8211; date.getUTCHours() + 24 ) % 24;
}</p>
<p>この情報に、下記のような時差と地域の対応表を合わせることで、javaScriptからユーザーの代表的な地域を予想することができます。</p>
<p>0=GB
1=IT
2=FI
3=RU
4=AE
5=PK
6=BD
7=ID
8=PH
9=JP
10=AU
11=NC
12=NZ
13=TO
14=TO
15=US
16=US
17=US
18=US
19=US
20=CL
21=BR
22=BR
23=GL</p>
<p>(上記の国コードをタイムゾーンのIDに変えれば、
サーバー側でユーザーの代表的なタイムゾーンも予測できます)
*同じ時差に対応する地域がいくつもあることに注意が必要です。
実際には、ユーザーが自分の地域を後で設定できるようにする必要があります。

jQueryを使った国際化
<p>jQieuryのライブラリjquery.i18n.propertiesを使った、Javaプロパティファイル形式でのリソース管理について記述します。</p>

リソースファイル(プロパティファイル)の作成
JSファイルに埋めこまれている文字列をプロパティファイル(.properties)に記述(外部化)します。プロパティファイルの作成については、Java国際化プログラミング &#8211; メッセージをご参照ください。
jQueryライブラリを読み込む
必要なJSファイル(jquery.min.js、jquery.i18n.properties.js)を読み込みます。
以下の二つの方法があります。</p>
<p>A. 元のHTMLのスクリプトタグに埋めこむ (通常の方法)</p>
<p>&#60;head&#62;
&#8230;
&#60;script src=&#8221;js/jquery.min.js&#8221; type=&#8221;text/javascript&#8221;&#62;&#60;/script&#62;
&#60;script src=&#8221;js/jquery.i18n.properties.js&#8221; type=&#8221;text/javascript&#8221;&#62;&#60;/script&#62;
&#8230;</p>
<p>* 呼出し元のHTML全てに埋めこむ必要あり。</p>
<p>B. 各JSから動的に読み込む。</p>
<p>function wwnaviHttpRequest(){
if(window.ActiveXObject){
try{
return new ActiveXObject(&#8220;Msxml2.XMLHTTP&#8221;);
}catch(e){
try {
return new ActiveXObject(&#8220;Microsoft.XMLHTTP&#8221;);
}catch(e2){
return null;
}
}
}else if(window.XMLHttpRequest){
return new [...]]]></description>
			<content:encoded><![CDATA[<p>JavaScriptはブラウザによって実行されるクライアント向けスクリプト言語ですが、その国際化の標準的な仕様はありません。<br />
ここでは、一般的なポイント、および主要なライブラリを使った国際化について説明します。</p>
<h4>ロケール、書式、タイムゾーン</h4>
<p>JavaScriptの一般的なプログラミングでの国際化のポイントを以下に挙げます。<br />
.NET AjaxライブラリやjQuery、その他固有のライブラリの情報については各情報リソースを参照ください。</p>
<ol>
<li>ユーザーロケール(言語と地域)の判定<br />
ユーザーの使用する言語や住んでいる地域によって、書式やメッセージを切り替えたい場合、そのユーザーのロケール(言語と地域の情報)を取得する必要があります。<br />
JavaやPHPといった通常のプログラミング言語には、これらの情報を取得する関数がありますが、JavaScriptにはこれらと等価のものはありません。<br />
一般的なJavaScriptのプログラミングでは、ユーザーの使用するブラウザの言語情報から言語を取得します。<br />
例えば、ユーザーの使っているFirefoxが日本版か英語版かということです。<br />
この情報は、殆どのブラウザにおいて、設定画面で変えられる言語設定の情報ではないことに注意が必要です。<br />
以下は、ブラウザの言語情報から言語コードを切り出す簡単なコードです。</p>
<blockquote><p>function wwnaviGetLang(){<br />
return (navigator.userLanguage||navigator.browserLanguage||navigator.language).substr(0,2);<br />
}</p></blockquote>
<p>このコードは、日本語版ブラウザを使っているユーザーの言語は日本語ということを意味します。<br />
OSの言語設定や、サーバーにアクセスする時のHTTPリクエストに入れられる言語情報などは、反映されないことに注意が必要です。</p>
<p>地域については、上記のコードの2文字目以降にセットされている場合もありますが、保障はありません。<br />
なお、後述のUTCとの時差によって代表的なものを取得することはできますが、これも正確な判定ではありません。</p>
<p>*ブラウザの言語設定を反映させたい場合には、<a href="https://github.com/dansingerman/jQuery-Browser-Language">jQuery-Browser-Language</a>という、リモートホストにアクセスし、HTTPリクエストの言語を抽出する(ブラウザの言語設定を認識する)jQueryライブラリがあります。</li>
<p>以下はそのライブラリを使ったサンプルコードです。</p>
<blockquote><p>$.browserLanguage(function( language , acceptHeader ){<br />
var l  = acceptHeader; l = l.substring(0,2);<br />
alert(l); // これはHTTPリクエストヘッダーを解析し、<br />
// &#8216;en&#8217;, &#8216;ja&#8217;&#8230;といったブラウザ言語設定と同じ値を返します。<br />
});</p></blockquote>
<li>日付、通貨などの書式<br />
JavaやPHPといった主要なプログラミング言語には、ロケールに沿った書式変換をする関数、クラスがありますが、JavaScriptにはそういった関数はありません。<br />
もし、ユーザーの言語情報などによって書式を切り替えたい場合は、そういった処理を作りこむ必要があります。<br />
これらを全言語分作成するのは大変ですが、.NET AjaxやjQueryなどのライブラリにはそういった汎用ライブラリが用意されています。</p>
<p>(※jQueryには、日付、通貨などの多言語用ライブラリとして<a href="https://github.com/nje/jquery-glob">Glob</a>があります。)</p>
<p>例えば、日付や通貨を書式変換して表示している個所は、固定の書式が使われていないか確認し、切り替えの必要がある場合は、上記のようなライブラリを使うことをお勧めします。</p>
<p>書式については、<a href="http://www1.kokusaika.jp/advisory/org/ja/common_format.html">文字列の書式</a>や<a href="http://www1.kokusaika.jp/advisory/org/ja/common_culture_exp.html">文化固有の表現</a>も参照してください。</li>
<li>ユーザーのタイムゾーンを取得する<br />
JavaScriptには、タイムゾーンを取得する関数はありませんが、UTC(世界標準時間)とクライアントPCの時計の時差を求める関数があります。<br />
これにより、サーバーの共通時間を各クライアントPCの時間に変換するといった処理ができます。</p>
<p>また、UTCとの時差から、代表的なユーザーの地域を特定することができます。<br />
以下は、UTC(世界標準時間)とクライアントPCの時計の時差を時間単位で求めるコードです。</p>
<blockquote><p>function getTzOff() {<br />
var date = new Date();<br />
return tzoff = ( date.getHours() &#8211; date.getUTCHours() + 24 ) % 24;<br />
}</p></blockquote>
<p>この情報に、下記のような時差と地域の対応表を合わせることで、javaScriptからユーザーの代表的な地域を予想することができます。</p>
<blockquote><p>0=GB<br />
1=IT<br />
2=FI<br />
3=RU<br />
4=AE<br />
5=PK<br />
6=BD<br />
7=ID<br />
8=PH<br />
9=JP<br />
10=AU<br />
11=NC<br />
12=NZ<br />
13=TO<br />
14=TO<br />
15=US<br />
16=US<br />
17=US<br />
18=US<br />
19=US<br />
20=CL<br />
21=BR<br />
22=BR<br />
23=GL</p></blockquote>
<p>(上記の国コードをタイムゾーンのIDに変えれば、<br />
サーバー側でユーザーの代表的なタイムゾーンも予測できます)<br />
*同じ時差に対応する地域がいくつもあることに注意が必要です。<br />
実際には、ユーザーが自分の地域を後で設定できるようにする必要があります。</li>
</ol>
<h4>jQueryを使った国際化</h4>
<p>jQieuryのライブラリ<a href="http://plugins.jquery.com/project/jquery_i18n_properties">jquery.i18n.properties</a>を使った、Javaプロパティファイル形式でのリソース管理について記述します。</p>
<ol>
<li>リソースファイル(プロパティファイル)の作成<br />
JSファイルに埋めこまれている文字列をプロパティファイル(.properties)に記述(外部化)します。プロパティファイルの作成については、<a href="http://www1.kokusaika.jp/advisory/org/ja/java_msg.html">Java国際化プログラミング &#8211; メッセージ</a>をご参照ください。</li>
<li>jQueryライブラリを読み込む<br />
必要なJSファイル(jquery.min.js、jquery.i18n.properties.js)を読み込みます。<br />
以下の二つの方法があります。</p>
<p>A. 元のHTMLのスクリプトタグに埋めこむ (通常の方法)</p>
<blockquote><p>&lt;head&gt;<br />
&#8230;<br />
&lt;script src=&#8221;js/jquery.min.js&#8221; type=&#8221;text/javascript&#8221;&gt;&lt;/script&gt;<br />
&lt;script src=&#8221;js/jquery.i18n.properties.js&#8221; type=&#8221;text/javascript&#8221;&gt;&lt;/script&gt;<br />
&#8230;</p></blockquote>
<p>* 呼出し元のHTML全てに埋めこむ必要あり。</p>
<p>B. 各JSから動的に読み込む。</p>
<blockquote><p>function wwnaviHttpRequest(){<br />
if(window.ActiveXObject){<br />
try{<br />
return new ActiveXObject(&#8220;Msxml2.XMLHTTP&#8221;);<br />
}catch(e){<br />
try {<br />
return new ActiveXObject(&#8220;Microsoft.XMLHTTP&#8221;);<br />
}catch(e2){<br />
return null;<br />
}<br />
}<br />
}else if(window.XMLHttpRequest){<br />
return new XMLHttpRequest();<br />
}else{<br />
return null;<br />
}<br />
}<br />
function wwnaviLoadJs(url){<br />
htoj = wwnaviHttpRequest();<br />
htoj.open(&#8220;GET&#8221;, url, false);<br />
htoj.send(null);<br />
return htoj.responseText;<br />
}</p>
<p>eval(wwnaviLoadJs(&#8216;wwnaviRs/jquery.min.js&#8217;));<br />
eval(wwnaviLoadJs(&#8216;wwnaviRs/jquery.i18n.properties.js&#8217;));<br />
* 必要なJSファイルを同期通信(*1)で読み込み、実行しています。</p>
<p>&#8230; (JSのコード)</p>
<p>(*1)非同期通信の場合、読み込みが完了する前にコードが実行されるのでうまく処理されません。</p></blockquote>
<p>* 各JSファイルのコード量が増えますが、呼出し元のHTMLを修正する必要がありません。wwnaviでは自動化を実現するため、デフォルトではこの方法をとっています。</li>
<li>初期化コードの記述<br />
上記の読み込みの直後に、プロパティファイルの場所や名前、対象言語などを設定する処理を記述します。</p>
<blockquote><p>jQuery.i18n.properties({name:&#8217;wwnaviBundle(*1)&#8217;,path:&#8217;wwnaviRs(*2)/&#8217;,mode:&#8217;both&#8217;,<br />
language:wwnaviGetLang()(*3),callback:function(){}});</p></blockquote>
<p>(*1)プロパティファイルの名前(基底名)です。<br />
(*2)プロパティファイルのパスです。<br />
(*3)対象の言語コード(&#8216;en&#8217;や&#8217;ja&#8217;など)です。この場合、以下のようなブラウザの言語情報を取得する関数を作成して指定しています。</p>
<blockquote><p>function wwnaviGetLang(){<br />
return (navigator.userLanguage||navigator.browserLanguage||navigator.language).substr(0,2);<br />
}</p></blockquote>
<p>*ブラウザ設定の値を使いたい場合は、<a href="https://github.com/dansingerman/jQuery-Browser-Language">jQuery-Browser-Language</a>が使えます。<br />
これはリモートホストにアクセスすることで、HTTPリクエストヘッダーを読むことができます。</p>
<p>以下はこのライブラリを使った初期化コード(ブラウザの設定を認識可)です。</p>
<blockquote><p>$.browserLanguage(function( language , acceptHeader ){<br />
var l  = acceptHeader; l = l.substring(0,2);<br />
jQuery.i18n.properties({name:&#8217;wwnaviBundle&#8217;,path:&#8217;wwnaviRs/&#8217;,mode:&#8217;both&#8217;,language:l,callback:function(){}});<br />
});</p></blockquote>
<p>※ブラウザの言語情報の取得については、<a href="http://www1.kokusaika.jp/advisory/org/ja/js_point.html">ロケール、書式、タイムゾーン</a>をご参照ください。</li>
<li>メッセージ読み込み処理を記述する。<br />
メッセージ読み込みのコードを文字列の位置に埋めこみます。</p>
<blockquote><p>var msg1 = jQuery.i18n.prop(&#8220;sample1_1(*1)&#8221;);</p></blockquote>
<p>(*1)1.で作成したプロパティファイルの対応するキーです。</li>
<li>.propertiesファイルを配置する。<br />
.propertiesファイルを初期化コードで指定したパスに配置します。<br />
ファイル名は以下の規則に従います。<br />
基底名(例：&#8221;wwnaviBundle&#8221;) + &#8220;_&#8221; + 言語名(例：&#8221;ja&#8221;)<br />
基底名だけのファイルはデフォルトのリソースとなり、対応する言語のものがある場合は、そちらが読み込まれます。<br />
以下のように言語分のリソースを追加するだけで、言語を切り替えができるようになります。</p>
<blockquote><p>../wwnaviRs/wwnaviBundle.properties  &#8230; English (default)<br />
../wwnaviRs/wwnaviBundle_ja.properties &#8230; Japanese<br />
../wwnaviRs/wwnaviBundle_ko.properties &#8230; Korean</p></blockquote>
</li>
</ol>
<p>上記は<strong><span style="color: #3366ff;">World Wide Navi付属のJavaScriptの文字列の外部化サンプル</span></strong>で確認できます。</p>
<h4>gettextを使った国際化</h4>
<p>JavaScriptのgettext、サンプルなどは<a href="http://jsgettext.berlios.de/">こちら</a>から入手できます。</p>
<p>C言語版gettextについては<a href="http://www1.kokusaika.jp/advisory/org/ja/gettext.html">gettext によるメッセージ処理</a>をご参照ください。</p>
<h4>.NET Ajaxライブラリを使った国際化</h4>
<p>.NET Ajaxライブラリについては<a href="http://msdn.microsoft.com/ja-jp/magazine/cc135974.aspx">こちら</a>をご参照ください。</p>
<p><span style="color: #3366ff;">※オリジナルソース：</span></p>
<p>ソフトウェア国際化ツール World Wide Navi <a href="http://www1.kokusaika.jp/advisory/org/ja/js_preface.html" target="_blank">JavaScript国際化プログラミング</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kokusaika.jp/2011/06/20/javascript-i18n/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

