Comprender los idiomas del perfil del usuario y los idiomas de manifiesto de la aplicación

Un usuario de Windows puede usar Configuración>Hora e idioma>Región e idioma para configurar una lista ordenada de idiomas de visualización preferidos, o sólo un idioma de visualización preferido. Un idioma puede tener una variante regional. Por ejemplo, se puede seleccionar el español que se habla en España, el español que se habla en México, el español que se habla en Estados Unidos, entre otros.

También en Configuración>Hora e idioma>Región e idioma, pero separado del idioma, el usuario puede especificar su ubicación (conocida como región) en el mundo. Tenga en cuenta que la configuración del idioma de visualización (y variante regional) no es determinante de la configuración de la región, y viceversa. Por ejemplo, un usuario puede vivir actualmente en Francia pero elegir Español (México) como idioma de visualización preferido en Windows.

Para las aplicaciones de Windows, un idioma se representa como una etiqueta de idioma BCP-47. Por ejemplo, la etiqueta de idioma BCP-47 "en-US" corresponde al inglés (Estados Unidos) en Configuración. Las API de Windows Runtime aceptan y devuelven representaciones de cadena de las etiquetas de idioma BCP-47.

Consulte también el registro de subetiquetas de idioma de IANA.

En las tres secciones siguientes se definen los términos "lista de idiomas del perfil de usuario", "lista de idiomas del manifiesto de la aplicación" y "lista de idiomas del tiempo de ejecución de la aplicación". En este tema y en otros de esta sección usaremos estos términos, por lo que es importante saber qué significan.

Lista de idiomas del perfil de usuario

La lista de idiomas del perfil de usuario es el nombre de la lista configurada por el usuario en Configuración>Hora e idioma>Región e idioma>Idiomas. En código se puede usar la propiedad GlobalizationPreferences.Languages para acceder a la lista de idiomas del perfil de usuario como una lista de cadenas de solo lectura, donde cada cadena es una única etiqueta de idioma BCP-47 como "en-US" o "ja-JP".

    IReadOnlyList<string> userLanguages = Windows.System.UserProfile.GlobalizationPreferences.Languages;

Lista de idiomas del manifiesto de la aplicación

La lista de idiomas del manifiesto de la aplicación es la lista de idiomas para los que tu aplicación declara (o declarará) compatibilidad. Esta lista aumenta a medida que la aplicación avanza en el ciclo de vida de desarrollo hasta llegar a la localización.

La lista se determina en tiempo de compilación, pero tienes dos opciones para controlar exactamente cómo sucede. Una opción es dejar que Visual Studio determine la lista a partir de los archivos del proyecto. Para ello, establezca primero el idioma predeterminado de la aplicación en la pestaña Aplicación del archivo de origen del manifiesto de paquete de la aplicación (Package.appxmanifest). A continuación, confirme que el mismo archivo contiene esta configuración (que lo hace de manera predeterminada).

  <Resources>
    <Resource Language="x-generate" />
  </Resources>

Cada vez que Visual Studio genera el archivo de manifiesto de paquete de aplicaciones creado (AppxManifest.xml), expande ese único elemento Resource del archivo de origen en una unión de todos los calificadores de idioma que encuentra en el proyecto (consulte Adaptar los recursos para el idioma, la escala, el contraste alto y otros calificadores). Por ejemplo, si comenzó a localizar y tiene recursos de cadena, imagen o archivo cuyos nombres de carpeta o archivo incluyen "en-US", "ja-JP" y "fr-FR", el archivo AppxManifest.xml creado contendrá lo siguiente (la primera entrada de la lista es el idioma predeterminado que configuró).

  <Resources>
    <Resource Language="EN-US" />
    <Resource Language="JA-JP" />
    <Resource Language="FR-FR" />
  </Resources>

La otra opción es reemplazar ese único elemento <Resource> "x-generate" en el archivo de código fuente del manifiesto de paquete de aplicaciones (Package.appxmanifest) con la lista expandida de elementos <Resource> (teniendo cuidado de listar primero el idioma predeterminado). Esta opción implica más trabajo de mantenimiento para ti, pero podría ser una opción adecuada si usas un sistema de compilación personalizado.

