Wie kann ich ein Systemgebietsschema anpassen?

24

Unter System Administration Sprachunterstützung Text. Ich kann nur Standard-Gebietsschemas auswählen, möchte aber eine Feinabstimmung vornehmen. Zum Beispiel könnte ich in Windows Dinge wie Zeit- und Datumsformat, Maßeinheiten, Dezimaltrennzeichen, Währung usw. manuell anpassen - wie kann ich das in Ubuntu tun?

Ivan
quelle

Antworten:

28

Diese Antwort zeigt, wie ein Gebietsschema vollständig angepasst werden kann, wobei optional ein vorhandenes Gebietsschema als Basis verwendet wird. Der Typ des Gebietsschemas, der in dieser Antwort verwendet wird, ist der i18nTyp. Diese Art von Gebietsschema wird bei jeder Erwähnung des Wortes "Gebietsschema" im Hauptteil der Antwort impliziert.

Finde einen Führer

Um ein Gebietsschema anzupassen, müssen Sie zunächst das Format des Gebietsschemas kennen. Dieser Web-Gebietsschema-Editor enthält eine umfassende Beschreibung aller Felder eines Gebietsschemas, auch wenn sie nicht sofort von allen Benutzern verwendet werden können. Dies wird die zu verwendende Anleitung sein.

Benötigte Werkzeuge

Die einzigen Tools, die Sie zum Arbeiten mit Gebietsschemas benötigen, sind

  1. Ein Texteditor. Jeder wird es tun, obwohl VIM ausgezeichnet sein wird.
  2. Ein Text-zu-Unicode-Konverter. Es wird am meisten erwartet, dass Sie keinen hatten, also werde ich Ihnen einen einfachen zur Verfügung stellen. Lesen Sie den nächsten Unterabschnitt, um es zu erhalten.

Ich empfehle Ihnen, ein Verzeichnis zu erstellen und alles zu speichern, was mit der Arbeit zusammenhängt, die Sie am Gebietsschema ausführen werden.

Text-zu-Unicode-Konverter (encodestr)

HINWEIS: Wenn Sie ungewöhnliche Zeichen verwenden , kann es sein, dass Sie Probleme mit dem Skript haben, das ich unten schreibe. Vielleicht möchten Sie sich die alternativen Skripte ansehen, die mit nass verknüpft sind .

Speichern Sie den folgenden Code in einer Datei. Diese Datei wird von Ihrem System als Python-Skript identifiziert, was in Ordnung ist, weil es eines ist. In diesem Handbuch wird davon ausgegangen, dass Sie das Skript aufgerufen haben encodestr.

#!/usr/bin/python

def encode(string):
    newstring = str()
    for ch in string:
        newstring += "<U%04X>" % ord(ch)
    return newstring

if __name__ == '__main__':
    import sys
    print encode(sys.argv[1])

Nachdem Sie es gespeichert haben, geben Sie die Dateiausführungserlaubnis - dies wird nützlich sein. Sie können tun , dass die Verwendung von nautilus, oder durch von einem Terminal folgenden Befehl ausgeführt wird , auf dem Verzeichnis , in dem Sie das Skript gespeichert: chmod +x encodestr.

Sie können nun dieses Skript testen auf dem gleichen Verzeichnis , indem Sie: ./encodestr hello. Sie sollten eine Ausgabe gleich bekommen <U0068><U0065><U006C><U006C><U006F>.

Ändern Sie ein vorhandenes Gebietsschema

Das Ändern eines vorhandenen Gebietsschemas ist der einfachste Fall, da Sie im Idealfall ein Gebietsschema auswählen, das fast vollständig Ihren Anforderungen entspricht. In diesem Fall müssen Sie nur geringfügige Änderungen vornehmen. Zum Anpassen können Sie anhand der Anleitung ermitteln, welche Abschnitte Sie ändern möchten und wie Sie sie ändern können. Alle installierten Gebietsschemas befinden sich in /usr/share/i18n/locales, das Handbuch enthält jedoch so ziemlich jedes Gebietsschema, das jemals erstellt wurde.

Das Erste, was Sie jedoch bemerken, wenn Sie ein Gebietsschema öffnen, ist, dass Sie englische Wörter genauso gut lesen wie seltsame <UXXXX>Codes. Sie müssen in der Lage sein, diese Codes zu erstellen - hier kommt das encodestrSkript.

Wenn Sie wissen, welche Abschnitte Sie ändern müssen, müssen Sie jedes Feld im Abschnitt kennen.

Zum Beispiel LC_TIMEenthält der Abschnitt das Feld t_fmtund viele andere. Jedes Feld hat eine eigene Beschreibung in der Anleitung .

Nachdem Sie nun wissen, welche Felder geändert werden müssen, ermitteln Sie anhand der Anleitung erneut, welche Werte das Feld akzeptiert.

