Manual:Langue

From mediawiki.org
This page is a translated version of the page Manual:Language and the translation is 29% complete.
Outdated translations are marked like this.
documents i18n
Voir aussi Manuel:architecture MediaWiki#Langues (devrait être fusionné ici ?)

Dans MediaWiki, il y a divers types de langues :

  • La langue du contenu du site (ContentLanguage, basé sur $wgLanguageCode ), qui devrait généralement rester la même aussi longtemps que le wiki existe.
  • La langue d’interface utilisateur ($contextSource->getLanguage() appelée précédemment $wgLang ), qui peut être changée dans vos préférences ou avec le paramètre ajouté &uselang=xyz dans l’URL, mais qui reste généralement la même tout au long de l’utilisation du wiki par l’utilisateur.
  • La langue du contenu de la page. Elle peut être différente pour chaque page, même si la langue du site et celle de l'utilisateur sont les mêmes. Elle est définie par getPageLanguage() dans son titre, qui représente la langue dans laquelle le texte source du wiki est écrit.
    • La variante de langue utilisateur (page view language) qui est une variante de langue de la langue du contenu de la page, suivant la préférence de l’utilisateur. Elle peut également être configurée par le paramètre &variant (ou $wgVariantArticlePath ) ajouté dans l’URL (par exemple, en sélectionnant l’un des onglets proposés) si c’est une variante de la langue de contenu de la page actuellement visualisée. Elle est définie par getPageViewLanguage() dans le titre, qui représente la langue dans laquelle le contenu rendu en HTML est écrit.

Tous les trois sont des objets de type langue.

Code de langue

A ne pas confondre avec les codes de projets Wikimedia ; voir également les codes de langue sur Meta.

