Locale — qué es, clase Foundation y localización

Autor: IT Sectr Publicado: 2026-07-12 Tiempo de lectura: 9 min

Locale es una clase de Foundation en iOS y macOS que encapsula las convenciones lingüísticas y culturales del usuario: formato de fechas, números, monedas y unidades de medida. Según Apple Developer Documentation, 2024, Locale determina cómo DateFormatter muestra un mes (enero o January), el separador decimal en un número (coma o punto) y el símbolo de moneda (rublo, dólar o euro). Cada instancia de Locale está vinculada a un identificador como ru_RU o en_US, donde la primera parte es el código de idioma (ISO 639-1) y la segunda el código de región (ISO 3166-1). A diferencia de TimeZone, Locale no afecta el valor absoluto del tiempo, solo su representación en cadena.

Puntos clave

  • Locale — una clase de Foundation para configuraciones culturales y lingüísticas de formato en iOS y macOS
  • Identificador ru_RU — combina el código de idioma (ISO 639-1) y el código de región (ISO 3166-1)
  • DateFormatter y NumberFormatter usan automáticamente Locale para localizar la salida
  • Locale.current — la configuración regional del sistema del usuario, se puede sobrescribir para operaciones específicas
  • Fijo vs actualización automática — Locale(identifier:) crea una configuración regional fija, Locale.current rastrea los cambios en los ajustes

¿Qué es Locale en Foundation?

Locale es un tipo de valor en Swift (NSLocale en Objective-C) que representa un conjunto de reglas de formato específicas para un idioma y región determinados. A diferencia de TimeZone, que determina el desplazamiento absoluto del tiempo, Locale determina cómo se ven el tiempo, los números y la moneda en representación de cadena. La misma fecha 2024-07-21 se mostrará como “21 julio 2024” para ru_RU y “July 21, 2024” para en_US.

Cada instancia de Locale consta de dos componentes: Idioma (determina los nombres de los meses, días de la semana, orden de las palabras) y Región (determina el formato numérico, la moneda, el calendario). La combinación de estos componentes se codifica en un identificador según el estándar BCP 47: ru_RU (ruso, Rusia), en_US (inglés, EE. UU.), de_DE (alemán, Alemania).

Según Unicode CLDR (2024), la cantidad de configuraciones regionales compatibles en iOS supera las 700 combinaciones idioma-región. Foundation utiliza datos de CLDR (Common Locale Data Repository), el repositorio más completo de datos de localización mantenido por el Unicode Consortium. Esto garantiza un formato uniforme en todos los dispositivos Apple.

¿Cómo afecta Locale al formato de fechas y números?

DateFormatter usa Locale para seleccionar los nombres correctos de meses y días, determinar el orden de los componentes de la fecha (día/mes/año o mes/día/año) y los separadores. Sin especificar explícitamente Locale, DateFormatter usa la configuración regional del dispositivo — esto es correcto para la interfaz de usuario pero peligroso para datos del servidor donde el formato debe ser fijo.

Componenteru_RUen_USde_DE
Fecha (medium)21 julio 2024Jul 21, 202421.07.2024
Número (1000.5)1 000,51,000.51.000,5
Moneda (100)100,00 ₽$100.00100,00 €
CalendarioGregorianoGregorianoGregoriano
Separador de lista;,;

NumberFormatter usa Locale para determinar el separador decimal (coma o punto), el separador de agrupación (espacio, coma, punto) y el símbolo de moneda. Ignorar Locale al analizar números es una de las causas comunes de errores en aplicaciones internacionales: el número “1,5” significa “uno y medio” para ru_RU, pero para en_US el analizador digital lo leerá como “cinco” después de la coma.

Importante: Calendar creado mediante Calendar.current hereda la configuración regional del dispositivo. Calendar(identifier: .gregorian) con una configuración regional establecida explícitamente es el enfoque recomendado para un formato predecible. Al trabajar con fechas ISO 8601, usa siempre Locale(identifier: “en_US_POSIX”) — una configuración regional especial para formato técnico que no se ve afectada por los ajustes regionales.

Identificadores de Locale: formatos básicos

El identificador de Locale consta de un código de idioma (ISO 639-1, dos caracteres) y un código de región (ISO 3166-1, dos caracteres), separados por un guion bajo. Ejemplos: ru_RU, en_US, fr_FR, zh_Hans_CN (chino, escritura simplificada, China). Foundation también admite identificadores en formato BCP 47: ru-RU, en-US, utilizados en estándares web.

Además de los identificadores completos, se puede crear Locale solo por idioma: Locale(identifier: “ru”) devuelve una configuración regional con el idioma ruso y la región predeterminada para ese idioma (generalmente Rusia). De manera similar para inglés: Locale(identifier: “en”) usa la región de EE. UU. Este enfoque es útil para establecer el idioma de formato sin vincularlo a una región específica.

Configuraciones regionales especiales incluyen en_US_POSIX — una configuración regional técnica para formato automático de fechas y números, que garantiza un formato estable independientemente de los ajustes del usuario. Esta configuración regional es obligatoria para analizar fechas de API de servidor, especialmente para el formato ISO 8601. Utiliza el calendario gregoriano, formato de hora de 24 horas y punto como separador decimal.

