2012年5月
« 4月    
 123456
78910111213
14151617181920
21222324252627
28293031  

カテゴリー

Windows API国際化プログラミング – リソース読み込み(Win32、MFC)

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

かなり古めな情報になりますが、MFCなどのレガシーなアプリケーションをお持ちで多言語化、海外展開をしたいと思っている方には、上記の参考情報はかなり有用なのではと思います。(特に、GUIのリソースとメッセージのリソースを同期をとって切り替える部分など)

眠っているアプリケーションをもういちど引き出しから出して、世界に羽ばたかせてみてはいかがでしょうか?

Visual Studioなどで作成されたWindows APIアプリケーションは通常、ラベルやメッセージなどの 言語間で異なるリソース情報がアプリケーションと一体化しています。 国際化されたアプリケーションにするには、実行時の言語設定にあったリソースを動的に読み込む 機能を作りこまなければなりません。 そのためにはリソースをDLLとして配布する方法が一般的にとられます。

1. リソースファイル(.rc)を作成する
ラベルやメッセージをリソースキーと値からなるリソースファイルに記述する。
以下はWorld Wide Naviで作成されたファイルの例。

#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

*コードページとファイルのエンコーディングは正しく対応する必要があります。

2. リソースの読み込み処理を記述する。
ラベルやメッセージを上記のリソースから読み込む処理を記述する。
読み込みにはLoadString関数を使う。
以下はWorld Wide Naviで生成されたコードの例。

LoadString(wwnaviH, uID, wwnaviBuf1,
WWNAVI_BUFF_SIZE);

wwnaviH … DLLモジュールへのポインタ(後述)。
uID … リソースキー
wwnaviBuf1 … 読み込んだ文字列の格納先(TCHAR)。
WWNAVI_BUFF_SIZE … 格納先のバッファサイズ。

3. リソースDLLの動的読み込みを記述する。
エントリポイント(アプリケーション起動時に呼ばれる個所)にリソースDLLを読み込む処理を記述します。
このとき、実行時の言語設定にあったDLLを読み込むようにしなくてはなりません。
World Wide Naviでは、GetUserDefaultLCIDで実行時のLCID(ロケールのID)を取得し、 それをISO-639の言語コードに変換して、該当するDLLをロードする方法をとっています。 以下はWorld Wide Naviで生成されたコードの例。

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"));
}

wwnaviH … DLLモジュールへのポインタ。
LoadLibrary … DLLを読み込み、ポインタへ渡す関数です。
GetUserDefaultLCID … 実行時のロケールIDを取得する関数です。
GetLocaleInfo … ロケールIDから文字列情報を取得する関数です。
*上記ではLCIDから変換された言語コードのDLLを読み込み、
該当するものがなければデフォルトのDLLを読み込むようにしています。

Visual StudioでWin32アプリケーションを作成する場合は、 デフォルトリソースファイル(メニュー、アイコン、その他リソースを含む your-application-name.rcという名前のもの)を自分自身のファイルと結合しなければなりません。
簡単な方法は、ロードしたモジュールをアプリケーションのデフォルトにセットし、 アプリケーションのリソースを自分自身のファイルに含めることです。

*** 自分自身の .rc file
...
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"
<- * アプリケーションの.rcファイルを含める

*** main関数内

