Cambiar una definición de configuración regional (en lugar de una configuración regional)

8

Observación preliminar : Esta pregunta es no sobre el establecimiento de un local cambiando LC_ALL, LC_TIME, LANG, etc, es bastante acerca de cómo cambiar una configuración regional de definición , por ejemplo, en /usr/share/i18n/locales/de_DE, o, respectivamente, para obtener sugerencias acerca de las opciones más apropiadas que cambiar los ajustes del sistema.

La intención es obtener representaciones de tiempo ISO %Y-%m-%d y %H:%M:%Ssin efectos secundarios no deseados.

Las sugerencias que encontré en la red todavía eran inapropiadas (por ejemplo, establecer la configuración regional en "danés" no mantendrá los nombres de los días de la semana escritos en el idioma nativo).

Ahora, la única opción que veo actualmente para obtener el comportamiento deseado es cambiar la definición de mi ubicación nativa en /usr/share/i18n/locales/de_DE. Esta no es una solución perfecta ya que con las actualizaciones del sistema, esos archivos modificados pueden sobrescribirse nuevamente.

Mis preguntas son:

  1. ¿Existen mejores opciones relacionadas con la configuración regional para obtener la función deseada que cambiar el archivo de configuración regional del sistema específico?
  2. ¿Hay algún problema que esperar al cambiar un archivo de definición de configuración regional específico? (¿Y cómo podría evitarse que este archivo se sobrescriba en caso de actualizaciones del sistema?)
  3. ¿Sería mejor definir una nueva variante específica de un archivo de configuración regional existente y usarla en la LC_*configuración? (¿Y cómo el nuevo archivo / definición se daría a conocer correctamente al sistema?)
  4. ¿Cualquier otra sugerencia?
Janis
fuente
Le sugiero que copie el archivo de configuración regional que le interesa, déle a esa copia un nombre único (por ejemplo, en_XX- No sé cuáles son las restricciones aquí, la prueba y el error pueden ser suficientes), realice los cambios que desee y úsalo como configuración regional. Vas a tener que regenerar la lista o lo que sea después, etc
GOLDILOCKS
1
Es posible que desee leer mi pregunta , que contiene detalles sobre lo que hice. Todavía tengo que empaquetarlo, pero por ahora esto funciona bastante bien. Basta con establecer LC_TIME(en /etc/environmento /etc/default/locale, o /etc/locale.confen función de distribución) a la configuración regional modificado (llamé a la mina isodate.UTF-8) y el formato respectivo ser recogido de esa localidad personalizado por sólo hora / fecha. Así es como personalicé mi en_USconfiguración para mostrar la fecha / hora ISO.
0xC0000022L
1
@ Janis: en Debian y Ubuntu también querrá poner el nombre de su configuración regional /var/lib/locales/supported.d/local(o uno de los otros archivos allí) y ejecutarlo dpkg-reconfigure localescomo superusuario para que se compile la definición de la configuración regional. Y sí, configurarLC_TIME para apuntar a una configuración regional personalizada parece ser el método menos intrusivo de todo lo que he visto hasta ahora. Es por eso que su sistema tiene una configuración global donde LC_TIMEse puede configurar de forma diferente a la "configuración regional general".
0xC0000022L
@ 0xC0000022L; Tu experiencia aquí es muy valiosa. Con las sugerencias hasta ahora, buscaré un nuevo archivo de configuración regional. Todavía estoy indeciso sobre si debo usar el copyenfoque de secciones activas o mantener otras secciones redundantes (para poder diffcontra el archivo original).
Janis

Respuestas:

5

En una pregunta reciente , pregunté cuál es la mejor práctica para este tipo de cambio. No hubo respuesta todavía. Sin embargo, puedo darle la receta que estoy usando, que ha demostrado funcionar bien. Todos los programas recogen la fecha correctamente.

Mi descripción es para Ubuntu, pero probablemente funcionará en Debian y Mint.

Preparativos

Copie la configuración regional desde la que desea personalizar /usr/share/i18n/localesa un nuevo archivo. P.ej

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