Un code de langue est une abréviation standard valide désignant une langue prise en charge par MediaWiki,[1] qui utilise de tels codes pour identifier de manière standard les langues (essentiellement en accord avec l'ISO 639-3, à l’exception des codes ISO 639-1 à deux lettres pour les régionalisations « établies » ) et qui les expose ou les nécessite pour adapter de nombreux points de l’interface et du code.[2]

Dans l’exemple ci-dessous, MediaWiki:Message/fr, fr est le code de langue pour le français.

La conformité avec le standard Unicode est requise pour fournir un bon support de langue, en particulier en coopération avec CLDR ; avoir un code ISO 639-3 valide est une condition nécessaire pour qu’une nouvelle langue puisse être ajoutée aux données de régionalisation de MediaWiki.

Names.php

Names.php est le dépôt maître des langues prises en charge par MediaWiki. Ce n'est pas la même chose que les langues affichées en l10n (fichiers JSON) par Mediawiki, ni les langues dont MediaWiki connait le nom (via CLDR/fr ), souvenez-vous en !

Langues de repli

Séquences de repli (Certaines des lignes affichées ne correspondent pas à cause des doublons dans les langues de repli. Vérifiez si la connexion existe actuellement pour la version du texte)

Certaines langues dans MediaWiki ont ce qu’on appelle des « séquences de repli ». C’est vers elles que MediaWiki s’orientera en utilisant une langue différente s’il ne peut pas trouver ce qu’il cherche dans une langue demandée. Par exemple le code de langue frc (français cajun) se replie sur le code de langue fr (français). La raison de ceci est que bien souvent de nombreuses langues (ou variantes de langues) n’ont pas tous les messages et paramètres de régionalisation traduits ou adaptés spécifiquement pour elles.

La séquence de repli pour chaque langue peut se trouver dans son fichier de configuration languages/messages/MessagesXX.php associé. Par exemple MessagesFrc.php (grep fallback). Une liste brute existe depuis 2020-09 dans ce commentaire de Phabricator.


Langue de contenu du site

Afficher/obtenir la langue du contenu du site

JavaScript :

mw.config.get( 'wgContentLanguage' );

Langue de l’interface utilisateur

Version de MediaWiki :
1.18
Valeur par défaut
Initialisé par
  • Spécial:Préférences
  • &uselang=zxx dans l’URL (voir uselang)
  • &variant=xy (ou $wgVariantArticlePath ) dans l’URL si c’est une variante de votre langue utilisateur
Problèmes
Parce que les messages d’interface peuvent venir des langues de repli et que la langue (sa valeur) n’est pas retournée, la langue actuelle de chaque message n’est pas connue.

Langue du contenu de page

Version de MediaWiki :
1.18
Valeur par défaut
  • $wgLang dans les pages spéciales.
  • l’anglais pour le CSS et les pages JS.
  • pour les pages de l’espace de noms MediaWiki, la langue dépend de la sous-page. Par exemple, la langue de la page MediaWiki:Message/ar sera définie comme l’arabe (ar), et MediaWiki:Message sera ContentLanguage .
  • toutes les autres pages sont ContentLanguage par défaut.
Configuration
Les extensions peuvent modifier toutes les autres pages au moyen de l'accroche PageContentLanguage . La valeur pour les pages spéciales, CSS, JS, et pour les pages des espaces de noms MediaWiki ne peut pas être modifiée.
Exemples
L’extension Translate l’utilise pour la fonctionnalité de traduction de page. Voir translatewiki:Project list/ar comme une traduction de translatewiki:Project list. La direction des lignes y est ainsi initialisée correctement à « de droite à gauche » pour l’arabe.
Version de MediaWiki :
1.24
Modification manuelle de la langue de la page
La sélection de la langue de la page est maintenant possible à l’aide de Special:PageLanguage depuis MediaWiki 1.24.
Les utilisateurs peuvent modifier la langue de contenu d’une page qui est par défaut la langue par défaut du wiki ($wgContLang). La langue des pages de l’espace de noms MediaWiki ne peut pas être modifiée.
La fonctionnalité doit être activée avec $code et les droits pour 'pagelang' doivent être atribués à un groupe de droits utilisateur (qui pourra alors faire les modifications de la langue des pages).
La modification de la langue de page a pour effet de déplacer la page source des traductions et ses unités de traduction vers la nouvelle page cible. Au cas où la page de traduction cible existe déjà, le changement de la langue de page n’est pas autorisé.
L’API correspondant se trouve sur API:SetPageLanguage.
Page language selection is now achievable with help of Special:PageLanguage since MediaWiki 1.24.
Users can change content language of a page which is by default the default Wiki language (ContentLanguage). Language of pages in the MediaWiki namespace can't be changed.
The feature needs to be enabled with $wgPageLanguageUseDB = true and the pagelang permission must be granted to a wiki user rights group (who can then perform page language changes).
Changing page language causes the source translation page and its units to be moved to the correct target language. In case the target language translation page already exists, the language change isn't allowed.
Matching API can be found on API:SetPageLanguage.
Que cela définit-il ?
  • Dans un SkinTemplate, cela ajoute un <div lang="xyz" dir="ltr/rtl" class="mw-content-ltr/rtl"></div> autour du texte de la page. L’attribut dir définit la direction d’écriture correcte. L’attribut lang sera toujours le code racine, par exemple de même si de-formal est indiqué.
    Pour les pages de fichier, la page de langue est initialisée dans ImagePage.php, car il y a beaucoup de HTML destiné à être affiché dans la langue de l’utilisateur.
  • Dans Parser.php, cela initialise le style de numérotation dans la table des matières (TOC), et d’autres éléments non directement reliés, comme la grammaire. Pour faire cela uniquement, utilisez parserOptions->setTargetLanguage().
  • La direction du texte de différence (DifferenceEngine) est initialisée à la valeur de la langue du contenu de la page. Dans certains cas cela ne sera pas le même, et donc $diffEngineObject->setTextLanguage( $code ) pourra être utilisé.
  • Depuis 1.19, cela définit le comportement des mots magiques de formatage des nombres et des dates, y compris DIRECTIONMARK, mais pas les noms des espaces de noms retournés par NAMESPACE(E) car ils ne dépendent en fait que de la langue du site. Notez que la transclusion d’un modèle défini dans une langue A dans une page définie dans la langue B sera analysée en utilisant la langue B de la page cible.
Langues multiples dans une seule page
Les langues multiples dans une seule page ne sont en théorie pas prises en charge, mais de simples balises <div lang="xyz" dir="ltr/rtl" class="mw-content-ltr/rtl"> peuvent être utilisées pour marquer le texte comme étant écrit dans une langue différente. Si la classe CSS est utilisée, les listes numérotées ou non, les liens de modification de sections seront affichés proprement lorsque l’attribut dir est opposé à celui de la langue de contenu de la page. Cependant, des éléments définis dans l’analyseur, tels que la table des matières (TOC) et les mots magiques ne seront pas modifiés.
Visualiser / obtenir la langue de la page
  • JavaScript : mw.config.get( 'wgPageContentLanguage' ) – notez que, quand lorsqu’on affiche par exemple l’historique d’une page, cela renvoie la langue de la page à laquelle l’historique est attaché, parce que la page historique n’a pas de classe mw-content-ltr/rtl propre. Par exemple, à la fois /wiki/NomDePage et /w/index.php?title=NomDePage&action=history renvoient la langue de NomDePage. 1.19+
  • La langue du contenu de page est mentionnée dans l’affichage des informations de page (action=info, liée depuis la boîte à outils) 1.21+
  • La langue du contenu de page peut être récupérée dans l’API par api.php?action=query&prop=info 1.22+

Code structure

First, you have a Language object in Language.php . This object contains all the localisable message strings, as well as other important language-specific settings and custom behavior (uppercasing, lowercasing, printing dates, formatting numbers, direction, custom grammar rules etc.).

The object is constructed from two sources: sub-classed versions of itself (classes) and Message files (messages).

There's also the MessageCache class, which handles input of text via the MediaWiki namespace. Most internationalisation is nowadays done via API Messages objects and by using the wfMessage() shortcut function, which is defined in includes/GlobalFunctions.php. Legacy code might still be using the old wfMsg*() functions, which are now considered deprecated in favor of the above-mentioned Message objects.

See also API Messages .

Language objects

There are two ways to get a language object. You can use the globals $wgLang and ContentLanguage service (MediaWiki\MediaWikiServices::getContentLanguage) for user interface and content language respectively. For an arbitrary language you can construct an object by using $languageFactory->getLanguage( 'en' ) by replacing en with the code of the language. You can get $languageFactory, an object of the MediaWiki\Languages\LanguageFactory class, using Dependency Injection .) You can also use wfGetLangObj( $code ); if $code could already be a language object. The list of codes is in includes/languages/data/Names.php.

