Příručka:Jazyk
- Podívejte také na stránku Příručka:Architektura MediaWiki#Jazyky (Nemělo by se to sloučit s touto stránkou?)
V rámci MediaWiki rozlišujeme různá pojetí jazyků:
- Jazyk obsahu webu (služba
ContentLanguage
vMediaWiki\MediaWikiServices::getContentLanguage
, na základě$wgLanguageCode
), který by měl obecně zůstat stejný, dokud bude wiki existovat.- Varianta jazyka stránky ($wgDefaultLanguageVariant ) je výchozí verzí, pokud je pro tento jazyk implementován LanguageConverter .
- Jazyk uživatelského rozhraní ($contextSource->getLanguage() dříve
$wgLang
), který lze nastavit v Nastavení, nebo použitím kódu&uselang=xyz
v URL. Ve standardních případech zůstává během používání jedné wiki taktéž neměnný. - Jazyk obsahu stránky se může u každé stránky lišit, i když základní jazyk stránek a uživatelského rozhraní budou totožné. Je definován v getPageLanguage() v hlavičce a značí, v jakém jazyce je zdroj obsahu stránky (např. wikitext) psán.
- Jazyk zobrazení stránky, neboli uživatelem nastavený jazyk je jazyková varianta jazyka stránky, kterou si uživatel zvolil. Lze ji nastavit pomocí
&variant
(nebo$wgVariantArticlePath
) v URL (např. zvolením některé ze záložek) pokud se jedná o variantu jazyka obsahu prohlížené stránky. Je definován v getPageViewLanguage() v hlavičce a značí, v jakém jazyce je vykreslený HTML obsah psán.
- Jazyk zobrazení stránky, neboli uživatelem nastavený jazyk je jazyková varianta jazyka stránky, kterou si uživatel zvolil. Lze ji nastavit pomocí
Všechny tři výše zmíněné chápeme jako jazykové objekty.
Kód jazyka
- Neplést s kódem projektu Wikimedie; viz také Jazykové kódy na Meta.
Jazykový kód je platná standardní zkratka pro jazyk podporovaný MediaWiki,[1] který používá takové kódy jako standardní identifikátory jazyků (většinou v souladu s ISO 639-3 , kromě dvoupísmenných kódů z ISO 639-1 pro "zavedené" lokality) a odhaluje je nebo je vyžaduje v mnoha bodech rozhraní a kódu.[2]
V níže uvedeném příkladu je MediaWiki:Message/ar
, ar
kód jazyka pro Arabic.
Pro zajištění dobré jazykové podpory je nutná jednotnost se standardem Unicode, zejména ve spolupráci s CLDR. Kód ISO 639-3 je požadavkem na přidání jazyka do lokalit 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 je hlavní registr jazyků podporovaných MediaWiki. To není totéž jako jazyky, jejichž MediaWiki zobrazí l10n (JSON soubory), ani jazyky, jejichž názvy MediaWiki zná (prostřednictvím CLDR ), pamatujte!
Záložní jazyky
Některé jazyky v MediaWiki mají to, co je známé jako "záložní sekvence".
Zde se MediaWiki vrátí k jinému jazyku, pokud nenajde, co potřebuje.
Příkladem toho je kód jazyka frc
(cajunská francouzština), který vychází z kódu jazyka fr
(francouzština).
Důvodem je, že někdy jazyky nemají všechny zprávy v nich definované.
Záložní nastavení pro jazyk lze nalézt v příslušném souboru languages/messages/MessagesXX.php
.
Například MessagesFrc.php. Můžete vyhledat kód pro všechna použití. V tomto komentáři Phabricatoru je také prostý seznam z září 2020.
Výchozí jazyk webu
Zobrazení/získání jazyka obsahu webu
mw.config.get( 'wgContentLanguage' );
Jazyk uživatelského rozhraní
Verze MediaWiki: | ≥ 1.18 |
- Výchozí hodnota
- Nastavit přes
- Special:Preferences
&uselang=zxx
v adrese URL (viz uselang)&variant=xy
(nebo$wgVariantArticlePath
) v adrese URL if je to varianta vašeho uživatelského jazyka
- Problémy
- Protože zprávy rozhraní mohou pocházet ze záložních jazyků, ale jazyk není vrácen, skutečný jazyk každé zprávy není znám.
Jazyk obsahu stránky
Verze MediaWiki: | ≥ 1.18 |
- Výchozí hodnota
- $wgLang u speciálních stránek.
- Angličtina pro stránky, které obsahují CSS a JS kódy.
- U stránek jmenného prostoru MediaWiki závisí jazyk na podstránce. Například MediaWiki:Message/ar bude nastaveno na arabštinu (ar) a MediaWiki:Message bude mít hodnotu
ContentLanguage
. - Všechny ostatní stránky jsou ve výchozím nastavení
ContentLanguage
.
- Konfigurace
- Rozšíření mohou změnit všechny ostatní stránky pomocí háčku PageContentLanguage . Hodnotu pro speciální stránky, CSS, JS a stránky jmenného prostoru MediaWiki nelze přepsat.
- Příklady
- Rozšíření Translate jej používá pro funkci překladu stránek. Viz translatewiki:Project:About/ar jako překlad translatewiki:Project:About. Směrovost stránky je tak pro arabštinu správně nastavena zprava doleva.
Verze MediaWiki: | ≥ 1.24 |
- Ruční změna jazyka stránky
- Výběr jazyka stránky je nyní dosažitelný pomocí Special:PageLanguage od MediaWiki 1.24.
- Uživatelé mohou změnit jazyk obsahu stránky, který je ve výchozím nastavení výchozím jazykem wiki (
ContentLanguage
). Jazyk stránek v jmenném prostoru MediaWiki nelze změnit. - Funkce musí být povolena pomocí
$wgPageLanguageUseDB = true
a oprávněnípagelang
musí být uděleno skupině uživatelských práv wiki (která pak může provádět změny jazyka stránky). - Změna jazyka stránky způsobí, že zdrojová stránka překladu a její jednotky budou přesunuty do správného cílového jazyka. V případě, že stránka překladu do cílového jazyka již existuje, změna jazyka není povolena.
- Matching API lze nalézt na API:Nastavení jazyka stránky .
- Co to znamená?
- V SkinTemplate přidá kolem textu stránky
<div lang="xyz" dir="ltr/rtl" class="mw-content-ltr/rtl"></div>
. Atribut dir nastavuje správný směr zápisu. Atributem lang bude vždy kořenový kód, např. "de", i když je uvedeno "de-formal".- U souborových stránek se to nastavuje v ImagePage.php, protože tam je hodně HTML, které jsou v uživatelském jazyce.
- V Parser.php nastavuje číslování obsahu (TOC) a věci jako gramatiku, i když to většinou není relevantní. Chcete-li to provést pouze, použijte parserOptions->setTargetLanguage().
- Směr textu rozdílu (DifferenceEngine) je nastaven na jazyk obsahu stránky. V některých případech to není totožné, v takovém případě lze použít $diffEngineObject->setTextLanguage($code).
- Od 1.19 také nastavuje čas a formátování čísel magic words, včetně DIRECTIONMARK, ale ne NAMESPACE(E), protože to opravdu závisí na jazyce webu. Všimněte si, že zahrnutí šablony označené jako jazyk A na stránku s jazykem B bude analyzováno s jazykem B na této stránce.
- V SkinTemplate přidá kolem textu stránky
- Více jazyků na jedné stránce
- Více jazyků na jedné stránce není teoreticky podporováno, ale jednoduché značky
<div lang="xyz" dir="ltr/rtl" class="mw-content-ltr/rtl">
lze použít k označení textu jako napsaného v jiném jazyce. Pokud je použita třída CSS, seznamy ul/ol a sekce úprav se zobrazí pěkně, když je značka dir opačná než hodnota jazyka obsahu stránky. Věci definované v parseru, jako TOC a magická slova, se však nezmění.
- Zobrazení/získání jazyka stránky
- JavaScript:
mw.config.get( 'wgPageContentLanguage' )
- všimněte si, že když např. při prohlížení historie stránky vrátí jazyk stránky, na které je historií, zatímco stránka historie nemá třídu mw-content-ltr/rtl. Tj. "/wiki/Page" i "/w/index.php?title=Page&action=history" vrátí jazyk "Page". 1.19+ - Jazyk obsahu stránky je uveden v zobrazení informací o stránce (
action=info
, odkaz v panelu nástrojů) 1.21+ - Jazyk obsahu stránky lze získat v API přes api.php?action=query&prop=info 1.22+
Struktura kódu
Nejprve máte objekt Language v Language.php . Tento objekt obsahuje všechny lokalizovatelné řetězce zpráv a také další důležitá nastavení specifická pro jazyk a vlastní chování (velká písmena, malá písmena, tisk dat, formátování čísel, směr, vlastní gramatická pravidla atd.).
Objekt je vytvořen ze dvou zdrojů: Podtřídy verze sebe sama (třídy) a soubory zpráv (zprávy).
K dispozici je také třída MessageCache, která zpracovává vkládání textu prostřednictvím jmenného prostoru MediaWiki.
Většina internacionalizace se dnes provádí prostřednictvím objektů na stránce Příručka:Zprávy API a pomocí funkce zkratky wfMessage()
, která je definována v includes/GlobalFunctions.php
.
Starší kód může stále používat staré funkce wfMsg*()
, které jsou nyní považovány za zastaralé ve prospěch výše uvedených objektů Message.
Více na stránce Příručka:Zprávy API .
Objekty jazyka
Existují dva způsoby, jak získat jazykový objekt.
Pro uživatelské rozhraní a jazyk obsahu můžete použít globální službu $wgLang a ContentLanguage
(MediaWiki\MediaWikiServices::getContentLanguage
).
Pro libovolný jazyk můžete vytvořit objekt pomocí $languageFactory->getLanguage( 'en' )
nahrazením en
kódem jazyka.
Můžete získat $languageFactory
, objekt třídy MediaWiki\Languages\LanguageFactory
, pomocí Dependency Injection .
Můžete také použít wfGetLangObj( $code );
, pokud $code
již může být jazykovým objektem.
Seznam kódů je v includes/languages/data/Names.php
.
Jazykové objekty jsou potřebné k provádění funkcí specifických pro daný jazyk, nejčastěji k formátování čísel, času a data, ale také k vytváření seznamů a dalších věcí. Existuje několik vrstev ukládání do mezipaměti a slučování s #Záložními jazyky, ale podrobnosti jsou při běžném používání irelevantní.
Starý místní překladatelský systém
S MediaWiki 1.3.0 byl vytvořen nový systém pro lokalizaci MediaWiki.
Namísto úpravy jazykového souboru a žádání vývojářů, aby změny použili, mohou uživatelé upravovat řetězce rozhraní přímo ze svých wikin.
Toto je systém používaný od srpna 2005.
Lidé mohou najít zprávu, kterou chtějí přeložit, v Special:AllMessages a poté upravit příslušný řetězec ve jmenném prostoru MediaWiki:
.
Po úpravě jsou tyto změny aktivní.
Už nebylo třeba žádat o aktualizaci a čekat, až vývojáři soubor zkontrolují a aktualizují.
Systém je skvělý pro projekty Wikipedie. Vedlejším efektem však je, že jazykové soubory MediaWiki dodávané se softwarem již nejsou zcela aktuální a pro vývojáře je obtížnější udržovat soubory na meta synchronizaci se soubory ve skutečném jazyce.
Protože soubory výchozího jazyka neposkytují dostatek přeloženého materiálu, čelíme dvěma problémům:
- Nové projekty Wikimedie vytvořené v jazyce, který nebyl po dlouhou dobu aktualizován, vyžadují úplný nový překlad rozhraní.
- Ostatním uživatelům MediaWiki (včetně projektů Wikimedie ve stejném jazyce) zůstávají nepřeložená rozhraní. To je obzvláště nešťastné pro menší jazyky, které nemají mnoho překladatelů.
To už není tak velký problém, protože translatewiki.net je inzerován prominentně a používají ho téměř všechny překlady. K místním překladům stále dochází, ale důrazně se od nich odrazuje. Místní zprávy se většinou musí smazat, přesunout příslušné překlady na translatewiki.net a na wiki ponechat pouze přizpůsobení specifické pro daný web. Zejména u starších projektů dochází k obrovskému nahromadění, s čištěním pomáhá tento nástroj.
Udržování centralizovaných a synchronizovaných zpráv
Anglické zprávy jsou velmi zřídka nesynchronizované s kódem. Zkušenosti ukazují, že je vhodné mít všechny anglické zprávy na stejném místě. Revize anglického textu může být provedena bez odkazu na kód, stejně jako překlad. Programátoři někdy velmi špatně volí výchozí text.
Co lze lokalizovat
Na MediaWiki lze lokalizovat tolik věcí, že ne všechny jsou přímo dostupné na translatewiki.net : viz translatewiki:Translating:MediaWiki. Pokud něco vyžaduje zásah vývojáře do kódu, můžete si to vyžádat na Phabricatoru nebo se zeptat na translatewiki:Support, pokud nevíte, co dělat přesně.
- Jmenné prostory - jádro i rozšíření plus pohlavně závislé uživatelské jmenné prostory
- Pracovní dny (a zkratky)
- Měsíce (a zkratky)
- Knihkupectví na Special:BookSources
- Názvy vzhledů
- Matematická jména
- Předvolby data -
$datePreferences
- Formáty data -
$dateFormats
- Výchozí formát data -
$defaultDateFormat
- Mapa migrace preferencí data - pro kompatibilitu se starými databázemi MediaWiki
- Výchozí uživatelská možnost přepíše
- Názvy jazyků
- Názvy zemí (přes Rozšíření:CLDR )
- Názvy měn (v rámci Rozšíření:CLDR )
- Časová pásma
- Převod kódování znaků prostřednictvím
iconv
- Nejprve UpperLowerCase (pro některé potřebuje casemaps)[potřebné objasnit]
- Velká malá písmena[potřebné objasnit]
- Velká písmena
- Konec slov s velkými písmeny[potřebné objasnit]
- Skládání obalu[potřebné objasnit]
- Odstranění interpunkci pro vyhledávání v MySQL (optimalizace vyhledávání)
- Získání prvního znaku
- Alternativní kódování
- Překódování pro úpravy (a poté překódování vstupu)[potřebné objasnit]
- Záložní jazyky (tj. další blíže příbuzné jazyky, které se mají použít, když překlad není k dispozici, namísto výchozího záložního jazyka, kterým je angličtina)
- Směrovost (zleva doprava nebo zprava doleva, RTL)
- Znak směrové značky v závislosti na RTL
- Šipka v závislosti na RTL
- Jazyky, kde nelze použít kurzívu
- Formátování čísel (comma-ify, tj. přidání nebo ne oddělování číslic; transformace číslic; transformační oddělovače)[3]
- Zkrácení (multibajt)
- Gramatické převody pro skloňované jazyky
- Plurální transformace
- Formátování časů vypršení platnosti[potřebné objasnit]
- Segmentace pro rozdíly (čínština)
- Převést na varianty jazyka (mezi různými pravopisy nebo písmy)
- Možnosti uživatelských preferencí specifické pro daný jazyk
- Trasy odkazů a předpona odkazu –
$linkTrail
. Toto jsou písmena, která lze nalepit za/před uzavírací/otevírací závorky odkazu na wiki, ale na obrazovce se zobrazují jako součást odkazu (to znamená, že lze kliknout a mají stejnou barvu), např.:[[foo]]bar
. Ve výchozím nastavení je trasa odkazu "a-z"; možná budete chtít do seznamu přidat písmena s diakritikou nebo písmena jiná než latinka používaná vaším jazykem. - Kód jazyka (nejlépe používaný podle nejnovějšího RFC ve standardu BCP 47, aktuálně RFC 5646, s přidruženou databází IANA. Vyhněte se zastaralým, starým a soukromým kódům: Podívejte se, co znamenají ve standardu ISO 639, a vyhněte se kódům přiřazeným sbírkám/skupinám jazyků v ISO 639-5 a kódům ISO 639, které nebyly importovány do databáze IANA pro BCP 47)
- Typ zdůraznění
- Rozšíření Cite má speciální stránkovací soubor pro každý jazyk,
cite_text-zyx
pro kód jazykazyx
.
Čistá funkčnost:
- I18N
sprintfDate
- Formátování římských číslic
Jmenné prostory
V současné době je vytváření překladů jmen jmenného prostoru na translatewiki.net zakázáno, takže to musíte udělat sami v Gerritu nebo zadat Phabricator úkol a požádat někoho jiného, aby to udělal.[4]
Chcete-li umožnit překlad vlastních jmenných prostorů zavedených vaším rozšířením, vytvořte soubor MyExtension.i18n.namespaces.php
, který vypadá takto:
<?php
/**
* Překlady jmenných prostorů zavedených MyExtension.
*
* @file
*/
$namespaceNames = [];
// Pro wikiny, kde není nainstalováno rozšíření MyExtension.
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',
];
Poté jej načtěte ze souboru extension.json
pomocí ExtensionMessagesFiles takto:
{
"name": "MyExtension",
"version": "0.0.1",
"descriptionmsg": "myextension-desc",
"ExtensionMessagesFiles": {
"MyExtensionNamespaces": "MyExtension.i18n.namespaces.php"
}
}
Nyní, když si uživatel nainstaluje MyExtension na svou finskou (fi) wiki, vlastní jmenný prostor bude magicky přeložen do finštiny a uživatel nemusí nic dělat!
Nezapomeňte také zaregistrovat jmenný prostor(y) svého rozšíření na stránce Výchozí jmenné prostory rozšíření .
Speciální aliasy stránek
Aktuální informace naleznete na manuálové stránce pro speciální stránky. Zdá se, že následující neplatí.
Vytvořte nový soubor pro speciální aliasy stránek v tomto formátu:
<?php
/**
* Aliases for the MyExtension extension.
*
* @file
* @ingroup Extensions
*/
$aliases = [];
/** English */
$aliases['en'] = [
'MyExtension' => [ 'MyExtension' ]
];
/** Finnish (Suomi) */
$aliases['fi'] = [
'MyExtension' => [ 'Lisäosani' ]
];
Poté jej načtěte ze souboru extension.json
pomocí ExtensionMessagesFiles takto:
{
"name": "MyExtension",
"version": "0.0.1",
"descriptionmsg": "myextension-desc",
"ExtensionMessagesFiles": {
"MyExtensionAlias": "MyExtension.i18n.alias.php"
}
}
Když váš speciální kód stránky používá SpecialPage::getTitleFor( 'MyExtension' )
nebo $this->getTitle()
(ve třídě, která poskytuje Special:MyExtension), použije se lokalizovaný alias, pokud je k dispozici.
Aliasy jmenného prostoru
Aliasy jmenných prostorů jsou další názvy, které lze použít k adresování existujících jmenných prostorů. Jsou zřídkakdy potřeba, ale když je nemáte, obvykle to na stávajících wikinách způsobí zmatek.
Potřebujete aliasy jmenného prostoru:
- Když má jazyk varianty a tyto varianty hláskují některé jmenné prostory odlišně a chcete, aby editoři mohli používat varianty pravopisu. Varianty jsou volitelné v uživatelských preferencích. Uživatelé vždy vidí svou vybranou variantu, kromě wikitextu, ale při editaci nebo vyhledávání lze použít libovolnou variantu.
- Když se změní jazyk existující wiki, záložní jazyk(y) nebo lokalizace, změní se i některé názvy jmenných prostorů. Aby nedošlo k přerušení odkazů již přítomných na wiki, které používají stará jména jmenných prostorů, musíte přidat každé ze změněných předchozích jmen jmenných prostorů k jejich aliasům jmen jmenných prostorů, když je změna provedena nebo před ní.
Obecné anglické názvy jmenných prostorů jsou vždy přítomny jako aliasy jmenných prostorů ve všech lokalizacích, takže je nemusíte a neměli byste přidávat.
Aliasy nelze přeložit na Translatewiki.net , ale lze o ně požádat tam nebo na Bugzilla : viz translatewiki:Translating:MediaWiki#Jméno aliasů jmenného prostoru.
Regionální nastavení
Některá jazyková nastavení se v různých zeměpisných oblastech liší. MediaWiki nemá koncept regionu, má pouze jazyky a jazykové varianty.
Tato nastavení je potřeba nastavit jednou jako výchozí jazyk, pak si je jednotlivé wikiny mohou ve své konfiguraci libovolně měnit.
Formáty času a data
Čas a data jsou zobrazeny na speciálních stránkách a podobně. Pro podpisy se používá výchozí formát času a data, takže by to měl být nejpoužívanější a nejrozšířenější formát pro uživatele daného jazyka. Také anonymní uživatelé vidí výchozí formát. Registrovaní uživatelé si mohou ve svých preferencích vybrat jiné formáty.
Pokud jste obeznámeni s formátem PHP time(), můžete se pokusit vytvořit formáty sami. MediaWiki používá podobný formátovací řetězec s některými funkcemi navíc. Pokud nerozumíte předchozí větě, nevadí. Můžete poskytnout seznam příkladů na Vývojáři .
Viz Nápověda:Systémová zpráva#Zdroje zpráv.
Poznámky pod čarou
- ↑ viz includes/languages/data/Names.php.
- ↑ Navzdory tomu není od roku 2012 validace jazykových kódů dosud vyřešeným problémem. Viz Niklas Laxström, Language validation in MediaWiki, 28. srpna, 2012
- ↑
Ty se konfigurují podle jazyka v příslušných souborech
language/classes/LanguageXx.php
nebolanguage/messages/MessagesXx.php
. - ↑ https://gerrit.wikimedia.org/r/211677
Související odkazy
- Multijazyčná MediaWiki
- Získávání názvů jazyků z kódů je možné pomocí základní funkce {{#language:<code>}} zdokumentované v magických slovech