Para empezar, la lista de idiomas del manifiesto de su aplicación solo contendrá un idioma. Puede que sea en-US. Pero con el tiempo, a medida que configure manualmente su manifiesto o agregue recursos traducidos a su proyecto, esa lista aumentará.

Cuando la aplicación está en Microsoft Store, los idiomas de la lista de idiomas del manifiesto de la aplicación son los que se muestran a los clientes. Para obtener una lista de las etiquetas de idioma BCP-47 admitidas específicamente por Microsoft Store, consulte Idiomas admitidos.

En el código, puede usar la propiedad ApplicationLanguages.ManifestLanguages para acceder a la lista de idiomas del manifiesto de la aplicación como una lista de cadenas de solo lectura, donde cada cadena es una sola etiqueta de idioma BCP-47.

    IReadOnlyList<string> userLanguages = Windows.Globalization.ApplicationLanguages.ManifestLanguages;

Lista de idiomas en tiempo de ejecución de la aplicación

La tercera lista de idiomas de interés es la intersección entre las dos listas que acabamos de describir. En tiempo de ejecución, la lista de idiomas para los que tu aplicación ha declarado compatibilidad (la lista de idiomas del manifiesto de la aplicación) se compara con la lista de idiomas para los que el usuario ha declarado una preferencia (la lista de idiomas del perfil de usuario). La lista de idiomas en tiempo de ejecución de la aplicación se ajusta a este cruce (si el cruce no está vacío), o solo al idioma predeterminado de la aplicación (si el cruce está vacío).

Más concretamente, la lista de idiomas de ejecución de la aplicación se compone de estos elementos.

  1. (Opcional) Invalidación del idioma principal. PrimaryLanguageOverride es una opción sencilla para aplicaciones que ofrecen a los usuarios la posibilidad de elegir su propio idioma, o aplicaciones que tienen alguna razón de peso para invalidar las opciones de idioma predeterminadas. Para obtener más información, consulte el ejemplo Recursos de la aplicación y localización.
  2. Idiomas del usuario admitidos por la aplicación.. Se trata de la lista de idiomas del perfil de usuario filtrada por la lista de idiomas del manifiesto de la aplicación. Al filtrar los idiomas del usuario por los admitidos por la aplicación, se mantiene la coherencia entre los kits de desarrollo de software (SDK), las bibliotecas de clases, los paquetes de marcos dependientes y la aplicación.
  3. Si 1 y 2 están vacíos, se usará el idioma predeterminado o el primer idioma admitido por la aplicación. Si la lista de idiomas del perfil de usuario no contiene ningún idioma compatible con la aplicación, el idioma de ejecución de la aplicación será el primer idioma compatible con la aplicación.

En el código se puede usar la propiedad ResourceContext.QualifierValues para acceder a la lista de idiomas en tiempo de ejecución de la aplicación en forma de cadena que contiene una lista delimitada por punto y coma de etiquetas de idioma BCP-47.

    string runtimeLanguages = Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().QualifierValues["Language"];

También puede acceder a ella como una lista de cadenas de solo lectura, cada una de las cuales contiene una única etiqueta de idioma BCP-47. Para ello, puede usar la propiedad ResourceContext.Languages o la propiedad ApplicationLanguages.Languages.

    IReadOnlyList<string> runtimeLanguages = Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().Languages;

    runtimeLanguages = Windows.Globalization.ApplicationLanguages.Languages;

La lista de idiomas en tiempo de ejecución de la aplicación determina los recursos que Windows carga para su aplicación y también el idioma o idiomas que se usan para dar formato a fechas, horas, números y otros componentes. Consulte Globalizar los formatos de fecha, hora y número.

Nota: Si el idioma del perfil de usuario y el idioma del manifiesto de la aplicación son variantes regionales entre sí, se usará la variante regional del usuario como idioma de ejecución de la aplicación. Por ejemplo, si el usuario prefiere en-GB y la aplicación admite en-US, el idioma de ejecución de la aplicación será en-GB. De este modo, las fechas, horas y números se formatean de acuerdo con las expectativas del usuario (en-GB), pero los recursos localizados se siguen cargando (debido a la coincidencia de idiomas) en el idioma admitido por la aplicación (en-US).