Language objects are needed for doing language-specific functions, most often to do number, time and date formatting, but also to construct lists and other things. There are multiple layers of caching and merging with #Fallback languages, but the details are irrelevant in normal use.

Old local translation system

With MediaWiki 1.3.0, a new system was set up for localising MediaWiki. Instead of editing the language file and asking developers to apply the change, users could edit the interface strings directly from their wikis. This is the system in use as of August 2005. People can find the message they want to translate in Special:AllMessages and then edit the relevant string in the MediaWiki: namespace. Once edited, these changes are live. There was no more need to request an update, and wait for developers to check and update the file.

The system is great for Wikipedia projects; however a side effect is that the MediaWiki language files shipped with the software are no longer quite up-to-date, and it is harder for developers to keep the files on meta in sync with the real language files.

As the default language files do not provide enough translated material, we face two problems:

  1. New Wikimedia projects created in a language which has not been updated for a long time, need a total re-translation of the interface.
  1. Other users of MediaWiki (including Wikimedia projects in the same language) are left with untranslated interfaces.

This is especially unfortunate for the smaller languages which don't have many translators.

This is not such a big issue anymore, because translatewiki.net is advertised prominently and used by almost all translations. Local translations still do happen sometimes but they're strongly discouraged. Local messages mostly have to be deleted, moving the relevant translations to translatewiki.net and leaving on the wiki only the site-specific customisation; there's a huge backlog especially in older projects, this tool helps with cleanup.

Keeping messages centralised and in sync

English messages are very rarely out of sync with the code. Experience has shown that it's convenient to have all the English messages in the same place. Revising the English text can be done without reference to the code, just like translation can. Programmers sometimes make very poor choices for the default text.

What can be localised

So many things are localisable on MediaWiki that not all of them are directly available on translatewiki.net : see translatewiki:Translating:MediaWiki. If something requires a developer intervention on the code, you can request it on Phabricator, or ask at translatewiki:Support if you don't know what to do exactly.

