春暖花开
雪化了,花开了,春天来了
posts - 149,comments - 125,trackbacks - 0
http://forums.microsoft.com/msdn/showpost.aspx?postid=2486338&siteid=1

在论坛上看到的一篇帖子,也是关于多语言的,未尝试过mfc上的多语言,暂且记录下来,以备参考。

Hi,
I'm trying to localize my English Windows Mobile 5.0 MFC application using mui dlls / satellite dlls but haven't got it to work.
I have read several instruction, have looked at the MuiHello example (Smartphone SDK) and Googled, but to no help.
To test, I create a Swedish resource dll/mui file with one resource item changed.

I'm not really sure if the technique used in MuiHello can be appliced on MFC applications or not.

I have named the out put file for my dll project to MyApp.exe.04d1.mui and placed it in the exe directory of the application.
When I execute the application (MyApp.exe) in a Smartphone with user language set to Swedish, the swedish resource is not loaded.
Originally I made resource-only dlls with no entry point but as the sample MuiHello has an entry point I have also tried to add this.

I have also tried out the things found here, "Localized Resources in MFC Applications: Satellite DLLs"
but with no success.
I have tried out the following:
  • Named my resource-only dll to MyAppSVE.dll, place it in the same directory as the exe.
  • Extracting the English resources from the exe and placed them in a resource-only dll named, MyRes.dll. Renamed the resource-only Swedish resource dll to MyResSVE.dll. Used LoadLibrary("MyRes.dll") and AfxSetResourceHandle to set the resource instance.
The result is the same, the Swedish resource is not loaded.

If I explicitly load the Swedish resource dll and use AfxSetResourceHandle it works, but that is not just good enough.

I have checked that the GetUserDefaultUILanguage() returns 0x04d1(Swedish)

Been stuck with this for two days now and getting really frustrated.

Does anyone know what I am doing wrong or how to do it in MFC?
Any pointers and directions are appreciated.

Cheers
Martin

 

Hi again,

I'm still unable to get the correct resource dll to load.

Instead I implemented the app so that it dynamically loaded the correct localized resoures.

I implemeted it in a way so the I can choose to localize on Locale (sub language & primary language) or primary language.

 

Code Block

HINSTANCE g_hInst;

HINSTANCE GetResHInstFormLangId(LANGID langId)

{

CString resDllName;

resDllName.Format(_T("res%04x.dll"), langId);

HINSTANCE hInst = LoadLibrary(resDllName);

if(!hInst)

{

LANGID priLangId = PRIMARYLANGID(langId);

resDllName.Format(_T("res%02x.dll"), priLangId);

hInst = LoadLibrary(resDllName);

}

return hInst;

}

 

BOOL ClocalizedApp::InitInstance()

{

#if defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)

SHInitExtraControls();

#endif // WIN32_PLATFORM_PSPC || WIN32_PLATFORM_WFSP

SetRegistryKey(_T("Local AppWizard-Generated Applications"));

//Home made localization support

LANGID userLangId = GetUserDefaultUILanguage();

g_hInst = GetResHInstFormLangId(userLangId);

if(!g_hInst )

{

sysLangId = GetSystemDefaultUILanguage();

if(userLandId != sysLangId)

g_hInst = GetResHInstFormLangId(sysLangId);

}

if(g_hInst)

AfxSetResourceHandle(g_hInst);

ClocalizedDlg dlg;

m_pMainWnd = &dlg;

INT_PTR nResponse = dlg.DoModal();

if (nResponse == IDOK)

{

}

return FALSE;

}

 

 

 

 

The drawback is of cause the all resource must be included in all localized resource dlls.

If anyone has the solution to the previous thread post please respond.

 

/

Martin

Hi once again,

Spent a too long time on this until I realized my misstake.
Oh God such a simple one.

In a application code created with the application wizard the virtual CWinApp::InitInstance is never called.
If one have a look at the implementation of CWinApp::InitInstance, one can see that it is here where the loading of the resoure dlls are made.

Simply put the localized dll in the same directory as the exe.
If my exe is called myApp.exe, my resource dll for the swedish locale is myAppSVE.dll.
In the InitInstance override function call CWinApp::InitInstance.

As far as I can see CWinApp::InitInstance does not do anything but trying to load localized resources.

Don't forget to call CWinApp::ExitInstance from any ExitInstance override, this frees the resource dll.
(Oh no not again, I answered my own Question)
Thanks Martin
posted on 2008-11-19 09:58 Sandy 阅读(513) 评论(0)  编辑 收藏 引用 所属分类: Window Mobile

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理