Ändern Sie eine Gebietsschema-Definition (im Gegensatz zu einer Gebietsschema-Einstellung).

8

Vorbemerkung : Diese Frage ist nicht über Einstellung eines locale durch Ändern LC_ALL, LC_TIME, LANGetc., ist es vielmehr um eine locale Ändern Definition , zB in /usr/share/i18n/locales/de_DEbzw. auf Vorschläge über geeignetere Möglichkeiten zu bekommen , als diese die Systemeinstellungen ändern.

Die Absicht ist zu erhalten ISO Zeit Darstellungen %Y-%m-%d und %H:%M:%Sohne unerwünschte Nebenwirkungen.

Vorschläge, die ich im Internet gefunden habe, waren noch alle unangemessen (z. B. wenn Sie das Gebietsschema auf "dänisch" setzen, werden die buchstabierten Wochentagsnamen der Muttersprache nicht beibehalten).

Die einzige Möglichkeit, die ich derzeit sehe, um das gewünschte Verhalten zu erzielen, besteht darin, die Definition meines nativen Gebietsschemas in zu ändern /usr/share/i18n/locales/de_DE. Dies ist keine perfekte Lösung, da bei Systemaktualisierungen diese geänderten Dateien möglicherweise erneut überschrieben werden.

Meine Fragen sind:

  1. Gibt es bessere Optionen für das Gebietsschema, um die gewünschte Funktion zu erhalten, als die spezifische Systemgebietsschemadatei zu ändern?
  2. Gibt es Probleme beim Ändern einer bestimmten Gebietsschema-Definitionsdatei? (Und wie kann verhindert werden, dass diese Datei bei Systemaktualisierungen überschrieben wird?)
  3. Wäre es besser, eine neue spezifische Variante einer vorhandenen Gebietsschemadatei zu definieren und diese in den LC_*Einstellungen zu verwenden? (Und wie würde diese neue Datei / Definition dem System korrekt bekannt gemacht?)
  4. Irgendwelche anderen Vorschläge?
Janis
quelle
Ich würde vorschlagen, dass Sie die Gebietsschemadatei, an der Sie interessiert sind, kopieren, dieser Kopie einen eindeutigen Namen geben (z. B. en_XX- Ich weiß nicht, welche Einschränkungen hier bestehen, Versuch und Irrtum könnten ausreichen) und die gewünschten Änderungen daran vornehmen und verwenden Sie es als Gebietsschema. Sie müssen die Liste oder was auch immer danach neu
generieren
1
Vielleicht möchten Sie meine Frage lesen , die Details zu meiner Arbeit enthält. Ich habe es noch nicht verpackt, aber im Moment funktioniert das ganz gut. Stellen Sie einfach LC_TIME(in /etc/environmentoder /etc/default/localeoder /etc/locale.confabhängig von der Distribution) das geänderte Gebietsschema ein (ich habe meins genannt isodate.UTF-8) und das entsprechende Format wird nur für Zeit / Datum aus diesem benutzerdefinierten Gebietsschema ausgewählt. Auf diese Weise habe ich meine ansonsten eingestellte en_USEinstellung so angepasst , dass ISO-Datum / Uhrzeit angezeigt werden.
0xC0000022L
1
@Janis: Unter Debian und Ubuntu möchten Sie auch den Namen Ihres Gebietsschemas in /var/lib/locales/supported.d/local(oder eine der anderen Dateien dort) dpkg-reconfigure localeseingeben und als Superuser für die zu kompilierende Gebietsschema-Definition ausführen . Und ja, die EinstellungLC_TIME auf ein benutzerdefiniertes Gebietsschema scheint die am wenigsten aufdringliche Methode zu sein, die ich bisher gesehen habe. Aus diesem Grund verfügt Ihr System über globale Einstellungen, LC_TIMEdie sich vom "Gesamtgebietsschema" unterscheiden können.
0xC0000022L
@ 0xC0000022L; Ihre Erfahrung hier ist sehr wertvoll. Mit den bisherigen Vorschlägen werde ich eine neue Gebietsschemadatei erstellen. Ich bin noch unentschlossen, ob ich den copyOn-Section-Ansatz verwenden oder andere Abschnitte redundant halten soll (damit ich diffgegen die Originaldatei vorgehen kann ).
Janis

Antworten:

5

In einer kürzlich gestellten Frage habe ich gefragt, was die beste Vorgehensweise für diese Art von Änderung ist. Es gab noch keine Antwort. Ich kann Ihnen jedoch das Rezept geben, das ich verwende und das sich als gut erwiesen hat. Alle Programme erfassen das Datum korrekt.

Meine Beschreibung ist für Ubuntu, wird aber wahrscheinlich unter Debian und Mint funktionieren.

Vorbereitungen

Kopieren Sie das Gebietsschema, aus dem Sie anpassen möchten, /usr/share/i18n/localesin eine neue Datei. Z.B

cp /usr/share/i18n/locales/de_DE /usr/share/i18n/locales/de_DE@isodate

Passen Sie alle mit Ausnahme der LC_TIMEAbschnitte an:

copy "de_DE"

Passen Sie den LC_TIMEAbschnitt an Ihr gewünschtes Ergebnis an. Sie können die Einstellungen aus meiner oben verlinkten Frage als Vorlage verwenden. Es sieht so aus, als ob dies ziemlich genau das ist, was Sie wollen.

Wenn Ihr Gebietsschema die "AM / PM" -Notation nicht verwendet, setzen Sie diese auf leer:

t_fmt_ampm ""
am_pm   "";""

Dem System bekannt machen

Bearbeiten Sie die Datei /var/lib/locales/supported.d/localund fügen Sie dort die Informationen zu Ihrer Gebietsschema-Definition hinzu. Fügen Sie also eine Zeile wie diese hinzu, wenn Ihr Dateiname oben war isodate, und passen Sie sie anders an:

de_DE.UTF-8@isodate UTF-8

Wenn /var/lib/locales/supported.d/localnicht vorhanden, erstellen Sie eine Datei mit diesem Namen. Legen Sie Ihre Änderungen nicht in der entsprechenden enoder deDatei in diesem Ordner ab, da diese möglicherweise überschrieben werden, sobald die Pakete language-pack-*-baseund language-pack-*auf Ihrem System ein Update erhalten.

Führen Sie jetzt aus dpkg-reconfigure locales:

# dpkg-reconfigure locales
Generating locales...
  de_DE.UTF-8@isodate... done
  de_DE.UTF-8... up-to-date
Generation complete.

In Ihrem Fall zeigt dies an, dass das de_DE.UTF-8@isodateGebietsschema generiert wurde (vorausgesetzt, Sie haben keine Syntaxprobleme).

Zu guter Letzt fügen Sie Folgendes hinzu /etc/default/locale:

LC_TIME="de_DE.UTF-8@isodate"

Dadurch wird sichergestellt, dass nur LC_TIME das mit definierte Standardgebietsschema überschrieben wird LANG.

Melden Sie sich erneut an und Sie sollten in der Lage sein, das neue ISO-Datum / die neue ISO-Uhrzeit zu sehen, wenn Sie dateoder andere Tools verwenden, die die entsprechende libc-Laufzeitfunktion verwenden.


Die Absicht hier ist, die am wenigsten aufdringliche Änderung vorzunehmen, ohne gleichzeitig gegen das System zu arbeiten (z. B. gegen Paketmanager und Freunde). Natürlich können Sie auch einfach eine Kopie Ihres Gebietsschemas erstellen, es auf ähnliche Weise wie oben beschrieben installieren und dann anpassen LANG. Der Punkt ist, solange Sie das Risiko von Änderungen durch eine Paket - Update überschrieben nicht ausführen möchten, Sie haben eine angepasste Kopie zu verwenden (was auch immer die individuell gestaltet werden Sie gehen, das heißt copyoder einfach die Abschnitte halten , wie sie waren in das Original). Und ob Sie LANGauf die vollständige benutzerdefinierte Gebietsschemadefinition verweisen - oder ob Sie hinzufügen LC_TIME Wenn Sie nur auf den entsprechenden benutzerdefinierten Abschnitt mit demselben Namen einer benutzerdefinierten Gebietsschema-Definitionsdatei verweisen, können Sie eine der globalen Einstellungen nicht anpassen.

0xC0000022L
quelle
3
Als Best Practice würden Sie Ihr Gebietsschema mit @something like ergänzen en_US.UTF-8@isodate.
Stéphane Chazelas
@ StéphaneChazelas: Hah! Genial. Aber dann kann man nicht copydas LC_IDENTIFICATIONund wie würde das Auswirkungen auf die Benennung der Dateien und wie Sie mit den Lokalisierungs verweisen /etc/default/localeund /var/lib/locales/supported.d/localjeweils? Können Sie sagen?
0xC0000022L
1
Sie würden eine en_US@isodateDefinitionsdatei erstellen und verwenden localedef, um die richtigen Dateien zu erstellen. Weitere Informationen finden Sie unter sourceware.org/git/?p=glibc.git;a=blob;f=localedata/README (und sourceware.org/git/?p=glibc.git;a=blob;f=localedata/locales/). … Zum Beispiel).
Stephen Kitt
1
Ja, auf jeden Fall möchten Sie den Abschnitt LC_IDENTIFICATION (en_US @ isodate) ändern, da es sich um ein anderes Gebietsschema handelt. Der Befehl end lautet localedef -i en_US@isodate -f UTF-8 en_US.UTF-8@isodate: Ich bin mir bei der Debian-spezifischen Konfiguration nicht sicher. Mein Kommentar war hauptsächlich, wie um das Gebietsschema zu benennen.
Stéphane Chazelas
1
Soweit ich weiß, würden Sie unter Debian Ihre Gebietsschema-Definition /usr/local/share/i18n/localeshinzufügen, die unterstützten Gebietsschema / Charmap-Paare hinzufügen /usr/local/share/i18n/SUPPORTEDund ausführen dpkg-reconfigure locales(siehe auch /etc/locale.gen).
Stephen Kitt