Manual:Idioma

This page is a translated version of the page Manual:Language and the translation is 97% complete.
i18n docs
Véase también Manual:MediaWiki architecture#Languages (¿debería fusionarse aquí?)

En MediaWiki, hay varios tipos de idiomas:

  • El idioma del contenido del sitio (ContentLanguage, basando en $wgLanguageCode ), que debería generalmente ser el mismo mientras el wiki existe.
  • El idioma de la interfaz del usuario ($contextSource->getLanguage() formalmente $wgLang ), que se puede ser cambiado en tus preferencias o con &uselang=xyz en la URL, pero también generalmente se mantiene igual mientras se usa el wiki.
  • El idioma del contenido de la página. Esto puede ser diferente para cada página, incluso si el sitio y el idioma del usuario son los mismos. Se define en getPageLanguage() en Title, lo que representa en qué idioma está escrito el contenido de la página (por ejemplo, wikitexto).
    • El idioma de visualización de la página, también llamado variante del idioma del usuario es la variante idiomática del idioma del contenido de una página, y es elegido por el usuario. Se puede establecer mediante &variant (o $wgVariantArticlePath ) en la URL (p. ej. al seleccionar una de las pestañas) si es una variante del idioma del contenido de la página que se está visualizando. Está definido en getPageViewLanguage() en Título, y representa en qué idioma está el contenido HTML que se muestra.

Esos tres son objetos de idioma.

Código de idioma

No confundir con el código de proyecto Wikimedia; véase también Códigos de idioma en Meta.

Un código de idioma es una abreviatura estándar válida para representar un idioma soportado por MediaWiki,[1] que utiliza tales códigos como identificadores estándar para los idiomas (generalmente acordes con ISO 639-3, exceptuando códigos de dos letras procedentes de ISO 639-1 para las configuraciones de localización «establecidas») y los muestra o requiere en muchas ubicaciones de la interfaz y del código.[2]

En el siguiente ejemplo, MediaWiki:Message/ar, ar es el código de idioma del Arabic.

La conformidad con la norma de Unicode es necesaria para proporcionar un buen soporte de idiomas, particularmente en cooperación con CLDR; disponer de un código ISO 639-3 es un requisito para que se pueda añadir un idioma a la lista de configuraciones de localización de MediaWiki.

There are some special language codes for internal or development use: qqq (for message documentation, does not work with uselang etc.), qqx (shows message names for debugging), en-x-rtl (English, but pretends it is a right-to-left language), en-x-piglatin (when $wgUsePigLatinVariant is enabled, for LanguageConverter testing), x-xss (when $wgUseXssLanguage is enabled, tests XSS vulnerabilities in messages).

Names.php

Names.php es el registro maestro de idiomas soportados por MediaWiki. No coincide con los idiomas de los que MediaWiki mostrará mensajes de localización (archivos JSON) ni con los idiomas de los que MediaWiki conoce los nombres (mediante CLDR ), ¡tenlo en cuenta!

Idiomas de respaldo

Véase también: Help:Mensaje del sistema
 
Cadenas de respaldo (Algunas de las conexiones mostradas no son exactas debido a la coexistencia de dos idiomas de respaldo. Comprueba si la conexión existe de verdad en la versión textual.)

Algunos idiomas en MediaWiki tienen lo que se conoce como «secuencia de respaldo». Esto es donde MediaWiki utilizará un idioma alternativo si no puede encontrar lo que necesita. Un ejemplo de ello es el código de idioma frc (francés cajún), que cuenta con el código de idioma fr (francés) como idioma de respaldo. El motivo de ello es que a veces no están definidos todos los mensajes en los distintos idiomas.

El idioma de respaldo de un idioma se puede encontrar en su archivo asociado languages/messages/MessagesXX.php. Por ejemplo, MessagesFrc.php. Puedes revisar todos los casos en el código. También existe una lista en texto plano de septiembre de 2020 en este comentario de Phabricator.

Idioma del contenido del sitio

Cómo ver u obtener el idioma del contenido del sitio

JavaScript :

mw.config.get( 'wgContentLanguage' );

Idioma de la interfaz de usuario

Versión de MediaWiki:
1.18
Valor por defecto
Establecido mediante
  • Especial:Preferencias
  • &uselang=zxx en la URL (véase uselang)
  • &variant=xy (o $wgVariantArticlePath ) en la URL si es una variante de tu idioma de usuario
