Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

225 lines
6.9 KiB

#include "precomp.h"
#pragma hdrstop
/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
nls.c
Abstract:
NLS related routines in the setupdll
Detect Routines:
----------------
Install Routines Workers:
-------------------------
1. SetCurrentLocaleWorker: To set the values associated with the
current locale in the cpanel area of the registry.
//
// Fill up the current structure with the values that we need:
//
// Field Name LcType Example
// ---------- ------- -------
// sLanguage = LOCALE_SABBREVLANGNAME, ENU
// sCountry = LOCALE_SCOUNTRY, United States
// iCountry = LOCALE_ICOUNTRY, 1
// sList = LOCALE_SLIST ,
// iMeasure = LOCALE_IMEASURE 1
// sDecimal = LOCALE_SDECIMAL .
// sThousand = LOCALE_STHOUSAND ,
// iDigits = LOCALE_IDIGITS 2
// iLZero = LOCALE_ILZERO 1
// sCurrency = LOCALE_SCURRENCY $
// iCurrDigits = LOCALE_ICURRDIGITS 2
// iCurrency = LOCALE_ICURRENCY 0
// iNegCurr = LOCALE_INEGCURR 0
// sDate = LOCALE_SDATE /
// sTime = LOCALE_STIME :
// sShortDate = LOCALE_SSHORTDATE M/d/yy
// sLongDate = LOCALE_SLONGDATE dddd, MMMM dd, yyyy
// iDate = LOCALE_IDATE 0
// iTime = LOCALE_ITIME 0
// iTLZero = LOCALE_ITLZERO 0
// s1159 = LOCALE_S1159 AM
// s2359 = LOCALE_S2359 PM
Author:
Sunil Pai (sunilp) Sept 1992
--*/
BOOL
SetCurrentLocaleWorker(
LPSTR Locale,
LPSTR ModifyCPL
)
/*++
Routine Description:
Sets the current values for all the per locale fields associated with the
control panel in the user tree. Also sets the current user locale and
system locale fields for the currently logged on session.
Arguments:
Locale: This is the current locale we have installed.
Return value:
Returns TRUE if successful, FALSE otherwise with the return buffer
containing the error text.
--*/
{
#define WORKSIZE 128 // size (in chars) of work buffer
WCHAR szwork[WORKSIZE];
INT i;
LCID lcid;
LPSTR pszTemp;
LONG RegStatus;
NTSTATUS Status;
HKEY hKey;
BOOL b24Hours = FALSE;
//
// Table of international settings and associated lctypes.
//
struct {
PWSTR szIniKey;
LCTYPE dwLcType;
} IntlDataArray[] = {
{ L"sLanguage" , LOCALE_SABBREVLANGNAME } ,
{ L"sCountry" , LOCALE_SCOUNTRY } ,
{ L"iCountry" , LOCALE_ICOUNTRY } ,
{ L"sList" , LOCALE_SLIST } ,
{ L"iMeasure" , LOCALE_IMEASURE } ,
{ L"sDecimal" , LOCALE_SDECIMAL } ,
{ L"sThousand" , LOCALE_STHOUSAND } ,
{ L"iDigits" , LOCALE_IDIGITS } ,
{ L"iLZero" , LOCALE_ILZERO } ,
{ L"sCurrency" , LOCALE_SCURRENCY } ,
{ L"iCurrDigits" , LOCALE_ICURRDIGITS } ,
{ L"iCurrency" , LOCALE_ICURRENCY } ,
{ L"iNegCurr" , LOCALE_INEGCURR } ,
{ L"sDate" , LOCALE_SDATE } ,
{ L"sTime" , LOCALE_STIME } ,
{ L"sTimeFormat" , LOCALE_STIMEFORMAT } ,
{ L"sShortDate" , LOCALE_SSHORTDATE } ,
{ L"sLongDate" , LOCALE_SLONGDATE } ,
{ L"iDate" , LOCALE_IDATE } ,
{ L"iTime" , LOCALE_ITIME } ,
{ L"iTLZero" , LOCALE_ITLZERO } ,
{ L"s1159" , LOCALE_S1159 } ,
{ L"s2359" , LOCALE_S2359 }
};
//
// Check to make sure we can modify all locale components later
//
RegStatus = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
"System\\CurrentControlSet\\Control\\Nls\\Language",
0,
KEY_WRITE,
&hKey
);
if( RegStatus != ERROR_SUCCESS ) {
SetReturnText( "ERROR_PRIVILEGE" );
return( FALSE );
}
else {
RegCloseKey( hKey );
}
RegStatus = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
"System\\CurrentControlSet\\Control\\Nls\\CodePage",
0,
KEY_WRITE,
&hKey
);
if( RegStatus != ERROR_SUCCESS ) {
SetReturnText( "ERROR_PRIVILEGE" );
return( FALSE );
}
else {
RegCloseKey( hKey );
}
lcid = (LCID)strtoul( Locale, &pszTemp, 16);
if( !lstrcmpi( ModifyCPL, "YES" ) ) {
//
// Update the control panel user area for new defaults for
// current locale
//
for( i = 0; i < sizeof(IntlDataArray)/sizeof(IntlDataArray[0]); i++ ) {
if(!GetLocaleInfoW(lcid,IntlDataArray[i].dwLcType,szwork,WORKSIZE)) {
SetReturnText( "ERROR_UNSUPPORTED" );
return( FALSE );
}
//
// if the default setting is 24hours,
// we set s1159 and s2359 with NULL.
//
if(IntlDataArray[i].dwLcType == LOCALE_ITIME) {
if(szwork[0] == L'1') {
b24Hours = TRUE;
}
} else if((IntlDataArray[i].dwLcType == LOCALE_S1159)||
(IntlDataArray[i].dwLcType == LOCALE_S2359) ) {
if(b24Hours) {
szwork[0] = L'\0';
}
}
if(!WriteProfileStringW(L"INTL",IntlDataArray[i].szIniKey,szwork)) {
SetReturnText( "ERROR_PRIVILEGE" );
return( FALSE );
}
}
//
// Flush win.ini
//
WriteProfileString( NULL, NULL, NULL );
}
//
// Set the current thread current system and user locales
//
Status = NtSetDefaultLocale( FALSE, lcid );
if(!NT_SUCCESS( Status )) {
SetReturnText( "ERROR_PRIVILEGE" );
return( FALSE );
}
Status = NtSetDefaultLocale( TRUE, lcid );
if(!NT_SUCCESS( Status )) {
SetReturnText( "ERROR_PRIVILEGE" );
return( FALSE );
}
return ( TRUE );
}