Modifica una definizione locale (anziché un'impostazione locale)


8

Premessa : Questa domanda è non è riguardo l'impostazione di un locale cambiando LC_ALL, LC_TIME, LANG, ecc, è piuttosto di cambiare un locale definizione , ad esempio in /usr/share/i18n/locales/de_DE, o, rispettivamente, per ottenere suggerimenti sulle opzioni più appropriate che cambiare le impostazioni del sistema.

L' intento è quello di ottenere rappresentazioni temporali ISO %Y-%m-%d e %H:%M:%Ssenza effetti collaterali indesiderati.

I suggerimenti che ho trovato in rete erano ancora tutti inappropriati (ad esempio, l'impostazione della lingua su "danese" non manterrà i nomi dei giorni della settimana scritti nella lingua madre).

Ora l'unica scelta che vedo attualmente per ottenere il comportamento desiderato è quella di cambiare la definizione della mia locale nativa /usr/share/i18n/locales/de_DE. Questa non è una soluzione perfetta poiché con gli aggiornamenti di sistema quei file modificati possono essere sovrascritti di nuovo.

Le mie domande sono:

  1. Esistono opzioni relative alle impostazioni internazionali migliori per ottenere la funzione desiderata rispetto alla modifica del file delle impostazioni internazionali di sistema specifico?
  2. Ci sono problemi da aspettarsi quando si modifica un file di definizione locale specifico? (E come si può impedire che questo file venga sovrascritto in caso di aggiornamenti di sistema?)
  3. Sarebbe meglio definire una nuova variante specifica di un file locale esistente e usarla nelle LC_*impostazioni? (E come sarebbe possibile far conoscere correttamente il nuovo file / definizione al sistema?)
  4. Qualche altro suggerimento?

Ti suggerirei di copiare il file locale che ti interessa, dare a quella copia un nome univoco (ad es. en_XX- Non so quali siano le restrizioni qui, prova ed errore potrebbero essere sufficienti), apportare qualsiasi modifica tu voglia a quello e usalo come locale. Dovrai rigenerare l'elenco o qualsiasi altra cosa in seguito, ecc.
Riccioli d'oro,

1
Potresti voler leggere la mia domanda , che contiene dettagli su ciò che ho fatto. Devo ancora impacchettarlo, ma per ora funziona abbastanza bene. È sufficiente impostare LC_TIME(in /etc/environmento /etc/default/localeo /etc/locale.confseconda distro) alla locale modificato (ho chiamato mia isodate.UTF-8) e il rispettivo formato andranno raccolti da quello locale personalizzato per solo il tempo / data. In questo modo ho personalizzato le mie en_USimpostazioni altrimenti per visualizzare la data / ora ISO.
0xC0000022L

1
@Janis: su Debian e Ubuntu vorrai anche inserire il nome del tuo locale /var/lib/locales/supported.d/local(o uno degli altri file lì dentro) ed eseguire dpkg-reconfigure localescome superutente per la definizione del locale da compilare. E sì, l' impostazioneLC_TIME per puntare a una localizzazione personalizzata sembra essere il metodo meno invadente di tutto ciò che ho visto finora. Ecco perché il tuo sistema ha impostazioni globali in cui LC_TIMEpuò essere impostato diverso dalla "localizzazione generale".
0xC0000022L

@ 0xC0000022L; La tua esperienza qui è molto preziosa. Con i suggerimenti finora, andrò per un nuovo file locale. Sono ancora indeciso se dovrei usare l' copyapproccio sulle sezioni o mantenere ridondanti le altre sezioni (in modo da poter fare diffcontro il file originale).
Janis,

Risposte:


5

In una domanda recente ho chiesto qual è la migliore pratica per questo tipo di cambiamento. Non c'era ancora risposta. Tuttavia, posso darti la ricetta che sto usando, che ha dimostrato di funzionare bene. Tutti i programmi raccolgono la data correttamente.

La mia descrizione è per Ubuntu, ma probabilmente funzionerà su Debian e Mint.

preparativi

Copia la locale che desideri personalizzare /usr/share/i18n/localesin un nuovo file. Per esempio

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

Regola tutto ad eccezione delle LC_TIMEsezioni per:

copy "de_DE"

Regola la LC_TIMEsezione in base al risultato desiderato. È possibile utilizzare le impostazioni dalla mia domanda collegata sopra come modello. Sembra che questo sia esattamente quello che vuoi.

Se la tua locale non utilizza la notazione "AM / PM", impostale come vuota:

t_fmt_ampm ""
am_pm   "";""

Facendolo conoscere al sistema

Modifica il file /var/lib/locales/supported.d/locale aggiungi le informazioni sulla definizione della tua locale. Vale a dire aggiungere una riga come questa se il nome del file sopra era isodate, regolare altrimenti:

de_DE.UTF-8@isodate UTF-8

Se /var/lib/locales/supported.d/localnon esiste, crea un file con quel nome. Non inserire le modifiche nel rispettivo file eno dein quella cartella, in quanto potrebbero essere sovrascritte non appena i pacchetti language-pack-*-basee language-pack-*sul sistema ricevono un aggiornamento.

Ora esegui dpkg-reconfigure locales:

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

Nel tuo caso questo indicherà che la de_DE.UTF-8@isodatelocalizzazione è stata generata (supponendo che tu non abbia problemi di sintassi).

Ultimo ma non meno importante aggiungere quanto segue a /etc/default/locale:

LC_TIME="de_DE.UTF-8@isodate"

Ciò assicurerà che sovrascriva solo LC_TIME le impostazioni internazionali predefinite definite utilizzando LANG.

Accedi di nuovo e dovresti essere in grado di vedere la nuova data / ora ISO quando usi dateo altri strumenti usando la rispettiva funzione di runtime libc.


L'intento qui è di apportare il minimo cambiamento invasivo pur non lavorando contro il sistema (ad esempio contro il gestore di pacchetti e gli amici). Ovviamente puoi anche semplicemente creare una copia della tua locale, installarla in modo simile come indicato sopra e quindi regolare LANG. Il punto è che, purché non si desideri correre il rischio che le modifiche vengano sovrascritte da un aggiornamento del pacchetto, è necessario utilizzare una copia personalizzata (qualunque sia la personalizzazione desiderata; ovvero, copyo semplicemente conservare le sezioni così come erano in l'originale). E se si cambia LANGper puntare alla definizione di locale personalizzata completa o se si aggiunge LC_TIME per indicare solo la sezione personalizzata pertinente con lo stesso nome di un file di definizione delle impostazioni internazionali personalizzato: non si potrà aggirare la regolazione di una delle impostazioni globali.


3
Come best practice, è sufficiente aggiungere il suffisso locale a @something like en_US.UTF-8@isodate.
Stéphane Chazelas,

@ StéphaneChazelas: Hah! Eccezionale. Tuttavia, quindi non è possibile copyil LC_IDENTIFICATIONe in che modo ciò influirebbe sulla denominazione dei file e su come fare riferimento alla locale in /etc/default/localee /var/lib/locales/supported.d/localrispettivamente? Puoi dire?
0xC0000022L

1
Dovresti creare un en_US@isodatefile di definizione e utilizzarlo localedefper produrre i file corretti; vedi sourceware.org/git/?p=glibc.git;a=blob;f=localedata/README per i dettagli (e sourceware.org/git/?p=glibc.git;a=blob;f=localedata/locales/ ... per un esempio).
Stephen Kitt,

1
Sì, in ogni caso, vorresti cambiare la sezione LC_IDENTIFICATION (en_US @ isodate) dato che è una locale diversa, Il comando finale sarebbe localedef -i en_US@isodate -f UTF-8 en_US.UTF-8@isodate, non sono sicuro della configurazione specifica di Debian, il mio commento era principalmente su come per nominare la locale.
Stéphane Chazelas,

1
A quanto ho capito, su Debian aggiungeresti la tua definizione locale /usr/local/share/i18n/locales, aggiungere le coppie locali / charmap supportate /usr/local/share/i18n/SUPPORTEDed eseguire dpkg-reconfigure locales(vedi anche /etc/locale.gen).
Stephen Kitt,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.