Última actualización: 04 de diciembre de 2023

10.4. locale — Servicios de internacionalización

Nota

Propósito: Formateo según la configuración regional

El módulo locale abre el acceso a la base de datos y la funcionalidad de POSIX locale. El mecanismo POSIX locale permite a los programadores tratar ciertos problemas culturales en una aplicación, sin requerir que el programador conozca todos los detalles de cada país donde se ejecuta el software.

El módulo locale se implementa en la parte superior del módulo _locale, que a su vez utiliza una implementación de configuración regional ANSI C si está disponible.

Uso del módulo locale:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from datetime import datetime
import locale

datos_basicos = {
    "nombres": "Leonardo Jose",
    "apellidos": "Caballero Garcia",
    "cedula": "26938401",
    "fecha_nacimiento": "03121980",
    "lugar_nacimiento": "Maracaibo, Zulia, Venezuela",
    "nacionalidad": "Venezolana",
    "estado_civil": "Soltero",
}

dia = datos_basicos["fecha_nacimiento"][0:2]
mes = datos_basicos["fecha_nacimiento"][2:4]
ano = datos_basicos["fecha_nacimiento"][4:8]

locale.setlocale(locale.LC_TIME, "")
locale.nl_langinfo(locale.MON_12).capitalize()

try:
    locale.setlocale(locale.LC_ALL, "es_VE.UTF-8")
except locale.Error as err:
    print(f"No reconoce esa configuración de locales ({err})")

fn_traducida = datetime(int(ano), int(mes), int(dia))
print(fn_traducida.strftime("%A, %d. %B %Y %I:%M%p"))

El anterior código al ejecutar debe mostrar el siguiente mensaje:

miércoles, 03. diciembre 1980 12:00am

Jugando con el módulo locale en el ipython:

In [1]: import locale

In [2]: locale.setlocale(locale.LC_TIME,'')
Out[3]: 'es_VE.UTF-8'

In [3]: locale.nl_langinfo(locale.MON_12).capitalize()
Out[3]: 'Diciembre'

In [4]: dir(locale)
Out[4]:
['ABDAY_1',
 'ABDAY_2',
 'ABDAY_3',
 'ABDAY_4',
 'ABDAY_5',
 'ABDAY_6',
 'ABDAY_7',
 'ABMON_1',
 'ABMON_10',
 'ABMON_11',
 'ABMON_12',
 'ABMON_2',
 'ABMON_3',
 'ABMON_4',
 'ABMON_5',
 'ABMON_6',
 'ABMON_7',
 'ABMON_8',
 'ABMON_9',
 'ALT_DIGITS',
 'AM_STR',
 'CHAR_MAX',
 'CODESET',
 'CRNCYSTR',
 'DAY_1',
 'DAY_2',
 'DAY_3',
 'DAY_4',
 'DAY_5',
 'DAY_6',
 'DAY_7',
 'D_FMT',
 'D_T_FMT',
 'ERA',
 'ERA_D_FMT',
 'ERA_D_T_FMT',
 'ERA_T_FMT',
 'Error',
 'LC_ALL',
 'LC_COLLATE',
 'LC_CTYPE',
 'LC_MESSAGES',
 'LC_MONETARY',
 'LC_NUMERIC',
 'LC_TIME',
 'MON_1',
 'MON_10',
 'MON_11',
 'MON_12',
 'MON_2',
 'MON_3',
 'MON_4',
 'MON_5',
 'MON_6',
 'MON_7',
 'MON_8',
 'MON_9',
 'NOEXPR',
 'PM_STR',
 'RADIXCHAR',
 'THOUSEP',
 'T_FMT',
 'T_FMT_AMPM',
 'YESEXPR',
 '__all__',
 '__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__spec__',
 '_append_modifier',
 '_build_localename',
 '_builtin_str',
 '_format',
 '_group',
 '_grouping_intervals',
 '_localeconv',
 '_override_localeconv',
 '_parse_localename',
 '_percent_re',
 '_print_locale',
 '_replace_encoding',
 '_setlocale',
 '_strcoll',
 '_strip_padding',
 '_strxfrm',
 '_test',
 'atof',
 'atoi',
 'bind_textdomain_codeset',
 'bindtextdomain',
 'collections',
 'currency',
 'dcgettext',
 'delocalize',
 'dgettext',
 'encodings',
 'format',
 'format_string',
 'functools',
 'getdefaultlocale',
 'getlocale',
 'getpreferredencoding',
 'gettext',
 'k',
 'locale_alias',
 'locale_encoding_alias',
 'localeconv',
 'nl_langinfo',
 'normalize',
 're',
 'resetlocale',
 'setlocale',
 'str',
 'strcoll',
 'strxfrm',
 'sys',
 'textdomain',
 'v',
 'windows_locale']

In [4]: import datetime

In [5]: dt = datetime.datetime(2015, 11, 15, 16, 30)

In [6]: dt
Out[6]: datetime.datetime(2015, 11, 15, 16, 30)

In [7]: locale.setlocale(locale.LC_ALL, "es_VE.UTF-8")
Out[7]: 'es_VE.UTF-8'

In [8]: print(dt.strftime("%A, %d. %B %Y %I:%M%p"))
domingo, 15. noviembre 2015 04:30pm

In [9]: import os

In [10]: os.environ['LANG']
Out[10]: 'es_VE.UTF-8'

In [11]: locale.setlocale(locale.LC_ALL, "")
Out[11]: 'es_VE.UTF-8'

In [12]: locale.setlocale(locale.LC_ALL, "es_VE.UTF-8")
Out[12]: 'es_VE.UTF-8'

In [13]: locale.setlocale(locale.LC_ALL, str(locale.getlocale()[0]) + "." + str(locale.getlocale()[1]))
Out[13]: 'es_VE.UTF-8'

Ver también

Consulte la sección de lecturas suplementarias del entrenamiento para ampliar su conocimiento en esta temática.