1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

I18nInitialize() now uses best matching default locale

This commit is contained in:
Klaus Schmidinger 2007-08-17 12:38:55 +02:00
parent 00328c31e1
commit 7bb744ccb0
3 changed files with 10 additions and 3 deletions

View File

@ -2092,6 +2092,7 @@ Matthias Schwarzott <zzam@gentoo.org>
for suggesting to move the "all" target in plugin Makefiles before the for suggesting to move the "all" target in plugin Makefiles before the
"Implicit rules", so that a plain "make" will compile everything "Implicit rules", so that a plain "make" will compile everything
for adding DESTDIR and PREFIX handling to the Makefile for adding DESTDIR and PREFIX handling to the Makefile
for reporting a problem with locale matching
Martin Ostermann <martin@familie-ostermann.de> Martin Ostermann <martin@familie-ostermann.de>
for fixing processing the PDCDescriptor in 'libsi' on big endian systems for fixing processing the PDCDescriptor in 'libsi' on big endian systems

View File

@ -5363,3 +5363,5 @@ Video Disk Recorder Revision History
Ahrenberg). Ahrenberg).
- Checking the string for NULL in I18nTranslate(). - Checking the string for NULL in I18nTranslate().
- Updated the French OSD texts (thanks to Bruno Roussel). - Updated the French OSD texts (thanks to Bruno Roussel).
- I18nInitialize() now uses best matching default locale (problem reported by
Matthias Schwarzott).

10
i18n.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: i18n.c 1.309 2007/08/15 14:17:56 kls Exp $ * $Id: i18n.c 1.310 2007/08/17 12:31:17 kls Exp $
* *
* *
*/ */
@ -100,12 +100,15 @@ void I18nInitialize(void)
cFileNameList Locales(I18nLocaleDir, true); cFileNameList Locales(I18nLocaleDir, true);
if (Locales.Size() > 0) { if (Locales.Size() > 0) {
dsyslog("found %d locales in %s", Locales.Size(), I18nLocaleDir); dsyslog("found %d locales in %s", Locales.Size(), I18nLocaleDir);
int MatchFull = 0, MatchPartial = 0;
char *OldLocale = strdup(setlocale(LC_MESSAGES, NULL)); char *OldLocale = strdup(setlocale(LC_MESSAGES, NULL));
for (int i = 0; i < Locales.Size(); i++) { for (int i = 0; i < Locales.Size(); i++) {
if (i < I18N_MAX_LANGUAGES - 1) { if (i < I18N_MAX_LANGUAGES - 1) {
if (setlocale(LC_MESSAGES, Locales[i])) { if (setlocale(LC_MESSAGES, Locales[i])) {
if (strstr(OldLocale, Locales[i]) == OldLocale) if (strstr(OldLocale, Locales[i]) == OldLocale)
CurrentLanguage = LanguageLocales.Size(); MatchFull = LanguageLocales.Size();
else if (strncmp(OldLocale, Locales[i], 2) == 0)
MatchPartial = LanguageLocales.Size();
LanguageLocales.Append(strdup(Locales[i])); LanguageLocales.Append(strdup(Locales[i]));
LanguageNames.Append(strdup(gettext(LanguageName))); LanguageNames.Append(strdup(gettext(LanguageName)));
const char *Code = gettext(LanguageCode); const char *Code = gettext(LanguageCode);
@ -121,7 +124,8 @@ void I18nInitialize(void)
else else
esyslog("ERROR: too many locales - increase I18N_MAX_LANGUAGES!"); esyslog("ERROR: too many locales - increase I18N_MAX_LANGUAGES!");
} }
setlocale(LC_MESSAGES, OldLocale); CurrentLanguage = MatchFull ? MatchFull : MatchPartial;
setlocale(LC_MESSAGES, CurrentLanguage ? LanguageLocales[CurrentLanguage] : OldLocale);
free(OldLocale); free(OldLocale);
} }
// Prepare any known language codes for which there was no locale: // Prepare any known language codes for which there was no locale: