1
-----------------------------------------------------------------------------
3
-- Module : System.Win32.NLS
4
-- Copyright : (c) Alastair Reid, 1997-2003
5
-- License : BSD-style (see the file libraries/base/LICENSE)
7
-- Maintainer : Esa Ilari Vuokko <ei@vuokko.info>
8
-- Stability : provisional
9
-- Portability : portable
11
-- A collection of FFI declarations for interfacing with Win32.
13
-----------------------------------------------------------------------------
15
module System.Win32.NLS (
16
module System.Win32.NLS,
18
-- defined in System.Win32.Types
19
LCID, LANGID, SortID, SubLANGID, PrimaryLANGID,
20
mAKELCID, lANGIDFROMLCID, sORTIDFROMLCID,
21
mAKELANGID, pRIMARYLANGID, sUBLANGID
24
import System.Win32.Types
31
#include "win32debug.h"
34
, lOCALE_SYSTEM_DEFAULT = LOCALE_SYSTEM_DEFAULT
35
, lOCALE_USER_DEFAULT = LOCALE_USER_DEFAULT
36
, lOCALE_NEUTRAL = LOCALE_NEUTRAL
39
foreign import stdcall unsafe "windows.h ConvertDefaultLocale"
40
convertDefaultLocale :: LCID -> IO LCID
42
-- ToDo: various enum functions.
52
foreign import stdcall unsafe "windows.h GetACP"
55
foreign import stdcall unsafe "windows.h SetThreadLocale"
56
setThreadLocale :: LCID -> IO ()
61
, lOCALE_ICALENDARTYPE = LOCALE_ICALENDARTYPE
62
, lOCALE_SDATE = LOCALE_SDATE
63
, lOCALE_ICURRDIGITS = LOCALE_ICURRDIGITS
64
, lOCALE_SDECIMAL = LOCALE_SDECIMAL
65
, lOCALE_ICURRENCY = LOCALE_ICURRENCY
66
, lOCALE_SGROUPING = LOCALE_SGROUPING
67
, lOCALE_IDIGITS = LOCALE_IDIGITS
68
, lOCALE_SLIST = LOCALE_SLIST
69
, lOCALE_IFIRSTDAYOFWEEK = LOCALE_IFIRSTDAYOFWEEK
70
, lOCALE_SLONGDATE = LOCALE_SLONGDATE
71
, lOCALE_IFIRSTWEEKOFYEAR = LOCALE_IFIRSTWEEKOFYEAR
72
, lOCALE_SMONDECIMALSEP = LOCALE_SMONDECIMALSEP
73
, lOCALE_ILZERO = LOCALE_ILZERO
74
, lOCALE_SMONGROUPING = LOCALE_SMONGROUPING
75
, lOCALE_IMEASURE = LOCALE_IMEASURE
76
, lOCALE_SMONTHOUSANDSEP = LOCALE_SMONTHOUSANDSEP
77
, lOCALE_INEGCURR = LOCALE_INEGCURR
78
, lOCALE_SNEGATIVESIGN = LOCALE_SNEGATIVESIGN
79
, lOCALE_INEGNUMBER = LOCALE_INEGNUMBER
80
, lOCALE_SPOSITIVESIGN = LOCALE_SPOSITIVESIGN
81
, lOCALE_SSHORTDATE = LOCALE_SSHORTDATE
82
, lOCALE_ITIME = LOCALE_ITIME
83
, lOCALE_STHOUSAND = LOCALE_STHOUSAND
84
, lOCALE_S1159 = LOCALE_S1159
85
, lOCALE_STIME = LOCALE_STIME
86
, lOCALE_S2359 = LOCALE_S2359
87
, lOCALE_STIMEFORMAT = LOCALE_STIMEFORMAT
88
, lOCALE_SCURRENCY = LOCALE_SCURRENCY
91
setLocaleInfo :: LCID -> LCTYPE -> String -> IO ()
92
setLocaleInfo locale ty info =
93
withTString info $ \ c_info ->
94
failIfFalse_ "SetLocaleInfo" $ c_SetLocaleInfo locale ty c_info
95
foreign import stdcall unsafe "windows.h SetLocaleInfoW"
96
c_SetLocaleInfo :: LCID -> LCTYPE -> LPCTSTR -> IO Bool
98
type LCMapFlags = DWORD
101
, lCMAP_BYTEREV = LCMAP_BYTEREV
102
, lCMAP_FULLWIDTH = LCMAP_FULLWIDTH
103
, lCMAP_HALFWIDTH = LCMAP_HALFWIDTH
104
, lCMAP_HIRAGANA = LCMAP_HIRAGANA
105
, lCMAP_KATAKANA = LCMAP_KATAKANA
106
, lCMAP_LOWERCASE = LCMAP_LOWERCASE
107
, lCMAP_SORTKEY = LCMAP_SORTKEY
108
, lCMAP_UPPERCASE = LCMAP_UPPERCASE
109
, nORM_IGNORECASE = NORM_IGNORECASE
110
, nORM_IGNORENONSPACE = NORM_IGNORENONSPACE
111
, nORM_IGNOREKANATYPE = NORM_IGNOREKANATYPE
112
, nORM_IGNORESYMBOLS = NORM_IGNORESYMBOLS
113
, nORM_IGNOREWIDTH = NORM_IGNOREWIDTH
114
, sORT_STRINGSORT = SORT_STRINGSORT
115
, lCMAP_LINGUISTIC_CASING = LCMAP_LINGUISTIC_CASING
116
, lCMAP_SIMPLIFIED_CHINESE = LCMAP_SIMPLIFIED_CHINESE
117
, lCMAP_TRADITIONAL_CHINESE = LCMAP_TRADITIONAL_CHINESE
120
lCMapString :: LCID -> LCMapFlags -> String -> Int -> IO String
121
lCMapString locale flags src dest_size =
122
withTStringLen src $ \ (c_src, src_len) ->
123
allocaArray dest_size $ \ c_dest -> do
124
_ <- failIfZero "LCMapString" $
125
c_LCMapString locale flags c_src src_len c_dest dest_size
127
foreign import stdcall unsafe "windows.h LCMapStringW"
128
c_LCMapString :: LCID -> LCMapFlags -> LPCTSTR -> Int -> LPCTSTR -> Int -> IO Int
130
type LocaleTestFlags = DWORD
132
#{enum LocaleTestFlags,
133
, lCID_INSTALLED = LCID_INSTALLED
134
, lCID_SUPPORTED = LCID_SUPPORTED
137
foreign import stdcall unsafe "windows.h IsValidLocale"
138
isValidLocale :: LCID -> LocaleTestFlags -> IO Bool
140
foreign import stdcall unsafe "windows.h IsValidCodePage"
141
isValidCodePage :: CodePage -> IO Bool
143
foreign import stdcall unsafe "windows.h GetUserDefaultLCID"
144
getUserDefaultLCID :: LCID
146
foreign import stdcall unsafe "windows.h GetUserDefaultLangID"
147
getUserDefaultLangID :: LANGID
149
foreign import stdcall unsafe "windows.h GetThreadLocale"
150
getThreadLocale :: IO LCID
152
foreign import stdcall unsafe "windows.h GetSystemDefaultLCID"
153
getSystemDefaultLCID :: LCID
155
foreign import stdcall unsafe "windows.h GetSystemDefaultLangID"
156
getSystemDefaultLangID :: LANGID
158
foreign import stdcall unsafe "windows.h GetOEMCP"
161
#{enum PrimaryLANGID,
162
, lANG_NEUTRAL = LANG_NEUTRAL
163
, lANG_BULGARIAN = LANG_BULGARIAN
164
, lANG_CHINESE = LANG_CHINESE
165
, lANG_CZECH = LANG_CZECH
166
, lANG_DANISH = LANG_DANISH
167
, lANG_GERMAN = LANG_GERMAN
168
, lANG_GREEK = LANG_GREEK
169
, lANG_ENGLISH = LANG_ENGLISH
170
, lANG_SPANISH = LANG_SPANISH
171
, lANG_FINNISH = LANG_FINNISH
172
, lANG_FRENCH = LANG_FRENCH
173
, lANG_HUNGARIAN = LANG_HUNGARIAN
174
, lANG_ICELANDIC = LANG_ICELANDIC
175
, lANG_ITALIAN = LANG_ITALIAN
176
, lANG_JAPANESE = LANG_JAPANESE
177
, lANG_KOREAN = LANG_KOREAN
178
, lANG_DUTCH = LANG_DUTCH
179
, lANG_NORWEGIAN = LANG_NORWEGIAN
180
, lANG_POLISH = LANG_POLISH
181
, lANG_PORTUGUESE = LANG_PORTUGUESE
182
, lANG_ROMANIAN = LANG_ROMANIAN
183
, lANG_RUSSIAN = LANG_RUSSIAN
184
, lANG_CROATIAN = LANG_CROATIAN
185
, lANG_SLOVAK = LANG_SLOVAK
186
, lANG_SWEDISH = LANG_SWEDISH
187
, lANG_TURKISH = LANG_TURKISH
188
, lANG_SLOVENIAN = LANG_SLOVENIAN
189
, lANG_ARABIC = LANG_ARABIC
190
, lANG_CATALAN = LANG_CATALAN
191
, lANG_HEBREW = LANG_HEBREW
192
, lANG_SERBIAN = LANG_SERBIAN
193
, lANG_ALBANIAN = LANG_ALBANIAN
194
, lANG_THAI = LANG_THAI
195
, lANG_URDU = LANG_URDU
196
, lANG_INDONESIAN = LANG_INDONESIAN
197
, lANG_BELARUSIAN = LANG_BELARUSIAN
198
, lANG_ESTONIAN = LANG_ESTONIAN
199
, lANG_LATVIAN = LANG_LATVIAN
200
, lANG_LITHUANIAN = LANG_LITHUANIAN
201
, lANG_FARSI = LANG_FARSI
202
, lANG_VIETNAMESE = LANG_VIETNAMESE
203
, lANG_ARMENIAN = LANG_ARMENIAN
204
, lANG_AZERI = LANG_AZERI
205
, lANG_BASQUE = LANG_BASQUE
206
, lANG_MACEDONIAN = LANG_MACEDONIAN
207
, lANG_AFRIKAANS = LANG_AFRIKAANS
208
, lANG_GEORGIAN = LANG_GEORGIAN
209
, lANG_FAEROESE = LANG_FAEROESE
210
, lANG_HINDI = LANG_HINDI
211
, lANG_MALAY = LANG_MALAY
212
, lANG_KAZAK = LANG_KAZAK
213
, lANG_SWAHILI = LANG_SWAHILI
214
, lANG_UZBEK = LANG_UZBEK
215
, lANG_TATAR = LANG_TATAR
216
, lANG_BENGALI = LANG_BENGALI
217
, lANG_PUNJABI = LANG_PUNJABI
218
, lANG_GUJARATI = LANG_GUJARATI
219
, lANG_ORIYA = LANG_ORIYA
220
, lANG_TAMIL = LANG_TAMIL
221
, lANG_TELUGU = LANG_TELUGU
222
, lANG_KANNADA = LANG_KANNADA
223
, lANG_MALAYALAM = LANG_MALAYALAM
224
, lANG_ASSAMESE = LANG_ASSAMESE
225
, lANG_MARATHI = LANG_MARATHI
226
, lANG_SANSKRIT = LANG_SANSKRIT
227
, lANG_KONKANI = LANG_KONKANI
228
, lANG_MANIPURI = LANG_MANIPURI
229
, lANG_SINDHI = LANG_SINDHI
230
, lANG_KASHMIRI = LANG_KASHMIRI
231
, lANG_NEPALI = LANG_NEPALI
235
, sORT_DEFAULT = SORT_DEFAULT
236
, sORT_JAPANESE_XJIS = SORT_JAPANESE_XJIS
237
, sORT_JAPANESE_UNICODE = SORT_JAPANESE_UNICODE
238
, sORT_CHINESE_BIG5 = SORT_CHINESE_BIG5
239
, sORT_CHINESE_UNICODE = SORT_CHINESE_UNICODE
240
, sORT_KOREAN_KSC = SORT_KOREAN_KSC
241
, sORT_KOREAN_UNICODE = SORT_KOREAN_UNICODE
245
, sUBLANG_NEUTRAL = SUBLANG_NEUTRAL
246
, sUBLANG_DEFAULT = SUBLANG_DEFAULT
247
, sUBLANG_SYS_DEFAULT = SUBLANG_SYS_DEFAULT
248
, sUBLANG_CHINESE_TRADITIONAL = SUBLANG_CHINESE_TRADITIONAL
249
, sUBLANG_CHINESE_SIMPLIFIED = SUBLANG_CHINESE_SIMPLIFIED
250
, sUBLANG_CHINESE_HONGKONG = SUBLANG_CHINESE_HONGKONG
251
, sUBLANG_CHINESE_SINGAPORE = SUBLANG_CHINESE_SINGAPORE
252
, sUBLANG_DUTCH = SUBLANG_DUTCH
253
, sUBLANG_DUTCH_BELGIAN = SUBLANG_DUTCH_BELGIAN
254
, sUBLANG_ENGLISH_US = SUBLANG_ENGLISH_US
255
, sUBLANG_ENGLISH_UK = SUBLANG_ENGLISH_UK
256
, sUBLANG_ENGLISH_AUS = SUBLANG_ENGLISH_AUS
257
, sUBLANG_ENGLISH_CAN = SUBLANG_ENGLISH_CAN
258
, sUBLANG_ENGLISH_NZ = SUBLANG_ENGLISH_NZ
259
, sUBLANG_ENGLISH_EIRE = SUBLANG_ENGLISH_EIRE
260
, sUBLANG_FRENCH = SUBLANG_FRENCH
261
, sUBLANG_FRENCH_BELGIAN = SUBLANG_FRENCH_BELGIAN
262
, sUBLANG_FRENCH_CANADIAN = SUBLANG_FRENCH_CANADIAN
263
, sUBLANG_FRENCH_SWISS = SUBLANG_FRENCH_SWISS
264
, sUBLANG_GERMAN = SUBLANG_GERMAN
265
, sUBLANG_GERMAN_SWISS = SUBLANG_GERMAN_SWISS
266
, sUBLANG_GERMAN_AUSTRIAN = SUBLANG_GERMAN_AUSTRIAN
267
, sUBLANG_ITALIAN = SUBLANG_ITALIAN
268
, sUBLANG_ITALIAN_SWISS = SUBLANG_ITALIAN_SWISS
269
, sUBLANG_NORWEGIAN_BOKMAL = SUBLANG_NORWEGIAN_BOKMAL
270
, sUBLANG_NORWEGIAN_NYNORSK = SUBLANG_NORWEGIAN_NYNORSK
271
, sUBLANG_PORTUGUESE = SUBLANG_PORTUGUESE
272
, sUBLANG_PORTUGUESE_BRAZILIAN = SUBLANG_PORTUGUESE_BRAZILIAN
273
, sUBLANG_SPANISH = SUBLANG_SPANISH
274
, sUBLANG_SPANISH_MEXICAN = SUBLANG_SPANISH_MEXICAN
275
, sUBLANG_SPANISH_MODERN = SUBLANG_SPANISH_MODERN
276
, sUBLANG_ARABIC_SAUDI_ARABIA = SUBLANG_ARABIC_SAUDI_ARABIA
277
, sUBLANG_ARABIC_IRAQ = SUBLANG_ARABIC_IRAQ
278
, sUBLANG_ARABIC_EGYPT = SUBLANG_ARABIC_EGYPT
279
, sUBLANG_ARABIC_LIBYA = SUBLANG_ARABIC_LIBYA
280
, sUBLANG_ARABIC_ALGERIA = SUBLANG_ARABIC_ALGERIA
281
, sUBLANG_ARABIC_MOROCCO = SUBLANG_ARABIC_MOROCCO
282
, sUBLANG_ARABIC_TUNISIA = SUBLANG_ARABIC_TUNISIA
283
, sUBLANG_ARABIC_OMAN = SUBLANG_ARABIC_OMAN
284
, sUBLANG_ARABIC_YEMEN = SUBLANG_ARABIC_YEMEN
285
, sUBLANG_ARABIC_SYRIA = SUBLANG_ARABIC_SYRIA
286
, sUBLANG_ARABIC_JORDAN = SUBLANG_ARABIC_JORDAN
287
, sUBLANG_ARABIC_LEBANON = SUBLANG_ARABIC_LEBANON
288
, sUBLANG_ARABIC_KUWAIT = SUBLANG_ARABIC_KUWAIT
289
, sUBLANG_ARABIC_UAE = SUBLANG_ARABIC_UAE
290
, sUBLANG_ARABIC_BAHRAIN = SUBLANG_ARABIC_BAHRAIN
291
, sUBLANG_ARABIC_QATAR = SUBLANG_ARABIC_QATAR
292
, sUBLANG_AZERI_CYRILLIC = SUBLANG_AZERI_CYRILLIC
293
, sUBLANG_AZERI_LATIN = SUBLANG_AZERI_LATIN
294
, sUBLANG_CHINESE_MACAU = SUBLANG_CHINESE_MACAU
295
, sUBLANG_ENGLISH_SOUTH_AFRICA = SUBLANG_ENGLISH_SOUTH_AFRICA
296
, sUBLANG_ENGLISH_JAMAICA = SUBLANG_ENGLISH_JAMAICA
297
, sUBLANG_ENGLISH_CARIBBEAN = SUBLANG_ENGLISH_CARIBBEAN
298
, sUBLANG_ENGLISH_BELIZE = SUBLANG_ENGLISH_BELIZE
299
, sUBLANG_ENGLISH_TRINIDAD = SUBLANG_ENGLISH_TRINIDAD
300
, sUBLANG_ENGLISH_PHILIPPINES = SUBLANG_ENGLISH_PHILIPPINES
301
, sUBLANG_ENGLISH_ZIMBABWE = SUBLANG_ENGLISH_ZIMBABWE
302
, sUBLANG_FRENCH_LUXEMBOURG = SUBLANG_FRENCH_LUXEMBOURG
303
, sUBLANG_FRENCH_MONACO = SUBLANG_FRENCH_MONACO
304
, sUBLANG_GERMAN_LUXEMBOURG = SUBLANG_GERMAN_LUXEMBOURG
305
, sUBLANG_GERMAN_LIECHTENSTEIN = SUBLANG_GERMAN_LIECHTENSTEIN
306
, sUBLANG_KASHMIRI_INDIA = SUBLANG_KASHMIRI_INDIA
307
, sUBLANG_KOREAN = SUBLANG_KOREAN
308
, sUBLANG_LITHUANIAN = SUBLANG_LITHUANIAN
309
, sUBLANG_MALAY_MALAYSIA = SUBLANG_MALAY_MALAYSIA
310
, sUBLANG_MALAY_BRUNEI_DARUSSALAM = SUBLANG_MALAY_BRUNEI_DARUSSALAM
311
, sUBLANG_NEPALI_INDIA = SUBLANG_NEPALI_INDIA
312
, sUBLANG_SERBIAN_LATIN = SUBLANG_SERBIAN_LATIN
313
, sUBLANG_SERBIAN_CYRILLIC = SUBLANG_SERBIAN_CYRILLIC
314
, sUBLANG_SPANISH_GUATEMALA = SUBLANG_SPANISH_GUATEMALA
315
, sUBLANG_SPANISH_COSTA_RICA = SUBLANG_SPANISH_COSTA_RICA
316
, sUBLANG_SPANISH_PANAMA = SUBLANG_SPANISH_PANAMA
317
, sUBLANG_SPANISH_DOMINICAN_REPUBLIC = SUBLANG_SPANISH_DOMINICAN_REPUBLIC
318
, sUBLANG_SPANISH_VENEZUELA = SUBLANG_SPANISH_VENEZUELA
319
, sUBLANG_SPANISH_COLOMBIA = SUBLANG_SPANISH_COLOMBIA
320
, sUBLANG_SPANISH_PERU = SUBLANG_SPANISH_PERU
321
, sUBLANG_SPANISH_ARGENTINA = SUBLANG_SPANISH_ARGENTINA
322
, sUBLANG_SPANISH_ECUADOR = SUBLANG_SPANISH_ECUADOR
323
, sUBLANG_SPANISH_CHILE = SUBLANG_SPANISH_CHILE
324
, sUBLANG_SPANISH_URUGUAY = SUBLANG_SPANISH_URUGUAY
325
, sUBLANG_SPANISH_PARAGUAY = SUBLANG_SPANISH_PARAGUAY
326
, sUBLANG_SPANISH_BOLIVIA = SUBLANG_SPANISH_BOLIVIA
327
, sUBLANG_SPANISH_EL_SALVADOR = SUBLANG_SPANISH_EL_SALVADOR
328
, sUBLANG_SPANISH_HONDURAS = SUBLANG_SPANISH_HONDURAS
329
, sUBLANG_SPANISH_NICARAGUA = SUBLANG_SPANISH_NICARAGUA
330
, sUBLANG_SPANISH_PUERTO_RICO = SUBLANG_SPANISH_PUERTO_RICO
331
, sUBLANG_SWEDISH = SUBLANG_SWEDISH
332
, sUBLANG_SWEDISH_FINLAND = SUBLANG_SWEDISH_FINLAND
333
, sUBLANG_URDU_PAKISTAN = SUBLANG_URDU_PAKISTAN
334
, sUBLANG_URDU_INDIA = SUBLANG_URDU_INDIA
335
, sUBLANG_UZBEK_LATIN = SUBLANG_UZBEK_LATIN
336
, sUBLANG_UZBEK_CYRILLIC = SUBLANG_UZBEK_CYRILLIC
339
-- , SUBLANG_LITHUANIAN_CLASSIC (not in mingw-20001111)
341
-- ----------------------------------------------------------------------------
343
-- | The `System.IO` input functions (e.g. `getLine`) don't
344
-- automatically convert to Unicode, so this function is provided to
345
-- make the conversion from a multibyte string in the given code page
346
-- to a proper Unicode string. To get the code page for the console,
347
-- use `getConsoleCP`.
349
stringToUnicode :: CodePage -> String -> IO String
350
stringToUnicode _cp "" = return ""
351
-- MultiByteToWideChar doesn't handle empty strings (#1929)
352
stringToUnicode cp mbstr =
353
withCStringLen mbstr $ \(cstr,len) -> do
354
wchars <- failIfZero "MultiByteToWideChar" $ multiByteToWideChar
360
-- wchars is the length of buffer required
361
allocaArray (fromIntegral wchars) $ \cwstr -> do
362
wchars <- failIfZero "MultiByteToWideChar" $ multiByteToWideChar
368
peekCWStringLen (cwstr,fromIntegral wchars) -- converts UTF-16 to [Char]
370
foreign import stdcall unsafe "MultiByteToWideChar"
374
-> LPCSTR -- lpMultiByteStr
375
-> CInt -- cbMultiByte
376
-> LPWSTR -- lpWideCharStr
377
-> CInt -- cchWideChar