Califique los archivos de recursos con su idioma

Nombre sus archivos de recursos, o sus carpetas, con calificadores de recursos por idioma. Para obtener más información sobre los calificadores de recursos, consulte Adaptar los recursos al idioma, la escala, el contraste alto y otros certificadores. Un archivo de recursos puede ser una imagen (u otro activo), o puede ser un archivo contenedor de recursos, como un .resw que contiene cadenas de texto.

Nota: Incluso los recursos en el idioma predeterminado de tu aplicación deben especificar el certificador de idioma. Por ejemplo, si el idioma predeterminado de la aplicación es inglés (Estados Unidos), califique los recursos como \Assets\Images\en-US\logo.png.

  • Windows realiza comparaciones complejas, incluso entre variantes regionales como en-US y en-GB. Por lo tanto, incluya la subetiqueta de región según corresponda. Consulte Cómo hace coincidir el sistema de administración de recursos las etiquetas de idioma.
  • Especifique una subetiqueta de guión de idioma en el certificador cuando no haya ningún valor Suppress-Script definido para el idioma. Por ejemplo, en lugar de zh-CN o zh-TW, utilice zh-Hant, zh-Hant-TW o zh-Hans (para obtener más información, consulte el registro de subetiquetas de idioma de IANA).
  • En el caso de los idiomas que tienen un único dialecto estándar, no es necesario incluir el certificador de región. Por ejemplo, use ja en lugar de ja-JP.
  • Algunas herramientas y otros componentes, como los traductores automáticos, pueden encontrar útiles las etiquetas de idioma específicas, como la información sobre el dialecto regional, para comprender los datos.

No es necesario localizar todos los recursos

Puede que no sea necesario localizar todos los recursos.

  • Como mínimo, asegúrese de que todos los recursos existen en el idioma predeterminado.
  • Un subconjunto de algunos recursos puede ser suficiente para un idioma estrechamente relacionado (localización parcial). Por ejemplo, puede que no localice toda la UI de su aplicación al catalán si su aplicación tiene un conjunto completo de recursos en español. Para los usuarios que hablan catalán y luego español, los recursos que no están disponibles en catalán aparecen en español.
  • Algunos recursos pueden requerir excepciones para idiomas específicos, mientras que la mayoría de los demás recursos se asignan a un recurso común. En este caso, marque el recurso destinado a todos los idiomas con la etiqueta de idioma indeterminado 'und'. Windows interpreta la etiqueta de idioma "und" como un carácter comodín (similar a "*") en el sentido de que coincide con el idioma principal de la aplicación después de cualquier otra coincidencia específica. Por ejemplo, si unos pocos recursos son diferentes para el finlandés, pero el resto de los recursos son los mismos para todos los idiomas, entonces el recurso finlandés debe marcarse con la etiqueta de idioma finlandés, y el resto debe marcarse con "und".
  • Para los recursos que se basan en un script lingüístico, como un tipo de letra o la altura de un texto, utilice la etiqueta de lengua indeterminada con un script especificado: und-<script>'. Por ejemplo, para tipos de letra latinas use und-Latn\\fonts.css y para fuentes cirílicas use und-Cryl\\fonts.css.

Establezca el encabezado de solicitud HTTP Accept-Language

Tenga en cuenta si los servicios web a los que llama tienen el mismo grado de localización que su aplicación. Las peticiones HTTP realizadas desde aplicaciones de Windows en peticiones web típicas, y XMLHttpRequest (XHR), usan el encabezado de solicitud estándar HTTP Accept-Language. De manera predeterminada, el encabezado HTTP se establece en la lista de idiomas del perfil de usuario. Cada idioma de la lista se amplía para incluir los neutrales del idioma y una ponderación (q). Por ejemplo, si la lista de idiomas de un usuario es fr-FR y en-US, el encabezado de solicitud HTTP Accept-Language será fr-FR, fr, en-US, en ("fr-FR,fr;q=0,8,en-US;q=0,5,en;q=0,3"). Pero si la aplicación del tiempo (por ejemplo) muestra una UI en francés (Francia), pero el idioma principal del usuario en su lista de preferencias es el alemán, tendrá que solicitar explícitamente el francés (Francia) al servicio para mantener la coherencia dentro de la aplicación.

