⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 locale.c

📁 winNT技术操作系统,国外开放的原代码和LIUX一样
💻 C
字号:
/*
 * PROJECT:         ReactOS International Control Panel
 * LICENSE:         GPL - See COPYING in the top level directory
 * FILE:            lib/cpl/intl/locale.h
 * PURPOSE:         Regional parameters page
 * PROGRAMMERS:     Eric Kohl
 *                  Alexey Zavyalov (gen_x@mail.ru)
*/

/* INCLUDES *****************************************************************/

#include <windows.h>
#include <commctrl.h>
#include <cpl.h>

#include "intl.h"
#include "resource.h"

/* GLOBALS ******************************************************************/

#define SAMPLE_NUMBER   L"123456789"
#define NO_FLAG         0

HWND hLocaleList, hGeoList;

/* FUNCTIONS ****************************************************************/

/* Location enumerate procedure */
BOOL
CALLBACK
LocationsEnumProc(GEOID gId)
{
    TCHAR loc[MAX_STR_SIZE];
    int index;

    GetGeoInfo(gId, GEO_FRIENDLYNAME, loc, MAX_FMT_SIZE, LANG_SYSTEM_DEFAULT);
    index = (int) SendMessageW(hGeoList,
                         CB_ADDSTRING,
                         0,
                         (LPARAM)loc);

    SendMessageW(hGeoList,
                 CB_SETITEMDATA,
                 index,
                 (LPARAM)gId);

    return TRUE;
}

/* Enumerate all system locations identifiers */
static
VOID
CreateLocationsList(HWND hWnd)
{
    GEOID userGeoID;
    TCHAR loc[MAX_STR_SIZE];

    hGeoList = hWnd;

    EnumSystemGeoID(GEOCLASS_NATION, 0, LocationsEnumProc);

    // Select current location
    userGeoID = GetUserGeoID(GEOCLASS_NATION);
    GetGeoInfo(userGeoID,
               GEO_FRIENDLYNAME,
               loc,
               MAX_FMT_SIZE,
               LANG_SYSTEM_DEFAULT);

    SendMessageW(hGeoList,
                 CB_SELECTSTRING,
                 (WPARAM) -1,
                 (LPARAM)loc);
}

/* Locale enumerate procedure */
BOOL
CALLBACK
LocalesEnumProc(LPTSTR lpLocale)
{
    LCID lcid;
    TCHAR lang[MAX_STR_SIZE];
    int index;

    lcid = wcstoul(lpLocale, NULL, 16);

    GetLocaleInfo(lcid, LOCALE_SLANGUAGE, lang, sizeof(lang));
    index = (int) SendMessageW(hLocaleList,
                         CB_ADDSTRING,
                         0,
                         (LPARAM)lang);

    SendMessageW(hLocaleList,
                 CB_SETITEMDATA,
                 (WPARAM) index,
                 (LPARAM)lcid);

    return TRUE;
}

/* Enumerate all installed locale identifiers */
static
VOID
CreateLanguagesList(HWND hWnd)
{
    TCHAR langSel[MAX_STR_SIZE];

    hLocaleList = hWnd;

    EnumSystemLocalesW(LocalesEnumProc, LCID_INSTALLED);

    // Select current locale
    GetLocaleInfo(GetUserDefaultLCID(),
                  LOCALE_SLANGUAGE,
                  langSel,
                  sizeof(langSel));

    SendMessageW(hLocaleList,
                 CB_SELECTSTRING,
                 (WPARAM) -1,
                 (LPARAM)langSel);
}


/* Update all locale samples */
static
VOID
UpdateLocaleSample(HWND hwndDlg, LCID lcidLocale)
{
    WCHAR OutBuffer[MAX_FMT_SIZE];

    /* Get number format sample */
    GetNumberFormatW(lcidLocale, NO_FLAG, SAMPLE_NUMBER, NULL, OutBuffer,
        MAX_FMT_SIZE);
    SendMessageW(GetDlgItem(hwndDlg, IDC_NUMSAMPLE_EDIT),
                 WM_SETTEXT, 0, (LPARAM)OutBuffer);

    /* Get monetary format sample */
    GetCurrencyFormatW(lcidLocale, LOCALE_USE_CP_ACP, SAMPLE_NUMBER, NULL,
        OutBuffer, MAX_FMT_SIZE);
    SendMessageW(GetDlgItem(hwndDlg, IDC_MONEYSAMPLE_EDIT),
                 WM_SETTEXT, 0, (LPARAM)OutBuffer);

    /* Get time format sample */
    GetTimeFormatW(lcidLocale, NO_FLAG, NULL, NULL, OutBuffer, MAX_FMT_SIZE);
    SendMessageW(GetDlgItem(hwndDlg, IDC_TIMESAMPLE_EDIT),
        WM_SETTEXT,
        0,
        (LPARAM)OutBuffer);

    /* Get short date format sample */
    GetDateFormatW(lcidLocale, DATE_SHORTDATE, NULL, NULL, OutBuffer,
        MAX_FMT_SIZE);
    SendMessageW(GetDlgItem(hwndDlg, IDC_SHORTTIMESAMPLE_EDIT), WM_SETTEXT,
        0, (LPARAM)OutBuffer);

    /* Get long date sample */
    GetDateFormatW(lcidLocale, DATE_LONGDATE, NULL, NULL, OutBuffer,
        MAX_FMT_SIZE);
    SendMessageW(GetDlgItem(hwndDlg, IDC_FULLTIMESAMPLE_EDIT),
        WM_SETTEXT, 0, (LPARAM)OutBuffer);
}