Das Feld t_fmtakzeptiert beispielsweise Text und die allgemeinen strfmt-Variablen .

Wenn Sie genau wissen, was Sie in die Felder schreiben müssen, die Sie ändern möchten, führen Sie den Text durch das encodestrSkript, um dessen kodiertes Äquivalent zu erhalten.

HINWEIS: Nicht jedes Feld muss codiert werden. Verwenden Sie bei Bedarf ein vorhandenes Gebietsschema als Referenz.

Wenn Sie beispielsweise das Zeitformat Time: %Tim t_fmtFeld haben möchten , führen Sie ./encodestr "Time: %T"Folgendes aus: Dies kehrt zurück <U0054><U0069><U006D><U0065><U003A><U0020><U0025><U0054>und Sie haben die Zeile t_fmt <U0054><U0069><U006D><U0065><U003A><U0020><U0025><U0054>in Ihrem Gebietsschema (natürlich in dem entsprechenden Abschnitt).

Nachdem Sie alle gewünschten Felder geändert haben, müssen Sie fortfahren, um das Gebietsschema auf dem System zu installieren, damit es verwendet werden kann. Fahren Sie dazu mit dem Installationsabschnitt fort.

Erstellen eines Gebietsschemas von Grund auf neu

Im Gegensatz zum Ändern eines Gebietsschemas können Sie das Gebietsschema auch mit einer anderen Methode von Grund auf neu erstellen. Dies ist nicht sehr schwierig, wenn Sie die Anleitung erneut verwenden . Hier ist ein nützlicher Tipp: Sie können Abschnitte aus anderen Gebietsschemas kopieren, ohne die eigentlichen Methoden zum Kopieren und Einfügen zu verwenden. Sie müssen nur dieses Format befolgen:

LC_SECTION
copy "locale"
END LC_SECTION

Wo LC_SECTIONbefindet sich der Abschnitt, den Sie ändern möchten, und localein welchem ​​Gebietsschema möchten Sie den Abschnitt kopieren?

Wenn Sie beispielsweise das Zeitformat in das englische Gebietsschema kopieren möchten, lautet der Text Ihrer benutzerdefinierten Gebietsschemadatei:

LC_TIME
copy "en_GB"
END LC_TIME

Das erspart Ihnen viel Arbeit und stellt sicher, dass alle Änderungen am referenzierten Gebietsschema für Sie übernommen werden.

Installieren Ihres benutzerdefinierten Gebietsschemas

Die Schritte, die ich unten zeigen werde, sind möglicherweise nicht optimal, funktionieren aber.

  1. Kompilieren Sie Ihr Gebietsschema. Keine Panik! Das braucht keine Zeit. Führen Sie einfach den Befehl sudo localedef -i custom -f UTF-8 custom.UTF-8 -c -vmit customdem Namen Ihres Gebietsschemas aus.

  2. Kopieren Sie Ihr Gebietsschema in das /usr/share/i18n/locales/Verzeichnis. Sie müssen auf jeden Fall sudo priviledges , dies zu tun, und Sie können es mit dem Befehl tun , sudo cp locale /usr/share/i18n/locales/wenn localeder Dateiname des benutzerdefinierten Gebietsschema ist.

  3. Geben Sie Ihr Gebietsschema in an /var/lib/locales/supported.d/. Erstellen Sie beispielsweise einen Dateinamen /var/lib/locales/supported.d/asdund fügen Sie die Zeile hinzu custom UTF-8, wobei custom der Name Ihres Gebietsschemas ist.

  4. Führen Sie den Zauberbefehl aus. Ich weiß eigentlich nicht genau, was dieser Befehl bewirkt, aber es ist entscheidend. Rennen sudo locale-gen. Es ist sehr wahrscheinlich, dass Referenzen zu den verfügbaren Gebietsschemas generiert werden, wenn dies erforderlich ist.

  5. Weisen Sie Ihr System an, das Gebietsschema zu verwenden. Wenn Sie möchten, dass das Gebietsschema systemweit verwendet wird, ändern Sie die /etc/environmentDatei. Ist dies nicht der Fall, können Sie Ihre ~/.profileDatei oder eine andere Datei ändern , die beim Start bezogen wird. Wenn Sie nicht wissen, was letzteres bedeutet, machen Sie sich keine Sorgen, verwenden Sie einfach die ~/.profileDatei. Um zu wissen, was Sie darin schreiben müssen, führen Sie zuerst den localeBefehl aus. Es sollte eine Liste mit Gegenständen wie auszustellen LANGUAGE, LC_MESSAGES, LC_CTYPEund vielen anderen. Sie schreiben, für jeden der Abschnitte , die Sie (aufgeführt von dem vorherigen Befehl) wollen, auf separaten Linien, dies SECTION="locale"wo SECTIONder Abschnitt ist und localeder Name Ihres benutzerdefinierten locale.