API del espacio de nombres Windows.Globalization

Por lo general, las API del espacio de nombres Windows.Globalization usan la lista de idiomas en tiempo de ejecución de la aplicación para determinar el idioma. Si ninguno de los idiomas tiene un formato que coincida, se usa la configuración regional del usuario. Esta es la misma configuración regional que se usa para el reloj del sistema. La configuración regional del usuario está disponible en Configuración>Hora e idioma>Región e idioma>Configuración adicional de fecha, hora y configuración regional>Región: Cambiar formatos de fecha, hora o número. Las API de Windows.Globalization también tienen anulaciones para especificar una lista de idiomas a usar, en lugar de la lista de idiomas en tiempo de ejecución de la aplicación.

Con la clase Idioma, se pueden inspeccionar detalles sobre un idioma concreto, como la escritura del idioma, el nombre para mostrar y el nombre nativo.

Uso de la región geográfica cuando proceda

En Configuración>Hora e idioma>Región e idioma>País o región, el usuario puede especificar su ubicación en el mundo. Puede usar esta configuración, en lugar del idioma, para elegir qué contenido mostrar al usuario. Por ejemplo, una aplicación de noticias podría mostrar contenido de esta región de manera predeterminada.

En el código, puede acceder a esta configuración mediante la propiedad GlobalizationPreferences.HomeGeographicRegion.

Con la clase GeographicRegion, puede inspeccionar detalles sobre una región en particular, como su nombre para mostrar, nombre nativo y monedas en uso.

Ejemplos

La siguiente tabla contiene ejemplos de lo que el usuario vería en la UI de su aplicación con distintas configuraciones de idioma y región.

Lista de idiomas del manifiesto de la aplicación Lista de idiomas del perfil de usuario Invalidación del idioma principal de la aplicación (opcional) Lista de idiomas en tiempo de ejecución de la aplicación Lo que el usuario ve en la aplicación
Inglés (GB) (valor predeterminado); Alemán (Alemania) Inglés (GB) None Inglés (GB) UI: Inglés (GB)
Fechas, horas, números: Inglés (GB)
Alemán (Alemania) (valor predeterminado); Francés (Francia); Italiano (Italia) Francés (Austria) None Francés (Austria) UI: Francés (Francia) (versión alternativa del francés [Austria])
Fechas, horas y números: francés (Austria)
Inglés (EE. UU.) (valor predeterminado); Francés (Francia); Inglés (GB) Inglés (Canadá); Francés (Canadá) None Inglés (Canadá); Francés (Canadá) UI: Inglés (US) (reserva del inglés [Canadá])
Fechas, horas, números: Inglés (Canadá)
Español (España) (valor predeterminado); Español (México); Español (América Latina); Portugués (Brasil) Inglés (EE. UU.) None Español (España) UI: Español (España) (usa el valor predeterminado, ya que no hay reserva disponible para inglés)
Fechas, horas y números español (España)
Catalán (valor predeterminado); Español (España); Francés (Francia) Catalán; Francés (Francia) None Catalán; Francés (Francia) UI: Principalmente catalán y algunos franceses (Francia) porque no todas las cadenas están en catalán
Fechas, horas y números: catalán
Inglés (GB) (valor predeterminado); Francés (Francia); Alemán (Alemania) Alemán (Alemania); Inglés (GB) Inglés (GB) (elegido por el usuario en la UI de la aplicación) Inglés (GB); Alemán (Alemania) UI: inglés (GB) (invalidación de idioma)
Fechas, horas, números Inglés (GB)

Nota:

Para obtener una lista de los códigos de país o región estándar que usa Microsoft, consulte la Lista oficial de países y regiones.

API importantes

Ejemplos