/* Setting up new locale */
static
VOID
SetNewLocale(LCID LcidLocale)
{
    int RetCode;
    TCHAR OutBuff[MAX_STR_SIZE];
    int LocaleCounter;
    HKEY LocaleKey;
    TCHAR Value[9];
    DWORD ValueSize;

    //SetUserDefaultLCID(LcidLocale); // Not implemented in MS :(

    if(!IsValidLocale(LcidLocale, LCID_INSTALLED)) 
    {
        MessageBoxW(NULL, L"Invalid locale.", L"Critical error",
            MB_OK | MB_ICONERROR);
        return;
    }

    //HACKHACK: I'm sure there is a better way to do this
    for(LocaleCounter = LOCALE_ILANGUAGE;
        LocaleCounter <= LOCALE_SISO3166CTRYNAME; LocaleCounter++)
    {
        RetCode = GetLocaleInfoW(LcidLocale,
                                 (LCTYPE)LocaleCounter,
                                 OutBuff,
                                 sizeof(OutBuff));
        if(RetCode == ERROR_INVALID_PARAMETER)
            continue;
        SetLocaleInfoW(LOCALE_USER_DEFAULT, (LCTYPE)LocaleCounter, OutBuff);
    }

    RetCode = RegOpenKeyW(HKEY_CURRENT_USER,
                          L"Control Panel\\International",
                          &LocaleKey);

    if(RetCode != ERROR_SUCCESS)
    {
        MessageBoxW(NULL,
                    L"Problem opening HKCU\\Control Panel\\International key",
                    L"Critical error", MB_OK | MB_ICONERROR);
        return;
    }

    wsprintf(Value, L"%04X", (DWORD)LcidLocale);
    ValueSize = (DWORD) (wcslen(Value) + 1) * sizeof(WCHAR);

    RegSetValueExW(LocaleKey, L"Locale", 0, REG_SZ, (BYTE *)Value, ValueSize);
    RegCloseKey(LocaleKey);
}

/* Regional Parameters page dialog callback */
INT_PTR
CALLBACK
RegOptsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    int CurrSel;
    LCID NewLCID;
    GEOID NewLocation;

    switch(uMsg)
    {
        case WM_INITDIALOG:
            CreateLocationsList(GetDlgItem(hwndDlg, IDC_LOCATION_COMBO));
            CreateLanguagesList(GetDlgItem(hwndDlg, IDC_SETREG_COMBO));
            /* Update locale samples */
            UpdateLocaleSample(hwndDlg, LOCALE_USER_DEFAULT);
        break;

        case WM_COMMAND:
            switch (LOWORD(wParam))
            {
                case IDC_SETUP_BUTTON:
                        // setup button code...
                        MessageBox(NULL, L"Not implemented yet", L"Info",
                            MB_OK | MB_ICONINFORMATION);
                break;

                /* If selected other locale */
                case IDC_SETREG_COMBO:
                    if (HIWORD(wParam) == CBN_SELCHANGE ||
                        HIWORD(wParam) == CBN_EDITCHANGE)
                    {
                        CurrSel = (int) SendMessageW((HWND)lParam, CB_GETCURSEL,
                            0, 0);
                        NewLCID = (LCID) SendMessageW((HWND)lParam, CB_GETITEMDATA,
                            CurrSel, 0);
                        UpdateLocaleSample(hwndDlg,
                                           MAKELCID(NewLCID, SORT_DEFAULT));
                        PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
                    }
                break;

                case IDC_LOCATION_COMBO:
                    if (HIWORD(wParam) == CBN_SELCHANGE ||
                        HIWORD(wParam) == CBN_EDITCHANGE)
                    {
                        PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
                    }
                break;
            }
        break;

        case WM_NOTIFY:
        {
            LPNMHDR lpnm = (LPNMHDR)lParam;
            /* If push apply button */
            if (lpnm->code == (UINT)PSN_APPLY)
            {
                /* Set locale */
                CurrSel = (int) SendMessageW(GetDlgItem(hwndDlg, IDC_SETREG_COMBO),
                    CB_GETCURSEL, 0, 0);
                NewLCID = (LCID) SendMessageW(GetDlgItem(hwndDlg, IDC_SETREG_COMBO),
                    CB_GETITEMDATA, CurrSel, 0);
                if (NewLCID == (LCID)CB_ERR) break;

                SetNewLocale(MAKELCID(NewLCID, SORT_DEFAULT));

                /* Set geo location */
                CurrSel = (int) SendMessageW(GetDlgItem(hwndDlg, IDC_LOCATION_COMBO),
                               CB_GETCURSEL,
                               0,
                               0);
                NewLocation = (GEOID) SendMessageW(GetDlgItem(hwndDlg, IDC_LOCATION_COMBO),
                              CB_GETITEMDATA,
                              CurrSel,
                              0);
                SetUserGeoID(NewLocation);
            }
        }
        break;
    }
    return FALSE;
}

/* EOF */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -