* add combobox (select language/region)
authorKlemens Friedl <frik85@gmail.com>
Sat, 12 Mar 2005 19:46:27 +0000 (19:46 +0000)
committerKlemens Friedl <frik85@gmail.com>
Sat, 12 Mar 2005 19:46:27 +0000 (19:46 +0000)
* german & english resource files

svn path=/trunk/; revision=13976

reactos/lib/cpl/intl/de.rc [new file with mode: 0644]
reactos/lib/cpl/intl/en.rc [new file with mode: 0644]
reactos/lib/cpl/intl/intl.rc
reactos/lib/cpl/intl/locale.c

diff --git a/reactos/lib/cpl/intl/de.rc b/reactos/lib/cpl/intl/de.rc
new file mode 100644 (file)
index 0000000..5168f02
--- /dev/null
@@ -0,0 +1,66 @@
+/* $Id: intl.rc 12852 2005-01-06 13:58:04Z mf $ */\r
+\r
+LANGUAGE LANG_GERMAN, SUBLANG_DEFAULT\r
+\r
+IDD_GENERALPAGE DIALOGEX 0, 0, 246, 228\r
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r
+CAPTION "Allgemein"\r
+FONT 8, "MS Shell Dlg"\r
+BEGIN\r
+  LTEXT "Property Page 1",-1,73,74,90,8\r
+END\r
+\r
+\r
+IDD_NUMBERSPAGE DIALOGEX 0, 0, 246, 228\r
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r
+CAPTION "Zahlen"\r
+FONT 8, "MS Shell Dlg"\r
+BEGIN\r
+  LTEXT "Property Page 2",-1,73,74,90,8\r
+END\r
+\r
+\r
+IDD_CURRENCYPAGE DIALOGEX 0, 0, 246, 228\r
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r
+CAPTION "Währung"\r
+FONT 8, "MS Shell Dlg"\r
+BEGIN\r
+  LTEXT "Property Page 3",-1,73,74,90,8\r
+END\r
+\r
+\r
+IDD_TIMEPAGE DIALOGEX 0, 0, 246, 228\r
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r
+CAPTION "Uhrzeit"\r
+FONT 8, "MS Shell Dlg"\r
+BEGIN\r
+  LTEXT "Property Page 4",-1,73,74,90,8\r
+END\r
+\r
+\r
+IDD_DATEPAGE DIALOGEX 0, 0, 246, 228\r
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r
+CAPTION "Datum"\r
+FONT 8, "MS Shell Dlg"\r
+BEGIN\r
+  LTEXT "Property Page 5",-1,73,74,90,8\r
+END\r
+\r
+\r
+IDD_LOCALEPAGE DIALOGEX 0, 0, 246, 228\r
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r
+CAPTION "Regionale Einstellungen"\r
+FONT 8, "MS Shell Dlg"\r
+BEGIN\r
+  GROUPBOX "Standardsprache", -1, 8, 11, 228, 74 \r
+  ICON IDC_FLAGS, IDC_ICON1, 12, 26, 21, 20, SS_ICON\r
+  LTEXT "Wählen Sie eine Sprache und Region aus welche Sie benutzen wollen:", -1, 38, 25, 193, 22\r
+  COMBOBOX IDC_LANGUAGELIST, 39, 49, 191, 83, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP\r
+END\r
+\r
+\r
+STRINGTABLE\r
+BEGIN\r
+  IDS_CPLNAME "Regionale Einstellungen"\r
+  IDS_CPLDESCRIPTION "Wählen Sie Anzeigeeinstellungen für Sprache, Zahlen, Währung, Uhrzeit und Datum aus."\r
+END\r
diff --git a/reactos/lib/cpl/intl/en.rc b/reactos/lib/cpl/intl/en.rc
new file mode 100644 (file)
index 0000000..fd579b6
--- /dev/null
@@ -0,0 +1,66 @@
+/* $Id: intl.rc 12852 2005-01-06 13:58:04Z mf $ */\r
+\r
+LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT\r
+\r
+IDD_GENERALPAGE DIALOGEX 0, 0, 246, 228\r
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r
+CAPTION "General"\r
+FONT 8, "MS Shell Dlg"\r
+BEGIN\r
+  LTEXT "Property Page 1",-1,73,74,90,8\r
+END\r
+\r
+\r
+IDD_NUMBERSPAGE DIALOGEX 0, 0, 246, 228\r
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r
+CAPTION "Numbers"\r
+FONT 8, "MS Shell Dlg"\r
+BEGIN\r
+  LTEXT "Property Page 2",-1,73,74,90,8\r
+END\r
+\r
+\r
+IDD_CURRENCYPAGE DIALOGEX 0, 0, 246, 228\r
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r
+CAPTION "Currency"\r
+FONT 8, "MS Shell Dlg"\r
+BEGIN\r
+  LTEXT "Property Page 3",-1,73,74,90,8\r
+END\r
+\r
+\r
+IDD_TIMEPAGE DIALOGEX 0, 0, 246, 228\r
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r
+CAPTION "Time"\r
+FONT 8, "MS Shell Dlg"\r
+BEGIN\r
+  LTEXT "Property Page 4",-1,73,74,90,8\r
+END\r
+\r
+\r
+IDD_DATEPAGE DIALOGEX 0, 0, 246, 228\r
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r
+CAPTION "Date"\r
+FONT 8, "MS Shell Dlg"\r
+BEGIN\r
+  LTEXT "Property Page 5",-1,73,74,90,8\r
+END\r
+\r
+\r
+IDD_LOCALEPAGE DIALOGEX 0, 0, 246, 228\r
+STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION\r
+CAPTION "Input Locale"\r
+FONT 8, "MS Shell Dlg"\r
+BEGIN\r
+  GROUPBOX "Primary language", -1, 8, 11, 228, 74 \r
+  ICON IDC_FLAGS, IDC_ICON1, 12, 26, 21, 20, SS_ICON\r
+  LTEXT "Select the primary language and region you want to use:", -1, 38, 25, 193, 22\r
+  COMBOBOX IDC_LANGUAGELIST, 39, 49, 191, 83, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP\r
+END\r
+\r
+\r
+STRINGTABLE\r
+BEGIN\r
+  IDS_CPLNAME "Regional Options"\r
+  IDS_CPLDESCRIPTION "Select languages and format numbers, currencies, times and date."\r
+END\r
index abd1173..6fe063b 100644 (file)
 
 
 IDC_CPLICON ICON "resources/applet.ico"
