2017年8月
« 7月    
 123456
78910111213
14151617181920
21222324252627
28293031  

カテゴリー

最近のコメント

<!–:ja–>「ODAを活用した中小企業等の海外展開支援に係る委託事業説明会」に参加してきた<!–:–>

タイトルのとおり、説明会に参加してきた。このタイトルの前に、「外務省によるODA中小企業支援策のプレアナウンス」という前書きが付いていた。

この委託事業は予算20億円。ニーズ調査、案件化調査、途上国政府への普及事業の3つの事業がある。

おそらく中小企業国際化アドバイザーに登録しているので案内が送られてきたのだと思うが、出席していたのは、コンサルタント、シンクタンク、商社などが多かった模様。

ODA事業に有益と考えられる製品分野の例というのが挙げられていたのだが、IT、ソフトウェア製品は入っていない。今ではどの分野でもITと無縁ではいられないが、具体例として挙げられているものは機械や装置の類である。

これらの機械や装置を海外に持っていったり、現地の人のトレーニングをしたり、その国で販売したりするとなると、機械装置のユーザインタフェースの現地語対応やマニュアルの翻訳といったことが必要になってくる。委託事業そのものではないか、周辺で我社が貢献できることもあるようだなと感じて帰ってきた。

公募対象のところに、開発コンサルタントや商社等からの提案が基本とか、中小企業とコンサルタント当による共同提案が基本、と書いてあって、やはりODAとなるとそういう世界なんだと、ちょっとお勉強にもなりました。

日本まるごと国際化。国際化JPがお手伝いできることがあればいつでもご相談ください。



<!–:ja–>Windows API国際化プログラミング – リソース読み込み(Win32、MFC)<!–:–><!–:en–>Windows API Internationalization Programming – Resource Loading (Win32, MFC)<!–:–>

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

かなり古めな情報になりますが、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[];
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 online casino  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の外部化を実行することで確認できます。



&amp;amp;lt;!–:ja–&amp;amp;gt;Visual Basic 6.0国際化プログラミング&amp;amp;lt;!–:–&amp;amp;gt;&amp;amp;lt;!–:en–&amp;amp;gt;Visual Basic 6.0 Internationalization Programming&amp;amp;lt;!–:–&amp;amp;gt;

ソフトウェア国際化ツール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