Karl Ove Hufthammer wrote:
>
> ----- Original Message -----
> From: "Andrew Dunbar" <[EMAIL PROTECTED]>
> To: "Karl Ove Hufthammer" <[EMAIL PROTECTED]>
> Sent: Saturday, May 26, 2001 12:45 PM
> Subject: Re: Patch: Win32 locale improvements
>
> > Karl Ove Hufthammer wrote:
> > >
> > > What is 'Non'? There is no language code (ISO or otherwise) with this name.
> >
> > That's code I've removed which was written by somebody else. Basically
> > Windows before NT returned its own three letter string for language and
> > one for country.
>
> Well, Windows 98 (1st edition) returns 'no-NO' for both Nynorsk and Bokm�l.
Yes I tested it under 98 earlier today and it returns lowercase whereas
2000 returns uppercase for the same function. This is now fixed.
> > > > - // Territory
> > > > - if (bNorwaySpecialCase == true) // Special case: Nynorsk in Norway
> > > > - LanguageISOTerritory = "NYNORSK"; // As in ap_Win32Prefs.cpp
> > >
> > > Also, there is no territory (country) named NYNORSK in ISO. The country is
> 'NO'.
> >
> > Yes this is removed also. I now return "no", "nb" and "nr" as per ISO.
>
> I hope you mean 'nn' and not 'nr'. And these are the language part, not the
> country part. The complete locale code should be 'nn-NO' and 'nb-NO'.
Yes sorry I was going from memory in the email but the code is correct
(:
> I see 'ut_Win32Locale.cpp' use 'NON' and 'NOR'. Is this what Windows 2000
> returns? The correct ISO 639-2 three-letter language codes for Nynorsk and
> Bokm�l is 'nno' and 'nob', respectively. ('nor' could be either Nynorsk or
> Bokm�l.) The official standard is available from <URL:
> http://lcweb.loc.gov/standards/iso639-2/ >.
Yes well there are two functions in Windows to get the code.
The pre-NT function returns a 3-letter Microsoft code which is not
ISO ISO 639. The newer function in NT/2000 returns ISO 639-1.
So I use both of these if necessary to conjure up an ISO 639-2 code.
Here's the updated patch and ut_Win32Locale. Please check this one.
Andrew.
--
http://linguaphile.sourceforge.net
? src/af/util/win/ut_Win32Locale.h
? src/af/util/win/ut_Win32Locale.cpp
Index: src/af/util/Makefile
===================================================================
RCS file: /cvsroot/abi/src/af/util/Makefile,v
retrieving revision 1.50
diff -u -r1.50 Makefile
--- src/af/util/Makefile 2001/05/25 05:52:08 1.50
+++ src/af/util/Makefile 2001/05/26 05:54:40
@@ -50,6 +50,7 @@
$(OBJDIR)/ut_$(ABI_FE)OS.$(OBJ_SUFFIX) \
$(OBJDIR)/ut_$(ABI_FE)String.$(OBJ_SUFFIX) \
$(OBJDIR)/ut_$(ABI_FE)Timer.$(OBJ_SUFFIX) \
+ $(OBJDIR)/ut_$(ABI_FE)Locale.$(OBJ_SUFFIX) \
$(OBJDIR)/ut_iconv.$(OBJ_SUFFIX) \
$(OBJDIR)/ut_Xpm2Bmp.$(OBJ_SUFFIX)
endif
Index: src/af/util/win/Makefile
===================================================================
RCS file: /cvsroot/abi/src/af/util/win/Makefile,v
retrieving revision 1.13
diff -u -r1.13 Makefile
--- src/af/util/win/Makefile 2000/02/14 11:24:49 1.13
+++ src/af/util/win/Makefile 2001/05/26 05:54:41
@@ -27,6 +27,7 @@
ut_Win32OS.cpp \
ut_Win32String.cpp \
ut_Win32Timer.cpp \
+ ut_Win32Locale.cpp \
ut_Xpm2Bmp.cpp
INCLUDES= -I$(ABI_XX_ROOT)/../libiconv/include
Index: src/af/xap/win/xap_Win32EncodingManager.cpp
===================================================================
RCS file: /cvsroot/abi/src/af/xap/win/xap_Win32EncodingManager.cpp,v
retrieving revision 1.3
diff -u -r1.3 xap_Win32EncodingManager.cpp
--- src/af/xap/win/xap_Win32EncodingManager.cpp 2001/05/25 18:12:44 1.3
+++ src/af/xap/win/xap_Win32EncodingManager.cpp 2001/05/26 05:54:44
@@ -2,12 +2,9 @@
#include <windows.h>
#include "ut_assert.h"
#include "ut_debugmsg.h"
+#include "ut_Win32Locale.h"
#include "xap_Win32EncodingManager.h"
-// TODO This data is defined in ap_Win32Prefs.cpp
-
-extern char s_ISO3166_2_and_3[1190];
-
/************************************************************/
XAP_EncodingManager *XAP_EncodingManager::get_instance()
@@ -46,11 +43,12 @@
void XAP_Win32EncodingManager::initialize()
{
char szLocaleInfo[64];
+ static char szCodepage[64];
static char szLanguage[64];
static char szTerritory[64];
bool bNorwaySpecialCase = false;
- NativeEncodingName = "ISO-8859-1";
+ NativeEncodingName = "CP1252";
LanguageISOName = "en";
LanguageISOTerritory = NULL;
@@ -60,42 +58,32 @@
// Windows Unicode locale?
if (!strcmp(szLocaleInfo,"0"))
{
- NativeEncodingName = "UCS-2-INTERNAL"; // As in
ev_Win32Keyboard.cpp
+ // As in ev_Win32Keyboard.cpp
+ // TODO Would UCS-2-LE / UCS-2-BE be preferable?
+ // TODO Does NT use UCS-2-BE internally on non-Intel CPUs?
+ NativeEncodingName = "UCS-2-INTERNAL";
m_bIsUnicodeLocale = true;
}
else
{
- NativeEncodingName = charsetFromCodepage(atoi(szLocaleInfo));
+ szCodepage[0] = 'C';
+ szCodepage[1] = 'P';
+ strcpy(szCodepage+2,szLocaleInfo);
+ NativeEncodingName = szCodepage;
m_bIsUnicodeLocale = false;
}
}
- // Language
- if
(GetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_SABBREVLANGNAME,szLanguage,sizeof(szLanguage)/sizeof(szLanguage[0])))
+ if (UT_getISO639Language(szLanguage))
{
- if (!strcmp(szLanguage,"Non")) // Special case: Nynorsk in
Norway
- bNorwaySpecialCase = true; // As in
ap_Win32Prefs.cpp
-
- szLanguage[0] = tolower(szLanguage[0]);
- szLanguage[1] = tolower(szLanguage[1]);
- szLanguage[2] = '\0';
LanguageISOName = szLanguage;
}
-
- // Territory
- if (bNorwaySpecialCase == true) // Special case: Nynorsk in
Norway
- LanguageISOTerritory = "NYNORSK"; // As in ap_Win32Prefs.cpp
- else if
(GetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_SABBREVCTRYNAME,szLocaleInfo,sizeof(szLocaleInfo)/sizeof(szLocaleInfo[0])))
+ else
{
- // TODO This code is copied from ap_Win32Prefs.cpp
- char *psz;
-
- for (psz = s_ISO3166_2_and_3; *psz != '\0'; psz += 5 )
- if (!strncmp(&psz[2],szLocaleInfo,3))
- break;
-
- strncpy(szTerritory, psz, 2 );
- szTerritory[2] = '\0';
+ UT_ASSERT(UT_SHOULD_NOT_HAPPEN);
+ }
+ if (UT_getISO3166Country(szTerritory))
+ {
LanguageISOTerritory = szTerritory;
}
Index: src/wp/ap/win/ap_Win32Prefs.cpp
===================================================================
RCS file: /cvsroot/abi/src/wp/ap/win/ap_Win32Prefs.cpp,v
retrieving revision 1.10
diff -u -r1.10 ap_Win32Prefs.cpp
--- src/wp/ap/win/ap_Win32Prefs.cpp 2001/02/06 22:54:55 1.10
+++ src/wp/ap/win/ap_Win32Prefs.cpp 2001/05/26 05:55:34
@@ -26,31 +26,10 @@
#include "ut_units.h"
#include "ut_debugmsg.h"
+#include "ut_Win32Locale.h"
#include "ap_Win32Prefs.h"
-// Codes from ISO 3166
-// Very compressed form. Two char code folowed by tree char code.
-
-char s_ISO3166_2_and_3[] =
-"AFAFGALALBDZDZAASASMADANDAOAGOAIAIAAQATAAGATGARARGAMARMAWABWAUAUSATAUT"
-"AZAZEBSBHSBHBHRBDBGDBBBRBBYBLRBEBELBZBLZBJBENBMBMUBTBTNBOBOLBABIHBWBWA"
-"BVBVTBRBRAIOIOTBNBRNBGBGRBFBFABIBDIKHKHMCMCMRCACANCVCPVKYCYMCFCAFTDTCD"
-"CLCHLCNCHNCXCXRCCCCKCOCOLKMCOMCGCOGCKCOKCRCRICICIVHRHRVCUCUBCYCYPCZCZE"
-"DKDNKDJDJIDMDMADODOMTPTMPECECUEGEGYSVSLVGQGNQERERIEEESTETETHFKFLKFOFRO"
-"FJFJIFIFINFRFRAFXFXXGFGUFPFPYFTFATFGAGABGMGMBGEGEODEDEUGHGHAGIGIBGRGRC"
-"GLGRLGDGRDGPGLPGUGUMGTGTMGNGINGWGNBGYGUYHTHTIHMHMDHNHNDHKHKGHUHUNISISL"
-"ININDIDIDNIRIRNIQIRQIEIRLILISRITITAJMJAMJPJPNJOJORKZKAZKEKENKIKIRKPPRK"
-"KRKORKWKWTKGKGZLALAOLVLVALBLBNLSLSOLRLBRLYLBYLILIELTLTULULUXMOMACMKMKD"
-"MGMDGMWMWIMYMYSMVMDVMLMLIMTMLTMHMHLMQMTQMRMRTMUMUSYTMYTMXMEXFMFSMMDMDA"
-"MCMCOMNMNGMSMSRMAMARMZMOZMMMMRNANAMNRNRUNPNPLNLNLDANANTNCNCLNZNZLNINIC"
-"NENERNGNGANUNIUNFNFKMPMNPNONOROMOMNPKPAKPWPLWPAPANPGPNGPYPRYPEPERPHPHL"
-"PNPCNPLPOLPTPRTPRPRIQAQATREREUROROMRURUSRWRWAKNKNALCLCAVCVCTWSWSMSMSMR"
-"STSTPSASAUSNSENSCSYCSLSLESGSGPSKSVKSISVNSBSLBSOSOMZAZAFESESPLKLKASHSHN"
-"PMSPMSDSDNSRSURSJSJMSZSWZSESWECHCHESYSYRTWTWNTJTJKTZTZATHTHATGTGOTKTKL"
-"TOTONTTTTOTNTUNTRTURTMTKMTCTCATVTUVUGUGAUAUKRAEAREGBGBRUSUSAUMUMIUYURY"
-"UZUZBVUVUTVAVATVEVENVNVNMVGVGBVIVIRWFWLFEHESHYEYEMYUYUGZRZARZMZMBZWZWE";
-
/*****************************************************************/
AP_Win32Prefs::AP_Win32Prefs(XAP_App * pApp)
@@ -73,41 +52,20 @@
m_builtinScheme->setValue( AP_PREF_KEY_RulerUnits, UT_dimensionName(
szLocaleInfo[0] == '0' ? DIM_CM : DIM_IN ) );
}
- if( GetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_SABBREVLANGNAME, szLocaleInfo,
sizeof( szLocaleInfo ) / sizeof( szLocaleInfo[0] ) ) )
+ if (UT_getISO639Language(szLocaleInfo))
{
- char szTmp[64];
-
- if( !strcmp( szLocaleInfo, "Non" ) ) // Special case: Nynorsk in Norway
- {
- strcpy( szLocaleInfo, "no-NYNORSK" );
- }
- else if( GetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_SABBREVCTRYNAME,
szTmp, sizeof( szTmp ) / sizeof( szTmp[0] ) ) )
- {
- char *psz;
-
- szLocaleInfo[0] = tolower( szLocaleInfo[0] );
- szLocaleInfo[1] = tolower( szLocaleInfo[1] );
- szLocaleInfo[2] = '-';
-
- for( psz = s_ISO3166_2_and_3; *psz != '\0'; psz += 5 )
- if( !strncmp( &psz[2], szTmp, 3 ) )
- break;
-
- strncpy( &szLocaleInfo[3], psz, 2 );
- szLocaleInfo[5] = '\0';
- }
- else
- {
- szLocaleInfo[0] = tolower( szLocaleInfo[0] );
- szLocaleInfo[1] = tolower( szLocaleInfo[1] );
- szLocaleInfo[2] = '\0';
- }
+ if (UT_getISO3166Country(&szLocaleInfo[3]))
+ szLocaleInfo[2] = '-';
UT_DEBUGMSG(("Prefs: Using LOCALE info from environment [%s]\n",
szLocaleInfo));
m_builtinScheme->setValue( AP_PREF_KEY_MenuLabelSet, szLocaleInfo );
m_builtinScheme->setValue( AP_PREF_KEY_ToolbarLabelSet, szLocaleInfo );
m_builtinScheme->setValue( AP_PREF_KEY_StringSet, szLocaleInfo );
+ }
+ else
+ {
+ UT_ASSERT(UT_SHOULD_NOT_HAPPEN);
}
return ret;
ut_Win32Locale.h
ut_Win32Locale.cpp