+IDC_FLAGS ICON "resources/flags.ico"
 
 
-LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
 
-IDD_GENERALPAGE DIALOGEX 0, 0, 246, 228
-STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "General"
-FONT 8, "MS Shell Dlg"
-BEGIN
-  LTEXT "Property Page 1",-1,73,74,90,8
-END
+/*
+ * Everything specific to any language goes in one of the specific
+ * files. Note that you can and may override resources which also have
+ * a neutral version. This is to get localized bitmaps for example.
+ */
 
+#include "en.rc"
+#include "de.rc"
 
-IDD_NUMBERSPAGE DIALOGEX 0, 0, 246, 228
-STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Numbers"
-FONT 8, "MS Shell Dlg"
-BEGIN
-  LTEXT "Property Page 2",-1,73,74,90,8
-END
-
-
-IDD_CURRENCYPAGE DIALOGEX 0, 0, 246, 228
-STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Currency"
-FONT 8, "MS Shell Dlg"
-BEGIN
-  LTEXT "Property Page 3",-1,73,74,90,8
-END
-
-
-IDD_TIMEPAGE DIALOGEX 0, 0, 246, 228
-STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Time"
-FONT 8, "MS Shell Dlg"
-BEGIN
-  LTEXT "Property Page 4",-1,73,74,90,8
-END
-
-
-IDD_DATEPAGE DIALOGEX 0, 0, 246, 228
-STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Date"
-FONT 8, "MS Shell Dlg"
-BEGIN
-  LTEXT "Property Page 5",-1,73,74,90,8
-END
-
-
-IDD_LOCALEPAGE DIALOGEX 0, 0, 246, 228
-STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Input Locale"
-FONT 8, "MS Shell Dlg"
-BEGIN
-  LTEXT "Property Page 6",-1,73,74,90,8
-END
-
-
-STRINGTABLE
-BEGIN
-  IDS_CPLNAME "Regional Options"
-  IDS_CPLDESCRIPTION "Select languages and format numbers, currencies, times and date."
-END
index a37b9ea..86eecea 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  ReactOS
- *  Copyright (C) 2004 ReactOS Team
+ *  Copyright (C) 2004, 2005 ReactOS Team
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -22,6 +22,7 @@
  * FILE:            lib/cpl/intl/locale.c
  * PURPOSE:         Locale property page
  * PROGRAMMER:      Eric Kohl
