135 JsonReader *reader = NULL;
136 JsonParser *parser = NULL;
137 GError *
error = NULL;
138 char *filename = NULL;
143#if defined(_WIN32) && !defined(MSYS2_INSTALL)
146 filename = g_build_filename(datadir,
"..",
"iso-codes",
"json",
"iso_639-2.json", NULL);
150 filename = g_build_filename(res_path,
"share",
"iso-codes",
"json",
"iso_639-2.json", NULL);
156 if(!g_file_test(filename, G_FILE_TEST_EXISTS))
158 fprintf(stderr,
"[l10n] error: can't open iso-codes file `%s'\n"
159 " there won't be nicely translated language names in the preferences.\n", filename);
163#if defined(_WIN32) && !defined(MSYS2_INSTALL)
167 bindtextdomain(
"iso_639-2", localedir);
174 bindtextdomain(
"iso_639-2", localedir);
181 bind_textdomain_codeset(
"iso_639-2",
"UTF-8");
183 parser = json_parser_new();
184 if(!json_parser_load_from_file(parser, filename, &
error))
186 fprintf(stderr,
"[l10n] error: parsing json from `%s' failed\n%s\n", filename,
error->message);
191 JsonNode *root = json_parser_get_root(parser);
194 fprintf(stderr,
"[l10n] error: can't get root node of `%s'\n", filename);
198 reader = json_reader_new(root);
200 if(!json_reader_read_member(reader,
"639-2"))
202 fprintf(stderr,
"[l10n] error: unexpected layout of `%s'\n", filename);
206 if(!json_reader_is_array(reader))
208 fprintf(stderr,
"[l10n] error: unexpected layout of `%s'\n", filename);
212 char *saved_locale = strdup(setlocale(LC_ALL, NULL));
214 int n_elements = json_reader_count_elements(reader);
215 for(
int i = 0;
i < n_elements;
i++)
217 json_reader_read_element(reader,
i);
218 if(!json_reader_is_object(reader))
220 fprintf(stderr,
"[l10n] error: unexpected layout of `%s' (element %d)\n", filename,
i);
225 const char *alpha_2 = NULL, *alpha_3 = NULL, *
name = NULL;
226 if(json_reader_read_member(reader,
"alpha_2"))
227 alpha_2 = json_reader_get_string_value(reader);
228 json_reader_end_member(reader);
230 if(json_reader_read_member(reader,
"alpha_3"))
231 alpha_3 = json_reader_get_string_value(reader);
232 json_reader_end_member(reader);
234 if(json_reader_read_member(reader,
"name"))
235 name = json_reader_get_string_value(reader);
236 json_reader_end_member(reader);
238 if(
name && (alpha_2 || alpha_3))
241 for(GList *iter = languages; iter; iter = g_list_next(iter))
244 if(!g_strcmp0(language->
base_code, alpha_2) || !g_strcmp0(language->
base_code, alpha_3))
247 g_setenv(
"LANGUAGE", language->
code,
TRUE);
248 setlocale (LC_ALL, language->
code);
250 char *localized_name = g_strdup(dgettext(
"iso_639-2",
name));
254 if(g_strcmp0(
name, localized_name) == 0 &&
262 localized_name = g_strdup(dgettext(
"iso_639-2",
name));
266 char *semicolon = strchr(localized_name,
';');
270 char *tmp = localized_name;
271 localized_name = g_strndup(localized_name, semicolon - localized_name);
277 language->
name = g_strdup_printf(
"%s (%s)", localized_name, language->
code);
285 fprintf(stderr,
"[l10n] error: element %d has no name, skipping\n",
i);
287 json_reader_end_element(reader);
292 setlocale(LC_ALL, saved_locale);
296 json_reader_end_member(reader);
305 if(reader) g_object_unref(reader);
306 if(parser) g_object_unref(parser);
318 const char *old_env = g_getenv(
"LANGUAGE");
324 const wchar_t *wcLocaleName = NULL;
329 langLocale = g_utf16_to_utf8(wcLocaleName, -1, NULL, NULL, NULL);
333 ui_lang = g_strdup(langLocale);
347 language->
code = g_strdup(
"C");
349 language->
name = g_strdup(
"English");
352 if(g_strcmp0(ui_lang,
"C") == 0) selected = language;
354 const gchar *
const * default_languages = g_get_language_names();
358 GDir *dir = g_dir_open(localedir, 0, NULL);
362 while((locale = g_dir_read_name(dir)))
364 gchar *testname = g_build_filename(localedir, locale,
"LC_MESSAGES",
GETTEXT_PACKAGE ".mo", NULL);
365 if(g_file_test(testname, G_FILE_TEST_EXISTS))
371 char *delimiter = strchr(locale,
'_');
373 language->
base_code = g_strndup(locale, delimiter - locale);
376 delimiter = strchr(language->
base_code,
'@');
387 for(
const gchar *
const * iter = default_languages; *iter; iter++)
389 if(g_strcmp0(*iter, locale) == 0)
392 sys_default = language;
398 language->
code = g_strdup(locale);
399 language->
name = g_strdup(locale);
401 if(g_strcmp0(ui_lang, language->
code) == 0)
409 fprintf(stderr,
"[l10n] error: can't open directory `%s'\n", localedir);
414 sys_default = g_list_last(result->
languages)->data;
430 for(GList *iter = result->
languages; iter; iter = g_list_next(iter))
433 if(iter->data == selected) result->
selected =
i;