locale — Interfaz de programación de localización cultural¶
Propósito: | Formatea y analiza valores que dependen de la ubicación o el idioma. |
---|
El módulo locale
es parte de la biblioteca de soporte de
internacionalización y localización de Python. Proporciona una forma estándar
de manejar operaciones que pueden depender del idioma o la ubicación del
usuario. Por ejemplo, maneja formato de números como moneda, compara cadenas
para ordenar y trabaja con fechas. No cubre la traducción (consulte el módulo
gettext
) ni la codificación Unicode (consulte el módulo codecs
).
Nota
Cambiar el entorno local puede tener ramificaciones en toda la aplicación, por lo que la práctica recomendada es evitar cambiar el valor en una biblioteca y dejar que la aplicación lo configure una vez. En los ejemplos de esta sección, la configuración regional se cambia varias veces dentro de un breve programa para resaltar las diferencias en la configuración de varias configuraciones regionales. Es mucho más probable que una aplicación establezca la configuración regional una vez que se inicia o cuando se recibe una solicitud web y no la cambia.
Esta sección cubre algunas de las funciones de alto nivel en el módulo
locale
. Hay otros que son de nivel inferior (format_string()
) o que se
relacionan con la administración de la configuración regional para una
aplicación (resetlocale()
).
Sondeo de la configuración regional actual¶
La forma más común de permitir que el usuario cambie la configuración regional
de una aplicación es a través de una variable de entorno (LC_ALL
,
LC_CTYPE
, LANG
o LANGUAGE
, dependiendo de la plataforma). Luego,
la aplicación llama a setlocale()
sin un valor codificado, y se utiliza el
valor del entorno.
import locale
import os
import pprint
# Default settings based on the user's environment.
locale.setlocale(locale.LC_ALL, '')
print('Environment settings:')
for env_name in ['LC_ALL', 'LC_CTYPE', 'LANG', 'LANGUAGE']:
print(' {} = {}'.format(
env_name, os.environ.get(env_name, ''))
)
# What is the locale?
print('\nLocale from environment:', locale.getlocale())
template = """
Numeric formatting:
Decimal point : "{decimal_point}"
Grouping positions : {grouping}
Thousands separator: "{thousands_sep}"
Monetary formatting:
International currency symbol : "{int_curr_symbol!r}"
Local currency symbol : {currency_symbol!r}
Symbol precedes positive value : {p_cs_precedes}
Symbol precedes negative value : {n_cs_precedes}
Decimal point : "{mon_decimal_point}"
Digits in fractional values : {frac_digits}
Digits in fractional values,
international : {int_frac_digits}
Grouping positions : {mon_grouping}
Thousands separator : "{mon_thousands_sep}"
Positive sign : "{positive_sign}"
Positive sign position : {p_sign_posn}
Negative sign : "{negative_sign}"
Negative sign position : {n_sign_posn}
"""
sign_positions = {
0: 'Surrounded by parentheses',
1: 'Before value and symbol',
2: 'After value and symbol',
3: 'Before value',
4: 'After value',
locale.CHAR_MAX: 'Unspecified',
}
info = {}
info.update(locale.localeconv())
info['p_sign_posn'] = sign_positions[info['p_sign_posn']]
info['n_sign_posn'] = sign_positions[info['n_sign_posn']]
print(template.format(**info))
El método localeconv()
devuelve un diccionario que contiene las
convenciones de la configuración regional. La lista completa de nombres de
valores y definiciones está cubierta en la documentación estándar de la
biblioteca.
Una Mac con OS X 10.11.6 con todas las variables sin configurar produce esta salida:
$ export LANG=; export LC_CTYPE=; python3 locale_env.py
Environment settings:
LC_ALL =
LC_CTYPE =
LANG =
LANGUAGE =
Locale from environment: (None, None)
Numeric formatting:
Decimal point : "."
Grouping positions : []
Thousands separator: ""
Monetary formatting:
International currency symbol : "''"
Local currency symbol : ''
Symbol precedes positive value : 127
Symbol precedes negative value : 127
Decimal point : ""
Digits in fractional values : 127
Digits in fractional values,
international : 127
Grouping positions : []
Thousands separator : ""
Positive sign : ""
Positive sign position : Unspecified
Negative sign : ""
Negative sign position : Unspecified
Ejecutar la misma secuencia de comandos con el conjunto de variables LANG
muestra cómo cambian la configuración regional y la codificación
predeterminada.
Estados Unidos (en_US
):
$ LANG=en_US LC_CTYPE=en_US LC_ALL=en_US python3 locale_env.py
Environment settings:
LC_ALL = en_US
LC_CTYPE = en_US
LANG = en_US
LANGUAGE =
Locale from environment: ('en_US', 'ISO8859-1')
Numeric formatting:
Decimal point : "."
Grouping positions : [3, 3, 0]
Thousands separator: ","
Monetary formatting:
International currency symbol : "'USD '"
Local currency symbol : '$'
Symbol precedes positive value : 1
Symbol precedes negative value : 1
Decimal point : "."
Digits in fractional values : 2
Digits in fractional values,
international : 2
Grouping positions : [3, 3, 0]
Thousands separator : ","
Positive sign : ""
Positive sign position : Before value and symbol
Negative sign : "-"
Negative sign position : Before value and symbol
Francia (fr_FR
):
$ LANG=fr_FR LC_CTYPE=fr_FR LC_ALL=fr_FR python3 locale_env.py
Environment settings:
LC_ALL = fr_FR
LC_CTYPE = fr_FR
LANG = fr_FR
LANGUAGE =
Locale from environment: ('fr_FR', 'ISO8859-1')
Numeric formatting:
Decimal point : ","
Grouping positions : [127]
Thousands separator: ""
Monetary formatting:
International currency symbol : "'EUR '"
Local currency symbol : 'Eu'
Symbol precedes positive value : 0
Symbol precedes negative value : 0
Decimal point : ","
Digits in fractional values : 2
Digits in fractional values,
international : 2
Grouping positions : [3, 3, 0]
Thousands separator : " "
Positive sign : ""
Positive sign position : Before value and symbol
Negative sign : "-"
Negative sign position : After value and symbol
España (es_ES
):
$ LANG=es_ES LC_CTYPE=es_ES LC_ALL=es_ES python3 locale_env.py
Environment settings:
LC_ALL = es_ES
LC_CTYPE = es_ES
LANG = es_ES
LANGUAGE =
Locale from environment: ('es_ES', 'ISO8859-1')
Numeric formatting:
Decimal point : ","
Grouping positions : [127]
Thousands separator: ""
Monetary formatting:
International currency symbol : "'EUR '"
Local currency symbol : 'Eu'
Symbol precedes positive value : 0
Symbol precedes negative value : 0
Decimal point : ","
Digits in fractional values : 2
Digits in fractional values,
international : 2
Grouping positions : [3, 3, 0]
Thousands separator : "."
Positive sign : ""
Positive sign position : Before value and symbol
Negative sign : "-"
Negative sign position : Before value and symbol
Portugal (pt_PT
):
$ LANG=pt_PT LC_CTYPE=pt_PT LC_ALL=pt_PT python3 locale_env.py
Environment settings:
LC_ALL = pt_PT
LC_CTYPE = pt_PT
LANG = pt_PT
LANGUAGE =
Locale from environment: ('pt_PT', 'ISO8859-1')
Numeric formatting:
Decimal point : ","
Grouping positions : []
Thousands separator: " "
Monetary formatting:
International currency symbol : "'EUR '"
Local currency symbol : 'Eu'
Symbol precedes positive value : 0
Symbol precedes negative value : 0
Decimal point : "."
Digits in fractional values : 2
Digits in fractional values,
international : 2
Grouping positions : [3, 3, 0]
Thousands separator : "."
Positive sign : ""
Positive sign position : Before value and symbol
Negative sign : "-"
Negative sign position : Before value and symbol
Polonia (pl_PL
):
$ LANG=pl_PL LC_CTYPE=pl_PL LC_ALL=pl_PL python3 locale_env.py
Environment settings:
LC_ALL = pl_PL
LC_CTYPE = pl_PL
LANG = pl_PL
LANGUAGE =
Locale from environment: ('pl_PL', 'ISO8859-2')
Numeric formatting:
Decimal point : ","
Grouping positions : [3, 3, 0]
Thousands separator: " "
Monetary formatting:
International currency symbol : "'PLN '"
Local currency symbol : 'zł'
Symbol precedes positive value : 1
Symbol precedes negative value : 1
Decimal point : ","
Digits in fractional values : 2
Digits in fractional values,
international : 2
Grouping positions : [3, 3, 0]
Thousands separator : " "
Positive sign : ""
Positive sign position : After value
Negative sign : "-"
Negative sign position : After value
Moneda¶
El resultado del ejemplo anterior muestra que al cambiar la configuración regional se actualiza la configuración del símbolo de moneda y el carácter para separar los números enteros de las fracciones decimales. Este ejemplo recorre varias configuraciones regionales diferentes para imprimir un valor de moneda positivo y negativo con formato para cada configuración regional.
import locale
sample_locales = [
('USA', 'en_US'),
('France', 'fr_FR'),
('Spain', 'es_ES'),
('Portugal', 'pt_PT'),
('Poland', 'pl_PL'),
]
for name, loc in sample_locales:
locale.setlocale(locale.LC_ALL, loc)
print('{:>10}: {:>10} {:>10}'.format(
name,
locale.currency(1234.56),
locale.currency(-1234.56),
))
El resultado es esta pequeña tabla:
$ python3 locale_currency.py
USA: $1234.56 -$1234.56
France: 1234,56 Eu 1234,56 Eu-
Spain: 1234,56 Eu -1234,56 Eu
Portugal: 1234.56 Eu -1234.56 Eu
Poland: zł 1234,56 zł 1234,56-
Formateo de números¶
Los números no relacionados con la moneda también tienen un formato diferente
según la configuración regional. En particular, el carácter grouping
se
usa para separar grandes cantidades en fragmentos legibles.
import locale
sample_locales = [
('USA', 'en_US'),
('France', 'fr_FR'),
('Spain', 'es_ES'),
('Portugal', 'pt_PT'),
('Poland', 'pl_PL'),
]
print('{:>10} {:>10} {:>15}'.format(
'Locale', 'Integer', 'Float')
)
for name, loc in sample_locales:
locale.setlocale(locale.LC_ALL, loc)
print('{:>10}'.format(name), end=' ')
print(locale.format('%10d', 123456, grouping=True), end=' ')
print(locale.format('%15.2f', 123456.78, grouping=True))
Para formatear números sin el símbolo de moneda, usa format()
en lugar de
currency()
.
$ python3 locale_grouping.py
Locale Integer Float
USA 123,456 123,456.78
France 123456 123456,78
Spain 123456 123456,78
Portugal 123456 123456,78
Poland 123 456 123 456,78
Para convertir números con formato de configuración regional a un formato
agnóstico de configuración regional normalizado, usa delocalize()
.
import locale
sample_locales = [
('USA', 'en_US'),
('France', 'fr_FR'),
('Spain', 'es_ES'),
('Portugal', 'pt_PT'),
('Poland', 'pl_PL'),
]
for name, loc in sample_locales:
locale.setlocale(locale.LC_ALL, loc)
localized = locale.format('%0.2f', 123456.78, grouping=True)
delocalized = locale.delocalize(localized)
print('{:>10}: {:>10} {:>10}'.format(
name,
localized,
delocalized,
))
La puntuación de agrupación se elimina y el separador decimal se convierte para
que siempre sea un .
.
$ python3 locale_delocalize.py
USA: 123,456.78 123456.78
France: 123456,78 123456.78
Spain: 123456,78 123456.78
Portugal: 123456,78 123456.78
Poland: 123 456,78 123456.78
Análisis de números¶
Además de generar resultados en diferentes formatos, el módulo locale
ayuda
a analizar la entrada. Incluye las funciones atoi()
y atof()
para
convertir las cadenas a valores enteros y de coma flotante en función de las
convenciones de formato numérico de la configuración regional.
import locale
sample_data = [
('USA', 'en_US', '1,234.56'),
('France', 'fr_FR', '1234,56'),
('Spain', 'es_ES', '1234,56'),
('Portugal', 'pt_PT', '1234.56'),
('Poland', 'pl_PL', '1 234,56'),
]
for name, loc, a in sample_data:
locale.setlocale(locale.LC_ALL, loc)
print('{:>10}: {:>9} => {:f}'.format(
name,
a,
locale.atof(a),
))
El analizador reconoce los valores de agrupación y separador decimal de la configuración regional.
$ python3 locale_atof.py
USA: 1,234.56 => 1234.560000
France: 1234,56 => 1234.560000
Spain: 1234,56 => 1234.560000
Portugal: 1234.56 => 1234.560000
Poland: 1 234,56 => 1234.560000
Fechas y Horarios¶
Otro aspecto importante de la localización es el formato de fecha y hora.
import locale
import time
sample_locales = [
('USA', 'en_US'),
('France', 'fr_FR'),
('Spain', 'es_ES'),
('Portugal', 'pt_PT'),
('Poland', 'pl_PL'),
]
for name, loc in sample_locales:
locale.setlocale(locale.LC_ALL, loc)
format = locale.nl_langinfo(locale.D_T_FMT)
print('{:>10}: {}'.format(name, time.strftime(format)))
Este ejemplo utiliza la cadena de formato de fecha para la configuración regional para imprimir la fecha y hora actuales.
$ python3 locale_date.py
USA: Sun Mar 18 16:20:59 2018
France: Dim 18 mar 16:20:59 2018
Spain: dom 18 mar 16:20:59 2018
Portugal: Dom 18 Mar 16:20:59 2018
Poland: ndz 18 mar 16:20:59 2018
Ver también
- Documentación de la biblioteca estándar para locale
- Notas para portar Python 2 a 3 para locale
gettext
– Catálogos de mensajes para traducciones