+ *                  Klemens Friedl
  */
 
 #include <windows.h>
 #include "resource.h"
 
 
+// FIXME:
+//        * change registry function (-> "HKCR\MIME\Database\Rfc1766")
+
+
+
+typedef struct _TZ_INFO
+{
+  LONG Bias;
+  LONG StandardBias;
+  LONG DaylightBias;
+  SYSTEMTIME StandardDate;
+  SYSTEMTIME DaylightDate;
+} TZ_INFO, *PTZ_INFO;
+
+typedef struct _TIMEZONE_ENTRY
+{
+  struct _TIMEZONE_ENTRY *Prev;
+  struct _TIMEZONE_ENTRY *Next;
+  WCHAR Description[64];   /* 'Display' */
+  WCHAR StandardName[32];  /* 'Std' */
+  WCHAR DaylightName[32];  /* 'Dlt' */
+  TZ_INFO TimezoneInfo;    /* 'TZI' */
+  ULONG Index;             /* 'Index' */
+} TIMEZONE_ENTRY, *PTIMEZONE_ENTRY;
+
+
+
+PTIMEZONE_ENTRY TimeZoneListHead = NULL;
+PTIMEZONE_ENTRY TimeZoneListTail = NULL;
+
+
+
+
+static PTIMEZONE_ENTRY
+GetLargerTimeZoneEntry(DWORD Index)
+{
+  PTIMEZONE_ENTRY Entry;
+
+  Entry = TimeZoneListHead;
+  while (Entry != NULL)
+    {
+      if (Entry->Index >= Index)
+       return Entry;
+
+      Entry = Entry->Next;
+    }
+
+  return NULL;
+}
+
+
+static VOID
+CreateTimeZoneList(VOID)
+{
+
+  WCHAR szKeyName[256];
+  DWORD dwIndex;
+  DWORD dwNameSize;
+  DWORD dwValueSize;
+  LONG lError;
+  HKEY hZonesKey;
+  HKEY hZoneKey;
+
+  PTIMEZONE_ENTRY Entry;
+  PTIMEZONE_ENTRY Current;
+
+
+
+  if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
+                   L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones",
+                   0,
+                   KEY_ALL_ACCESS,
+                   &hZonesKey))
+    return;
+
+  dwIndex = 0;
+  while (TRUE)
+    {
+      dwNameSize = 256;
+      lError = RegEnumKeyExW(hZonesKey,
+                            dwIndex,
+                            szKeyName,
+                            &dwNameSize,
+                            NULL,
+                            NULL,
+                            NULL,
+                            NULL);
+      if (lError != ERROR_SUCCESS && lError != ERROR_MORE_DATA)
+       break;
+
+
+      if (RegOpenKeyExW(hZonesKey,
+                       szKeyName,
+                       0,
+                       KEY_ALL_ACCESS,
+                       &hZoneKey))
+       break;
+
+
+      Entry = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(TIMEZONE_ENTRY));
+      if (Entry == NULL)
+       {
+         RegCloseKey(hZonesKey);
+         break;
+       }
+
+      dwValueSize = 64 * sizeof(WCHAR);
+      if (RegQueryValueExW(hZonesKey,
+                          L"Display",
+                          NULL,
+                          NULL,
+                          (LPBYTE)&Entry->Description,
+                          &dwValueSize))
+       {
+         RegCloseKey(hZonesKey);
+         break;
+       }
+
+      dwValueSize = 32 * sizeof(WCHAR);
+      if (RegQueryValueExW(hZonesKey,
+                          L"Std",
+                          NULL,
+                          NULL,
+                          (LPBYTE)&Entry->StandardName,
+                          &dwValueSize))
+       {
+         RegCloseKey(hZonesKey);
+         break;
+       }
+
+      dwValueSize = 32 * sizeof(WCHAR);
+      if (RegQueryValueExW(hZonesKey,
+                          L"Dlt",
+                          NULL,
+                          NULL,
+                          (LPBYTE)&Entry->DaylightName,
+                          &dwValueSize))
+       {
+         RegCloseKey(hZonesKey);
+         break;
+       }
+
+      dwValueSize = sizeof(DWORD);
+      if (RegQueryValueExW(hZonesKey,
+                          L"Index",
+                          NULL,
+                          NULL,
+                          (LPBYTE)&Entry->Index,
+                          &dwValueSize))
+       {
+         RegCloseKey(hZonesKey);
+         break;
+       }
+
+      dwValueSize = sizeof(TZ_INFO);
+      if (RegQueryValueExW(hZonesKey,
+                          L"TZI",
+                          NULL,
+                          NULL,
+                          (LPBYTE)&Entry->TimezoneInfo,
+                          &dwValueSize))
+       {
+         RegCloseKey(hZonesKey);
+         break;
+       }
+
+      RegCloseKey(hZoneKey);
+
+      if (TimeZoneListHead == NULL &&
+         TimeZoneListTail == NULL)
+       {
+         Entry->Prev = NULL;
+         Entry->Next = NULL;
+         TimeZoneListHead = Entry;
+         TimeZoneListTail = Entry;
+       }
+      else
+       {
+         Current = GetLargerTimeZoneEntry(Entry->Index);
+         if (Current != NULL)
+           {
+             if (Current == TimeZoneListHead)
+               {
+                 /* Prepend to head */
+                 Entry->Prev = NULL;
+                 Entry->Next = TimeZoneListHead;
+                 TimeZoneListHead->Prev = Entry;
+                 TimeZoneListHead = Entry;
+               }
+             else
+               {
+                 /* Insert before current */
+                 Entry->Prev = Current->Prev;
+                 Entry->Next = Current;
+                 Current->Prev->Next = Entry;
+                 Current->Prev = Entry;
+               }
+           }
+         else
+           {
+             /* Append to tail */
+             Entry->Prev = TimeZoneListTail;
+             Entry->Next = NULL;
+             TimeZoneListTail->Next = Entry;
+             TimeZoneListTail = Entry;
+           }
+       }
+
+      dwIndex++;
+    }
+
+  RegCloseKey(hZonesKey);
+
+}
+
+
+static VOID
+ShowTimeZoneList(HWND hwnd)
+{
+  TIME_ZONE_INFORMATION TimeZoneInfo;
+  PTIMEZONE_ENTRY Entry;
+  DWORD dwIndex;
+  DWORD i;
+
+  GetTimeZoneInformation(&TimeZoneInfo);
+
+  dwIndex = 0;
+  i = 0;
+  Entry = TimeZoneListHead;
+  while (Entry != NULL)
+    {
+      SendMessageW(hwnd,
+                  CB_ADDSTRING,
+                  0,
+                  (LPARAM)Entry->Description);
+
+      if (!wcscmp(Entry->StandardName, TimeZoneInfo.StandardName))
+       dwIndex = i;
+
+      i++;
+      Entry = Entry->Next;
+    }
+
+  SendMessageW(hwnd,
+              CB_SETCURSEL,
+              (WPARAM)dwIndex,
+              0);
+}
+
+
+
+
 /* Property page dialog callback */
 INT_PTR CALLBACK
 LocalePageProc(HWND hwndDlg,
@@ -42,9 +295,14 @@ LocalePageProc(HWND hwndDlg,
   switch(uMsg)
   {
     case WM_INITDIALOG:
+
+      CreateTimeZoneList();
+      ShowTimeZoneList(GetDlgItem(hwndDlg, IDC_LANGUAGELIST));
+
       break;
   }
   return FALSE;
 }
 
+
 /* EOF */