int WINAPI WinMain(HINSTANCE
hInstance, HINSTANCE hPreInst,
   LPSTR lpszCmdLine,
 int nCmdShow) {
...
hInstance = LoadLibrary(
YOUR_LIB_NAME);
<- * 引数のハンドルにロードしたハンドルをセット

MFCアプリケーションの場合は、hIsntanceをセットする代わりに AfxSetResourceHandleを使います。

*** InitInstanceメソッド内

BOOL CXXXX::InitInstance()
{
...
AfxSetResourceHandle(LoadLibrary(
YOUR_LIB_NAME));
<- * デフォルトのリソースハンドルにロードしたハンドルをセット

4. リソースファイルをDLLにコンパイルする。
Visual Studio附属のRCコマンド、またはDLLプロジェクトから リソースファイル(.rc)をDLL(.dll)にコンパイルします (World Wide NaviはDLLプロジェクトを自動的に作成し、 ソリューションまたはワークスペースに追加します)。
World Wide Naviは、実行ファイルと同じ場所のDLLをデフォルトとし、
言語コードディレクトリ内のものをその言語用のDLLとみなす方法をとっています。
たとえば日本語リソースの場合、以下のようにDLLを作成します。

./Foo.exe
... 実行ファイル
./wwnavi_string.rc
-> ./wwnavi_string.dll
... <- * デフォルトDLL
./wwnavi_string_ja.rc
-> ./ja/wwnavi_string.dll
... <- * 日本語DLL

LCIDとロケール、コードページの対応は以下のようになります。(MSDNページより抜粋)

--------------------------------------------------------------------------------------------------
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

--------------------------------------------------------------------------------------------------

上記はWorld Wide Navi付属のサンプルコード(windows_dll)にWindows DLLの外部化を実行することで確認できます。



Visual Basic 6.0国際化プログラミング

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

ちょっとというかかなり古いトピックですが、上記の参考情報以外にここまでまとめられているサイトはないので、VB6の古いアプリの多言語化を探している方には、かなり有用なトピックではないかと思います。

眠っているアプリケーションをもういちど引き出しから出して、世界に羽ばたかせてみてはいかがでしょうか?

各言語設定(ロケール)に対応してメッセージ、ラベル、キャプション、フォントなどを切り替えるためには、 これらのデータをリソースにまとめ動的に読み込む必要があります。
Visual Basic 6.0では、それはWindows APIのリソース読み込みと同じ方法を用いることで達成できます。
次の手順ではVisual Basic 6.0でリソースデータを作成、読み込む方法を、 World Wide Naviの文字列の外部化を使って説明しています。

1. リソースファイル(.rc)の作成
文字列をリソースのキーと値からなるリソースファイルに記述します。
(このファイルはテキストエディタ、またはWorld Wide Navi文字列の外部化によって作成できます。)
以下はWorld Wide Naviによって作成されたサンプルコードです。

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

*コードページとファイルのエンコーディングは対応している必要があります。

2. Windows API関数を宣言

Windows APIをVBで使うためには、それらの宣言を以下のように記述する必要があります。

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 =
&H1004&
Private Const
LOCALE_SISO639LANGNAME
= &H59

GetThreadLocale, GetUserDefaultLCID … 現在のロケールを取得
GetLocaleInfo … ロケール情報を取得
LoadLibrary … リソースDLLを読み込む
LoadString … 文字列データをDLLから読み込む(*1)
LOCALE_IDEFAULTANSICODEPAGE, LOCALE_SISO639LANGNAME … ロケール関数用の定数

*1)VBは同じ様な関数”LoadResString”を持っていますが、 DLLから読み込むためには”LoadString”が必要です。

3. リソース読み込み処理を記述
リソースから文字列を読み込む処理を記述します。
読み込みにはLoadString関数を使います。 以下はWorld Wide Naviによって作成されたサンプルコードです。

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

wwnaviH … DLLモジュールへのポインタ(後述)
id … リソースキー
buf … 読み込んだ文字列を格納する文字列
512 … 読み込む文字列のバッファサイズ

4. 動的なリソースDLL読み込みを記述
リソースDLLの読み込み処理を、LoadStringの初回呼び出しの前に記述します。
実行時の言語設定にあったDLLを読み込む必要があります。
World Wide Naviは現在のLCID (ロケールID)をGetUserDefaultLCID関数によって取得し、 それをISO-639言語コードに変換してから適切なDLLを読み込みます。
以下はWorld Wide Naviによって作成されたサンプルコードです。

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) <> " " Then
            langName2 =
 langName2 & Mid(langName, i, 1)
        End If
    Next i
    libName = "./" &
langName2 &
"/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(*1)
    End If
    rslt = LoadString(
wwnaviH, id, buf, 512)
    WwnaviGetString = buf
End Function

wwnaviH … DLLモジュールへのポインタ
LoadLibrary … DLLを読み込みポインタへセットする関数
GetUserDefaultLCID … 実行時のロケールIDを取得する関数
GetLocaleInfo … ロケールIDから文字列情報を取得する関数
*LCIDから変換された現在の言語コードのDLLを読み込むか、 または適切なDLLがない場合はデフォルトのものを読み込みます。

*1)リソースDLLがまだ読み込まれていない場合に読み込みます。 これは一回の実行に一度だけ呼び出される必要があります。

5. フォントの切り替え
フォーム、ラベル、ボタンなどのフォントはVisual Basic 6.0 IDEのGUIによってセットされるため、 フォームのコードを手動で編集することはできません。 (もし行った場合はIDEはエラーを表示します)
代わりに、Form_LoadイベントでリソースDLLから読み込まれたフォント名称をセットするのが、 フォントを動的に切り替えるためのよい解決策と言えます。 (フォント切り替えは全てのアプリケーションに必要ではありません、それはGUIの設計に依存します。)