Ajuste todo con la excepción de las LC_TIMEsecciones a:

copy "de_DE"

Ajuste la LC_TIMEsección para que coincida con el resultado deseado. Puede usar la configuración de mi pregunta vinculada anterior como plantilla. Parece que esto es exactamente lo que quieres.

Si su configuración regional no utiliza la notación "AM / PM", configúrelas para que se vacíen:

t_fmt_ampm ""
am_pm   "";""

Darlo a conocer al sistema

Edite el archivo /var/lib/locales/supported.d/localy agregue la información sobre su definición de configuración regional allí. Es decir, agregue una línea como esta si su nombre de archivo anterior era isodate, ajústelo de otra manera:

de_DE.UTF-8@isodate UTF-8

Si /var/lib/locales/supported.d/localno existe, cree un archivo con ese nombre. No ponga los cambios en el respectivo eno dearchivo en esa carpeta, ya que pueden obtener sobrescribe tan pronto como el language-pack-*-basey language-pack-*paquetes en el sistema recibe una actualización.

Ahora ejecuta dpkg-reconfigure locales:

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

En su caso, esto indicará que de_DE.UTF-8@isodatese ha generado la configuración regional (suponiendo que no tenga problemas de sintaxis).

Por último, pero no menos importante, agregue lo siguiente a /etc/default/locale:

LC_TIME="de_DE.UTF-8@isodate"

Esto garantizará que solo LC_TIME anule la configuración regional predeterminada definida mediante LANG.

Inicie sesión de nuevo y debería poder ver la nueva fecha / hora ISO cuando use dateu otras herramientas que usen la función de tiempo de ejecución libc respectiva.


La intención aquí es hacer el cambio menos intrusivo sin trabajar contra el sistema (por ejemplo, contra el administrador de paquetes y amigos). Por supuesto, también puede simplemente crear una copia de su configuración regional, instalarla de una manera similar a la descrita anteriormente y luego ajustarla LANG. El punto es que, mientras no quiera correr el riesgo de que sus cambios se sobrescriban con una actualización del paquete, debe usar una copia personalizada (cualquiera sea la personalización que elija; es decir, copyo simplemente mantener las secciones como estaban en el original). Y si cambia LANGpara apuntar a la definición regional personalizada completa , o si agrega LC_TIME para apuntar solo a la sección personalizada relevante del mismo nombre de un archivo de definición de configuración regional personalizada: no podrá ajustar una de las configuraciones globales.

0xC0000022L
fuente
3
Como práctica recomendada, sufre su ubicación con @algo parecido en_US.UTF-8@isodate.
Stéphane Chazelas
@ StéphaneChazelas: ¡Ja! Increíble. Sin embargo, entonces no puede copyel LC_IDENTIFICATIONy cómo afectaría eso a los nombres de los archivos y cómo se hace referencia a la configuración regional en /etc/default/localey /var/lib/locales/supported.d/localrespectivamente? ¿Puedes decir?
0xC0000022L
1
Crearía un en_US@isodatearchivo de definición y lo usaría localedefpara producir los archivos correctos; ver sourceware.org/git/?p=glibc.git;a=blob;f=localedata/README para más detalles (y sourceware.org/git/?p=glibc.git;a=blob;f=localedata/locales/ ... por un ejemplo).
Stephen Kitt
1
Sí, en cualquier caso, desearía cambiar la sección LC_IDENTIFICATION (en_US @ isodate) ya que es una configuración regional diferente. El comando final sería localedef -i en_US@isodate -f UTF-8 en_US.UTF-8@isodate, no estoy seguro acerca de la configuración específica de Debian, mi comentario fue principalmente sobre cómo para nombrar la localidad.
Stéphane Chazelas
1
Según tengo entendido, en Debian agregaría su definición de configuración regional /usr/local/share/i18n/locales, agregaría los pares de configuración regional / mapa de caracteres compatibles /usr/local/share/i18n/SUPPORTEDy ejecutaría dpkg-reconfigure locales(ver también /etc/locale.gen).
Stephen Kitt