1234353Sdim(*
2193323Sed    Copyright (c) 2001, 2015
3193323Sed        David C.J. Matthews
4193323Sed
5193323Sed    This library is free software; you can redistribute it and/or
6193323Sed    modify it under the terms of the GNU Lesser General Public
7193323Sed    License version 2.1 as published by the Free Software Foundation.
8193323Sed    
9193323Sed    This library is distributed in the hope that it will be useful,
10193323Sed    but WITHOUT ANY WARRANTY; without even the implied warranty of
11193323Sed    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12193323Sed    Lesser General Public License for more details.
13193323Sed    
14193323Sed    You should have received a copy of the GNU Lesser General Public
15193323Sed    License along with this library; if not, write to the Free Software
16193323Sed    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17234353Sdim*)
18193323Sed
19193323Sedstructure LocaleBase =
20224145Sdimstruct
21224145Sdim    local
22224145Sdim        open Foreign Base
23193323Sed    in
24193323Sed        datatype PrimaryLanguage =
25193323Sed            LANG_AFRIKAANS | LANG_ICELANDIC | LANG_ALBANIAN | LANG_INDONESIAN 
26193323Sed          | LANG_ARABIC | LANG_ITALIAN  | LANG_BASQUE | LANG_JAPANESE 
27202878Srdivacky          | LANG_BELARUSIAN | LANG_KOREAN | LANG_BULGARIAN | LANG_LATVIAN 
28202878Srdivacky          | LANG_CATALAN | LANG_LITHUANIAN | LANG_CHINESE | LANG_NEUTRAL 
29202878Srdivacky          | LANG_CROATIAN | LANG_NORWEGIAN | LANG_CZECH | LANG_POLISH 
30202878Srdivacky          | LANG_DANISH | LANG_PORTUGUESE  | LANG_DUTCH | LANG_ROMANIAN 
31202878Srdivacky          | LANG_ENGLISH | LANG_RUSSIAN | LANG_ESTONIAN | LANG_SERBIAN 
32202878Srdivacky          | LANG_FAEROESE | LANG_SLOVAK | LANG_FARSI | LANG_SLOVENIAN 
33202878Srdivacky          | LANG_FINNISH | LANG_SPANISH | LANG_FRENCH | LANG_SWEDISH 
34202878Srdivacky          | LANG_GERMAN | LANG_THAI | LANG_GREEK | LANG_TURKISH 
35202878Srdivacky          | LANG_HEBREW | LANG_UKRANIAN | LANG_HUNGARIAN | LANG_VIETNAMESE
36202878Srdivacky
37202878Srdivacky        datatype SubLanguage =
38202878Srdivacky            SUBLANG_ARABIC_SAUDI_ARABIA | SUBLANG_GERMAN 
39202878Srdivacky         | SUBLANG_ARABIC_IRAQ | SUBLANG_GERMAN_SWISS 
40202878Srdivacky         | SUBLANG_ARABIC_EGYPT | SUBLANG_GERMAN_AUSTRIAN 
41202878Srdivacky         | SUBLANG_ARABIC_LIBYA | SUBLANG_GERMAN_LUXEMBOURG 
42202878Srdivacky         | SUBLANG_ARABIC_ALGERIA | SUBLANG_GERMAN_LIECHTENSTEIN 
43224145Sdim         | SUBLANG_ARABIC_MOROCCO | SUBLANG_ITALIAN 
44193323Sed         | SUBLANG_ARABIC_TUNISIA | SUBLANG_ITALIAN_SWISS 
45263508Sdim         | SUBLANG_ARABIC_OMAN | SUBLANG_KOREAN 
46193323Sed         | SUBLANG_ARABIC_YEMEN | SUBLANG_KOREAN_JOHAB 
47193323Sed         | SUBLANG_ARABIC_SYRIA | SUBLANG_NEUTRAL 
48193323Sed         | SUBLANG_ARABIC_JORDAN | SUBLANG_NORWEGIAN_BOKMAL 
49193323Sed         | SUBLANG_ARABIC_LEBANON | SUBLANG_NORWEGIAN_NYNORSK 
50193323Sed         | SUBLANG_ARABIC_KUWAIT | SUBLANG_PORTUGUESE 
51193323Sed         | SUBLANG_ARABIC_UAE | SUBLANG_PORTUGUESE_BRAZILIAN 
52193323Sed         | SUBLANG_ARABIC_BAHRAIN | SUBLANG_SERBIAN_LATIN 
53193323Sed         | SUBLANG_ARABIC_QATAR | SUBLANG_SERBIAN_CYRILLIC 
54193323Sed         | SUBLANG_CHINESE_TRADITIONAL | SUBLANG_SPANISH 
55210299Sed         | SUBLANG_CHINESE_SIMPLIFIED | SUBLANG_SPANISH_MEXICAN 
56210299Sed         | SUBLANG_CHINESE_HONGKONG | SUBLANG_SPANISH_MODERN 
57210299Sed         | SUBLANG_CHINESE_SINGAPORE | SUBLANG_SPANISH_GUATEMALA 
58210299Sed         | SUBLANG_DEFAULT | SUBLANG_SPANISH_COSTA_RICA 
59193323Sed         | SUBLANG_DUTCH | SUBLANG_SPANISH_PANAMA 
60193323Sed         | SUBLANG_DUTCH_BELGIAN | SUBLANG_SPANISH_DOMINICAN_REPUBLIC 
61193323Sed         | SUBLANG_ENGLISH_US | SUBLANG_SPANISH_VENEZUELA 
62193323Sed         | SUBLANG_ENGLISH_UK | SUBLANG_SPANISH_COLOMBIA 
63193323Sed         | SUBLANG_ENGLISH_AUS | SUBLANG_SPANISH_PERU 
64208599Srdivacky         | SUBLANG_ENGLISH_CAN | SUBLANG_SPANISH_ARGENTINA 
65208599Srdivacky         | SUBLANG_ENGLISH_NZ | SUBLANG_SPANISH_ECUADOR 
66193323Sed         | SUBLANG_ENGLISH_EIRE | SUBLANG_SPANISH_CHILE 
67193323Sed         | SUBLANG_ENGLISH_SOUTH_AFRICA | SUBLANG_SPANISH_URUGUAY 
68193323Sed         | SUBLANG_ENGLISH_JAMAICA | SUBLANG_SPANISH_PARAGUAY 
69208599Srdivacky         | SUBLANG_ENGLISH_CARIBBEAN | SUBLANG_SPANISH_BOLIVIA 
70208599Srdivacky         | SUBLANG_ENGLISH_BELIZE | SUBLANG_SPANISH_EL_SALVADOR 
71193323Sed         | SUBLANG_ENGLISH_TRINIDAD | SUBLANG_SPANISH_HONDURAS 
72202878Srdivacky         | SUBLANG_FRENCH | SUBLANG_SPANISH_NICARAGUA 
73202878Srdivacky         | SUBLANG_FRENCH_BELGIAN | SUBLANG_SPANISH_PUERTO_RICO 
74198396Srdivacky         | SUBLANG_FRENCH_CANADIAN | SUBLANG_SWEDISH 
75198396Srdivacky         | SUBLANG_FRENCH_SWISS | SUBLANG_SWEDISH_FINLAND 
76198396Srdivacky         | SUBLANG_FRENCH_LUXEMBOURG | SUBLANG_SYS_DEFAULT 
77198396Srdivacky
78198396Srdivacky        local
79198396Srdivacky            val tab = [
80198396Srdivacky            (LANG_NEUTRAL, 0x00),
81193323Sed            (LANG_AFRIKAANS, 0x36),
82198396Srdivacky            (LANG_ALBANIAN, 0x1c),
83198396Srdivacky            (LANG_ARABIC, 0x01),
84198396Srdivacky            (LANG_BASQUE, 0x2d),
85210299Sed            (LANG_BELARUSIAN, 0x23),
86210299Sed            (LANG_BULGARIAN, 0x02),
87198396Srdivacky            (LANG_CATALAN, 0x03),
88193323Sed            (LANG_CHINESE, 0x04),
89193323Sed            (LANG_CROATIAN, 0x1a),
90193323Sed            (LANG_CZECH, 0x05),
91193323Sed            (LANG_DANISH, 0x06),
92193323Sed            (LANG_DUTCH, 0x13),
93            (LANG_ENGLISH, 0x09),
94            (LANG_ESTONIAN, 0x25),
95            (LANG_FAEROESE, 0x38),
96            (LANG_FARSI, 0x29),
97            (LANG_FINNISH, 0x0b),
98            (LANG_FRENCH, 0x0c),
99            (LANG_GERMAN, 0x07),
100            (LANG_GREEK, 0x08),
101            (LANG_HEBREW, 0x0d),
102            (LANG_HUNGARIAN, 0x0e),
103            (LANG_ICELANDIC, 0x0f),
104            (LANG_INDONESIAN, 0x21),
105            (LANG_ITALIAN, 0x10),
106            (LANG_JAPANESE, 0x11),
107            (LANG_KOREAN, 0x12),
108            (LANG_LATVIAN, 0x26),
109            (LANG_LITHUANIAN, 0x27),
110            (LANG_NORWEGIAN, 0x14),
111            (LANG_POLISH, 0x15),
112            (LANG_PORTUGUESE, 0x16),
113            (LANG_ROMANIAN, 0x18),
114            (LANG_RUSSIAN, 0x19),
115            (LANG_SERBIAN, 0x1a),
116            (LANG_SLOVAK, 0x1b),
117            (LANG_SLOVENIAN, 0x24),
118            (LANG_SPANISH, 0x0a),
119            (LANG_SWEDISH, 0x1d),
120            (LANG_THAI, 0x1e),
121            (LANG_TURKISH, 0x1f),
122            (LANG_UKRANIAN, 0x22),
123            (LANG_VIETNAMESE, 0x2a)]
124        in
125            val (fromPrim, toPrim) = tableLookup(tab, NONE)
126        end
127
128        local
129            val tab = [
130            (SUBLANG_NEUTRAL, 0x00),
131            (SUBLANG_DEFAULT, 0x01),
132            (SUBLANG_SYS_DEFAULT, 0x02),
133            (SUBLANG_ARABIC_SAUDI_ARABIA, 0x01),
134            (SUBLANG_ARABIC_IRAQ, 0x02),
135            (SUBLANG_ARABIC_EGYPT, 0x03),
136            (SUBLANG_ARABIC_LIBYA, 0x04),
137            (SUBLANG_ARABIC_ALGERIA, 0x05),
138            (SUBLANG_ARABIC_MOROCCO, 0x06),
139            (SUBLANG_ARABIC_TUNISIA, 0x07),
140            (SUBLANG_ARABIC_OMAN, 0x08),
141            (SUBLANG_ARABIC_YEMEN, 0x09),
142            (SUBLANG_ARABIC_SYRIA, 0x0a),
143            (SUBLANG_ARABIC_JORDAN, 0x0b),
144            (SUBLANG_ARABIC_LEBANON, 0x0c),
145            (SUBLANG_ARABIC_KUWAIT, 0x0d),
146            (SUBLANG_ARABIC_UAE, 0x0e),
147            (SUBLANG_ARABIC_BAHRAIN, 0x0f),
148            (SUBLANG_ARABIC_QATAR, 0x10),
149            (SUBLANG_CHINESE_TRADITIONAL, 0x01),
150            (SUBLANG_CHINESE_SIMPLIFIED, 0x02),
151            (SUBLANG_CHINESE_HONGKONG, 0x03),
152            (SUBLANG_CHINESE_SINGAPORE, 0x04),
153            (SUBLANG_DUTCH, 0x01),
154            (SUBLANG_DUTCH_BELGIAN, 0x02),
155            (SUBLANG_ENGLISH_US, 0x01),
156            (SUBLANG_ENGLISH_UK, 0x02),
157            (SUBLANG_ENGLISH_AUS, 0x03),
158            (SUBLANG_ENGLISH_CAN, 0x04),
159            (SUBLANG_ENGLISH_NZ, 0x05),
160            (SUBLANG_ENGLISH_EIRE, 0x06),
161            (SUBLANG_ENGLISH_SOUTH_AFRICA, 0x07),
162            (SUBLANG_ENGLISH_JAMAICA, 0x08),
163            (SUBLANG_ENGLISH_CARIBBEAN, 0x09),
164            (SUBLANG_ENGLISH_BELIZE, 0x0a),
165            (SUBLANG_ENGLISH_TRINIDAD, 0x0b),
166            (SUBLANG_FRENCH, 0x01),
167            (SUBLANG_FRENCH_BELGIAN, 0x02),
168            (SUBLANG_FRENCH_CANADIAN, 0x03),
169            (SUBLANG_FRENCH_SWISS, 0x04),
170            (SUBLANG_FRENCH_LUXEMBOURG, 0x05),
171            (SUBLANG_GERMAN, 0x01),
172            (SUBLANG_GERMAN_SWISS, 0x02),
173            (SUBLANG_GERMAN_AUSTRIAN, 0x03),
174            (SUBLANG_GERMAN_LUXEMBOURG, 0x04),
175            (SUBLANG_GERMAN_LIECHTENSTEIN, 0x05),
176            (SUBLANG_ITALIAN, 0x01),
177            (SUBLANG_ITALIAN_SWISS, 0x02),
178            (SUBLANG_KOREAN, 0x01),
179            (SUBLANG_KOREAN_JOHAB, 0x02),
180            (SUBLANG_NORWEGIAN_BOKMAL, 0x01),
181            (SUBLANG_NORWEGIAN_NYNORSK, 0x02),
182            (SUBLANG_PORTUGUESE, 0x02),
183            (SUBLANG_PORTUGUESE_BRAZILIAN, 0x01),
184            (SUBLANG_SERBIAN_LATIN, 0x02),
185            (SUBLANG_SERBIAN_CYRILLIC, 0x03),
186            (SUBLANG_SPANISH, 0x01),
187            (SUBLANG_SPANISH_MEXICAN, 0x02),
188            (SUBLANG_SPANISH_MODERN, 0x03),
189            (SUBLANG_SPANISH_GUATEMALA, 0x04),
190            (SUBLANG_SPANISH_COSTA_RICA, 0x05),
191            (SUBLANG_SPANISH_PANAMA, 0x06),
192            (SUBLANG_SPANISH_DOMINICAN_REPUBLIC, 0x07),
193            (SUBLANG_SPANISH_VENEZUELA, 0x08),
194            (SUBLANG_SPANISH_COLOMBIA, 0x09),
195            (SUBLANG_SPANISH_PERU, 0x0a),
196            (SUBLANG_SPANISH_ARGENTINA, 0x0b),
197            (SUBLANG_SPANISH_ECUADOR, 0x0c),
198            (SUBLANG_SPANISH_CHILE, 0x0d),
199            (SUBLANG_SPANISH_URUGUAY, 0x0e),
200            (SUBLANG_SPANISH_PARAGUAY, 0x0f),
201            (SUBLANG_SPANISH_BOLIVIA, 0x10),
202            (SUBLANG_SPANISH_EL_SALVADOR, 0x11),
203            (SUBLANG_SPANISH_HONDURAS, 0x12),
204            (SUBLANG_SPANISH_NICARAGUA, 0x13),
205            (SUBLANG_SPANISH_PUERTO_RICO, 0x14),
206            (SUBLANG_SWEDISH, 0x01),
207            (SUBLANG_SWEDISH_FINLAND, 0x02)]
208        in
209            val (fromSub, toSub) = tableLookup(tab, NONE)
210        end
211
212        datatype LANGID = MAKELANGID of PrimaryLanguage * SubLanguage
213
214        local
215            fun fromLANGID(MAKELANGID(prim, sub)) =
216                IntInf.orb(fromPrim prim, IntInf.<<(fromSub sub, 0w10))
217            (* It seems that GetUserDefaultLangID at least sets the top word
218               to something odd so we mask both parts. *)
219            fun toLANGID l =
220                MAKELANGID(
221                    toPrim(IntInf.andb(l, 0x3ff)),
222                    toSub(IntInf.andb(IntInf.~>>(l, 0w10), 0x3f))
223                )
224                
225        in
226            val LANGID: LANGID conversion = absConversion {abs = toLANGID, rep = fromLANGID} cUshort
227        end 
228    end
229end;
230