Using international string resources in dialog design
TA -- siemens@inet.uni-c.dk Friday, January 17, 1997 Environment: VC++ 4.0, Windows NT 4.0 I wish to use string resources for the controls on my dialogs. How can I set these with a minimal effort? Is it really necessary to use API's like LoadString() and SetWindowText()? There must be a way to automate this proces! Thanks in advance and best regards, Kent Fonager kfk@siemens.dk Siemens A/S Borupvang 3 DK-2750 Ballerup +45 4477 5934
Brad Wilson/Crucial Software -- crucial@pobox.com Saturday, January 18, 1997 [Mini-digest: 6 responses] > Environment: VC++ 4.0, Windows NT 4.0 > > I wish to use string resources for the controls on my dialogs. How can I > set these with a minimal effort? The only advantage I see to using strings to set the text on dialog controls is that the string is used in many places (internationalize one vs. many). Otherwise, why are you doing this? > Is it really necessary to use API's like LoadString() and SetWindowText()? Yes. -- Brad Wilson, Objectivist crucial@pobox.com http://www.thebrads.com/ "No, his mind is not for rent . To any god or government Always hopeful, but discontent . He knows changes aren't permanent But change is..." - Tom Sawyer (from the Rush CD "Moving Pictures") -----From: Michael IlesOn Friday, January 17, 1997 6:51 AM, Siemens, TA[SMTP:siemens@inet.uni-c.dk] wrote: >Environment: VC++ 4.0, Windows NT 4.0 > >I wish to use string resources for the controls on my dialogs. How can I >set these with a minimal effort? >Is it really necessary to use API's like LoadString() and SetWindowText()? Hi Kent, The text used on your dialogs is also in your .rc file, so you can localise it as easily as you localise your string resources. Mike. -----From: Sergei Fishel First you should do is to install another language system for your NT. So, if you install German as primary language you will see that resources will appear with German code page when you will create them. This is primary way. Second way, is to edit manually resource file and put there reference to German code page. (But you should have it installed already any way). I have example with Russian language, but it uses default code page and sub-language. You will have to replace code page to German one and sublang as well. //////////////////////////////////////////////////////// // Russian resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT #pragma code_page(1251) #endif //_WIN32 Regards At 12:51 PM 1/17/97 +0100, you wrote: >Environment: VC++ 4.0, Windows NT 4.0 > >I wish to use string resources for the controls on my dialogs. How can I >set these with a minimal effort? >Is it really necessary to use API's like LoadString() and SetWindowText()? > >There must be a way to automate this proces! > >Thanks in advance and best regards, > >Kent Fonager >kfk@siemens.dk >Siemens A/S >Borupvang 3 >DK-2750 Ballerup >+45 4477 5934 > -----From: Tim Robinson At 12:51 1/17/97 +0100, you wrote: >Environment: VC++ 4.0, Windows NT 4.0 > >I wish to use string resources for the controls on my dialogs. How can I >set these with a minimal effort? >Is it really necessary to use API's like LoadString() and SetWindowText()? > >There must be a way to automate this proces! Offhand, I should point out that dialogs ARE localizable resources just like strings. In theory, there shouldn't be a need to automate a relation between a dialog and a string resource. Any translator should do the dialogs just like doing the strings. However, if you're bent on doing that, why not something like the following in your OnInitDialog: static struct { int m_ID, m_String; } tab[] = { { IDC_STATIC1, IDS_STRING1 }, { IDC_STATIC2, IDS_STRING2 }, // etc... { 0, 0 } }; CString text; for ( int i=0; tab[i].m_ID; i++ ) { text.LoadString (tab[i].m_String ); ((CWnd*)GetDlgItem( tab[i].m_ID )->SetWindowText( text ); } Untested, but that's as painless as I can imagine. Naturally, consider subclassing CDialog if you're going to use this a bunch of places. | Tim Robinson, Esquire | Liberty means responsibility. | | timtroyr@ionet.net | That is why most men dread it. | | http://www.ionet.net/~timtroyr | George Bernard Shaw | -----From: "Hemanta Banerjee" > I wish to use string resources for the controls on my dialogs. How can I > set these with a minimal effort? > Is it really necessary to use API's like LoadString() and SetWindowText()? There cannot be an automatic way of doin it. The only semi automatic way of doing whereby u can give the notion of automatic handling is :- 1) Define strings in ur string table. 2) In the string table add an entry for the dialog in the form dialog name,start string table pos, number of entries and have the position as some factor of the dialog id. (like dialog id * 3 + 100 - blah blah ....) so that u have a unique position for the entry. 3) Have a common base class derived from CDialog which in its init dialog will load the string and do corresponding activities. Here u have to take care bcos u cannot just have entries for text fields. U also have to have entries for list boxes, combo's etc. So have a schema like this Field id, type , no of strings , string entries separated by commas . So if ur type is combo then load all the strings and do needful etc. But even this is not automatic but all dialogs need not repeat the code. It is just reusability. Bye Hemanta -----From: "Christian Rosner" Kent Fonager wrote: > I wish to use string resources for the controls on my dialogs. How can I > set these with a minimal effort? Is it really necessary to use API's like > LoadString() and SetWindowText()? > > There must be a way to automate this proces! Yes: inheritance! I inherited a subclass from the MFC classes CFormView and CDialog and called a function Translate() from within the function CFormView::OnInitialUpdate() (resp. CDialog::OnInitDialog()). The function Translate() simply iterates through each control in the form (using EnumChildWindows()) and loads for each control the label string from the resources (identified by the control ID) and sets the new window text. Now you can use the new class instead of the MFC class and the translation is done automatically. If you need more help (or some sample code) please write me an email. Hope this helps Christian ---------- Christian Rosner (crosner@csci.csc.com)
Alexey Yakovlev -- avy@aha.ru Tuesday, January 21, 1997 Environment: MSVC 4.2b Win95 WinNT 4.0 Sergei Fishelwrote: > //////////////////////////////////////////////////////// > // Russian resources > #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) > #ifdef _WIN32 > LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT > #pragma code_page(1251) > #endif //_WIN32 ...it is all nice and fine: You can have your resources in 2 (or more) languages attached right to your executable. No need for fancy dialog processing, substituting strings from resources or loading language DLLs. Just create a copy of resource (VC will mark it as ID_NAME1), switch it to different language and change ID back to original ID_NAME. Then you can edit such resources in VC editor after selecting required input locale in WinNT control panel. WinNT will use your custom accelerators and display your menus, dialogs and strings at runtime based on the locale selected by user. Very cool, very convenient, single binary for all international users, bravo Microsoft! BUT it does not work in English version of Win95. I have English (United States) and Russian locales and fonts installed, and can successfully type using both languages in MS Word, for example. Win95 shows _English version_ of resource regardless of what is in international settings. When I remove all but Russian language resources, Win95 displays underlines instead of my cyrillic chars. A _recompile under Win95 with #pragma code_page(1251) commented out_ is needed to make this exe show correctly under Win95. BUT then cyrillic will show up as question marks on WinNT... Any ideas? Can RC mark the executable for Russian (or whatever alternate language to be displayed correctly on _both_ Win32 platforms? Alexey -- avy@aha.ru http://win.aha.ru/~avy (Russian cp1251)
Alexey Yakovlev -- avy@aha.ru Tuesday, January 21, 1997 Environment: MSVC 4.2b Win95 WinNT 4.0 Sergei Fishelwrote: > //////////////////////////////////////////////////////// > // Russian resources > #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) > #ifdef _WIN32 > LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT > #pragma code_page(1251) > #endif //_WIN32 ...it is all nice and fine: You can have your resources in 2 (or more) languages attached right to your executable. No need for fancy dialog processing, substituting strings from resources or loading language DLLs. Just create a copy of resource (VC will mark it as ID_NAME1), switch it to different language and change ID back to original ID_NAME. Then you can edit such resources in VC editor after selecting required input locale in WinNT control panel. WinNT will use your custom accelerators and display your menus, dialogs and strings at runtime based on the locale selected by user. Very cool, very convenient, single binary for all international users, bravo Microsoft! BUT it does not work in English version of Win95. I have English (United States) and Russian locales and fonts installed, and can successfully type using both languages in MS Word, for example. Win95 shows _English version_ of resource regardless of what is in international settings. When I remove all but Russian language resources, Win95 displays underlines instead of my cyrillic chars. A _recompile under Win95 with #pragma code_page(1251) commented out_ is needed to make this exe show correctly under Win95. BUT then cyrillic will show up as question marks on WinNT... Any ideas? Can RC mark the executable for Russian (or whatever alternate language to be displayed correctly on _both_ Win32 platforms? Alexey -- avy@aha.ru http://win.aha.ru/~avy (Russian cp1251)
Kristoffer -- gjevre@filenet.com Wednesday, January 22, 1997 According to the "Developing International Software" by Nadine Kano, on Windows NT, most standard resource calls retrieve resources based on the language ID of the calling thread locale, and only Windows NT supports SetThreadLocale and GetThreadLocale, and another method has to be used for Windows 95 to change the user interface at run time (Page 136). From this it sounds like you can not get to other than the default language resources on Windows 95. Kristoffer ---------- From: Alexey Yakovlev[SMTP:avy@aha.ru] Sent: Monday, January 20, 1997 21:04 To: mfc-l@netcom.com Subject: Re: Using international string resources in dialog design Environment: MSVC 4.2b Win95 WinNT 4.0 Sergei Fishelwrote: > //////////////////////////////////////////////////////// > // Russian resources > #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) > #ifdef _WIN32 > LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT > #pragma code_page(1251) > #endif //_WIN32 ...it is all nice and fine: You can have your resources in 2 (or more) languages attached right to your executable. No need for fancy dialog processing, substituting strings from resources or loading language DLLs. Just create a copy of resource (VC will mark it as ID_NAME1), switch it to different language and change ID back to original ID_NAME. Then you can edit such resources in VC editor after selecting required input locale in WinNT control panel. WinNT will use your custom accelerators and display your menus, dialogs and strings at runtime based on the locale selected by user. Very cool, very convenient, single binary for all international users, bravo Microsoft! BUT it does not work in English version of Win95. I have English (United States) and Russian locales and fonts installed, and can successfully type using both languages in MS Word, for example. Win95 shows _English version_ of resource regardless of what is in international settings. When I remove all but Russian language resources, Win95 displays underlines instead of my cyrillic chars. A _recompile under Win95 with #pragma code_page(1251) commented out_ is needed to make this exe show correctly under Win95. BUT then cyrillic will show up as question marks on WinNT... Any ideas? Can RC mark the executable for Russian (or whatever alternate language to be displayed correctly on _both_ Win32 platforms? Alexey -- avy@aha.ru http://win.aha.ru/~avy (Russian cp1251)
| Вернуться в корень Архива |