2012年3月
« 1月   4月 »
 1234
567891011
12131415161718
19202122232425
262728293031  

カテゴリー

最近のコメント

<!–:ja–>ASP.NET国際化プログラミング – リソース管理<!–:–><!–:en–>ASP.NET Internationalization Programming – Resource Administration<!–:–>

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

1. ASPXにヘッダー追加
カルチャ(言語と地域)の設定をASPXのヘッダー部分に追加します。

Default.aspx

 <%@ Page Language="C#" ...%>
=><%@ Page Culture="auto"
UICulture="auto" Language="C#" ...%>

2. 文字列の外部化(リテラルの置換)
ASP.NETは、文字列リソースの管理のために、4つの構文を持っています。

  • 構文1は “<%=..%>” を必要とします。
  • “”" は構文2では切り落とされます。
  • 構文3は構文1と非常に似ていますが、
    少し違います。
  • 構文4ではmeta属性を追加することで、
    デフォルトのテキストを残すことが出来ます。
  • 構文3と4はASPタグのみにしか使えません。
Default.aspx

* 構文1. (タグテキストの置換) "<%="
 "Resources.Default." RESOURCE_KEY "%>"
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
 <title>This is a sample site!</title>
 => <title><%=Resources.
 Default.DefaultWwnaviMsg1%></title>
</head>
<body>

* 構文2. (プログラム内のリテラルの置換)
 "Resources.Default." RESOURCE_KEY
<div>
 <% Response.Write("Hello, World!"); %>
 => <% Response.Write(
Resources.Default.DefaultWwnaviMsg2); %>
</div> 

* 構文3. (ASPタグ内のテキストの置換)
 "<%$" "Resources.Default,"
RESOURCE_KEY "%>"
<asp:Label ID="Label1" runat="server"
Text="This is label 1.">
=><asp:Label ID="Label1" runat="server" Text=
"<%$Resources:Default,
DefaultWwnaviMsg3%>">
</asp:Label>

* 構文4. (ASPタグ内のmeta属性の追加)
 "meta:resourcekey="" RESOURCE_KEY """
<asp:Label ID="Label1" runat="server"
Text="This is label 1.">
=><asp:Label ID="Label2" runat="server" Text=
"This is label 1." meta:resourcekey=
"DefaultWwnaviMsg4" >
</asp:Label>

各文字列の場所に応じて、適切な構文を使う必要があります。
(ASPタグでは構文3または4どちらかが使えます。)

3. Resxファイルの作成
外部化された文字列をresx(リソース)ファイルに配置します。”App_GlobalResources”フォルダをプロジェクトディレクトリの直下に作成し、resxファイルをその下に、”ASPX_FILE_NAME(拡張子なし).resx”(*1)という名前で作成します。

PROJECT_DIRECTORY
 - App_GlobalResources
 - Default.resx
 - WebForm1.resx
 *1)構文4(meta属性)を使っている場合は、
拡張子を付ける必要があります(Default.aspx.resx)。
Default.resx 

<?xml version="1.0" encoding="utf-8"?>
<root>
 <xsd:schema id="root" xmlns=""
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
 ...
 </xsd:schema>
 ...
 <resheader name="writer">
 <value>System.Resources.ResXResourceWriter,
 System.Windows.Forms, Version=2.0.0.0,
  Culture=neutral,
 PublicKeyToken=b77a5c561934e089</value>
 </resheader>
 <data name="DefaultWwnaviMsg1" xml:space="preserve">
 (RESOURCE_KEY)
 <value>This is a sample clomid site!</value>
 (RESOURCE_STRING)
 </data>
</root>

4. コンパイルとローカリゼーション
ビルドと実行をしてください、ブラウザ内でリソース文字列が表示されるのが確認できるはずです。他の言語のリソースを追加したい場合は、ASPX_FILE_NAME.LOCALE_CODE(例:”ja”).resxをApp_GlobalResourcesに追加してください。

App_GlobalResources
 - Default.resx
... マスターリソース (例:英語)
 - Default.ja.resx
... ローカライズされたリソース (例:日本語)


&amp;amp;lt;!–:ja–&amp;amp;gt;PHP国際化プログラミング – gettextを使った国際化&amp;amp;lt;!–:–&amp;amp;gt;&amp;amp;lt;!–:en–&amp;amp;gt;PHP Internationalization Programming – Internationalization By gettext&amp;amp;lt;!–:–&amp;amp;gt;

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

1. ローカライズする文字列をgettext関数に配置
ローカライズしたい文字列をgettext関数(殆どの場合、”_()”)内に配置します。
これらの文字列は、各外部リソースファイルによってローカライズ(翻訳)されます。

echo "Hello from PHP!";
-> echo _("Hello from PHP!");

2. 初期化コードを記述
ユーザーロケール(言語と地域)を適用し、リソースの名前とパスをgettextの仕組みに教えます。

index.php (または他のphp)

<?php require_once(
$_SERVER["DOCUMENT_ROOT"]."/
gettext/wwnaviRs/" .
"wwnavi.gettext.php");?>
// ロケールの設定およびgettextの
読み込みのための初期化コードの実行
...
echo _("Hello from PHP!");
...
wwnavi.gettext.php // 初期化コード

require_once("wwnaviLang.php");
// 後に使う、
// 言語と地域の配列

$header = $_SERVER[
"HTTP_ACCEPT_LANGUAGE"];
// 言語情報を持った、
ユーザーのHTTPヘッダーの取得

