/* * Copyright (c) 2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ /* * * * A simple tool to output all the installed locales on a Windows machine, and * corresponding Java default locale/file.encoding using PrintDefaultLocale * * WARNING: This tool directly modifies the locale info in the Windows registry. * It may not work with the Windows versions after Windows XP SP2. Also, * if the test did not complete or was manually killed, you will need to reset * the user default locale in the Control Panel manually. * * Usage: "deflocale.exe PrintDefaultLocale * * How to compile: "cl deflocale.c advapi32.lib" */ #include #include #include char* launcher; char szBuffer[MAX_PATH]; LCID LCIDArray[1024]; int numLCIDs = 0; void testLCID(int anLCID) { HKEY hk; printf("\n"); printf("OS Locale (lcid: %x): ", anLCID); GetLocaleInfo(anLCID, LOCALE_SENGLANGUAGE, szBuffer, MAX_PATH); printf("%s (", szBuffer); GetLocaleInfo(anLCID, LOCALE_SENGCOUNTRY, szBuffer, MAX_PATH); printf("%s) - ", szBuffer); GetLocaleInfo(anLCID, LOCALE_IDEFAULTANSICODEPAGE, szBuffer, MAX_PATH); printf("%s\n", szBuffer); fflush(0); if (RegOpenKeyEx(HKEY_CURRENT_USER, "Control Panel\\International", 0, KEY_READ | KEY_WRITE, &hk) == ERROR_SUCCESS) { BYTE original[16]; BYTE test[16]; DWORD cb = 16; STARTUPINFO si; PROCESS_INFORMATION pi; RegQueryValueEx(hk, "Locale", 0, 0, original, &cb); sprintf(test, "%08x", anLCID); RegSetValueEx(hk, "Locale", 0, REG_SZ, test, cb); ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); if (CreateProcess(NULL, launcher, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)==0) { printf("CreateProcess failed with the error code: %x\n", GetLastError()); } WaitForSingleObject( pi.hProcess, INFINITE ); RegSetValueEx(hk, "Locale", 0, REG_SZ, original, cb); RegCloseKey(hk); } } BOOL CALLBACK EnumLocaleProc(LPTSTR lpLocaleStr) { sscanf(lpLocaleStr, "%08x", &LCIDArray[numLCIDs]); numLCIDs ++; return TRUE; } int sortLCIDs(LCID * pLCID1, LCID * pLCID2) { if (*pLCID1 < *pLCID2) return (-1); if (*pLCID1 == *pLCID2) return 0; if (*pLCID1 > *pLCID2) return 1; } int main(int argc, char** argv) { OSVERSIONINFO osvi; LPTSTR commandline = GetCommandLine(); int i; osvi.dwOSVersionInfoSize = sizeof(osvi); GetVersionEx(&osvi); printf("# OSVersionInfo\n"); printf("# MajorVersion: %d\n", osvi.dwMajorVersion); printf("# MinorVersion: %d\n", osvi.dwMinorVersion); printf("# BuildNumber: %d\n", osvi.dwBuildNumber); printf("# CSDVersion: %s\n", osvi.szCSDVersion); printf("\n"); fflush(0); launcher = strchr(commandline, ' ')+1; while (*launcher == ' ') { launcher++; } // Enumerate locales EnumSystemLocales(EnumLocaleProc, LCID_INSTALLED); // Sort LCIDs qsort(LCIDArray, numLCIDs, sizeof(LCID), (void *)sortLCIDs); // Execute enumeration of Java default locales for (i = 0; i < numLCIDs; i ++) { testLCID(LCIDArray[i]); } }