swift
import Foundation

// Identificadores de configuración regional disponibles
let available: [String] = Locale.availableIdentifiers
print("Total de configuraciones regionales: \(available.count)")

// Filtrar configuraciones regionales rusas
let russianLocales = available.filter { $0.hasPrefix("ru") }
print("Configuraciones regionales rusas: \(russianLocales)")

// Componentes de configuración regional
let locale = Locale(identifier: "de_DE")
print("Idioma: \(locale.languageCode ?? "nil")")
print("Región: \(locale.regionCode ?? "nil")")
print("Moneda: \(locale.currencyCode ?? "nil")")
print("Calendario: \(locale.calendar.identifier)")

Comprobar configuraciones regionales disponibles mediante Locale.availableIdentifiers devuelve una matriz de todos los identificadores admitidos por la versión actual de iOS. Para filtrar por región, usa Locale.availableIdentifiers.filter con la comprobación de regionCode. Esto es útil para crear una interfaz de selección de región sin una lista codificada.

Determinación de la configuración regional actual del usuario en Swift

Locale.current es la forma principal de obtener la configuración regional actual del dispositivo establecida por el usuario en los ajustes de iOS (Settings > General > Language & Region). Esta propiedad se actualiza automáticamente al cambiar el idioma o la región en los ajustes sin reiniciar la aplicación. Sin embargo, puede no coincidir con la configuración regional preferida para mostrar contenido: un usuario puede establecer el idioma de la interfaz en inglés pero ver las fechas en formato ruso.

Para una determinación más precisa de las preferencias del usuario, usa Locale.preferredLanguages — una matriz de idiomas ordenados por prioridad del usuario. El primer elemento es el idioma principal de la interfaz. Esta lista corresponde a los ajustes en Language & Region, incluyendo la reorganización de idiomas en orden de preferencia. Las aplicaciones de comunicación (mensajeros, clientes de correo electrónico) deben considerar este orden al seleccionar el idioma de visualización del contenido.

swift
import Foundation

// Configuración regional actual del sistema
let current = Locale.current
print("Configuración regional actual: \(current.identifier)")
print("Idioma: \(current.language?.disjointName ?? "nil")")

// Idiomas preferidos del usuario
let preferred = Locale.preferredLanguages
print("Idiomas preferidos: \(preferred)")

// Obtener región de la configuración regional actual
if let region = current.regionCode {
    let regionLocale = Locale(identifier: "en_\(region)")
    let countryName = regionLocale.localizedString(
        forRegionCode: region
    )
    print("País: \(countryName ?? region)")
}

// Comprobar formato 24h
let uses24h = current.uses24hClock(
    for: .dateAndTime
)
print("Usa 24h: \(uses24h)")

Localización en la interfaz de usuario: para mostrar los nombres de los meses y días en el idioma de la interfaz, usa Calendar con una configuración regional establecida. Calendar.current.symbols(for: .month) devuelve los nombres de los meses en el idioma de la configuración regional actual. Para mostrar los nombres de los países en el idioma del usuario, usa Locale.current.localizedString(forRegionCode:).

Locale en Swift: ejemplos de uso

Formato de fecha con reconocimiento de configuración regional es una tarea clave al mostrar fechas al usuario. DateFormatter con una configuración regional establecida selecciona automáticamente el formato correcto de fecha y hora para la región del usuario. Para dateStyle y timeStyle con valores .short, .medium, .long, .full, el formateador usa las reglas de la configuración regional para componer los componentes de la fecha.

swift
import Foundation

let date = Date()

// Formato con diferentes configuraciones regionales
let formatter = DateFormatter()
formatter.dateStyle = .medium

formatter.locale = Locale(identifier: "ru_RU")
print("Ruso: \(formatter.string(from: date))")

formatter.locale = Locale(identifier: "en_US")
print("Inglés: \(formatter.string(from: date))")

formatter.locale = Locale(identifier: "ja_JP")
print("Japonés: \(formatter.string(from: date))")

// Formato de moneda con configuración regional
let numFormatter = NumberFormatter()
numFormatter.numberStyle = .currency

numFormatter.locale = Locale(identifier: "de_DE")
print("Moneda alemana: \(numFormatter.string(from: 1234.56) ?? "nil")")

numFormatter.locale = Locale(identifier: "en_US")
print("Moneda estadounidense: \(numFormatter.string(from: 1234.56) ?? "nil")")

Análisis de fechas de API de servidor siempre debe usar Locale(identifier: “en_US_POSIX”) para un formato fijo. Los servidores generalmente envían fechas en formato ISO 8601 con nombres de meses en inglés, y usar la configuración regional actual del dispositivo puede causar errores de análisis si el usuario se encuentra en una región no angloparlante. en_US_POSIX garantiza que el análisis no dependa de la configuración del dispositivo.

swift
import Foundation

// Análisis correcto de fecha del servidor
let isoFormatter = DateFormatter()
isoFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
isoFormatter.locale = Locale(identifier: "en_US_POSIX")
isoFormatter.timeZone = TimeZone(secondsFromGMT: 0)

