<?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>Thu, 05 Apr 2012 15:00:03 +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>Windows API国際化プログラミング &#8211; リソース読み込み（Win32、MFC）</title>
		<link>http://blog.kokusaika.jp/2012/04/06/windows-api-mfc-i18n-resource-load/</link>
		<comments>http://blog.kokusaika.jp/2012/04/06/windows-api-mfc-i18n-resource-load/#comments</comments>
		<pubDate>Thu, 05 Apr 2012 15:00:03 +0000</pubDate>
		<dc:creator>J. O.</dc:creator>
				<category><![CDATA[World Wide Navi]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[I18N]]></category>
		<category><![CDATA[Internationalization]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Win32]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[国際化]]></category>
		<category><![CDATA[多言語化]]></category>

		<guid isPermaLink="false">http://blog.kokusaika.jp/?p=947</guid>
		<description><![CDATA[<p>ソフトウェア国際化ツールWorld Wide Navi（ワールドワイドナビ）の国際化プログラミング参考情報から、Windows APIの国際化の抜粋です。</p>
<p>かなり古めな情報になりますが、MFCなどのレガシーなアプリケーションをお持ちで多言語化、海外展開をしたいと思っている方には、上記の参考情報はかなり有用なのではと思います。（特に、GUIのリソースとメッセージのリソースを同期をとって切り替える部分など）</p>
<p>眠っているアプリケーションをもういちど引き出しから出して、世界に羽ばたかせてみてはいかがでしょうか？</p>
<p>Visual Studioなどで作成されたWindows APIアプリケーションは通常、ラベルやメッセージなどの 言語間で異なるリソース情報がアプリケーションと一体化しています。 国際化されたアプリケーションにするには、実行時の言語設定にあったリソースを動的に読み込む 機能を作りこまなければなりません。 そのためにはリソースをDLLとして配布する方法が一般的にとられます。</p>
<p>1. リソースファイル(.rc)を作成する
ラベルやメッセージをリソースキーと値からなるリソースファイルに記述する。
以下はWorld Wide Naviで作成されたファイルの例。</p>

#pragma code_page(1252)
STRINGTABLE
BEGIN
    IDS_MSG_WWNAVI1
"Hello, how are you? This is sample for Windows DLL."
    IDS_MSG_WWNAVI2
 "This is title 1."
    IDS_MSG_WWNAVI3
 "This is message 2."
    IDS_MSG_WWNAVI4
"This is title 2."
END

<p>*コードページとファイルのエンコーディングは正しく対応する必要があります。</p>
<p>2. リソースの読み込み処理を記述する。
ラベルやメッセージを上記のリソースから読み込む処理を記述する。
読み込みにはLoadString関数を使う。
以下はWorld Wide Naviで生成されたコードの例。</p>

LoadString(wwnaviH, uID, wwnaviBuf1,
WWNAVI_BUFF_SIZE);

<p>wwnaviH &#8230; [...]]]></description>
			<content:encoded><![CDATA[<p>ソフトウェア国際化ツール<a href="http://www.kokusaika.jp/product/wwnavi.html" target="_blank">World Wide Navi</a>（ワールドワイドナビ）の<a href="http://www1.kokusaika.jp/advisory/org/ja/top.html" target="_blank">国際化プログラミング参考情報</a>から、<a href="http://www1.kokusaika.jp/advisory/org/ja/win32_preface.html" target="_blank">Windows APIの国際化</a>の抜粋です。</p>
<p>かなり古めな情報になりますが、MFCなどのレガシーなアプリケーションをお持ちで多言語化、海外展開をしたいと思っている方には、上記の参考情報はかなり有用なのではと思います。（特に、GUIのリソースとメッセージのリソースを同期をとって切り替える部分など）</p>
<p><strong>眠っているアプリケーションをもういちど引き出しから出して、世界に羽ばたかせてみてはいかがでしょうか？</strong></p>
<p>Visual Studioなどで作成されたWindows APIアプリケーションは通常、ラベルやメッセージなどの 言語間で異なるリソース情報がアプリケーションと一体化しています。 国際化されたアプリケーションにするには、実行時の言語設定にあったリソースを動的に読み込む 機能を作りこまなければなりません。 そのためにはリソースをDLLとして配布する方法が一般的にとられます。</p>
<p><strong>1. リソースファイル(.rc)を作成する</strong><br />
ラベルやメッセージをリソースキーと値からなるリソースファイルに記述する。<br />
以下はWorld Wide Naviで作成されたファイルの例。</p>
<blockquote>
<pre>#pragma code_page(1252)
STRINGTABLE
BEGIN
    IDS_MSG_WWNAVI1
"Hello, how are you? This is sample for Windows DLL."
    IDS_MSG_WWNAVI2
 "This is title 1."
    IDS_MSG_WWNAVI3
 "This is message 2."
    IDS_MSG_WWNAVI4
"This is title 2."
END</pre>
</blockquote>
<p>*コードページとファイルのエンコーディングは正しく対応する必要があります。</p>
<p><strong>2. リソースの読み込み処理を記述する。</strong><br />
ラベルやメッセージを上記のリソースから読み込む処理を記述する。<br />
読み込みにはLoadString関数を使う。<br />
以下はWorld Wide Naviで生成されたコードの例。</p>
<blockquote>
<pre>LoadString(wwnaviH, uID, wwnaviBuf1,
WWNAVI_BUFF_SIZE);</pre>
</blockquote>
<p>wwnaviH &#8230; DLLモジュールへのポインタ(後述)。<br />
uID &#8230; リソースキー<br />
wwnaviBuf1 &#8230; 読み込んだ文字列の格納先(TCHAR)。<br />
WWNAVI_BUFF_SIZE &#8230; 格納先のバッファサイズ。</p>
<p><strong>3. リソースDLLの動的読み込みを記述する。</strong><br />
エントリポイント(アプリケーション起動時に呼ばれる個所)にリソースDLLを読み込む処理を記述します。<br />
このとき、実行時の言語設定にあったDLLを読み込むようにしなくてはなりません。<br />
World Wide Naviでは、GetUserDefaultLCIDで実行時のLCID(ロケールのID)を取得し、 それをISO-639の言語コードに変換して、該当するDLLをロードする方法をとっています。 以下はWorld Wide Naviで生成されたコードの例。</p>
<blockquote>
<pre>TCHAR libName[MAX_PATH];
TCHAR langName[10];
LCID id=GetUserDefaultLCID();
GetLocaleInfo(id,
LOCALE_SISO639LANGNAME,langName,10);
wsprintf(libName ,
 _T("./%s/wwnavi_string.dll"), langName);
wwnaviH = LoadLibrary(
libName);
if (wwnaviH == NULL) {
    wwnaviH =
LoadLibrary(_T("./wwnavi_string.dll"));
}</pre>
</blockquote>
<p>wwnaviH &#8230; DLLモジュールへのポインタ。<br />
LoadLibrary &#8230; DLLを読み込み、ポインタへ渡す関数です。<br />
GetUserDefaultLCID &#8230; 実行時のロケールIDを取得する関数です。<br />
GetLocaleInfo &#8230; ロケールIDから文字列情報を取得する関数です。<br />
*上記ではLCIDから変換された言語コードのDLLを読み込み、<br />
該当するものがなければデフォルトのDLLを読み込むようにしています。</p>
<p>Visual StudioでWin32アプリケーションを作成する場合は、 デフォルトリソースファイル(メニュー、アイコン、その他リソースを含む your-application-name.rcという名前のもの)を自分自身のファイルと結合しなければなりません。<br />
簡単な方法は、ロードしたモジュールをアプリケーションのデフォルトにセットし、 アプリケーションのリソースを自分自身のファイルに含めることです。</p>
<blockquote>
<pre><span style="color: #3366ff;">*** 自分自身の .rc file</span>
...
STRINGTABLE
BEGIN
    IDS_MSG_WWNAVI1
"Hello, how are you? This is sample for Windows DLL."
    IDS_MSG_WWNAVI2
"This is title 1."
    IDS_MSG_WWNAVI3
"This is message 2."
    IDS_MSG_WWNAVI4
 "This is title 2."
END

...

#include "././Test.rc"
&lt;- <span style="color: #ff0000;">* アプリケーションの.rcファイルを含める</span>

<span style="color: #3366ff;">*** main関数内</span>

int WINAPI WinMain(HINSTANCE
hInstance, HINSTANCE hPreInst,
   LPSTR lpszCmdLine,
 int nCmdShow) {
...
hInstance = LoadLibrary(
YOUR_LIB_NAME);
&lt;- <span style="color: #ff0000;">* 引数のハンドルにロードしたハンドルをセット</span></pre>
</blockquote>
<p>MFCアプリケーションの場合は、hIsntanceをセットする代わりに AfxSetResourceHandleを使います。</p>
<blockquote>
<pre><span style="color: #3366ff;">*** InitInstanceメソッド内</span>

BOOL CXXXX::InitInstance()
{
...
AfxSetResourceHandle(LoadLibrary(
YOUR_LIB_NAME));
&lt;- <span style="color: #ff0000;">* デフォルトのリソースハンドルにロードしたハンドルをセット</span></pre>
</blockquote>
<p><strong>4. リソースファイルをDLLにコンパイルする。</strong><br />
Visual Studio附属のRCコマンド、またはDLLプロジェクトから リソースファイル(.rc)をDLL(.dll)にコンパイルします (World Wide NaviはDLLプロジェクトを自動的に作成し、 ソリューションまたはワークスペースに追加します)。<br />
World Wide Naviは、実行ファイルと同じ場所のDLLをデフォルトとし、<br />
言語コードディレクトリ内のものをその言語用のDLLとみなす方法をとっています。<br />
たとえば日本語リソースの場合、以下のようにDLLを作成します。</p>
<blockquote>
<pre>./Foo.exe
... <span style="color: #ff0000;">実行ファイル</span>
./wwnavi_string.rc
-&gt; ./wwnavi_string.dll
... &lt;- <span style="color: #ff0000;">* デフォルトDLL</span>
./wwnavi_string_ja.rc
-&gt; ./ja/wwnavi_string.dll
... &lt;- <span style="color: #ff0000;">* 日本語DLL</span></pre>
</blockquote>
<p>LCIDとロケール、コードページの対応は以下のようになります。(MSDNページより抜粋)</p>
<blockquote>
<pre>--------------------------------------------------------------------------------------------------
LCID       Language       	    Sublanguage   	           code page        Language code
--------------------------------------------------------------------------------------------------
0x0436     Afrikaans     	    South Africa                   1252     	    AFK
0x041c     Albanian      	    Albania                        1250             SQI
0x1401     Arabic        	    Algeria                        1256             ARG
0x3c01     Arabic        	    Bahrain                        1256             ARH
0x0c01     Arabic        	    Egypt                          1256             ARE
0x0801     Arabic        	    Iraq                           1256             ARI
0x2c01     Arabic        	    Jordan                         1256             ARJ
0x3401     Arabic        	    Kuwait                         1256             ARK
0x3001     Arabic        	    Lebanon                        1256             ARB
0x1001     Arabic        	    Libya                          1256             ARL
0x1801     Arabic        	    Morocco                        1256             ARM
0x2001     Arabic        	    Oman                           1256             ARO
0x4001     Arabic        	    Qatar                          1256             ARQ
0x0401     Arabic        	    Saudi Arabia                   1256             ARA
0x2801     Arabic        	    Syria                          1256             ARS
0x1c01     Arabic        	    Tunisia                        1256             ART
0x3801     Arabic        	    U.A.E.                         1256             ARU
0x2401     Arabic        	    Yemen                          1256     	    ARY
0x042b     Armenian      	    Armenia                        Unicode only     HYE
0x044d     Assamese      	    India                          Unicode only     ASM
0x082c     Azeri         	    Azerbaijan (Cyrillic)          1251             AZE
0x042c     Azeri         	    Azerbaijan (Latin)             1254             AZE
0x042d     Basque        	    Spain                          1252             EUQ
0x0423     Belarusian    	    Belarus                        1251             BEL
0x0445     Bengali       	    India                                           BEN
0x0402     Bulgarian     	    Bulgaria                       1251             BGR
0x0403     Catalan       	    Spain                          1252             CAT
0x0c04     Chinese       	    Hong Kong SAR                  950              ZHH
0x1404     Chinese       	    Macao SAR                      950              ZHM
0x0804     Chinese       	    PRC                            936              CHS
0x1004     Chinese       	    Singapore                      936              ZHI
0x0404     Chinese       	    Taiwan                         950              CHT
0x0827     Classic       	    Lithuanian                     1257             LTC
0x041a     Croatian      	    Croatia                        1250             HRV
0x0405     Czech         	    Czech Republic                 1250             CSY
0x0406     Danish        	    Denmark                        1252             DAN
0x0465     Divehi         	    Maldives                       Unicode only     DIV
0x0813     Dutch         	    Belgium                        1252             NLB
0x0413     Dutch         	    Netherlands                    1252             NLD
0x0c09     English       	    Australia                      1252             ENA
0x2809     English       	    Belize                         1252             ENL
0x1009     English       	    Canada                         1252             ENC
0x2409     English       	    Caribbean                      1252             ENB
0x1809     English       	    Ireland                        1252             ENI
0x2009     English       	    Jamaica     	           1252             ENJ
0x1409     English       	    New Zealand     	           1252             ENZ
0x3409     English       	    Philippines     	           1252             ENP
0x1c09     English       	    South Africa                   1252             ENS
0x2c09     English       	    Trinidad                       1252             ENT
0x0809     English       	    United Kingdom                 1252             ENG
0x0409     English       	    United States                  1252             USA
0x3009     English       	    Zimbabwe                       1252             ENW
0x0425     Estonian      	    Estonia                        1257             ETI
0x0438     Faeroese      	    Faeroe Islands                 1252             FOS
0x0429     Farsi         	    Iran                           1256             FAR
0x040b     Finnish       	    Finland                        1252             FIN
0x080c     French        	    Belgium                        1252             FRB
0x0c0c     French        	    Canada                         1252             FRC
0x040c     French        	    France                         1252             FRA
0x140c     French        	    Luxembourg                     1252             FRL
0x180c     French        	    Monaco     	                   1252             FRM
0x100c     French        	    Switzerland     	           1252             FRS
0x042f     Macedonian (FYROM)       Macedonian (FYROM)             1251             MKI
0x0456     Galician      	    Spain     	                   1252             GLC
0x0437     Georgian      	    Georgia     	           Unicode only     KAT
0x0c07     German        	    Austria     	           1252             DEA
0x0407     German        	    Germany     		   1252             DEU
0x1407     German        	    Liechtenstein     	           1252             DEC
0x1007     German        	    Luxembourg     	           1252             DEL
0x0807     German        	    Switzerland     	           1252             DES
0x0408     Greek         	    Greece     		           1253             ELL
0x0447     Gujarati      	    India     		           Unicode only     GUJ
0x040d     Hebrew        	    Israel     		           1255             HEB
0x0439     Hindi         	    India     		           Unicode only     HIN
0x040e     Hungarian     	    Hungary     		   1250             HUN
0x040f     Icelandic     	    Iceland     		   1252             ISL
0x0421     Indonesian     	    Indonesia (Bahasa)             1252             IND
0x0410     Italian       	    Italy     		           1252             ITA
0x0810     Italian       	    Switzerland     	           1252             ITS
0x0411     Japanese      	    Japan     		           932              JPN
0x044b     Kannada       	    India (Kannada script)         Unicode only     KAN
0x043f     Kazakh        	    Kazakstan     	           1251             KKZ
0x0457     Konkani       	    India     		           Unicode only     KNK
0x0412     Korean        	    Korea     		           949              KOR
0x0440     Kyrgyz        	    Kyrgyzstan     	           1251             KYR
0x0426     Latvian       	    Latvia     		           1257             LVI
0x0427     Lithuanian    	    Lithuania     	           1257             LTH
0x083e     Malay         	    Brunei Darussalam              1252             MSB
0x043e     Malay         	    Malaysia     		   1252             MSL
0x044c     Malayalam     	    India     		           Unicode only     MAL
0x044e     Marathi       	    India     	                   Unicode only     MAR
0x0450     Mongolian (Cyrillic)     Mongolia     	 	   1251             MON
0x0414     Norwegian     	    Norway (Bokmal)     	   1252             NOR
0x0814     Norwegian     	    Norway (Nynorsk)     	   1252             NON
0x0448     Oriya         	    India           			            ORI
0x0415     Polish        	    Poland     	                   1250             PLK
0x0416     Portuguese    	    Brazil     	                   1252             PTB
0x0816     Portuguese    	    Portugal     		   1252             PTG
0x0446     Punjabi       	    India (Gurmukhi script)        Unicode only     PAN
0x0418     Romanian      	    Romania     		   1250             ROM
0x0419     Russian       	    Russia     	       	           1251             RUS
0x044f     Sanskrit      	    India     		           Unicode only     SAN
0x0c1a     Serbian       	    Serbia (Cyrillic)              1251             SRB
0x081a     Serbian       	    Serbia (Latin)     	           1250             SRL
0x041b     Slovak        	    Slovakia     	           1250             SKY
0x0424     Slovenian     	    Slovenia     	           1250             SLV
0x2c0a     Spanish      	    Argentina     	           1252             ESS
0x400a     Spanish       	    Bolivia     	           1252             ESB
0x340a     Spanish       	    Chile     		           1252             ESL
0x240a     Spanish       	    Colombia                       1252             ESO
0x140a     Spanish       	    Costa Rica                     1252             ESC
0x1c0a     Spanish       	    Dominican Republic             1252             ESD
0x300a     Spanish       	    Ecuador                        1252             ESF
0x440a     Spanish       	    El Salvador                    1252             ESE
0x100a     Spanish       	    Guatemala                      1252             ESG
0x480a     Spanish       	    Honduras                       1252             ESH
0x080a     Spanish       	    Mexico                         1252             ESM
0x4c0a     Spanish       	    Nicaragua                      1252             ESI
0x180a     Spanish       	    Panama                         1252             ESA
0x3c0a     Spanish       	    Paraguay                       1252             ESZ
0x280a     Spanish       	    Peru                           1252             ESR
0x500a     Spanish       	    Puerto Rico                    1252             ESU
0x040a     Spanish       	    Spain (Traditional sort)       1252             ESP
0x0c0a     Spanish       	    Spain (International sort)     1252             ESN
0x380a     Spanish     	 	    Uruguay     	           1252             ESY
0x200a     Spanish       	    Venezuela     	           1252             ESV
0x0441     Swahili       	    Kenya     	                   1252             SWK
0x081d     Swedish       	    Finland     	           1252             SVF
0x041d     Swedish       	    Sweden     	                   1252             SVE
0x045a     Syriac        	    Syria     		           Unicode only     SYR
0x0449     Tamil         	    India                          Unicode only     TAM
0x0444     Tatar         	    Tatarstan                      1251             TTT
0x044a     Telugu        	    India (Telugu script)          Unicode only     TEL
0x041e     Thai          	    Thailand                       874              THA
0x041f     Turkish       	    Turkey                         1254             TRK
0x0422     Ukrainian     	    Ukraine                        1251             UKR
0x0420     Urdu          	    Pakistan                       1256             URP
0x0820     Urdu          	    India                          1256             URI
0x0843     Uzbek         	    Uzbekistan (Cyrillic)          1251             UZB
0x0443     Uzbek         	    Uzbekistan (Latin)             1254             UZB
0x042a     Vietnamese    	    Viet Nam                       1258             VIT

The following special identifiers are also defined:
Identifier     Sublanguage/locale
0x0000         Language-Neutral
0x0400         Process Default Language

--------------------------------------------------------------------------------------------------</pre>
</blockquote>
<p>上記は<a href="http://www.kokusaika.jp/product/wwnavi.html" target="_blank">World Wide Navi</a>付属のサンプルコード(windows_dll)にWindows DLLの外部化を実行することで確認できます。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kokusaika.jp/2012/04/06/windows-api-mfc-i18n-resource-load/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visual Basic 6.0国際化プログラミング</title>
		<link>http://blog.kokusaika.jp/2012/04/04/visual-basic-6-i18n-resource/</link>
		<comments>http://blog.kokusaika.jp/2012/04/04/visual-basic-6-i18n-resource/#comments</comments>
		<pubDate>Tue, 03 Apr 2012 15:00:38 +0000</pubDate>
		<dc:creator>J. O.</dc:creator>
				<category><![CDATA[World Wide Navi]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[I18N]]></category>
		<category><![CDATA[Internationalization]]></category>
		<category><![CDATA[VB6]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[国際化]]></category>
		<category><![CDATA[多言語化]]></category>

		<guid isPermaLink="false">http://blog.kokusaika.jp/?p=936</guid>
		<description><![CDATA[<p>ソフトウェア国際化ツールWorld Wide Navi（ワールドワイドナビ）の国際化プログラミング参考情報から、Visual Basic 6.0の国際化の抜粋です。</p>
<p>ちょっとというかかなり古いトピックですが、上記の参考情報以外にここまでまとめられているサイトはないので、VB6の古いアプリの多言語化を探している方には、かなり有用なトピックではないかと思います。</p>
<p>眠っているアプリケーションをもういちど引き出しから出して、世界に羽ばたかせてみてはいかがでしょうか？</p>
<p>各言語設定(ロケール)に対応してメッセージ、ラベル、キャプション、フォントなどを切り替えるためには、 これらのデータをリソースにまとめ動的に読み込む必要があります。
Visual Basic 6.0では、それはWindows APIのリソース読み込みと同じ方法を用いることで達成できます。
次の手順ではVisual Basic 6.0でリソースデータを作成、読み込む方法を、 World Wide Naviの文字列の外部化を使って説明しています。</p>
<p>1. リソースファイル(.rc)の作成
文字列をリソースのキーと値からなるリソースファイルに記述します。
(このファイルはテキストエディタ、またはWorld Wide Navi文字列の外部化によって作成できます。)
以下はWorld Wide Naviによって作成されたサンプルコードです。</p>

wwnavi_string.rc
...
#pragma code_page(1252)
STRINGTABLE
BEGIN
    101 "My Name" // MsgBox ("My Name"), MyClass.cls
    102 "Form1" // Caption
 =   "Form1", Form1.frm
    103 "MS PGothic" // Name
    =  [...]]]></description>
			<content:encoded><![CDATA[<p>ソフトウェア国際化ツール<a href="http://www.kokusaika.jp/product/wwnavi.html" target="_blank">World Wide Navi</a>（ワールドワイドナビ）の<a href="http://www1.kokusaika.jp/advisory/org/ja/top.html" target="_blank">国際化プログラミング参考情報</a>から、<a href="http://www1.kokusaika.jp/advisory/org/ja/vb_preface.html" target="_blank">Visual Basic 6.0の国際化</a>の抜粋です。</p>
<p>ちょっとというかかなり古いトピックですが、上記の参考情報以外にここまでまとめられているサイトはないので、VB6の古いアプリの多言語化を探している方には、かなり有用なトピックではないかと思います。</p>
<p><strong>眠っているアプリケーションをもういちど引き出しから出して、世界に羽ばたかせてみてはいかがでしょうか？</strong></p>
<p>各言語設定(ロケール)に対応してメッセージ、ラベル、キャプション、フォントなどを切り替えるためには、 これらのデータをリソースにまとめ動的に読み込む必要があります。<br />
Visual Basic 6.0では、それはWindows APIのリソース読み込みと同じ方法を用いることで達成できます。<br />
次の手順ではVisual Basic 6.0でリソースデータを作成、読み込む方法を、 World Wide Naviの文字列の外部化を使って説明しています。</p>
<p><strong>1. リソースファイル(.rc)の作成</strong><br />
文字列をリソースのキーと値からなるリソースファイルに記述します。<br />
(このファイルはテキストエディタ、またはWorld Wide Navi文字列の外部化によって作成できます。)<br />
以下はWorld Wide Naviによって作成されたサンプルコードです。</p>
<blockquote>
<pre>wwnavi_string.rc
...
#pragma code_page(1252)
STRINGTABLE
BEGIN
    101 "My Name" // MsgBox ("My Name"), MyClass.cls
    102 "Form1" // Caption
 =   "Form1", Form1.frm
    103 "MS PGothic" // Name
    =   "MS PGothic", Form1.frm
    104 "Button1" // Caption
      =   "Button1", Form1.frm
    105 "@Arial Unicode MS" // Name
        =   "@Arial Unicode MS", Form1.frm
    106 "Label1" // Caption
    =   "Label1", Form1.frm
    107 "Ms Mincho" // Name
        =   "Ms Mincho", Form1.frm
    108 "array 1" // strs1(0) = "array 1", Form1.frm
    109 "array 2" // strs2(0) = "array 2", Form1.frm
    110 "Hello, how are you? This is
sample for Windows DLL."
// MsgBox ("Hello, how are you?
 This is sample for Windows DLL."), Form1.frm
    111 "this is simple text."
// msg = "this is simple text.", Module1.bas
    112 "This is message 2."
// MsgBox ("This is message 2."), Module1.bas
END</pre>
</blockquote>
<p>*コードページとファイルのエンコーディングは対応している必要があります。</p>
<p><strong>2. Windows API関数を宣言</strong></p>
<p>Windows APIをVBで使うためには、それらの宣言を以下のように記述する必要があります。</p>
<blockquote>
<pre>Private Declare Function
GetThreadLocale Lib "kernel32" () As Long
Private Declare Function
GetUserDefaultLCID Lib "kernel32" () As Long
Private Declare Function
GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" _
   (ByVal Locale As Long,
ByVal LCType As Long, ByVal lpLCData As String, _
    ByVal cchData As Long) As Long
Private Declare Function
LoadLibrary Lib "kernel32" Alias "LoadLibraryA" _
   (ByVal lpLibFileName As String) As Long
Private Declare Function
LoadString Lib "user32" Alias "LoadStringA" _
   (ByVal hInstance As Long,
ByVal wID As Long, ByVal lpBuffer As String, _
    ByVal nBufferMax As Long) As Long

Private Const
LOCALE_IDEFAULTANSICODEPAGE =
&amp;H1004&amp;
Private Const
LOCALE_SISO639LANGNAME
= &amp;H59</pre>
</blockquote>
<p>GetThreadLocale, GetUserDefaultLCID &#8230; 現在のロケールを取得<br />
GetLocaleInfo &#8230; ロケール情報を取得<br />
LoadLibrary &#8230; リソースDLLを読み込む<br />
LoadString &#8230; 文字列データをDLLから読み込む(<span style="color: #ff0000;">*1</span>)<br />
LOCALE_IDEFAULTANSICODEPAGE, LOCALE_SISO639LANGNAME &#8230; ロケール関数用の定数</p>
<p><span style="color: #ff0000;">*1</span>)VBは同じ様な関数&#8221;LoadResString&#8221;を持っていますが、  DLLから読み込むためには&#8221;LoadString&#8221;が必要です。</p>
<p><strong>3. リソース読み込み処理を記述</strong><br />
リソースから文字列を読み込む処理を記述します。<br />
読み込みにはLoadString関数を使います。   以下はWorld Wide Naviによって作成されたサンプルコードです。</p>
<blockquote>
<pre>MsgBox (wwnaviGetString(110))
...
Function WwnaviGetString
(id As Long) As String
    Dim buf As String * 512
    Dim rslt As Long
    rslt = LoadString(
wwnaviH, id, buf, 512)
    WwnaviGetString = buf
End Function</pre>
</blockquote>
<p>wwnaviH &#8230; DLLモジュールへのポインタ(後述)<br />
id &#8230; リソースキー<br />
buf &#8230; 読み込んだ文字列を格納する文字列<br />
512 &#8230; 読み込む文字列のバッファサイズ</p>
<p><strong>4. 動的なリソースDLL読み込みを記述</strong><br />
リソースDLLの読み込み処理を、LoadStringの初回呼び出しの前に記述します。<br />
実行時の言語設定にあったDLLを読み込む必要があります。<br />
World Wide Naviは現在のLCID (ロケールID)をGetUserDefaultLCID関数によって取得し、 それをISO-639言語コードに変換してから適切なDLLを読み込みます。<br />
以下はWorld Wide Naviによって作成されたサンプルコードです。</p>
<blockquote>
<pre>Private wwnaviH As Long

Function WwnaviLoadLibrary()
As Long
    Dim libName As String
    Dim langName As String * 10
    Dim langName2 As String
    Dim lcId As Long
    Dim rslt As Long
    Dim posNull As Long
    Dim cnt As Integer
    Dim i As Integer
    'lcId = GetThreadLocale()
    lcId = GetUserDefaultLCID()
    rslt = GetLocaleInfo(lcId,
LOCALE_SISO639LANGNAME, langName, 10)
    posNull = InStr(langName,
 Chr$(0))
    langName = Left$(langName,
posNull - 1)
    langName2 = ""
    cnt = Len(langName)
    For i = 1 To cnt
        If Mid(langName,
i, 1) &lt;&gt; " " Then
            langName2 =
 langName2 &amp; Mid(langName, i, 1)
        End If
    Next i
    libName = "./" &amp;
langName2 &amp;
"/wwnavi_string_VBTest.dll"
    wwnaviH =
LoadLibrary(libName)
    If wwnaviH = 0 Then
        wwnaviH =
 LoadLibrary("./wwnavi_string_VBTest.dll")
    End If
    WwnaviLoadLibrary = wwnaviH
End Function

Function WwnaviGetModule() As Long
    WwnaviGetModule = wwnaviH
End Function

Function WwnaviGetString(
id As Long) As String
    Dim buf As String * 512
    Dim rslt As Long
    If WwnaviGetModule()
= 0 Then
        WwnaviLoadLibrary(<span style="color: #ff0000;">*1</span>)
    End If
    rslt = LoadString(
wwnaviH, id, buf, 512)
    WwnaviGetString = buf
End Function</pre>
</blockquote>
<p>wwnaviH &#8230; DLLモジュールへのポインタ<br />
LoadLibrary &#8230; DLLを読み込みポインタへセットする関数<br />
GetUserDefaultLCID &#8230; 実行時のロケールIDを取得する関数<br />
GetLocaleInfo &#8230; ロケールIDから文字列情報を取得する関数<br />
*LCIDから変換された現在の言語コードのDLLを読み込むか、 または適切なDLLがない場合はデフォルトのものを読み込みます。</p>
<p><span style="color: #ff0000;">*1</span>)リソースDLLがまだ読み込まれていない場合に読み込みます。  これは一回の実行に一度だけ呼び出される必要があります。</p>
<p><strong>5. フォントの切り替え</strong><br />
フォーム、ラベル、ボタンなどのフォントはVisual Basic 6.0 IDEのGUIによってセットされるため、 フォームのコードを手動で編集することはできません。 (もし行った場合はIDEはエラーを表示します)<br />
代わりに、Form_LoadイベントでリソースDLLから読み込まれたフォント名称をセットするのが、 フォントを動的に切り替えるためのよい解決策と言えます。 (フォント切り替えは全てのアプリケーションに必要ではありません、それはGUIの設計に依存します。)</p>
<blockquote>
<pre>Form1.frm
...
VERSION 5.00
Begin VB.Form Form1
   Caption
=   "Form1"
   ClientHeight
 =   1530
   ...
   BeginProperty Font
      Name
           =   "MS PGothic" (<span style="color: #ff0000;">*1</span>)
      Size
      =   8.25

...

Private Sub Form_Load()
     WwnaviSetCaption
End Sub

Private Sub WwnaviSetCaption()
    Form1.Caption
= wwnaviGetString(102) ' "Form1"
    'Form1.Font.Name
 = "Lucida Sans Unicode"
    Form1.Font.Name
 = wwnaviGetString(103) (<span style="color: #ff0000;">*2</span>) ' "MS PGothic"
    Command1.Caption
 = wwnaviGetString(104) ' "Button1"
    'Command1.Font.Name
= "Lucida Sans Unicode"
    Command1.Font.Name
 = wwnaviGetString(105) ' "@Arial Unicode MS"
    Label1.AutoSize
 = True
    Label1.Font.Charset
 = WwnaviGetCharSet(WwnaviGetCodePage)
    Label1.Caption
 = wwnaviGetString(106) ' "Label1"
    'Label1.Font.Name
 = "Lucida Sans Unicode"
    Label1.Font.Name
 = wwnaviGetString(107) ' "Ms Mincho"
End Sub</pre>
</blockquote>
<p><span style="color: #ff0000;">*1</span>)IDEによるデフォルトフォント。これは自動生成されたコードであり、手動で編集できません。</p>
<p><span style="color: #ff0000;">*2</span>)フォントをDLLから読み込まれた現在の言語に適切なものに切り替えています。</p>
<p><strong>6. リソースファイルをDLLにコンパイルする</strong><br />
RCコマンド(Visual Studioツールに含まれます)とVisual Basic DLLプロジェクトを使って、 リソースファイル(.rc)をDLL(.dll)にコンパイルします。</p>
<p><span style="color: #ff0000;">1.</span> Visual Basic DLLプロジェクトは .resファイル(RCコマンドによってコンパイル)しか読み込めないため、 .rcファイルをこのコマンドで作成します。</p>
<p><span style="color: #ff0000;">2.</span> .resファイル作成後、それをコンパイルするためのDLLプロジェクトを、 Visual Basicアドインの&#8221;Rsource Editor&#8221;をロード、有効にした状態で作成します。</p>
<p><span style="color: #ff0000;">3.</span> EXEとDLLを一度にコンパイルするために、ソースプロジェクトとDLLプロジェクトを含んだVisual Basicグループを作成します。</p>
<p>World Wide Naviはこれらの手順を、 1.のための.batファイル、2.のためのDLLプロジェクトファイル、3.のためのグループファイルを作成することにより、 自動化しています。<br />
World Wide Naviによって作成されたコードは、実行ファイルと同じディレクトリにあるDLLをデフォルトとみなし、  各言語コードのディレクトリにあるDLLをその言語用のものとみなします。<br />
例えば日本語のリソースの場合、以下のようにDLLを作成します。</p>
<blockquote>
<pre>./Foo.exe
... <span style="color: #ff0000;">実行ファイル</span>
./wwnavi_string.rc
 -&gt; ./wwnavi_string.res
-&gt; ./wwnavi_string.dll
... &lt;- <span style="color: #ff0000;">* デフォルトDLL</span>
./wwnavi_string_ja.rc
-&gt; ./wwnavi_string_ja.res
-&gt; ./ja/wwnavi_string.dll
... &lt;- <span style="color: #ff0000;">* 日本語DLL</span></pre>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.kokusaika.jp/2012/04/04/visual-basic-6-i18n-resource/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flash国際化プログラミング &#8211; リソース管理</title>
		<link>http://blog.kokusaika.jp/2012/04/03/flash-i18n-resource/</link>
		<comments>http://blog.kokusaika.jp/2012/04/03/flash-i18n-resource/#comments</comments>
		<pubDate>Mon, 02 Apr 2012 15:22:36 +0000</pubDate>
		<dc:creator>J. O.</dc:creator>
				<category><![CDATA[World Wide Navi]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[I18N]]></category>
		<category><![CDATA[Internationalization]]></category>
		<category><![CDATA[フラッシュ]]></category>
		<category><![CDATA[国際化]]></category>
		<category><![CDATA[多言語化]]></category>

		<guid isPermaLink="false">http://blog.kokusaika.jp/?p=929</guid>
		<description><![CDATA[<p>ソフトウェア国際化ツールWorld Wide Navi（ワールドワイドナビ）の国際化プログラミング参考情報から、Flashの国際化の抜粋です。</p>
<p>Flashのリソース管理の方法は、大きくわけて、mx.resources.ResourceManagerを使ったproeprtiesファイルの方法と、fl.lang.Localeを使ったXLIFFの方法の2つがあります。</p>
<p>また、MXMLの場合は、ResourceManagerを使って直接ラベルをリソース化することができます。</p>
<p>各方法の詳細は、以下のAdobeの開発ガイドをご参照ください。</p>
<p>1. fl.lang.Localeの詳細</p>
<p>2. ResourceManagerのリソースの使用</p>
<p>*fl.lang.LocaleのXLIFF読み込みは非同期であるため、文字列の読み込みはコールバック関数で行う必要があります。
この仕様はコード中の文字列の切り替えなどに適さないため、wwnaviの文字列の外部化では、ResourceManagerを使った処理を使用しています。</p>
<p>*ResourceManagerに関係するクラスやメソッドの多くが現在非推称となっています。以下のコードは現在サポートされていません。</p>

var r:SystemManager = new SystemManager();
var t:Locale = (r.topLevelSystemManager) ?
Locale.getCurrent(r.topLevelSystemManager)
: Locale.getCurrent(r);

<p>参考)wwnaviによるリソース切り替えのサンプルコード</p>
<p>フラッシュを読み込むHTMLからユーザーロケールを取得して、それに合ったリソースを表示する処理です。</p>

======
WwnaviRs.as (リソースの読み込みクラス)
======
 //$NLS-WWNAVI 2011-06-13T20:24:27+0900
package
{

	import flash.system.Capabilities;
	import flash.external.ExternalInterface;
	import mx.resources.ResourceManager;

	/**
	 * This class is automatically
generated by wwnavi.
	 */

	[ResourceBundle("wwnaviRs")]
	public class WwnaviRs
	{
		private static var isInit:Boolean = false;

		private static var  loc:String = null;

		public static function init():void
		{

			// Get user system
language code (without country
codes in most cases).

	loc = Capabilities.language;
	loc = [...]]]></description>
			<content:encoded><![CDATA[<p>ソフトウェア国際化ツール<a href="http://www.kokusaika.jp/product/wwnavi.html" target="_blank">World Wide Navi</a>（ワールドワイドナビ）の<a href="http://www1.kokusaika.jp/advisory/org/ja/top.html" target="_blank">国際化プログラミング参考情報</a>から、<a href="http://www1.kokusaika.jp/advisory/org/ja/as_preface.html" target="_blank">Flashの国際化</a>の抜粋です。</p>
<p>Flashのリソース管理の方法は、大きくわけて、mx.resources.ResourceManagerを使ったproeprtiesファイルの方法と、fl.lang.Localeを使ったXLIFFの方法の2つがあります。</p>
<p>また、MXMLの場合は、ResourceManagerを使って直接ラベルをリソース化することができます。</p>
<p>各方法の詳細は、以下のAdobeの開発ガイドをご参照ください。</p>
<p>1. <a href="http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/fl/lang/Locale.html" target="_blank">fl.lang.Localeの詳細</a></p>
<p>2. <a href="http://livedocs.adobe.com/flex/3_jp/html/help.html?content=l10n_4.html#727952" target="_blank">ResourceManagerのリソースの使用</a></p>
<p>*fl.lang.LocaleのXLIFF読み込みは非同期であるため、文字列の読み込みはコールバック関数で行う必要があります。<br />
この仕様はコード中の文字列の切り替えなどに適さないため、wwnaviの文字列の外部化では、ResourceManagerを使った処理を使用しています。</p>
<p>*ResourceManagerに関係するクラスやメソッドの多くが現在非推称となっています。以下のコードは現在サポートされていません。</p>
<blockquote>
<pre>var r:SystemManager = new SystemManager();
var t:Locale = (r.topLevelSystemManager) ?
Locale.getCurrent(r.topLevelSystemManager)
: Locale.getCurrent(r);</pre>
</blockquote>
<p>参考)wwnaviによるリソース切り替えのサンプルコード</p>
<p>フラッシュを読み込むHTMLからユーザーロケールを取得して、それに合ったリソースを表示する処理です。</p>
<blockquote>
<pre><span style="color: #3366ff;">======
WwnaviRs.as (リソースの読み込みクラス)
======</span>
 //$NLS-WWNAVI 2011-06-13T20:24:27+0900
package
{

	import flash.system.Capabilities;
	import flash.external.ExternalInterface;
	import mx.resources.ResourceManager;

	/**
	 * This class is automatically
generated by wwnavi.
	 */

	[ResourceBundle("wwnaviRs")]
	public class WwnaviRs
	{
		private static var isInit:Boolean = false;

		private static var  loc:String = null;

		public static function init():void
		{

			<span style="color: #3366ff;">// Get user system
language code (without country
codes in most cases).</span>

	loc = Capabilities.language;
	loc = loc.replace("-", "_");

	var cn:String = "";

			<span style="color: #3366ff;">// For using this code,
the additional compile option,
			// '-locale=YOUR_LOCALE(e.g. en_US)
-source-path=YOUR_RESOURCE_PATH(e.g. locale)
/{locale}' is required.
			// If you add other locales,
you have to add them to the option above.</span>

			switch (loc) {
			case "en":
			    cn = "US";
			    break;
			case "ja":
			    cn = "JP";
			    break;
			case "ko":
			    cn = "KR";
			    break;
			case "zh":
			    // do nothing.
       (loc has "_CN or _TW")
			    break;
			// add your locale country codes.
			//case...
			//    break;
			default:
			}

			if (loc.indexOf("_") == -1) {
				loc = loc + "_" + cn;
			}

			<span style="color: #3366ff;">// Or get user browser
language by your external JavaScript.
			// loc = getBrowserLang();</span>

			<span style="color: #3366ff;">// In some cases,
this code doesn't work.</span>
			ResourceManager.getInstance().
localeChain = [loc];

			isInit = true;
		}

		<span style="color: #3366ff;">ロケールをHTMLの
引数として受け取ります。</span>
		public static function
initByFlashVars(flashVars:Object):void
		{
			loc = flashVars["locale"];
			isInit = true;
		}

		public static function
getString(id:String):String
		{
			if (!isInit) init();
			// ResourceManager.getInstance()
.localeChain = [loc]
			<span style="color: #3366ff;">// でロケールが切り替わらない場合が
あるので安全策として以下の方法にしています。</span>
var str:String = ResourceManager.getInstance().
getString("wwnaviRs", id, null, loc);
if (str == null) str = ResourceManager.getInstance().
getString("wwnaviRs", id);
			return str;
		}

/*public function getBrowserLang():String {
var s:String;
            if (ExternalInterface.available) {
 var wrapperFunction:String =
 "YOUR_JAVASCRIPT_FUNCTION";
 s = ExternalInterface.call(wrapperFunction);
            } else {
               s = "Wrapper not available";
            }
           return s;
}*/

	}

}

<span style="color: #3366ff;">======
test.html (Flashの読み込み)
======</span>
&lt;html&gt;
&lt;object width="100%" height="100%" &gt;
&lt;!-- Edit locale to the
suitable one. --&gt;
&lt;param name="FlashVars"
value="locale=ja_JP" /&gt;
&lt;!-- Edit locale to the
suitable one. --&gt;
&lt;embed  width="100%"
height="100%" src="Main.swf"
<span style="color: #ff0000;">FlashVars</span>
="<span style="color: #ff0000;">locale=ja_JP</span>" /&gt;
&lt;/object&gt;
&lt;/html&gt;

<span style="color: #3366ff;">======
Main.as (HTMLからのロケール取得)
======</span>
<span style="color: #3366ff;">Main関数などのエントリーポイントに記述します。</span>
public function Main():void
{     WwnaviRs.initByFlashVars(
this.root.loaderInfo.parameters);

<span style="color: #3366ff;">======
 Main.as (文字列の読み込み処理)
======</span>
...
tx1.text = WwnaviRs.getString("Main.1");
// tx1.text = "This is text 1.";
...

<span style="color: #3366ff;">======
リソースファイルの場所
======</span>
../locale/<span style="color: #ff0000;">en_US</span>/wwnaviRs.properties
          <span style="color: #ff0000;">ja_JP</span>/wwnaviRs.properties
           ...
../src/Main.as
        WwnaviRs.as

<span style="color: #3366ff;">======
 リソースファイルの中身
 ======</span>
Main.3=This is text 3.
Main.2=This is text 2.
Main.1=This is text 1.
...
Main.3=これはテキスト3です。
Main.2=これはテキスト2です。
Main.1=これはテキスト1です。

<span style="color: #3366ff;">======
コンパイルオプション
======</span>
<span style="color: #ff0000;">-locale=en_US,ja_JP
-source-path=locale/{locale}</span></pre>
</blockquote>
<hr />
<hr />
]]></content:encoded>
			<wfw:commentRss>http://blog.kokusaika.jp/2012/04/03/flash-i18n-resource/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.NET国際化プログラミング &#8211; リソース管理 (Form、WPF、Silverlight）</title>
		<link>http://blog.kokusaika.jp/2012/04/02/net-i18n-form-wpf-silverlight/</link>
		<comments>http://blog.kokusaika.jp/2012/04/02/net-i18n-form-wpf-silverlight/#comments</comments>
		<pubDate>Sun, 01 Apr 2012 15:20:26 +0000</pubDate>
		<dc:creator>J. O.</dc:creator>
				<category><![CDATA[World Wide Navi]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[I18N]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WPF]]></category>
		<category><![CDATA[国際化]]></category>
		<category><![CDATA[多言語化]]></category>

		<guid isPermaLink="false">http://blog.kokusaika.jp/?p=916</guid>
		<description><![CDATA[<p>ソフトウェア国際化ツールWorld Wide Navi（ワールドワイドナビ）の国際化プログラミング参考情報から、.NETの国際化の抜粋です。</p>
<p>※後半には、ローカリゼーションツールSisulizer（シスライザー）によるXAML編集なしでの直接WPF、Silverlightのバイナリをローカライズする方法を記述しています。</p>
<p>1. ResourceManagerを作成する
初期処理(MainやInitializeComponent)でResourceManagerのインスタンスを作成します。以下はWorld Wide Naviのサンプルコードです。</p>

WwnaviResource.cs

namespace Wwnavi {
    using System;
    public class Resource {
        public static void Init(){

           // Set the user interface to
display in the same culture as that set in Control [...]]]></description>
			<content:encoded><![CDATA[<p>ソフトウェア国際化ツール<a href="http://www.kokusaika.jp/product/wwnavi.html" target="_blank">World Wide Navi</a>（ワールドワイドナビ）の<a href="http://www1.kokusaika.jp/advisory/org/ja/top.html" target="_blank">国際化プログラミング参考情報</a>から、<a href="http://www1.kokusaika.jp/advisory/org/ja/dotnet_preface.html" target="_blank">.NETの国際化</a>の抜粋です。</p>
<p>※後半には、ローカリゼーションツール<a href="http://www.kokusaika.jp/product/sisulizer.html" target="_blank">Sisulizer</a>（シスライザー）によるXAML編集なしでの直接<strong><span style="color: #3366ff;">WPF、Silverlightのバイナリをローカライズする方法</span></strong>を記述しています。</p>
<p><strong>1. ResourceManagerを作成する</strong><br />
初期処理(MainやInitializeComponent)でResourceManagerのインスタンスを作成します。以下はWorld Wide Naviのサンプルコードです。</p>
<blockquote>
<pre>WwnaviResource.cs

namespace Wwnavi {
    using System;
    public class Resource {
        public static void Init(){

           <span style="color: #3366ff;">// Set the user interface to
display in the same culture as that set in Control Panel.</span>
           System.Threading.Thread.CurrentThread.
           CurrentUICulture =
               System.Threading.Thread.
            CurrentThread.CurrentCulture;
           <span style="color: #3366ff;">// (*コントロールパネルの
            地域と言語の設定を反映させるための重要なコードです。)</span>

            // Assembly
            wwnaviRs(<span style="color: #ff0000;">*1</span>) = new System.Resources.
           ResourceManager(
                 "WindowsFormsApplication.(
             Properties.)wwnavi_string",
                  <span style="color: #3366ff;">(*'Properties' は
              2005以降のC# プロジェクトのみ必要です)</span>
                 System.Reflection.Assembly.
               GetExecutingAssembly());
            // File Based
            // wwnaviRs = System.Resources.ResourceManager.
            //    CreateFileBasedResourceManager(
            //    "WindowsFormsApplication.wwnavi_string",
            //    "./",null);
        }
        public static String GetString(String id){
            if (wwnaviRs == null) Init(); <span style="color: #ff0000;">*3</span>)
            return wwnaviRs.GetString(id);
        }
        public static System.Resources.ResourceManager
GetResourceManager(){
            return wwnaviRs;
        }
        private static System.Resources.
ResourceManager wwnaviRs = null;
    };
}</pre>
</blockquote>
<p><span style="color: #ff0000;">*1)</span>wwnaviRs &#8230; RsourceManagerのインスタンス</p>
<p>このサンプルは、埋めこみリソースまたはサテライトDLLを読む<br />
&#8216;Assembly&#8217; RsourceManagerを作成しています。<br />
2番目のコメントアウトされたコードは&#8217;FileBased&#8217; RsourceManagerを作成しており、<br />
.resourcesファイルを読み込むものです。</p>
<blockquote>
<pre>static void Main()
{
    Wwnavi.Resource.Init(); <span style="color: #ff0000;">*2</span>)
    ...
}</pre>
</blockquote>
<p><span style="color: #ff0000;">*2</span>)上記*1)のResourceManager作成処理を呼んでいます。</p>
<p>ResourceManagerの作成は初期処理で行うのが望ましいですが必須ではありません。<br />
<span style="color: #ff0000;">*3</span>)のコードはリソースデータを返す前にResourceManagerが作成されていない場合、&#8217;Init&#8217;を呼んでいます。<br />
これはクラスライブラリなどの初期処理を持たないプロジェクトのためです。</p>
<p>フォームアプリケーションの場合は、Main関数内の冒頭で、InitializeComponent()が呼ばれる前にInitを呼ぶ必要があります。</p>
<blockquote>
<pre>[STAThread]
static void Main()
 {
 <span style="color: #3366ff;">// System.Threading.Thread.
CurrentThread.CurrentUICultureの設定を
初めに行う必要があります。</span>
 Wwnavi.Resource.Init(); 

<span style="color: #3366ff;">VBの場合は、Sub New()の冒頭。</span></pre>
</blockquote>
<p><span style="color: #3366ff;"><strong>※WPF、およびSilverlightの場合</strong></span>は、<br />
<a href="http://blog.kokusaika.jp/2012/04/02/net-i18n-form-wpf-silverlight#wpf" target="_self">こちら</a>をごらんください。</p>
<p><strong>3. 文字列取得のコードを埋めこむ</strong><br />
ResourceManager.GetStringメソッドでresxファイルから文字列情報を取得します。</p>
<blockquote>
<pre>MessageBox.Show(
Wwnavi.Resource.GetString(
"wwnavi.Msg.Id1")...

WwnaviResource.cs
...
public static String GetString(String id){
    ...
    return wwnaviRs.GetString(id);
}</pre>
</blockquote>
<p><strong>4. 文字列をresxファイルに記述する</strong><br />
メッセージIDと共に文字列をresxファイルの以下のエレメントに記述します。<br />
このファイル名はResourceManager作成メソッド(上記1-*1を参照、&#8221;WindowsFormsApplication.<br />
(Properties.)wwnavi_string&#8221;)に対応している必要があり、 このケースでは&#8217;wwnavi_string.resx&#8217;でなければいけません。</p>
<p>*Visual Studioアドインの実装では、&#8221;resources&#8221;という名前を使う必要があります。<br />
(例： ResourceManager &#8220;MyAddin.resources&#8221;、resx ファイル &#8220;resources.resx&#8221;)</p>
<blockquote>
<pre>&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;root&gt;
  &lt;xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"&gt;
    ...
  &lt;/xsd:schema&gt;
  ...
  &lt;resheader name="writer"&gt;
    &lt;value&gt;System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&lt;/value&gt;
  &lt;/resheader&gt;
  &lt;data name="<span style="color: #ff0000;">wwnavi.Msg.Id1</span>" xml:space="preserve"&gt;
        <span style="color: #ff0000;">*1</span>)
    &lt;value&gt;<span style="color: #ff0000;">Hello, how are you? This is a sample.</span>&lt;/value&gt;
  &lt;/data&gt;
&lt;/root&gt;</pre>
<p><span style="color: #ff0000;">*1</span>)&#8217;data&#8217;エレメントに文字列を記述する必要があります。<br />
&#8220;wwnavi.Msg.Id1&#8243;は&#8217;GetString&#8217;のメッセージIDに対応しています。</p></blockquote>
<p><strong>5. リソースファイルをコンパイルし配置する</strong><br />
.NETアプリケーションをVisual Studio(C#プロジェクト、VC++ CLRプロジェクトなど)で開発している場合、 自動国際化プロセスを使うことができます。手順は以下です。</p>
<blockquote>
<pre><span style="color: #3366ff;">1. コンポーネントプロパティをセットする</span>

   フォームデザイナビューで以下のプロパティをセットします。

   Form.Localizable = true
   Form.Language = Default
   (Label.AutoSize = true)

<span style="color: #3366ff;">2. resxファイルをプロジェクトに追加する</span>

   resxファイル(例、上記の'wwnavi_string.resx')をプロジェクトに追加します。
   VC++プロジェクトを使っている場合プロジェクトの直下に追加し、
   2005以降のC#プロジェクトの場合は、ドラッグアンドドロップで'Properties'ディレクトリの
   下に追加します。
   (World Wide Naviはこれらの手順を自動的に行います)

   project-
           Form1.h (or .cs)
&lt;- <span style="color: #3366ff;">*Localizableをtrueにセット</span>
           Form1.resx
&lt;- <span style="color: #3366ff;">*Visual Studioにより作成</span>
           wwnavi_string.resx or
           Properties/wwnavi_string.resx
 (<span style="color: #3366ff;">C#のみ</span>)

<span style="color: #3366ff;">3. ソリューションをリビルドする</span>

   ソリューションをリビルドし実行ファイルを生成します。

   これらの手順では、リソース(Visual Studioのリソース'Form1.resx'と自分自身のリソース
   'wwnavi_string.resx')は実行ファイルにデフォルトのものとして埋めこまれるため、
   DLLは作成されません。

   Debug/Release-
                 WindowsFormApplication.exe
 &lt;- <span style="color: #3366ff;">*Form1.resxとwwnavi_string.resx</span>
 <span style="color: #3366ff;">のリソースを含む</span>

<span style="color: #3366ff;">4. 他の言語リソースを追加する</span>

   他の言語リソースをプロジェクトに追加した場合Visual Studioは自動的にサテライトDLLを
   作成します。
   例えば、Form1.resxとwwnavi_string.resxを日本語に翻訳されたリソースにコピーし
   (名前は'*.ja.resx'となります)、それらをプロジェクトに追加しリビルドすると、
   自動的に日本語リソースのDLLが作成されます。  

   project-
           Form1.h (or .cs)
 &lt;- <span style="color: #3366ff;">*Localizableをtrueにセット</span>
           Form1.resx
  &lt;- <span style="color: #3366ff;">*Visual Studioにより作成</span>
           Form1.ja.resx
  &lt;- <span style="color: #3366ff;">*コピーし翻訳されたもの</span> <span style="color: #ff0000;">*3</span>)
           wwnavi_string.resx
           wwnavi_string.ja.resx
&lt;- <span style="color: #3366ff;">*コピーし翻訳されたもの</span>
           Properties/wwnavi_string.resx
   (C#のみ)
        /wwnavi_string.ja.resx
  (C#のみ)

          *3)Form1.ja.resxは、フォームデザイナビューで
Form.Languageを'ja'にすることで
             Visual Studioで自動的に作成することもできます。

   Debug/Release-
                 WindowsFormApplication.exe
   &lt;- <span style="color: #3366ff;">*Form1.resxとwwnavi_string.resx</span>
<span style="color: #3366ff;">のリソースを含む</span>

     ja/WindowsFormApplication.resources.dll
   &lt;- <span style="color: #3366ff;">*Form1.ja.resxとwwnavi_string.ja.resx</span>
<span style="color: #3366ff;">のリソースを含む</span>

   <span style="color: #ff0000;">=== 注意 ===</span>
   これらの手順は'Assembly' ResourceManagerを
使った場合のみ有効です。
   'FileBased'のマネージャを作る場合は、
.resourcesファイルを実行ディレクトリに
   手動でコピーし、常にそれらを実行ファイルに
添付する必要があります。</pre>
</blockquote>
<p><a name="wpf"></a><br />
<strong><span style="color: #3366ff;">WPFとSilverlightの場合 </span></strong><br />
WPFスタンドアプリケーションとSilverlightの場合は、UIロケールの設定の仕方が異なります。</p>
<p><span style="color: #3366ff;">WPFスタンドアプリケーション</span>の場合：<br />
デフォルトではMain関数が自動生成され、UICultureの設定ができないため、<br />
自分でMain関数用のクラスを記述し、Main関数の自動生成をOFFにします。</p>
<blockquote>
<pre><span style="color: #3366ff;">1. App.xamlのプロパティの「ビルドアクション」を「Page」に変更。</span>

<span style="color: #3366ff;">2.以下のようなMain関数用のクラスを作成し、
Wwnavi.Resource.Init()(CurrentUICultureの設定)
を呼び出します。</span>

using System;
using System.Collections.Generic;
namespace Wwnavi{
    class TempMain{
        [STAThread]
        static public void Main(string[] args) {

           Wwnavi.Resource.Init();
<span style="color: #3366ff;">// CurrentUICultureの設定</span>

           YOUR_APP_NAME.App app =
new YOUR_APP_NAME.App();
           // YOUR_APP_NAME is your application name
 (e.g. WpfApplication1)
           app.InitializeComponent();
           app.Run();
        }
    }
}

<span style="color: #3366ff;">3.あとは正常にビルドされればOKです。</span>

<span style="color: #ff0000;">*各国語のdllはビルドされたexeから<a href="http://www.kokusaika.jp/product/sisulizer.html" target="_blank">Sisulizer</a>を使って、
XAMLファイルの変更なしに容易に作成できます。</span>

YOUR_PROJECT_PATH/bin/Debug/WpfApplication1.exe
     <span style="color: #ff0000;">ja</span>/WpfApplication1.resources.<span style="color: #ff0000;">dll
</span> (*<a href="http://www.kokusaika.jp/product/sisulizer.html" target="_blank"><span style="color: #ff0000;">Sisulizer</span></a>を使って作成された日本語のdll)

Sisulizerの詳細については、
<a href="http://www1.kokusaika.jp/help/ja/wwnavi_sisu.html" target="_blank">World Wide Naviのヘルプ</a>をごらんください。</pre>
</blockquote>
<p><span style="color: #3366ff;">Silverlight</span>の場合：<br />
Silverlightでは、Silverlightのオブジェクト(xap)を埋めこんだHTML(ASP、PHPなど)でユーザーのロケール(言語)を認識し、それをSilverlightのパラメータとして渡し、適切なxapファイルを読み込むのが一般的です。</p>
<p>以下は、Visual Studioのテスト用ASPを修正した、World Wide Naviのサンプルです。</p>
<blockquote>
<pre>SilverlightApplication1TestPage.aspx
...
&lt;%--

//// These are Silverlight i18n/l10n part. ////

--%&gt;

    &lt;script runat="server"&gt;
    // Get the current locale.
   <span style="color: #3366ff;"> //ユーザーのHTTPリクエストから言語情報を取得します。</span>
    string <span style="color: #ff0000;">sLang</span> = System.Web.HttpContext.
Current.Request.UserLanguages[0];
    string <span style="color: #ff0000;">sPath</span> = System.Web.HttpContext.
Current.Request.UserLanguages[0];
    string root = System.Web.HttpContext.
Current.Server.MapPath("/ClientBin/");
    &lt;/script&gt;

    &lt;%
        // Set Silverlight file (xap) path.
        <span style="color: #3366ff;">//ユーザーの言語情報に対応するxapファイルのパスを生成します。
        // ClientBin/SilverlightApplication1.xap
... デフォルトxap
        // ClientBin/<span style="color: #ff0000;">ja</span>/
SilverlightApplication1.xap ... 日本語xap
        // ClientBin/<span style="color: #ff0000;">ko</span>/
SilverlightApplication1.xap ... 韓国語xap</span>

        <span style="color: #3366ff;">// <span style="color: #ff0000;">*各国語のxapは<a href="http://www.kokusaika.jp/product/sisulizer.html" target="_blank">Sisulizer</a>を使って、
XAMLファイルの変更なしに容易に作成できます。</span>
        // <a href="http://www.kokusaika.jp/product/sisulizer.html" target="_blank">Sisulizer</a>の詳細については、
<a href="http://www1.kokusaika.jp/help/ja/wwnavi_sisu.html" target="_blank">World Wide Naviのヘルプ</a>をごらんください。</span>

        if (!System.IO.Directory.Exists(root + sPath))
        {
            if (sPath.Length &gt; 2)
sPath = sPath.Substring(0, 2);
        }
        if (!System.IO.Directory.
Exists(root + sPath))
        {
            sPath = "";
        }
        if (sPath != "") sPath = sPath + "/";
     %&gt;

    ...
        &lt;object data="data:application/x-silverlight-2,"
type="application/x-silverlight-2" width="100%" height="100%"&gt;

         &lt;%--
         Switch xap files to load on the current locale.
         These are directly localized files
by Sisulizer WITHOUT XAML sources.
          --%&gt;
		  &lt;param name="source" value="ClientBin/
<span style="color: #000000;">&lt;%=<span style="color: #ff0000;">sPath</span> %&gt;SilverlightApplication1.xap</span>"/&gt;

		  &lt;param name="onError" value="onSilverlightError" /&gt;
		  &lt;param name="background" value="white" /&gt;
		  &lt;param name="minRuntimeVersion" value="3.0.40624.0" /&gt;
		  &lt;param name="autoUpgrade" value="true" /&gt;

		  &lt;%--
		  Set the current locale to the Silverlight code.
		   --%&gt;
		  &lt;param name="<span style="color: #ff0000;">uiculture</span>"
value="&lt;%=<span style="color: #ff0000;">sLang</span> %&gt;" /&gt;
         &lt;param name="<span style="color: #ff0000;">culture</span>"
value="&lt;%=<span style="color: #ff0000;">sLang</span> %&gt;" /&gt;
         <span style="color: #3366ff;">//これら2つのパラメータが
Silverlightオブジェクトのカルチャとして
引き継がれます。</span></pre>
</blockquote>
<p>*デバックには、デバックメニューではなく、Visual Studio内でこのASPを右クリックし、「ブラウザで開く」メニューで確認してください。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kokusaika.jp/2012/04/02/net-i18n-form-wpf-silverlight/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET国際化プログラミング &#8211; リソース管理</title>
		<link>http://blog.kokusaika.jp/2012/03/30/asp-net-18n-resource/</link>
		<comments>http://blog.kokusaika.jp/2012/03/30/asp-net-18n-resource/#comments</comments>
		<pubDate>Thu, 29 Mar 2012 21:00:16 +0000</pubDate>
		<dc:creator>J. O.</dc:creator>
				<category><![CDATA[World Wide Navi]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[I18N]]></category>
		<category><![CDATA[Internationalization]]></category>
		<category><![CDATA[国際化]]></category>

		<guid isPermaLink="false">http://blog.kokusaika.jp/?p=907</guid>
		<description><![CDATA[<p>ソフトウェア国際化ツールWorld Wide Navi（ワールドワイドナビ）の国際化プログラミング参考情報から、ASP.NETの国際化の抜粋です。</p>
<p>1.  ASPXにヘッダー追加
カルチャ(言語と地域)の設定をASPXのヘッダー部分に追加します。</p>

Default.aspx

﻿  &#60;%@ Page  Language="C#" ...%&#62;
=&#62;&#60;%@ Page  Culture="auto"
UICulture="auto" Language="C#" ...%&#62;

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

構文1は &#8216;&#60;%=..%&#62;&#8217; を必要とします。
&#8216;&#8221;&#8216; は構文2では切り落とされます。
構文3は構文1と非常に似ていますが、
少し違います。
構文4ではmeta属性を追加することで、
デフォルトのテキストを残すことが出来ます。
構文3と4はASPタグのみにしか使えません。


Default.aspx

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

* 構文2. (プログラム内のリテラルの置換)
 'Resources.Default.' + RESOURCE_KEY
&#60;div&#62;
    &#60;% Response.Write("Hello, World!"); %&#62;
 [...]]]></description>
			<content:encoded><![CDATA[<p>ソフトウェア国際化ツール<a href="http://www.kokusaika.jp/product/wwnavi.html" target="_blank">World Wide Navi</a>（ワールドワイドナビ）の<a href="http://www1.kokusaika.jp/advisory/org/ja/top.html" target="_blank">国際化プログラミング参考情報</a>から、<a href="http://www1.kokusaika.jp/advisory/org/ja/asp_preface.html" target="_blank">ASP.NETの国際化</a>の抜粋です。</p>
<p><strong>1.  ASPXにヘッダー追加</strong><br />
カルチャ(言語と地域)の設定をASPXのヘッダー部分に追加します。</p>
<blockquote>
<pre>Default.aspx

﻿  &lt;%@ Page  Language="C#" ...%&gt;
<span style="color: #ff0000;">=&gt;&lt;%@ Page  Culture="auto"
UICulture="auto" Language="C#" ...%&gt;</span></pre>
</blockquote>
<p><strong><span style="color: #000000;">2</span>. 文字列の外部化(リテラルの置換)</strong><br />
ASP.NETは、文字列リソースの管理のために、4つの構文を持っています。</p>
<ul>
<li>構文1は &#8216;&lt;%=..%&gt;&#8217; を必要とします。</li>
<li>&#8216;&#8221;&#8216; は構文2では切り落とされます。</li>
<li>構文3は構文1と非常に似ていますが、<br />
少し違います。</li>
<li>構文4ではmeta属性を追加することで、<br />
デフォルトのテキストを残すことが出来ます。</li>
<li>構文3と4はASPタグのみにしか使えません。</li>
</ul>
<blockquote>
<pre>Default.aspx

<span style="color: #3366ff;">* 構文1. (タグテキストの置換) '&lt;%='
+ 'Resources.Default.' + RESOURCE_KEY + '%&gt;'</span>
&lt;html xmlns="http://www.w3.org/1999/xhtml" &gt;
&lt;head runat="server"&gt;
    &lt;title&gt;This is a sample site!&lt;/title&gt;
 <span style="color: #ff0000;">=&gt; &lt;title&gt;&lt;%=Resources.
   Default.DefaultWwnaviMsg1%&gt;&lt;/title&gt;</span>
&lt;/head&gt;
&lt;body&gt;

<span style="color: #3366ff;">* 構文2. (プログラム内のリテラルの置換)
 'Resources.Default.' + RESOURCE_KEY</span>
&lt;div&gt;
    &lt;% Response.Write("Hello, World!"); %&gt;
<span style="color: #3366ff;"> <span style="color: #ff0000;">=&gt; &lt;% Response.Write(
Resources.Default.DefaultWwnaviMsg2); %&gt;</span></span>
&lt;/div&gt; 

<span style="color: #3366ff;">* 構文3. (ASPタグ内のテキストの置換)
 '&lt;%$' + 'Resources.Default,' +
RESOURCE_KEY + '%&gt;'</span>
&lt;asp:Label ID="Label1" runat="server"
Text="This is label 1."&gt;
<span style="color: #ff0000;">=&gt;&lt;asp:Label ID="Label1" runat="server" Text=
"&lt;%$Resources:Default,
DefaultWwnaviMsg3%&gt;"&gt;</span>
&lt;/asp:Label&gt;

<span style="color: #3366ff;">* 構文4. (ASPタグ内のmeta属性の追加)
 'meta:resourcekey="' + RESOURCE_KEY + '"'</span>
&lt;asp:Label ID="Label1" runat="server"
Text="This is label 1."&gt;
<span style="color: #ff0000;">=&gt;&lt;asp:Label ID="Label2" runat="server" Text=
"This is label 1." meta:resourcekey=
"DefaultWwnaviMsg4" &gt;</span>
&lt;/asp:Label&gt;</pre>
</blockquote>
<p>各文字列の場所に応じて、適切な構文を使う必要があります。<br />
(ASPタグでは構文3または4どちらかが使えます。)</p>
<p><strong>3. Resxファイルの作成</strong><br />
外部化された文字列をresx(リソース)ファイルに配置します。&#8217;App_GlobalResources&#8217;フォルダをプロジェクトディレクトリの直下に作成し、resxファイルをその下に、&#8217;ASPX_FILE_NAME(拡張子なし).resx&#8217;(<span style="color: #ff0000;">*1</span>)という名前で作成します。</p>
<blockquote>
<pre>PROJECT_DIRECTORY
    -  App_GlobalResources
         -  Default.resx
         -  WebForm1.resx
         <span style="color: #ff0000;">*1</span>)<span style="color: #3366ff;">構文4(meta属性)を使っている場合は、
拡張子を付ける必要があります(Default.aspx.resx)。</span></pre>
</blockquote>
<blockquote>
<pre>Default.resx 

&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;root&gt;
  &lt;xsd:schema id="root" xmlns=""
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"&gt;
    ...
  &lt;/xsd:schema&gt;
  ...
  &lt;resheader name="writer"&gt;
    &lt;value&gt;System.Resources.ResXResourceWriter,
    System.Windows.Forms, Version=2.0.0.0,
    Culture=neutral,
    PublicKeyToken=b77a5c561934e089&lt;/value&gt;
  &lt;/resheader&gt;
  &lt;data name="<span style="color: #ff0000;">DefaultWwnaviMsg1</span>" xml:space="preserve"&gt;
     (RESOURCE_KEY)
    &lt;value&gt;<span style="color: #ff0000;">This is a sample site!</span>&lt;/value&gt;
    (RESOURCE_STRING)
  &lt;/data&gt;
&lt;/root&gt;</pre>
</blockquote>
<p><strong>4. コンパイルとローカリゼーション</strong><br />
ビルドと実行をしてください、ブラウザ内でリソース文字列が表示されるのが確認できるはずです。他の言語のリソースを追加したい場合は、ASPX_FILE_NAME.LOCALE_CODE(例：&#8217;ja&#8217;).resxをApp_GlobalResourcesに追加してください。</p>
<blockquote>
<pre>App_GlobalResources
  -  Default.resx
... <span style="color: #3366ff;">マスターリソース (例：英語)</span>
  -  Default.<span style="color: #ff0000;">ja</span>.resx
... <span style="color: #3366ff;">ローカライズされたリソース (例：日本語)</span></pre>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.kokusaika.jp/2012/03/30/asp-net-18n-resource/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