Problemas
Dado que los mensajes de la interfaz pueden provenir de un idioma de respaldo pero no se devuelve el idioma en sí, no se conoce el idioma real de cada mensaje.

Idioma del contenido de la página

Versión de MediaWiki:
1.18
Valor por defecto
  • $wgLang en páginas especiales.
  • Inglés en páginas CSS y JS.
  • En las páginas del espacio de nombres MediaWiki, el idioma depende de la subpágina. Por ejemplo, MediaWiki:Mensaje/ar estará fijado en árabe (ar), y MediaWiki:Mensaje será ContentLanguage.
  • Todas las demás páginas están en ContentLanguage por defecto.
Configuración
Las extensiones pueden cambiar todas las demás páginas mediante el gancho PageContentLanguage . El valor de las páginas especiales y de las páginas CSS, JS y del espacio de nombres MediaWiki no se puede redefinir.
Ejemplos
La extensión Translate lo utiliza para la funcionalidad de traducción de páginas. Véase translatewiki:Project:About/ar como traducción de translatewiki:Project:About. La direccionalidad de la página está fijada correctamente a «derecha a izquierda» para el árabe.
Versión de MediaWiki:
1.24
Cambiar a mano el idioma de la página
La selección de idioma a nivel de página es ahora posible con la ayuda de Special:PageLanguage desde MediaWiki 1.24.
Los usuarios pueden cambiar el idioma de contenido de una página que es por defecto el idioma predeterminado del wiki (ContentLanguage). El idioma de las páginas del espacio de nombres MediaWiki no se puede cambiar.
Para habilitar la funcionalidad, hay que utilizar el código $wgPageLanguageUseDB = true y conceder el permiso pagelang a un grupo de permisos de usuario del wiki (que posteriormente podrá realizar cambios de idioma a nivel de página).
Cambiar el idioma de una página hace que se traslade la página de traducción de origen junto con sus unidades al idioma de destino correcto. En caso de que ya exista la página de traducción en el idioma de destino, no se permitirá el cambios de idioma.
La API correspondiente se puede encontrar en API:SetPageLanguage .
¿Qué es lo que define?
  • En SkinTemplate, envuelve el texto en un <div lang="xyz" dir="ltr/rtl" class="mw-content-ltr/rtl"></div>. El atributo dir establece la dirección de escritura correcta. El atributo lang siempre será el código raíz, por ejemplo, «de» aunque se haya indicado «de-formal».
    Para páginas de archivos, está inicializado en ImagePage.php, porque hay mucho HTML que está en el idioma del usuario.
  • En Parser.php, inicializa la numeración de la tabla de contenidos (TOC) y otros elementos como la gramática, aunque en su mayor parte no son especialmente relevantes. Para hacer sólo eso, utiliza parserOptions->setTargetLanguage().
  • La dirección del texto diferencial (DifferenceEngine) está inicializada a la del idioma del contenido de la página. En algunos casos, no será exactamente igual, en cuyo caso se puede utilizar $diffEngineObject->setTextLanguage( $code ).
  • Desde 1.19, también inicializa palabras mágicas de formato de fecha y hora, incluida DIRECTIONMARK, pero no NAMESPACE(E), ya que esta última depende del idioma del sitio. Nótese que, al incluir una plantilla definida en el idioma A en una página en el idioma B, ésta se analizará en el idioma B de la página.
Varios idiomas en una sola página
En teoría, no hay soporte para la coexistencia de varios idiomas en una sola página, pero se pueden utilizar simples etiquetas <div lang="xyz" dir="ltr/rtl" class="mw-content-ltr/rtl"> para marcar texto escrito en otro idioma. Si se usa la clase CSS, las listas (numeradas o no) y los enlces de edición de sección se mostrarán bien cuando la etiqueta dir es opuesta a la dirección de texto del idioma de contenido. Los elementos definidos en el analizador sintáctico, como la tabla de contenidos (TOC) y las palabras mágicas, sin embargo, no cambiarán.
Ver u obtener el idioma de la página
  • JavaScript: mw.config.get( 'wgPageContentLanguage' ) - ten en cuenta que, por ejemplo, al ver el historial de una página, devolverá el idioma de la página cuyo historial estás viendo, mientras que la página del historial en sí no tiene una clase mw-content-ltr/rtl class. Es decir, tanto «/wiki/Página» como «/w/index.php?title=Página&action=history» devolverá el idioma de «Página». 1.19+
  • El idioma del contenido de la página está mencionado en la vista de información de la página (action=info, enlazada en la caja de herramientas) 1.21+
  • El idioma del contenido de la página se puede recuperar desde la API mediante api.php?action=query&prop=info 1.22+