Graph of language fallback
  • Fallback languages (that is, other more closely related language(s) to use when a translation is not available, instead of the default fallback, which is English)
  • Directionality (left to right or right to left, RTL)
  • Direction mark character depending on RTL
  • Arrow depending on RTL
  • Languages where italics cannot be used
  • Number formatting (comma-ify, i.e. adding or not digits separators; transform digits; transform separators)[3]
  • Truncate (multibyte)
  • Grammar conversions for inflected languages
  • Plural transformations
  • Formatting expiry times[demande de précisions]
  • Segmenting for diffs (Chinese)
  • Convert to variants of language (between different orthographies, or scripts)
  • Language specific user preference options
  • Link trails and link prefix, e.g.: [[foo]]bar. These are letters that can be glued after/before the closing/opening brackets of a wiki link, but appear rendered on the screen as if part of the link (that is, clickable and in the same colour). By default the link trail is "a-z"; you may want to add the accentuated or non-Latin letters used by your language to the list.
  • Language code (preferably used according to the latest RFC in standard BCP 47, currently RFC 5646, with its associated IANA database. Avoid deprecated, grandfathered and private-use codes: look at what they mean in standard ISO 639, and avoid codes assigned to collections/families of languages in ISO 639-5, and ISO 639 codes which were not imported in the IANA database for BCP 47)
  • Type of emphasising
  • The Cite extension has a special page file per language, cite_text-zyx for language code zyx.

Neat functionality:

  • I18N sprintfDate
  • Roman numeral formatting

Espace de noms

Currently making namespace name translations is disabled on translatewiki.net, so you need to do this yourself in Gerrit, or file a Phabricator task asking for someone else to do it.[4]

To allow custom namespaces introduced by your extension to be translated, create a MyExtension.i18n.namespaces.php file that looks like this:

<?php
/**
 *  Translations of the namespaces introduced by MyExtension.
 *
 * @file
 */

$namespaceNames = [];

//  For wikis where the MyExtension extension is not installed.
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',
];

Then load it from the extension.json file using ExtensionMessagesFiles like this:

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

Now, when a user installs MyExtension on their Finnish (fi) wiki, the custom namespace will be translated into Finnish magically, and the user doesn't need to do a thing!

Also remember to register your extension's namespace(s) on the extension default namespaces page.

Special page aliases

See the manual page for Special pages for up-to-date information. The following does not appear to be valid.


Create a new file for the special page aliases in this format:

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

$aliases = [];

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

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

Then load it from the extension.json file using ExtensionMessagesFiles like this:

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

When your special page code uses either SpecialPage::getTitleFor( 'MyExtension' ) or $this->getTitle() (in the class that provides Special:MyExtension), the localised alias will be used, if it's available.

Namespace name aliases

Namespace name aliases are additional names which can be used to address existing namespaces. They are rarely needed, but not having them when they are, usually creates havoc in existing wikis.

You need namespace name aliases:

  1. When a language has variants, and these variants spell some namespaces differently, and you want editors to be able to use the variant spellings.

Variants are selectable in the user preferences. Users always see their selected variant, except in wikitext, but when editing or searching, an arbitrary variant can be used.

  1. When an existing wiki's language, fall back language(s), or localisation is changed, with it are changed some namespace names.

So as not to break the links already present in the wiki, that are using the old namespace names, you need to add each of the altered previous namespace names to its namespace name aliases, when, or before, the change is made.

The generic English namespace names are always present as namespace name aliases in all localisations, so you need not, and should not, add those.

Aliases can't be translated on Translatewiki.net , but can be requested there or on Bugzilla : see translatewiki:Translating:MediaWiki#Namespace name aliases.

Regional settings

Some linguistic settings vary across geographies; MediaWiki doesn't have a concept of region, it only has languages and language variants.

These settings need to be set once as a language's default, then individual wikis can change them as they wish in their configuration.

Time and date formats

Time and dates are shown on special pages and alike. The default time and date format is used for signatures, so it should be the most used and most widely understood format for users of that language. Also anonymous users see the default format. Registered users can choose other formats in their preferences.

If you are familiar with PHP's time() format, you can try to construct formats yourself. MediaWiki uses a similar format string, with some extra features. If you don't understand the previous sentence, that's OK. You can provide a list of examples for Développeurs .

Notes

  1. Voir includes/languages/data/Names.php.
  2. En dépit de ceci, depuis 2012, la validation des codes langue n’est toujours pas un problème résolu. Voir la Validation des langues dans MediaWiki, par Niklas Laxström, 28 août 2012.
  3. These are configured by language in the respective language/classes/LanguageXx.php or language/messages/MessagesXx.php files.
  4. https://gerrit.wikimedia.org/r/211677

Voir aussi

  • MediaWiki multilingue
  • Obtenir le nom des langues à partir de leurs codes est possible en utilisant la fonction noyau {{#language:<code>}} documentée dans mots magiques.