137 JsonReader *reader = NULL;
138 JsonParser *parser = NULL;
139 GError *
error = NULL;
140 char *filename = NULL;
145#if defined(_WIN32) && !defined(MSYS2_INSTALL)
148 filename = g_build_filename(datadir,
"..",
"iso-codes",
"json",
"iso_639-2.json", NULL);
152 filename = g_build_filename(res_path,
"share",
"iso-codes",
"json",
"iso_639-2.json", NULL);
158 if(!g_file_test(filename, G_FILE_TEST_EXISTS))
160 fprintf(stderr,
"[l10n] error: can't open iso-codes file `%s'\n"
161 " there won't be nicely translated language names in the preferences.\n", filename);
165#if defined(_WIN32) && !defined(MSYS2_INSTALL)
169 bindtextdomain(
"iso_639-2", localedir);
176 bindtextdomain(
"iso_639-2", localedir);
183 bind_textdomain_codeset(
"iso_639-2",
"UTF-8");
185 parser = json_parser_new();
186 if(!json_parser_load_from_file(parser, filename, &
error))
188 fprintf(stderr,
"[l10n] error: parsing json from `%s' failed\n%s\n", filename,
error->message);
193 JsonNode *root = json_parser_get_root(parser);
196 fprintf(stderr,
"[l10n] error: can't get root node of `%s'\n", filename);
200 reader = json_reader_new(root);
202 if(!json_reader_read_member(reader,
"639-2"))
204 fprintf(stderr,
"[l10n] error: unexpected layout of `%s'\n", filename);
208 if(!json_reader_is_array(reader))
210 fprintf(stderr,
"[l10n] error: unexpected layout of `%s'\n", filename);
214 char *saved_locale = strdup(setlocale(LC_ALL, NULL));
216 int n_elements = json_reader_count_elements(reader);
217 for(
int i = 0;
i < n_elements;
i++)
219 json_reader_read_element(reader,
i);
220 if(!json_reader_is_object(reader))
222 fprintf(stderr,
"[l10n] error: unexpected layout of `%s' (element %d)\n", filename,
i);
227 const char *alpha_2 = NULL, *alpha_3 = NULL, *
name = NULL;
228 if(json_reader_read_member(reader,
"alpha_2"))
229 alpha_2 = json_reader_get_string_value(reader);
230 json_reader_end_member(reader);
232 if(json_reader_read_member(reader,
"alpha_3"))
233 alpha_3 = json_reader_get_string_value(reader);
234 json_reader_end_member(reader);
236 if(json_reader_read_member(reader,
"name"))
237 name = json_reader_get_string_value(reader);
238 json_reader_end_member(reader);
240 if(
name && (alpha_2 || alpha_3))
243 for(GList *iter = languages; iter; iter = g_list_next(iter))
246 if(!g_strcmp0(language->
base_code, alpha_2) || !g_strcmp0(language->
base_code, alpha_3))
249 g_setenv(
"LANGUAGE", language->
code,
TRUE);
250 setlocale (LC_ALL, language->
code);
252 char *localized_name = g_strdup(dgettext(
"iso_639-2",
name));
256 if(g_strcmp0(
name, localized_name) == 0 &&
264 localized_name = g_strdup(dgettext(
"iso_639-2",
name));
268 char *semicolon = strchr(localized_name,
';');
272 char *tmp = localized_name;
273 localized_name = g_strndup(localized_name, semicolon - localized_name);
279 language->
name = g_strdup_printf(
"%s (%s)", localized_name, language->
code);
287 fprintf(stderr,
"[l10n] error: element %d has no name, skipping\n",
i);
289 json_reader_end_element(reader);
294 setlocale(LC_ALL, saved_locale);
298 json_reader_end_member(reader);
307 if(reader) g_object_unref(reader);
308 if(parser) g_object_unref(parser);
320 const char *old_env = g_getenv(
"LANGUAGE");
326 const wchar_t *wcLocaleName = NULL;
331 langLocale = g_utf16_to_utf8(wcLocaleName, -1, NULL, NULL, NULL);
335 ui_lang = g_strdup(langLocale);
349 language->
code = g_strdup(
"C");
351 language->
name = g_strdup(
"English");
354 if(g_strcmp0(ui_lang,
"C") == 0)
selected = language;
356 const gchar *
const * default_languages = g_get_language_names();
360 GDir *dir = g_dir_open(localedir, 0, NULL);
364 while((locale = g_dir_read_name(dir)))
366 gchar *testname = g_build_filename(localedir, locale,
"LC_MESSAGES",
GETTEXT_PACKAGE ".mo", NULL);
367 if(g_file_test(testname, G_FILE_TEST_EXISTS))
373 char *delimiter = strchr(locale,
'_');
375 language->
base_code = g_strndup(locale, delimiter - locale);
378 delimiter = strchr(language->
base_code,
'@');
389 for(
const gchar *
const * iter = default_languages; *iter; iter++)
391 if(g_strcmp0(*iter, locale) == 0)
394 sys_default = language;
400 language->
code = g_strdup(locale);
401 language->
name = g_strdup(locale);
403 if(g_strcmp0(ui_lang, language->
code) == 0)
411 fprintf(stderr,
"[l10n] error: can't open directory `%s'\n", localedir);
416 sys_default = g_list_last(result->
languages)->data;
432 for(GList *iter = result->
languages; iter; iter = g_list_next(iter))