2017年2月
« 1月    
 12345
6789101112
13141516171819
20212223242526
2728  

カテゴリー

最近のコメント

<!–:ja–>PHP国際化プログラミング – マルチバイト、ロケール、書式、タイムゾーン<!–:–><!–:en–>PHP Internationalization Programming – Multi-Byte, Locale, Format, and Time Zone<!–:–>

ソフトウェア国際化ツールWorld Wide Navi(ワールドワイドナビ)の国際化プログラミング参考情報から、PHPの国際化の抜粋です。

1. マルチバイト
文字日本語のようなマルチバイト文字を扱うためには、mbstringモジュールをWebサーバーにインストールする必要があります。
mb_***()関数はマルチバイト文字の操作を提供し、いくつかのmb_を持たない関数は正しくマルチバイト文字を処理できないため、mb_***()関数に置き換える必要があります。

主な重要関数は以下となります。

===
主なマルチバイト関数の変換
=== (非推称 -> 推称)

mail() -> mb_send_mail()

strlen() -> mb_strlen()
strpos() -> mb_strpos()
strrpos() -> mb_strrpos()
substr() -> mb_substr()
str_replace() -> mb_ereg_replace()
strstr() -> mb_strstr()
strtolower() -> mb_strtolower()
strtoupper() -> mb_strtoupper() 

ereg() -> mb_ereg()
または preg_match()
eregi() -> mb_eregi()
または "i"を使った preg_match()
ereg_replace() -> mb_ereg_replace()
または preg_replace()
eregi_replace() -> mb_eregi_replace()
または "i"を使った preg_replace()
split() -> mb_split() または preg_split()

全てのマルチバイト関数については、
PHPマニュアル -
マルチバイト文字列 関数を参照してください。

全ての非推称の関数については、
PHPマニュアル -
PHP 5.3.x で推奨されない機能
を参照してください。

* mbstring.func_overloadビットフラグを使うことで、非推称の関数のいくつかをオーバーロードされたマルチバイト関数として使用できます。
PHPマニュアル – 関数のオーバーロード機能を参照してください。

2. ユーザーロケールの設定
ユーザーロケール(ユーザーの言語と地域)を日付操作や文化依存の書式(日付、通貨…)に適用させるには、setlocale関数を呼ぶ必要があります。

$locale = "en_US.UTF-8" or "ja_JP.UTF-8"...
これらはHTTPヘッダー(Accept-Language)、
もしくは保存されたアカウント情報から取得する
必要があります。

setlocale(LC_ALL, $locale);
... 全てのロケール対応関数用
例) gettextリソースの切り替え

setlocale(LC_TIME, $locale);
... 日付のローけー屡対応関数用
例) 日付関数の書式の切り替え

3. ユーザー文化に基づくフォーマット
ロケール対応関数はsetlocale関数によってフォーマット(書式)を切り替えることができます。

setlocale(LC_TIME, "en_US.UTF-8");
strftime("%c");
... "Mon 01 Jan 2012..."を返します。
(英語書式)

setlocale(LC_TIME, "ja_JP.UTF-8");
strftime("%c");
... "2012年1月1日..."を返します。
(日本語書式)

*"%c"は、ロケール対応書式のパターンです。

4. サーバーとユーザー間の時間の変換
多言語でグローバル化されたwebサービスで時間を処理するには、GMT/UTCを使うことが推称されます。 date_default_timezone_setを使うことで、全てのユーザー活動を共通時間で管理し、各ユーザーのタイムゾーンに変換することができます。GMT/UTCの処理については、国際化プログラミング- サーバーサイドプログラミングを参照してください。

$timestamp = strtotime(gmdate("Y-m-d H:i:s"));
 ... GMT/UTC タイムスタンプ

date_default_timezone_set("Asia/Tokyo");
... 日本のタイムゾーンを設定
strftime("%c", $timestamp);
... 日本の現地時間を返す

date_default_timezone_set("America/Los_Angeles");
... アメリカのタイムゾーンを設定
strftime("%c", $timestamp);
... アメリカの現地時間を返す

* ユーザーのタイムゾーンはユーザーアカウント情報から取得すべきです。ログインしていないユーザーについては、アクセスIPのエリアか、ユーザーのWebブラウザのJavaScriptで知ることができます。
JavaScriptでのタイムゾーンの取得については、国際化プログラミング- ロケール、書式、タイムゾーン (JavaScriptの章)を参照してください。



<!–:ja–>JSONによるJavaScriptの国際化(文字列切り替え)<!–:–><!–:en–>JavaScript Internationalization with JSON<!–:–>

以前、JavaScript国際化プログラミング で、jQueryを使った、Javaプロパティファイルによる国際化(文字列切り替え)、および他の国際化ライブラリ(Glob(jquery-global)など)について書きましたが、今回は、jQueryを使わず、Pure Java JSONによる文字列切り替えについて書こうと思います。

オリジナルコンテンツは、ソフトウェア国際化ツールWorld Wide Navi付属の、国際化プログラミングの章になりますので、そちらも参照してください。

