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