Wenn Sie beispielsweise das Zeitformat aus den Niederlanden, aber die englische Sprache verwenden möchten, schreiben Sie:

LANGUAGE="en_GB:en"
LC_TIME="nl_NL"

HINWEIS: Wenn Sie ein Gebietsschema für jede Gebietsschemaeinstellung verwenden möchten, schreiben Sie, LC_ALL="locale"wo localeder Name Ihres benutzerdefinierten Gebietsschemas ist. Wenn Sie ein Gebietsschema für alles außer für die Sprache verwenden möchten, können Sie schreiben LANG="locale"und (natürlich LANGUAGE="locale":XXin einer anderen Zeile) XXden 2-Buchstaben-Code für die gewünschte Sprache eingeben.

Wenn Sie beispielsweise das niederländische Gebietsschema und die englische Sprache verwenden möchten, können Sie Folgendes verwenden:

LANG="nl_NL"
LANGUAGE="nl_NL:en"

Du bist fertig

Wenn Sie sich das nächste Mal anmelden, sollte Ihr Gebietsschema verwendet werden. Sie können dies testen, indem Sie den localeBefehl erneut ausführen.

Bitte kommentieren Sie Inkonsistenzen oder falsche Angaben in diesem Handbuch!

Severo Raz
quelle
Hallo zusammen, Der verwendete Python-Code funktioniert nicht in allen Fällen. Bei griechischen Zeichen πμwerden <U00CF><U0080><U00CE><U00BC>anstelle der erwarteten Zeichen ausgegeben <U03C0><U03BC>. Hier ist ein Link , der funktioniert.
nass
Danke für deinen Beitrag! Ich habe Ihren Kommentar in den Text eingefügt, in dem er fällig war :)
Severo Raz
Ich musste hinzufügen custom UTF-8, /usr/share/i18n/SUPPORTEDbevor ich rennen konnte sudo locale-gen. Sonst wäre es nicht in der Liste.
Wilbert
Kopieren Sie Ihre String-Konvertierungsmethode in meine Shell-Scripts-Sammlung: github.com/budhajeewa/shell-scripts/commit/… . Vielen Dank!
Budhajeewa
Wenn jemand nach einer Funktion sucht, mit der die Methode in dieser Antwort umgekehrt werden kann (ich brauchte sie, um vorhandene Hex-Werte in Gebietsschemadateien zu lesen.), Habe ich ein PHP-Skript dafür geschrieben. github.com/budhajeewa/shell-scripts/commit/… . Wenn jemand es in Python schreiben kann, lass es mich wissen. Ich möchte das zu meiner Sammlung hinzufügen.
Budhajeewa
8

Sie sind sich nicht sicher, welche Art von Anpassung Sie wünschen, aber Sie können einige Gebietsschemavariablen mithilfe von festlegen ~/.locale. Zum Beispiel, um englische Nachrichten zu bekommen, aber deutsche Zeit und dergleichen, die ich benutze

export LC_ALL=""
export LANG="en_GB.utf8"
export LC_CTYPE="de_DE.utf8"
export LC_NUMERIC="de_DE.utf8"
export LC_TIME="de_DE.utf8"
export LC_COLLATE="de_DE.utf8"
export LC_MONETARY="de_DE.utf8"
export LC_MESSAGES="en_GB.utf8"
export LC_PAPER="de_DE.utf8"
export LC_NAME="en_GB.utf8"
export LC_ADDRESS="de_DE.utf8"
export LC_TELEPHONE="de_DE.utf8"
export LC_MEASUREMENT="de_DE.utf8"
export LC_IDENTIFICATION="de_DE.utf8"

Das Generieren von benutzerdefinierten Gebietsschemas ist ebenfalls möglich. Siehe zB diesen Leitfaden für Daten.

Carsten Thiel
quelle
1
Nein, ich möchte eine Anpassung auf einer niedrigeren Ebene. Zum Beispiel: Englische Nachrichten, metrische Einheiten, modifiziertes tschechisches Datum / Uhrzeit (TT.MM.JJJJ HH: mm anstelle von DMYYYY H.MM), ein Punkt als Dezimaltrennzeichen (in der tschechischen Ländereinstellung gibt es dafür ein Komma) und € als Währung (in tschechischer Sprache gibt es Kč-Währung).
Ivan
Aha. Nehmen en_USfür LC_NUMERICund de_DEfür LC_MONETARYund LC_MEASUREMENTgibt Ihnen andere Nebenwirkungen? Siehe auch den neuen Link zum Generieren eines persönlichen Gebietsschemas.
Carsten Thiel
1
die anweisungen hinter dem link scheinen die frage wunderbar zu beantworten, vielleicht könntest du hier die wichtigsten bits nachbilden, falls der link eines tages nicht erreichbar sein sollte?
Stefano Palazzo