Estructura del código

En primer lugar, tienes un objeto Language («idioma») en Language.php . Este objeto contiene todas las cadenas de mensajes localizables, así como otros parámetros y comportamientos importantes específicos del idioma (uso de mayúsculas y minúsculas, formato de fechas y de números, dirección, reglas gramaticales personalizadas, etc.).

El objeto se construye a partir de dos fuentes: versiones subclasificadas de sí mismo (clases) y archivos Message (mensajes).

También está la clase MessageCache, que maneja la entrada de texto mediante el espacio de nombres MediaWiki. La mayor parte de la internacionalización se realiza en la actualidad mediante objetos Manual:API de mensajes y utilizando la función de atajo wfMessage() definida en includes/GlobalFunctions.php. El código heredado puede seguir utilizando las antiguas funciones wfMsg*(), que se consideran obsoletas en favor de los ya mencionados objetos Message.

Véase también Manual:API de mensajes .

Objetos Language

Hay dos formas de obtener un objeto de idioma. Puedes utilizar el objeto global $wgLang y el servicio ContentLanguage (MediaWiki\MediaWikiServices::getContentLanguage) para la interfaz de usuario y el idioma del contenido respectivamente. Para un idioma arbitrario, puedes construir un objeto mediante $languageFactory->getLanguage( 'en' ) reemplazando en por el código de ese idioma. Puedes obtener $languageFactory, un objeto de la clase MediaWiki\Languages\LanguageFactory, mediante Dependency Injection . También puedes utilizar wfGetLangObj( $code ); si $code puede ya ser un objeto de idioma. La lista de códigos se encuentra en includes/languages/data/Names.php.

Los objetos de idioma son necesarios para realizar funciones específicas de un idioma, en la mayoría de los casos para aplicar el formato de número, fecha y hora, pero también para construir listas y otras cosas. Hay varias capas de almacenamiento en caché y de fusión con #Idiomas de respaldo, pero los detalles son irrelevantes en el uso general.

Sistema anterior de traducción local

Con MediaWiki 1.3.0, se implantó un nuevo sistema para la localización de MediaWiki. En lugar de editar el archivo de idioma y pedir a los desarrolladores que apliquen los cambios, los usuarios podían editar las cadenas de texto de la interfaz directamente desde sus wikis. Este es el sistema utilizado desde agosto de 2005. Los usuarios pueden encontrar el mensaje que desean traducir en Special:AllMessages y modificar la cadena correspondiente en el espacio de nombres MediaWiki:. Una vez hecha la edición, los cambios son visibles inmediatamente. Ya no era necesario solicitar una actualización y esperar a que los desarrolladores comprobaran y actualizaran el archivo.

El sistema es ideal para los proyectos Wikipedia; sin embargo, un efecto secundario es que los archivos de idiomas de MediaWiki incluidos en el software ya no están muy al día, y los desarrolladores lo tienen más difícil para mantener los archivos de meta sincronizados con los archivos reales.

Como los archivos de idiomas por defecto no proporcionan suficiente material traducido, nos enfrentamos a dos problemas:

  1. Los proyectos nuevos de Wikimedia creados en un idioma que lleve mucho tiempo sin actualizarse necesitan que se vuelva a traducir por completo la interfaz.
  2. Otros usuarios de MediaWiki (incluidos los proyectos Wikimedia en el mismo idioma) se encuentran con interfaces sin traducir. Esto es especialmente desafortunado para los idiomas más pequeños que no tienen muchos traductores.

Esto ya no es un problema tan grande, ya que translatewiki.net está anunciado de forma prominente y se emplea en casi todas las traducciones. De vez en cuando se siguen haciendo traducciones locales, pero es una práctica muy desaconsejada. Los mensajes locales, en su mayor parte, tienen que ser eliminados, trasladándose las traducciones relevantes a translatewiki.net y dejando en el wiki únicamente la personalización específica del sitio; hay un enorme retraso, especialmente en los proyectos más veteranos, aunque esta herramienta ayuda a hacer limpieza.

Mantener los mensajes centralizados y sincronizados

Los mensajes en inglés muy rara vez estarán desincronizados con el código. La experiencia ha demostrado que es conveniente tener todos los mensajes en inglés en un mismo lugar. Se puede revisar el texto en inglés sin hacer referencia al código, al igual que ocurre con las traducciones. Los programadores a veces toman muy malas decisiones para establecer el texto por defecto.