$lang="";
// HTTPヘッダーからロケールを解析
// ロケールの表現は、各Webブラウザによって異なりますが
// ("en"、"en-us"、"en_US"...)、
// setlocaleの引数は、
// "language_REGION"である必要があります。
if(strpos($header, ",")>0) {
 $hds = explode(",", $header);
 $lang = $hds[];
 $lang = str_replace("-", "_",
 $lang);
 if(strpos($lang, "_")>0) {
 $ls = explode("_", $lang);
 if(count($ls)>1) $lang =
 $ls[] . "_" . strtoupper($ls[]);
 }else if(!empty($wwnaviLang[$lang]
 )) {
 $lang .= "_" . $wwnaviLang[
 $lang];
 // 言語コード(例: "en")
 // のみの場合、地域コード(例: "US")を、
 // 予め定義された配列から追加します。
 // setlocaleは、完全なロケール名を必要と
 // するからです。
 }
}
//echo $lang . "
";
//putenv("LC_ALL=$lang");

setlocale(LC_ALL, $lang);
// $langは少なくとも、
// 言語と地域(例:"en_US")である必要があります。

$domain = "wwnaviBundle";
// gettextのリソース名と
// パスを教えます。
bindtextdomain($domain,
dirname(__FILE__));
textdomain($domain);
bind_textdomain_codeset(
$domain, "UTF-8");
wwnaviLang.php // 予め定義された、
// 言語とデフォルトの地域のコードの配列

$wwnaviLang = array(
...
"de"=>"DE",
"en"=>"US",
"es"=>"ES",
"et"=>"EE",
"eu"=>"ES",
"fa"=>"IR",
"fi"=>"FI",
"fo"=>"FO",
"fr"=>"FR",
...
"ja"=>"JP",
...

3. gettextのマスターテンプレートリソース(.POT)の作成
msgidとmsgstrのペアを持つ、マスターリソース(.pot)を、リソースパスの下に作成する必要があります。
xgettextコマンドは、”_()”文字列をスキャンし、potファイルを作成するのに便利です。

YOUR_DOCUMENT_ROOT/gettext/
wwnaviRs/(*1)
 ... wwnaviBundle.pot(*1)

*1)上記コードで
指定されたものと同じディレクトリ
wwnaviBundle.pot
...

#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-03-05 17:32 0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: /...../examples/php/gettext/index.php:10
msgid "Hello from PHP!"
msgstr ""

#: /...../examples/php/gettext/index.php:13
msgid "This is a DIV text."
msgstr ""
...

#: /root/wwnavi/workspace/examples/php/
gettext/sub/sub2/sub2.php:31
#, php-format
msgid "My local time is %c!"
msgstr ""
xgettext -j -L php -k"_" --from-code=UTF-8 -o
/..../examples/php/gettext/wwnaviRs/
wwnaviBundle.pot \
 /..../examples/php/gettext/index.php

4. .POTを各言語リソース(.PO)にローカライズ
マスターテンプレートを、対象ロケールのディレクトリ(LOCALE(例:”ja_JP”)/LC_MESSAGES)に、.poファイルとしてコピーし、msgstrを翻訳します。

日本語への翻訳の場合

YOUR_DOCUMENT_ROOT/gettext/
wwnaviRs/ja_JP/LC_MESSAGES
 ... wwnaviBundle.po
ja_JP/LC_MESSAGES/wwnaviBundle.po
...

#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-03-05 17:32 0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: /...../examples/php/gettext/index.php:10
msgid "Hello from PHP!"
msgstr "PHPからこんにちは!"

#: /...../examples/php/gettext/index.php:13
msgid "This is a DIV text."
msgstr "これはDIVのテキストです。"
...

#: /root/wwnavi/workspace/examples/php/gettext/
sub/sub2/sub2.php:31
#, php-format
msgid "My local time is %c!"
msgstr "わたしの現地時間は%cです!"

***注意: “%c”のようなフォーマット文字を修正(翻訳)してはいけません。


5. .POを.MO(リソースバイナリ)にコンパイル

msgfmtコマンドを実行し、リソースバイナリ(.mo)を対象ロケールディレクトリに作成します。

msgfmt -o wwnaviBundle.mo wwnaviBundle.po

これで、ブラウザの言語設定を変更しながら、英語と日本語のメッセージを切り替えられるようになります。

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

POT/POのローカリゼーションのプロセスは、ローカリゼーションツールSisulizerを使うことで、より簡単に効果的になります。



&amp;amp;lt;!–:ja–&amp;amp;gt;ソフトウェアローカリゼーションツールSisulizer(シスライザー)製品ページ更新&amp;amp;lt;!–:–&amp;amp;gt;&amp;amp;lt;!–:en–&amp;amp;gt;Software Localization Tool Sisulizer Product Page Updated&amp;amp;lt;!–:–&amp;amp;gt;

弊社が販売しているソフトウェアローカリゼーションツール Sisulizer (シスライザー)の製品ページに、日英の詳細ページを追加しました!

http://www.kokusaika.jp/product/sisulizer/details.html

ご購入の際にぜひお役立てください!

WEBアプリケーション、Android、.NET、Delphiなど、様々なプラットフォームへの対応を、ソフトウェア国際化ツール World Wide Navi国際化プログラミング参考情報とともに、詳細に記述しています。

今後は、特設サイトも設けて、より多くの情報発信、製品サポートをしていく予定です!

また、日本語ユーザー向けのTwitterも始めました!

@sisulizerJp

こちらもSisulizerの情報にとどまらず、広くローカリゼーションの情報を発信していきますので、フォローよろしくお願いいたします!