let serverDate = "2024-07-21T14:30:00+0000"
if let parsed = isoFormatter.date(from: serverDate) {
    print("Fecha analizada: \(parsed)")
}

// Nombre de moneda localizado
let usLocale = Locale(identifier: "en_US")
let currencyName = usLocale.localizedString(
    forCurrencyCode: "RUB"
)
print("Rublo ruso en configuración regional estadounidense: \(currencyName ?? "nil")")

Capacidades adicionales: Locale proporciona descripciones localizadas de sus componentes a través de los métodos localizedString(forRegionCode:), localizedString(forLanguageCode:), localizedString(forCurrencyCode:) y localizedString(forCalendarIdentifier:). Estos métodos devuelven nombres en el idioma de la configuración regional en la que se llaman. Por ejemplo, Locale(identifier: “ru_RU”).localizedString(forCountryCode: “DE”) devuelve “Alemania”.

Errores comunes al trabajar con Locale

Ignorar Locale al analizar números es un error crítico en aplicaciones internacionales. NumberFormatter sin una configuración regional explícita usa la configuración regional actual del dispositivo. Si un usuario en Rusia ingresa “1,5”, NumberFormatter.number(from: “1,5”) devuelve correctamente 1.5. Pero si el mismo código se ejecuta en un dispositivo con configuración regional en_US, el análisis devuelve nil porque para en_US el separador decimal es un punto.

Falta de en_US_POSIX para fechas del servidor provoca errores difíciles de detectar. DateFormatter con dateFormat y locale = Locale.current puede fallar en usuarios de regiones donde el formato de fecha difiere del estadounidense. Por ejemplo, en Alemania DateFormatter puede esperar “21.07.2024” mientras que el servidor envía “07/21/2024”. en_US_POSIX garantiza un formato fijo para el análisis automático independientemente de la región del usuario.

Comparar cadenas de fecha en lugar de usar Date es otro error común. Los desarrolladores a veces comparan representaciones de cadena de fechas de diferentes configuraciones regionales, obteniendo resultados incorrectos. Locale solo cambia la visualización, no el valor absoluto de la fecha. Siempre compara objetos Date, no sus representaciones de cadena. Para comparar componentes de fecha, usa Calendar con una configuración regional establecida explícitamente.

Según WWDC 2023, alrededor del 30% de los problemas de internacionalización en aplicaciones están relacionados con una configuración incorrecta de Locale. Apple recomienda establecer siempre explícitamente la configuración regional para DateFormatter y NumberFormatter al trabajar con datos del servidor y usar Locale.current solo para la visualización en la interfaz de usuario. Esta práctica simple elimina la mayoría de los errores relacionados con la configuración regional.

Preguntas frecuentes

¿Qué es Locale en Foundation?

Locale es una clase de Foundation que representa las reglas culturales y lingüísticas de formato: formato de fecha, número, moneda y unidades de medida. Se usa junto con DateFormatter, NumberFormatter y Calendar para la visualización localizada de datos.

¿Cuál es la diferencia entre Locale y TimeZone?

Locale determina el formato de visualización (idioma, convenciones regionales), mientras que TimeZone determina el desplazamiento absoluto del tiempo respecto a UTC. Locale afecta la representación en cadena, TimeZone afecta el valor numérico del tiempo. Ambos se usan juntos para un formato completo de fecha.

¿Qué es en_US_POSIX y para qué sirve?

en_US_POSIX es una configuración regional especial para formato técnico que garantiza un formato estable independientemente de los ajustes del usuario. Es obligatoria para analizar fechas del servidor (ISO 8601) y trabajar con API donde el formato debe ser predecible.

¿Cómo obtener una lista de todas las configuraciones regionales disponibles?

Locale.availableIdentifiers devuelve una matriz de cadenas con los identificadores de todas las configuraciones regionales admitidas. Para filtrar por idioma, usa filter con hasPrefix; para obtener la región, usa Locale(identifier:).regionCode.

¿Cómo afecta Locale a NumberFormatter?

NumberFormatter usa Locale para determinar el separador decimal (coma o punto), el símbolo de moneda y el separador de agrupación. Para un formato fijo, establece la configuración regional en en_US_POSIX o establece explícitamente las propiedades del formateador.

Resumen

  • Locale — una clase fundamental para localizar el formato de fechas, números y monedas en iOS y macOS
  • Identificador ru_RU codifica el idioma (ISO 639-1) y la región (ISO 3166-1) para ajustes precisos de formato
  • DateFormatter y NumberFormatter usan automáticamente Locale.current para la salida localizada
  • en_US_POSIX — configuración regional obligatoria para analizar fechas del servidor y formato automático fijo
  • Locale.current rastrea los cambios en los ajustes, Locale(identifier:) crea una configuración regional fija
  • Analizar números requiere establecer explícitamente la configuración regional — el separador decimal depende de la región del usuario
  • Calendar.current hereda la configuración regional del dispositivo; para cálculos predecibles, establece la configuración regional explícitamente

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también