Qué se puede traducir o adaptar a las convenciones de localización

Hay tantas cosas susceptibles de ser traducidas o localizadas que no todas están disponibles directamente en translatewiki.net : véase translatewiki:Translating:MediaWiki. Si algo requiere que un desarrollador intervenga en el código, puedes solicitarlo en Phabricator o preguntar en translatewiki:Support si no sabes exactamente qué hacer.

 
El gráfico de respaldo de idiomas
  • Los idiomas de respaldo (es decir, uno o más idiomas próximos para utilizar a falta de traducción al idioma deseado en lugar del idioma de respaldo por defecto, que es el inglés)
  • El sentido de la escritura (de izquierda a derecha o de derecha a izquierda)
  • El carácter de marca de dirección en función del sentido de la escritura
  • Los símbolos de flechas en función del sentido de la escritura
  • Los idiomas donde no se puede utilizar la cursiva
  • El formato de números (añadir o no separadores de cifras, transformar cifras o transformar separadores)[3]
  • Los truncamientos de cadenas de caracteres (teniendo en cuenta los caracteres codificados en varios bytes)
  • Las conversiones gramaticales para lenguas flexivas
  • Las transformaciones al plural
  • El formato de los tiempos de expiración[aclárese]
  • La segmentación de diferencias (particularmente en chino)
  • La conversión entre variantes de un idioma (entre distintas ortografías o incluso entre distintos sistemas de escritura)
  • Las opciones de preferencias de usuario específicas del idioma
  • Los prefijos y sufijos (o rastros - trails) de los enlaces - $linkTrail. Se trata de letras que se pueden añadir antes de los corchetes de apertura o después de los corchetes de cierre de un wikienlace, pero que se muestran en pantalla como parte del enlace (es decir, cliqueables y del mismo color), por ejemplo, [[foo]]bar. Por defecto, el conjunto de estos caracteres es «a-z»; también puedes añadir a la lista las letras acentuadas o no pertenecientes al alfabeto latino utilizadas en tu idioma.
  • El código de idioma (preferiblemente según el último RFC en la norma BCP 47, actualmente RFC 5646, con su base de datos IANA asociada. Evita utilizar códigos obsoletos, heredados de especificaciones antiguas o de uso privado, y evita utilizar códigos asignados a colecciones y familias de lenguas en ISO 639.5, así como los códigos ISO 639 que no se han importado en la base de datos IANA para BCP 47)
  • El tipo de énfasis
  • La extensión Cite tiene un archivo de página especial por idioma, cite_text-zyx para el código de idioma zyx.

Funcionalidad pulcra:

  • Internacionalización de sprintfDate
  • Formato de números romanos

Espacios de nombres

En la actualidad, la traducción de espacios de nombres está deshabilitada en translatewiki.net, por lo que tendrás que hacerla por tu cuenta en Gerrit o bien registrar una tarea en Phabricator solicitando a otra persona que la haga por ti.[4]

Para permitir que se traduzcan los espacios de nombres introducidos por tu extensión, crea un archivo MyExtension.i18n.namespaces.php con este aspecto:

<?php
/**
 *  Traducciones de los espacios de nombres introducidos por MyExtension.
 *
 * @file
 */

$namespaceNames = [];

//  Para wikis donde la extensión MyExtension no está instalada.
if( !defined( 'NS_MYEXTENSION' ) ) {
	define( 'NS_MYEXTENSION', 2510 );
}

if( !defined( 'NS_MYEXTENSION_TALK' ) ) {
	define( 'NS_MYEXTENSION_TALK', 2511 );
}

/** English */
$namespaceNames['en'] = [
	NS_MYEXTENSION => 'MyNamespace',
	NS_MYEXTENSION_TALK => 'MyNamespace_talk',
];

/** Finnish (Suomi) */
$namespaceNames['fi'] = [
	NS_MYEXTENSION => 'Nimiavaruuteni',
	NS_MYEXTENSION_TALK => 'Keskustelu_nimiavaruudestani',
];

Después, cárgalo a partir del archivo extension.json mediante ExtensionMessagesFiles, así:

{
	"name": "MyExtension",
	"version": "0.0.1",
	"descriptionmsg": "myextension-desc",
    "ExtensionMessagesFiles": {
		"MyExtensionNamespaces": "MyExtension.i18n.namespaces.php"
	}
}

