diff options
author | Patrick Lam <plam@MIT.EDU> | 2005-10-22 14:21:14 +0000 |
---|---|---|
committer | Patrick Lam <plam@MIT.EDU> | 2005-10-22 14:21:14 +0000 |
commit | 904426816df300fad816238f0f27ef595a6a539b (patch) | |
tree | a9bc7a136b62b04bba7a4a9b48fd922ed1debaa4 /src/fcdefault.c | |
parent | e58b50e88cbe3b55695101a0988306ea4646bbe4 (diff) | |
download | fontconfig-904426816df300fad816238f0f27ef595a6a539b.tar.gz |
Support localized font family and style names. This has been reported to
break old apps like xfd, but modern (gtk+/qt/mozilla) apps work fine.
reviewed by: plam
Diffstat (limited to 'src/fcdefault.c')
-rw-r--r-- | src/fcdefault.c | 110 |
1 files changed, 62 insertions, 48 deletions
diff --git a/src/fcdefault.c b/src/fcdefault.c index 5e648dc..956862c 100644 --- a/src/fcdefault.c +++ b/src/fcdefault.c @@ -37,6 +37,67 @@ static struct { #define NUM_FC_BOOL_DEFAULTS (int) (sizeof FcBoolDefaults / sizeof FcBoolDefaults[0]) +FcChar8 * +FcGetDefaultLang (void) +{ + static char lang_local [128] = {0}; + char *ctype; + char *territory; + char *after; + int lang_len, territory_len; + + if (lang_local [0]) + return (FcChar8 *) lang_local; + + ctype = setlocale (LC_CTYPE, NULL); + + /* + * Check if setlocale (LC_ALL, "") has been called + */ + if (!ctype || !strcmp (ctype, "C")) + { + ctype = getenv ("LC_ALL"); + if (!ctype) + { + ctype = getenv ("LC_CTYPE"); + if (!ctype) + ctype = getenv ("LANG"); + } + } + + /* ignore missing or empty ctype */ + if (ctype && *ctype != '\0') + { + territory = strchr (ctype, '_'); + if (territory) + { + lang_len = territory - ctype; + territory = territory + 1; + after = strchr (territory, '.'); + if (!after) + { + after = strchr (territory, '@'); + if (!after) + after = territory + strlen (territory); + } + territory_len = after - territory; + if (lang_len + 1 + territory_len + 1 <= (int) sizeof (lang_local)) + { + strncpy (lang_local, ctype, lang_len); + lang_local[lang_len] = '-'; + strncpy (lang_local + lang_len + 1, territory, territory_len); + lang_local[lang_len + 1 + territory_len] = '\0'; + } + } + } + + /* set default lang to en */ + if (!lang_local [0]) + strcpy (lang_local, "en"); + + return (FcChar8 *) lang_local; +} + void FcDefaultSubstitute (FcPattern *pattern) { @@ -91,54 +152,7 @@ FcDefaultSubstitute (FcPattern *pattern) if (FcPatternGet (pattern, FC_LANG, 0, &v) == FcResultNoMatch) { - char *lang; - char *territory; - char *after; - int lang_len, territory_len; - char lang_local[128]; - char *ctype = setlocale (LC_CTYPE, NULL); - - /* - * Check if setlocale (LC_ALL, "") has been called - */ - if (!ctype || !strcmp (ctype, "C")) - { - ctype = getenv ("LC_ALL"); - if (!ctype) - { - ctype = getenv ("LC_CTYPE"); - if (!ctype) - ctype = getenv ("LANG"); - } - } - if (ctype) - { - lang = ctype; - territory = strchr (ctype, '_'); - if (territory) - { - lang_len = territory - lang; - territory = territory + 1; - after = strchr (territory, '.'); - if (!after) - { - after = strchr (territory, '@'); - if (!after) - after = territory + strlen (territory); - } - territory_len = after - territory; - if (lang_len + 1 + territory_len + 1 <= (int) sizeof (lang_local)) - { - strncpy (lang_local, lang, lang_len); - lang_local[lang_len] = '-'; - strncpy (lang_local + lang_len + 1, territory, territory_len); - lang_local[lang_len + 1 + territory_len] = '\0'; - FcPatternAddString (pattern, FC_LANG, (FcChar8 *) lang_local); - } - } - else - FcPatternAddString (pattern, FC_LANG, (FcChar8 *) lang); - } + FcPatternAddString (pattern, FC_LANG, FcGetDefaultLang ()); } if (FcPatternGet (pattern, FC_FONTVERSION, 0, &v) == FcResultNoMatch) { |