Form1.frm
...
VERSION 5.00
Begin VB.Form Form1
   Caption
=   "Form1"
   ClientHeight
 =   1530
   ...
   BeginProperty Font
      Name
           =   "MS PGothic" (*1)
      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) (*2) ' "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

*1)IDEによるデフォルトフォント。これは自動生成されたコードであり、手動で編集できません。

*2)フォントをDLLから読み込まれた現在の言語に適切なものに切り替えています。

6. リソースファイルをDLLにコンパイルする
RCコマンド(Visual Studioツールに含まれます)とVisual Basic DLLプロジェクトを使って、 リソースファイル(.rc)をDLL(.dll)にコンパイルします。

1. Visual Basic DLLプロジェクトは .resファイル(RCコマンドによってコンパイル)しか読み込めないため、 .rcファイルをこのコマンドで作成します。

2. .resファイル作成後、それをコンパイルするためのDLLプロジェクトを、 Visual Basicアドインの”Rsource Editor”をロード、有効にした状態で作成します。

3. EXEとDLLを一度にコンパイルするために、ソースプロジェクトとDLLプロジェクトを含んだVisual Basicグループを作成します。

World Wide Naviはこれらの手順を、 1.のための.batファイル、2.のためのDLLプロジェクトファイル、3.のためのグループファイルを作成することにより、 自動化しています。
World Wide Naviによって作成されたコードは、実行ファイルと同じディレクトリにあるDLLをデフォルトとみなし、 各言語コードのディレクトリにあるDLLをその言語用のものとみなします。
例えば日本語のリソースの場合、以下のようにDLLを作成します。

./Foo.exe
... 実行ファイル
./wwnavi_string.rc
 -> ./wwnavi_string.res
-> ./wwnavi_string.dll
... <- * デフォルトDLL
./wwnavi_string_ja.rc
-> ./wwnavi_string_ja.res
-> ./ja/wwnavi_string.dll
... <- * 日本語DLL


Flash国際化プログラミング – リソース管理

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

Flashのリソース管理の方法は、大きくわけて、mx.resources.ResourceManagerを使ったproeprtiesファイルの方法と、fl.lang.Localeを使ったXLIFFの方法の2つがあります。

また、MXMLの場合は、ResourceManagerを使って直接ラベルをリソース化することができます。

各方法の詳細は、以下のAdobeの開発ガイドをご参照ください。

1. fl.lang.Localeの詳細

2. ResourceManagerのリソースの使用

*fl.lang.LocaleのXLIFF読み込みは非同期であるため、文字列の読み込みはコールバック関数で行う必要があります。
この仕様はコード中の文字列の切り替えなどに適さないため、wwnaviの文字列の外部化では、ResourceManagerを使った処理を使用しています。

*ResourceManagerに関係するクラスやメソッドの多くが現在非推称となっています。以下のコードは現在サポートされていません。

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

参考)wwnaviによるリソース切り替えのサンプルコード

フラッシュを読み込むHTMLからユーザーロケールを取得して、それに合ったリソースを表示する処理です。

======
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 = loc.replace("-", "_");

	var cn:String = "";

			// 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.

			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;
			}

			// Or get user browser
language by your external JavaScript.
			// loc = getBrowserLang();

			// In some cases,
this code doesn't work.
			ResourceManager.getInstance().
localeChain = [loc];

			isInit = true;
		}

		ロケールをHTMLの
引数として受け取ります。
		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]
			// でロケールが切り替わらない場合が
あるので安全策として以下の方法にしています。
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;
}*/

	}

}

======
test.html (Flashの読み込み)
======
<html>
<object width="100%" height="100%" >
<!-- Edit locale to the
suitable one. -->
<param name="FlashVars"
value="locale=ja_JP" />
<!-- Edit locale to the
suitable one. -->
<embed  width="100%"
height="100%" src="Main.swf"
FlashVars
="locale=ja_JP" />
</object>
</html>

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

======
 Main.as (文字列の読み込み処理)
======
...
tx1.text = WwnaviRs.getString("Main.1");
// tx1.text = "This is text 1.";
...

======
リソースファイルの場所
======
../locale/en_US/wwnaviRs.properties
          ja_JP/wwnaviRs.properties
           ...
../src/Main.as
        WwnaviRs.as

======
 リソースファイルの中身
 ======
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です。

======
コンパイルオプション
======
-locale=en_US,ja_JP
-source-path=locale/{locale}