Ahora, cuando un usuario instale MyExtension en su wiki en finés (fi), ¡el espacio de nombres personalizado se traducirá por arte de magia al finés sin que el usuario tenga que mover un dedo!

Acuérdate también de registrar los espacios de nombres de tu extensión en la página extension default namespaces .

Alias de páginas especiales

Véase la página del manual sobre las páginas especiales para una información actualizada. Lo que sigue no parece ser válido.


Crea un archivo nuevo para los alias de las páginas especiales en este formato:

<?php
/**
 * Aliases for the MyExtension extension.
 *
 * @file
 * @ingroup Extensions
 */

$aliases = [];

/** English */
$aliases['en'] = [
	'MyExtension' => [ 'MyExtension' ]
];

/** Finnish (Suomi) */
$aliases['fi'] = [
	'MyExtension' => [ 'Lisäosani' ]
];

Después cárgalo del archivo extension.json mediante ExtensionMessagesFiles, así:

{
	"name": "MyExtension",
	"version": "0.0.1",
	"descriptionmsg": "myextension-desc",
    "ExtensionMessagesFiles": {
		"MyExtensionAlias": "MyExtension.i18n.alias.php"
	}
}

Si tu código de página especial utiliza SpecialPage::getTitleFor( 'MyExtension' ) o $this->getTitle() (en la clase que proporciona Special:MyExtension), se utilizará el alias localizado en caso de estar disponible.

Alias de espacios de nombres

Los alias de espacios de nombres son nombres adicionales que se pueden utilizar para apuntar a espacios de nombres existentes. Rara vez son necesarios, pero no disponer de ellos cuando lo son suele causar estragos en los wikis.

Necesitas alias de espacios de nombres:

  1. Cuando un idioma tiene variantes, en estas variantes se escriben algunos espacios de nombres de forma diferente y deseas que los editores sean capaces de utilizar las grafías alternativas. Las variantes son seleccionables en las preferencias de usuario. Los usuarios siempre ven la variante que seleccionaron, excepto en el wikitexto, pero al editar o realizar búsquedas, se puede utilizar cualquier variante.
  2. Cuando cambia el idioma, el o los idiomas de respaldo o la localización de un wiki existente, ese cambio conlleva el cambio de algunos espacios de nombres. Para no romper los enlaces ya presentes en el wiki que utilizan los nombres antiguos de los espacios de nombres, tendrás que añadir cada uno de los nombres anteriores a su alias de espacio de nombres cuando se realice el cambio, o antes de que se realice.

Los nombres genéricos en inglés de los espacios de nombres siempre están presentes como alias en todas las localizaciones, por lo que no necesitas, y de hecho no deberías, añadirlos.

Los alias no se pueden traducir en Translatewiki.net , pero se pueden solicitar allí o en Bugzilla : véase translatewiki:Translating:MediaWiki#Alias de espacios de nombres.

Configuraciones regionales

Algunas configuraciones lingüísticas varían geográficamente; MediaWiki carece de concepto de región, sólo conoce idiomas y sus variantes.

Estas configuraciones deben definirse una vez como predeterminadas para el idioma, y posteriormente los distintos wikis pueden cambiarlas como se desee en su configuración.

Formatos de fecha y hora

Las fechas y horas se muestran en las páginas especiales y similares. El formato predeterminado de fecha y hora se emplea en las firmas, por lo que debería ser el formato más utilizado y comprensible para los usuarios de ese idioma. Asimismo, los usuarios anónimos verán el formato predeterminado. Los usuarios registrados pueden escoger otros formatos en sus preferencias.

Si conoces el formato time() de PHP, puedes tratar de construir formatos por tu cuenta. MediaWiki utiliza una cadena de formato similar con algunas funcionalidades extra. Si no entiendes la frase anterior, no pasa nada. Puedes proporcionar una lista de ejemplos para Desarrolladores .

Véase Ayuda:Mensaje del sistema#Fuentes de mensajes.

Notas

  1. Véase includes/languages/data/Names.php.
  2. A pesar de ello, en 2012, la validación de códigos de idioma sigue siendo un problema por resolver. Véase Niklas Laxström, Language validation in MediaWiki [Validación de idiomas en MediaWiki], 28 de agosto de 2012.
  3. Estos se configuran por idioma en los respectivos archivos language/classes/LanguageXx.php y language/messages/MessagesXx.php.
  4. https://gerrit.wikimedia.org/r/211677

Véase también