1.リソースファイルの作成

JSファイル内の埋めこみ文字列をJSONファイルに外部化します。

sample_1.js

var msg1 = "msg1:";
->var msg1 = wwnRs.sample1_1(*1);
function msgA() {
 alert(msg1 "Hello, this is a sample1 text.");
 ->alert(msg1 wwnRs.sample1_2(*1));
}

../wwnaviRs/wwnaviBundle.json

{
"sample1_1" : "msg1:",(*2)
"sample1_2" : "Hello, this is a sample1 text."(*2)
}

*1) wwn.sample1_1 = JSON変数.JSONキー
*2) “sample1_1″ : “msg1″ = “JSONキー” : “JSON値”
最後の”,”は削除する必要があります。削除しない場合、IEは正しくJSONを解析できません。

2.JSONのロード処理を他のJSファイルに作成

文字列をJSONに外部化した後、それらをユーザーロケール(ブラウザの言語設定)に適した形で、上記の変数にロードする処理を書く必要があります。 処理は、はじめに呼ばれる1つのJSファイル(この章では”wwnaviJs.json.js”と呼びます)にまとめて、HTMLヘッダーで読み込むことがのぞましいです。

HTMLヘッダー

<head>
...
<script src="wwnaviRs/wwnaviJs.json.js"
 type="text/javascript">
</script>
<script src="sample_1.js" type="text/javascript">
</script>
...

wwnaviJs.json.js (初期化コード)

// 通常のAjax HTTPリクエスト関数
function wwnaviHttpRequest(){
 if(window.ActiveXObject){
 try{
 return new ActiveXObject(
 "Msxml2.XMLHTTP");
 }catch(e){
 try {
 return new ActiveXObject(
 "Microsoft.XMLHTTP");
 }catch(e2){
 return null;
 }
 }
 }else if(window.XMLHttpRequest){
 return new XMLHttpRequest();
 }else{
 return null;
 }
}

// 「同期」処理でのAjaxによるファイル読み込み関数
// 通常のAjax通信は「非同期」ですが、
// それではファイル読み込みが完了するまで待機できないので、
// 「同期」方法を採用しています。
function wwnaviLoadJs(url){
 htoj = wwnaviHttpRequest();
 htoj.open("GET", url, false);
 htoj.send(null);
 return htoj.responseText;
}

// JSON変数(「wwnRs」は、sample_1.jsと同じである必要あり)
// の初期化
var wwnRs = eval("({"_rslang":""})");

// HTTPサーバーアクセスを通じてユーザーロケールを
// 取得するためのコールバック関数 (JSONP)
// (最後の行参照)
function wwnParseLang(json) {

  // 言語と国コード(例:en-us)を取得するための
 // HTTPヘッダー
 var l = ""; if(json["Accept-Language"]
 != undefined)
 l = json["Accept-Language"];
 if(l.indexOf(",") >=0) l = l.substring(0,
 l.indexOf(","));

 // マスターのJSONリソース(ロケールなしのもの)を、
 // JSON変数へ読み込む (同期Ajax).
 wwnRs = eval("("
 wwnaviLoadJs("wwnaviRs/wwnaviBundle.json") ")");
 wwnRs._rslang="default"; 

 try {
 // ユーザーロケール(変数"l")のJSONリソースを、
 // JSON変数に読み込む (同期Ajax).
 wwnRs = eval("("
 wwnaviLoadJs("wwnaviRs/" l
  "/wwnaviBundle.json") ")");
 wwnRs._rslang=l; 
 // 使用されたリソースのロケールコードを設定
 }catch(e){
 // エラー(ユーザーロケールのリソースが見つからない)
 // 場合、マスターを使用
 }

 wwnRs._ulang=l; 
 // 検出したユーザーロケールを設定

}

// ユーザーロケールを取得するために、
// jQuery browser languageライブラリ(*)の
// JSONP APIを使用していますが、
// 他のものを使うことも可能です。
document.write(
"<script
src="http://ajaxhttpheaders2.appspot.com/
?callback=wwnParseLang"
type="text/javascript"></script>"
);

*)jQuery browser languageライブラリについては、
GitHubを参照してください。

3.JSONファイルの配置

マスターJSONファイル(ステップ1の”wwnaviRs/wwnaviBundle.json“)と翻訳(ローカライズ)されたファイルを、上記の初期化コードに従い、ロケールのディレクトリに配置します。

ローカライズされたリソース =
 wwnaviRs(リソースパス)/ユーザーロケール/
   wwnaviBundle(リソース名).json

ローカライズされたリソースを追加するだけで、JavaAScriptメッセージをユーザーの言語設定に基づいて切り替えられます。

../wwnaviRs/wwnaviBundle.json ... 英語 (デフォルト)
../wwnaviRs/ja/wwnaviBundle.json ... 日本語
../wwnaviRs/ko/wwnaviBundle.json ... 韓国語

これらの処理は、World Wide Navi内のJavaScriptの文字列外部化のサンプルで確認できます。