Warum funktioniert das Gebietsschema es_MX, aber nicht es?

7

Der Wikipedia-Eintrag für GNU gettext zeigt ein Beispiel, in dem das Gebietsschema nur die Sprache "fr" ist. Während das Beispiel 'i18n gettext () "Hallo Welt" in SO den Gebietsschemawert sowohl für die Sprache als auch für das Land hat, " es_MX".

Ich habe das es_MXBeispiel " " geändert , um nur die Sprache "es" zu verwenden. Dies umfasst das Erstellen eines Nachrichtenkatalogs "es" anstelle von "'es_MX'" und das Aufrufen des Programms mit der Umgebungsvariablen LANG, die auf "es" gesetzt ist. Dies erzeugt jedoch den englischen Text und nicht das erwartete Spanisch.

cat >hellogt.cxx <<EOF
// hellogt.cxx
#include <libintl.h>
#include <locale.h>
#include <iostream>
int main (){
    setlocale(LC_ALL, "");
    bindtextdomain("hellogt", ".");
    textdomain( "hellogt");
    std::cout << gettext("hello, world!") << std::endl;
}
EOF
g++ -ohellogt hellogt.cxx
xgettext -d hellogt -o hellogt.pot hellogt.cxx
msginit --no-translator -l es -o hellogt_spanish.po -i hellogt.pot
sed --in-place hellogt_spanish.po --expression='/#: /,$ s/""/"hola mundo"/'
sed --in-place hellogt_spanish.po --expression='s/PACKAGE VERSION/hellogt 1.0/'
mkdir -p ./es.utf8/LC_MESSAGES
msgfmt -c -v -o ./es.utf8/LC_MESSAGES/hellogt.mo hellogt_spanish.po
LANG=es.utf8 ./hellogt

Gemäß Steuern Ihres Gebietsschemas mit Umgebungsvariablen :

Umgebungsvariable LANGUAGE, die nur von GNU gettext verwendet wird ... Wenn definiert, hat LANGUAGE Vorrang vor LC_ALL, LC_MESSAGES und LANG.

LANGUAGE=es.utf8 ./hellogt

erzeugt den erwarteten spanischen Text anstatt Englisch.

Dies erklärt jedoch nicht, warum "LANG = es" nicht funktioniert.

CW Holeman II
quelle
1
In welcher Distribution arbeitest du?
FerranB
1
Es ist erwähnenswert, dass es keinen Standard für Gebietsschemanamen gibt. Die meisten Unices definieren Gebietsschemanamen des Formulars, xx_YYwobei xxes sich um ein Sprach-Subtag und YYein Region-Subtag handelt, manchmal gefolgt von einer Zeichensatzanzeige.
Gilles 'SO - hör auf böse zu sein'

Antworten:

4

Wikipedia ist wahrscheinlich nicht die beste Referenz für solche Dinge. Es enthält normalerweise sehr einfache Beispiele, die möglicherweise nicht allgemein anwendbar sind und eher zum Verständnis von Konzepten als für praktische Überlegungen dienen.

Warum nicht gnus eigene Dokumentation verwenden?

http://www.gnu.org/software/gettext/manual/gettext.html#Setting-the-POSIX-Locale

Sie können LANGUAGE auf "es" setzen (oder sogar "es: fr: en" für eine Prioritätsliste), aber LANG müsste immer noch auf es_MX oder ähnliches gesetzt werden. Die Dokumente erklären es ziemlich klar.

Zac Thompson
quelle
4

Von Zac Thompsons Link zu den GNU-Gettext-Dienstprogrammen Abschnitt 2.3 Festlegen des Gebietsschemas über Umgebungsvariablen Der Unterabschnitt Die LANGUAGE-Variable :

In der Umgebungsvariablen LANGUAGE, jedoch nicht in den anderen Umgebungsvariablen, können 'll_CC'-Kombinationen als' ll 'abgekürzt werden, um den Hauptdialekt der Sprache zu bezeichnen. Zum Beispiel ist 'de' in diesem Zusammenhang gleichbedeutend mit 'de_DE' (Deutsch wie in Deutschland gesprochen) und 'pt' mit 'pt_PT' (Portugiesisch wie in Portugal gesprochen) in diesem Zusammenhang.

Macht den Punkt, dass "es" eine Abkürzung ist, die nur, LANGUAGEaber nicht LANGunterstützt.

CW Holeman II
quelle
4

Das von Ihnen verwendete Gebietsschema muss im System generiert werden. Verwenden Sie locale -adiese Option , um alle generierten Gebietsschemas anzuzeigen. Gebietsschema-Quelldateien müssen unter vorhanden sein /usr/share/i18n/locales/, und soweit ich sehen kann, sind alle vom Typ 'language_COUNTRY'. Wenn Sie das Gebietsschema 'es' wirklich verwenden müssen, können Sie die erforderlichen Dateien vorbereiten, ändern /etc/locale.gen, um 'es' einzuschließen, und locale-gen ausführen, um es zu generieren. Verwenden Sie andernfalls ein Gebietsschema 'es' mit einem Land.

Hayalci
quelle
2

Könnte dies daran liegen, dass Spanisch in vielen verschiedenen Ländern gesprochen wird und möglicherweise Unterschiede und Macken zwischen den Dialekten aufweist? Gleich wie en_US, en_CA oder en_GB usw.

In der Tat sind hier Ihre Optionen - ich denke, Sie können die meisten Länder erraten (AR = Argentinien, BO = Bolivien, CL = Chile usw.)

es_AR
es_AR.iso88591
es_AR.utf8
es_BO
es_BO.iso88591
es_BO.utf8
es_CL
es_CL.iso88591
es_CL.utf8
es_CO
es_CO.iso88591
es_CO.utf8
es_CR
es_CR.iso88591
es_CR.utf8
es_DO
es_DO.iso88591
es_DO.utf8
es_EC
es_EC.iso88591
es_EC.utf8
es_ES
es_ES@euro
es_ES.iso88591
es_ES.iso885915@euro
es_ES.utf8
es_ES.utf8@euro
es_GT
es_GT.iso88591
es_GT.utf8
es_HN
es_HN.iso88591
es_HN.utf8
es_MX
es_MX.iso88591
es_MX.utf8
es_NI
es_NI.iso88591
es_NI.utf8
es_PA
es_PA.iso88591
es_PA.utf8
es_PE
es_PE.iso88591
es_PE.utf8
es_PR
es_PR.iso88591
es_PR.utf8
es_PY
es_PY.iso88591
es_PY.utf8
es_SV
es_SV.iso88591
es_SV.utf8
es_US
es_US.iso88591
es_US.utf8
es_UY
es_UY.iso88591
es_UY.utf8
es_VE
es_VE.iso88591
es_VE.utf8

quelle
1

Ich bin mir nicht sicher, aber ich habe mit Joomla und anderen CMS gearbeitet und der Code für Spanisch - Spanien lautet: es_ES


quelle