WinGui: Fix another instance of the Caliburn vs Json.net sillyness where objects...
[HandBrake.git] / libhb / lang.c
blob34466da3436a3187dd9c7ad1796f0a7b18afe254
1 /* lang.h
3 Copyright (c) 2003-2015 HandBrake Team
4 This file is part of the HandBrake source code
5 Homepage: <http://handbrake.fr/>.
6 It may be used under the terms of the GNU General Public License v2.
7 For full terms see the file COPYING file or visit http://www.gnu.org/licenses/gpl-2.0.html
8 */
10 #include "lang.h"
11 #include <string.h>
12 #include <ctype.h>
14 static const iso639_lang_t languages[] =
15 { { "Unknown", "", "", "und" },
16 { "Afar", "", "aa", "aar" },
17 { "Abkhazian", "", "ab", "abk" },
18 { "Afrikaans", "", "af", "afr" },
19 { "Akan", "", "ak", "aka" },
20 { "Albanian", "", "sq", "sqi", "alb" },
21 { "Amharic", "", "am", "amh" },
22 { "Arabic", "", "ar", "ara" },
23 { "Aragonese", "", "an", "arg" },
24 { "Armenian", "", "hy", "hye", "arm" },
25 { "Assamese", "", "as", "asm" },
26 { "Avaric", "", "av", "ava" },
27 { "Avestan", "", "ae", "ave" },
28 { "Aymara", "", "ay", "aym" },
29 { "Azerbaijani", "", "az", "aze" },
30 { "Bashkir", "", "ba", "bak" },
31 { "Bambara", "", "bm", "bam" },
32 { "Basque", "", "eu", "eus", "baq" },
33 { "Belarusian", "", "be", "bel" },
34 { "Bengali", "", "bn", "ben" },
35 { "Bihari", "", "bh", "bih" },
36 { "Bislama", "", "bi", "bis" },
37 { "Bosnian", "", "bs", "bos" },
38 { "Breton", "", "br", "bre" },
39 { "Bulgarian", "", "bg", "bul" },
40 { "Burmese", "", "my", "mya", "bur" },
41 { "Catalan", "", "ca", "cat" },
42 { "Chamorro", "", "ch", "cha" },
43 { "Chechen", "", "ce", "che" },
44 { "Chinese", "", "zh", "zho", "chi" },
45 { "Church Slavic", "", "cu", "chu" },
46 { "Chuvash", "", "cv", "chv" },
47 { "Cornish", "", "kw", "cor" },
48 { "Corsican", "", "co", "cos" },
49 { "Cree", "", "cr", "cre" },
50 { "Czech", "", "cs", "ces", "cze" },
51 { "Danish", "Dansk", "da", "dan" },
52 { "Divehi", "", "dv", "div" },
53 { "Dutch", "Nederlands", "nl", "nld", "dut" },
54 { "Dzongkha", "", "dz", "dzo" },
55 { "English", "English", "en", "eng" },
56 { "Esperanto", "", "eo", "epo" },
57 { "Estonian", "", "et", "est" },
58 { "Ewe", "", "ee", "ewe" },
59 { "Faroese", "", "fo", "fao" },
60 { "Fijian", "", "fj", "fij" },
61 { "Finnish", "Suomi", "fi", "fin" },
62 { "French", "Francais", "fr", "fra", "fre" },
63 { "Western Frisian", "", "fy", "fry" },
64 { "Fulah", "", "ff", "ful" },
65 { "Georgian", "", "ka", "kat", "geo" },
66 { "German", "Deutsch", "de", "deu", "ger" },
67 { "Gaelic (Scots)", "", "gd", "gla" },
68 { "Irish", "", "ga", "gle" },
69 { "Galician", "", "gl", "glg" },
70 { "Manx", "", "gv", "glv" },
71 { "Greek, Modern", "", "el", "ell", "gre" },
72 { "Guarani", "", "gn", "grn" },
73 { "Gujarati", "", "gu", "guj" },
74 { "Haitian", "", "ht", "hat" },
75 { "Hausa", "", "ha", "hau" },
76 { "Hebrew", "", "he", "heb" },
77 { "Herero", "", "hz", "her" },
78 { "Hindi", "", "hi", "hin" },
79 { "Hiri Motu", "", "ho", "hmo" },
80 { "Hungarian", "Magyar", "hu", "hun" },
81 { "Igbo", "", "ig", "ibo" },
82 { "Icelandic", "Islenska", "is", "isl", "ice" },
83 { "Ido", "", "io", "ido" },
84 { "Sichuan Yi", "", "ii", "iii" },
85 { "Inuktitut", "", "iu", "iku" },
86 { "Interlingue", "", "ie", "ile" },
87 { "Interlingua", "", "ia", "ina" },
88 { "Indonesian", "", "id", "ind" },
89 { "Inupiaq", "", "ik", "ipk" },
90 { "Italian", "Italiano", "it", "ita" },
91 { "Javanese", "", "jv", "jav" },
92 { "Japanese", "", "ja", "jpn" },
93 { "Kalaallisut (Greenlandic)", "", "kl", "kal" },
94 { "Kannada", "", "kn", "kan" },
95 { "Kashmiri", "", "ks", "kas" },
96 { "Kanuri", "", "kr", "kau" },
97 { "Kazakh", "", "kk", "kaz" },
98 { "Central Khmer", "", "km", "khm" },
99 { "Kikuyu", "", "ki", "kik" },
100 { "Kinyarwanda", "", "rw", "kin" },
101 { "Kirghiz", "", "ky", "kir" },
102 { "Komi", "", "kv", "kom" },
103 { "Kongo", "", "kg", "kon" },
104 { "Korean", "", "ko", "kor" },
105 { "Kuanyama", "", "kj", "kua" },
106 { "Kurdish", "", "ku", "kur" },
107 { "Lao", "", "lo", "lao" },
108 { "Latin", "", "la", "lat" },
109 { "Latvian", "", "lv", "lav" },
110 { "Limburgan", "", "li", "lim" },
111 { "Lingala", "", "ln", "lin" },
112 { "Lithuanian", "", "lt", "lit" },
113 { "Luxembourgish", "", "lb", "ltz" },
114 { "Luba-Katanga", "", "lu", "lub" },
115 { "Ganda", "", "lg", "lug" },
116 { "Macedonian", "", "mk", "mkd", "mac" },
117 { "Marshallese", "", "mh", "mah" },
118 { "Malayalam", "", "ml", "mal" },
119 { "Maori", "", "mi", "mri", "mao" },
120 { "Marathi", "", "mr", "mar" },
121 { "Malay", "", "ms", "msa", "msa" },
122 { "Malagasy", "", "mg", "mlg" },
123 { "Maltese", "", "mt", "mlt" },
124 { "Moldavian", "", "mo", "mol" },
125 { "Mongolian", "", "mn", "mon" },
126 { "Nauru", "", "na", "nau" },
127 { "Navajo", "", "nv", "nav" },
128 { "Ndebele, South", "", "nr", "nbl" },
129 { "Ndebele, North", "", "nd", "nde" },
130 { "Ndonga", "", "ng", "ndo" },
131 { "Nepali", "", "ne", "nep" },
132 { "Norwegian Nynorsk", "", "nn", "nno" },
133 { "Norwegian Bokmål", "", "nb", "nob" },
134 { "Norwegian", "Norsk", "no", "nor" },
135 { "Chichewa; Nyanja", "", "ny", "nya" },
136 { "Occitan (post 1500); Provençal", "", "oc", "oci" },
137 { "Ojibwa", "", "oj", "oji" },
138 { "Oriya", "", "or", "ori" },
139 { "Oromo", "", "om", "orm" },
140 { "Ossetian; Ossetic", "", "os", "oss" },
141 { "Panjabi", "", "pa", "pan" },
142 { "Persian", "", "fa", "fas", "per" },
143 { "Pali", "", "pi", "pli" },
144 { "Polish", "", "pl", "pol" },
145 { "Portuguese", "Portugues", "pt", "por" },
146 { "Pushto", "", "ps", "pus" },
147 { "Quechua", "", "qu", "que" },
148 { "Romansh", "", "rm", "roh" },
149 { "Romanian", "", "ro", "ron", "rum" },
150 { "Rundi", "", "rn", "run" },
151 { "Russian", "", "ru", "rus" },
152 { "Sango", "", "sg", "sag" },
153 { "Sanskrit", "", "sa", "san" },
154 { "Serbian", "", "sr", "srp", "scc" },
155 { "Croatian", "Hrvatski", "hr", "hrv", "scr" },
156 { "Sinhala", "", "si", "sin" },
157 { "Slovak", "", "sk", "slk", "slo" },
158 { "Slovenian", "", "sl", "slv" },
159 { "Northern Sami", "", "se", "sme" },
160 { "Samoan", "", "sm", "smo" },
161 { "Shona", "", "sn", "sna" },
162 { "Sindhi", "", "sd", "snd" },
163 { "Somali", "", "so", "som" },
164 { "Sotho, Southern", "", "st", "sot" },
165 { "Spanish", "Espanol", "es", "spa" },
166 { "Sardinian", "", "sc", "srd" },
167 { "Swati", "", "ss", "ssw" },
168 { "Sundanese", "", "su", "sun" },
169 { "Swahili", "", "sw", "swa" },
170 { "Swedish", "Svenska", "sv", "swe" },
171 { "Tahitian", "", "ty", "tah" },
172 { "Tamil", "", "ta", "tam" },
173 { "Tatar", "", "tt", "tat" },
174 { "Telugu", "", "te", "tel" },
175 { "Tajik", "", "tg", "tgk" },
176 { "Tagalog", "", "tl", "tgl" },
177 { "Thai", "", "th", "tha" },
178 { "Tibetan", "", "bo", "bod", "tib" },
179 { "Tigrinya", "", "ti", "tir" },
180 { "Tonga (Tonga Islands)", "", "to", "ton" },
181 { "Tswana", "", "tn", "tsn" },
182 { "Tsonga", "", "ts", "tso" },
183 { "Turkmen", "", "tk", "tuk" },
184 { "Turkish", "", "tr", "tur" },
185 { "Twi", "", "tw", "twi" },
186 { "Uighur", "", "ug", "uig" },
187 { "Ukrainian", "", "uk", "ukr" },
188 { "Urdu", "", "ur", "urd" },
189 { "Uzbek", "", "uz", "uzb" },
190 { "Venda", "", "ve", "ven" },
191 { "Vietnamese", "", "vi", "vie" },
192 { "Volapük", "", "vo", "vol" },
193 { "Welsh", "", "cy", "cym", "wel" },
194 { "Walloon", "", "wa", "wln" },
195 { "Wolof", "", "wo", "wol" },
196 { "Xhosa", "", "xh", "xho" },
197 { "Yiddish", "", "yi", "yid" },
198 { "Yoruba", "", "yo", "yor" },
199 { "Zhuang", "", "za", "zha" },
200 { "Zulu", "", "zu", "zul" },
201 { NULL, NULL, NULL } };
203 static const int lang_count = sizeof(languages) / sizeof(languages[0]);
205 const iso639_lang_t * lang_lookup( const char * str )
207 iso639_lang_t * lang;
209 // We use "Any" as a synonym for undefined
210 if (!strcasecmp("any", str))
212 return &languages[0];
215 for (lang = (iso639_lang_t*) languages; lang->eng_name; lang++)
217 if ((lang->iso639_1 != NULL && !strcasecmp(lang->iso639_1, str)) ||
218 (lang->iso639_2 != NULL && !strcasecmp(lang->iso639_2, str)) ||
219 (lang->iso639_2b != NULL && !strcasecmp(lang->iso639_2b, str)) ||
220 (lang->eng_name != NULL && !strcasecmp(lang->eng_name, str)) ||
221 (lang->native_name != NULL && !strcasecmp(lang->native_name, str)))
223 return lang;
227 return NULL;
230 iso639_lang_t * lang_for_code( int code )
232 char code_string[2];
233 iso639_lang_t * lang;
235 code_string[0] = tolower( ( code >> 8 ) & 0xFF );
236 code_string[1] = tolower( code & 0xFF );
238 for( lang = (iso639_lang_t*) languages; lang->eng_name; lang++ )
240 if( !strncmp( lang->iso639_1, code_string, 2 ) )
242 return lang;
246 return (iso639_lang_t*) languages;
249 iso639_lang_t * lang_for_code2( const char *code )
251 char code_string[4];
252 iso639_lang_t * lang;
254 code_string[0] = tolower( code[0] );
255 code_string[1] = tolower( code[1] );
256 code_string[2] = tolower( code[2] );
257 code_string[3] = 0;
259 for( lang = (iso639_lang_t*) languages; lang->eng_name; lang++ )
261 if( !strcmp( lang->iso639_2, code_string ) )
263 return lang;
265 if( lang->iso639_2b && !strcmp( lang->iso639_2b, code_string ) )
267 return lang;
271 return (iso639_lang_t*) languages;
274 int lang_to_code(const iso639_lang_t *lang)
276 int code = 0;
278 if (lang)
279 code = (lang->iso639_1[0] << 8) | lang->iso639_1[1];
281 return code;
284 iso639_lang_t * lang_for_english( const char * english )
286 iso639_lang_t * lang;
288 for( lang = (iso639_lang_t*) languages; lang->eng_name; lang++ )
290 if( !strcmp( lang->eng_name, english ) )
292 return lang;
296 return (iso639_lang_t*) languages;
299 const iso639_lang_t* lang_get_next(const iso639_lang_t *last)
301 if (last == NULL)
303 return (const iso639_lang_t*)languages;
305 if (last < languages || // out of bounds
306 last >= languages + lang_count - 2) // last valid language
308 return NULL;
310 return ++last;