63
63
static GHashTable *gdm_languages_map;
64
64
static GHashTable *gdm_territories_map;
65
65
static GHashTable *gdm_available_locales_map;
66
static GHashTable *gdm_language_count_map;
67
static GHashTable *gdm_territory_count_map;
67
69
static char * construct_language_name (const char *language,
68
70
const char *territory,
619
count_languages_and_territories (void)
625
gdm_language_count_map = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
626
gdm_territory_count_map = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
628
g_hash_table_iter_init (&iter, gdm_available_locales_map);
629
while (g_hash_table_iter_next (&iter, NULL, &value)) {
632
locale = (GdmLocale *) value;
634
count = GPOINTER_TO_INT (g_hash_table_lookup (gdm_language_count_map, locale->language_code));
636
g_hash_table_insert (gdm_language_count_map, g_strdup (locale->language_code), GINT_TO_POINTER (count));
638
count = GPOINTER_TO_INT (g_hash_table_lookup (gdm_territory_count_map, locale->territory_code));
640
g_hash_table_insert (gdm_territory_count_map, g_strdup (locale->territory_code), GINT_TO_POINTER (count));
617
645
collect_locales (void)
631
659
collect_locales_from_directory ();
633
661
collect_locales_from_locale_file (ALIASES_FILE);
663
count_languages_and_territories ();
667
get_language_count (const char *language)
669
if (gdm_language_count_map == NULL) {
673
return GPOINTER_TO_INT (g_hash_table_lookup (gdm_language_count_map, language));
677
is_unique_language (const char *language)
679
return get_language_count (language) == 1;
683
get_territory_count (const char *territory)
685
if (gdm_territory_count_map == NULL) {
689
return GPOINTER_TO_INT (g_hash_table_lookup (gdm_territory_count_map, territory));
693
is_unique_territory (const char *territory)
695
return get_territory_count (territory) == 1;
1102
1166
full_language = g_string_append (full_language, translated_language);
1168
if (is_unique_language (language_code)) {
1104
1172
if (territory_code != NULL) {
1105
1173
translated_territory = get_translated_territory (territory_code, locale);
1129
1201
g_free (langinfo_codeset);
1130
1202
g_free (translated_language);
1131
1203
g_free (translated_territory);
1133
1206
if (full_language->len == 0) {
1134
1207
g_string_free (full_language, TRUE);
1138
1211
return g_string_free (full_language, FALSE);
1215
gdm_get_region_from_name (const char *name,
1219
char *language_code;
1220
char *territory_code;
1222
char *langinfo_codeset;
1223
char *translated_language;
1224
char *translated_territory;
1225
gboolean is_utf8 = TRUE;
1227
g_return_val_if_fail (name != NULL, NULL);
1228
g_return_val_if_fail (*name != '\0', NULL);
1230
translated_territory = NULL;
1231
translated_language = NULL;
1232
langinfo_codeset = NULL;
1234
full_name = g_string_new (NULL);
1236
if (gdm_languages_map == NULL) {
1240
if (gdm_territories_map == NULL) {
1241
territories_init ();
1244
language_code = NULL;
1245
territory_code = NULL;
1246
codeset_code = NULL;
1248
gdm_parse_language_name (name,
1254
if (territory_code == NULL) {
1258
translated_territory = get_translated_territory (territory_code, locale);
1259
g_string_append (full_name, translated_territory);
1261
if (is_unique_territory (territory_code)) {
1265
if (language_code != NULL) {
1266
translated_language = get_translated_language (language_code, locale);
1268
if (translated_language != NULL) {
1269
g_string_append_printf (full_name,
1271
translated_language);
1274
language_name_get_codeset_details (name, &langinfo_codeset, &is_utf8);
1276
if (codeset_code == NULL && langinfo_codeset != NULL) {
1277
codeset_code = g_strdup (langinfo_codeset);
1280
if (!is_utf8 && codeset_code) {
1281
g_string_append_printf (full_name,
1287
g_free (language_code);
1288
g_free (territory_code);
1289
g_free (codeset_code);
1290
g_free (langinfo_codeset);
1291
g_free (translated_language);
1292
g_free (translated_territory);
1294
if (full_name->len == 0) {
1295
g_string_free (full_name, TRUE);
1299
return g_string_free (full_name, FALSE);
1142
1303
gdm_get_all_language_names (void)