CINXE.COM

Help:Extension:Translate/Components - MediaWiki

<!DOCTYPE html> <html class="client-nojs vector-feature-language-in-header-disabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-disabled skin-theme-clientpref-day vector-toc-available" lang="en" dir="ltr"> <head> <meta charset="UTF-8"> <title>Help:Extension:Translate/Components - MediaWiki</title> <script>(function(){var className="client-js vector-feature-language-in-header-disabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-disabled skin-theme-clientpref-day vector-toc-available";var cookie=document.cookie.match(/(?:^|; )mediawikiwikimwclientpreferences=([^;]+)/);if(cookie){cookie[1].split('%2C').forEach(function(pref){className=className.replace(new RegExp('(^| )'+pref.replace(/-clientpref-\w+$|[^\w-]+/g,'')+'-clientpref-\\w+( |$)'),'$1'+pref+'$2');});}document.documentElement.className=className;}());RLCONF={"wgBreakFrames":false,"wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""], "wgDefaultDateFormat":"dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgRequestId":"cfc4d2bf-ac56-46e1-b378-5937189e1cd8","wgCanonicalNamespace":"Help","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":12,"wgPageName":"Help:Extension:Translate/Components","wgTitle":"Extension:Translate/Components","wgCurRevisionId":6817941,"wgRevisionId":6817941,"wgArticleId":98270,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["Extension:Translate"],"wgPageViewLanguage":"en","wgPageContentLanguage":"en","wgPageContentModel":"wikitext","wgRelevantPageName":"Help:Extension:Translate/Components","wgRelevantArticleId":98270,"wgIsProbablyEditable":true,"wgRelevantPageIsProbablyEditable":true,"wgRestrictionEdit":[],"wgRestrictionMove":[],"wgNoticeProject":"mediawiki","wgCiteReferencePreviewsActive":true,"wgMediaViewerOnClick":true, "wgMediaViewerEnabledByDefault":true,"wgVisualEditor":{"pageLanguageCode":"en","pageLanguageDir":"ltr","pageVariantFallbacks":"en"},"wgMFDisplayWikibaseDescriptions":{"search":true,"watchlist":true,"tagline":false,"nearby":true},"wgWMESchemaEditAttemptStepOversample":false,"wgWMEPageLength":20000,"wgTranslatePageTranslation":"source","wgCentralAuthMobileDomain":false,"wgEditSubmitButtonLabelPublish":true,"wgDiscussionToolsFeaturesEnabled":{"replytool":true,"newtopictool":true,"sourcemodetoolbar":true,"topicsubscription":false,"autotopicsub":false,"visualenhancements":false,"visualenhancements_reply":false,"visualenhancements_pageframe":false},"wgDiscussionToolsFallbackEditMode":"visual","wgULSPosition":"personal","wgULSisCompactLinksEnabled":true,"wgVector2022LanguageInHeader":false,"wgULSisLanguageSelectorEmpty":false,"wgCheckUserClientHintsHeadersJsApi":["brands","architecture","bitness","fullVersionList","mobile","model","platform","platformVersion"]};RLSTATE={ "ext.globalCssJs.user.styles":"ready","site.styles":"ready","user.styles":"ready","ext.globalCssJs.user":"ready","user":"ready","user.options":"loading","ext.translate.tag.languages":"ready","ext.pygments":"ready","ext.discussionTools.init.styles":"ready","oojs-ui-core.styles":"ready","oojs-ui.styles.indicators":"ready","mediawiki.widgets.styles":"ready","oojs-ui-core.icons":"ready","skins.vector.search.codex.styles":"ready","skins.vector.styles":"ready","skins.vector.icons":"ready","ext.translate.edit.documentation.styles":"ready","ext.translate":"ready","ext.wikimediamessages.styles":"ready","ext.visualEditor.desktopArticleTarget.noscript":"ready","ext.uls.pt":"ready","wikibase.client.init":"ready","ext.wikimediaBadges":"ready"};RLPAGEMODULES=["ext.pygments.view","site","mediawiki.page.ready","mediawiki.toc","skins.vector.js","ext.centralNotice.geoIP","ext.centralNotice.startUp","ext.translate.pagetranslation.uls","ext.urlShortener.toolbar","ext.centralauth.centralautologin", "ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader","ext.echo.centralauth","ext.discussionTools.init","ext.eventLogging","ext.wikimediaEvents","ext.navigationTiming","ext.uls.compactlinks","ext.uls.interface","ext.checkUser.clientHints"];</script> <script>(RLQ=window.RLQ||[]).push(function(){mw.loader.impl(function(){return["user.options@12s5i",function($,jQuery,require,module){mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"}); }];});});</script> <link rel="stylesheet" href="/w/load.php?lang=en&amp;modules=ext.discussionTools.init.styles%7Cext.pygments%2Ctranslate%2CwikimediaBadges%7Cext.translate.edit.documentation.styles%7Cext.translate.tag.languages%7Cext.uls.pt%7Cext.visualEditor.desktopArticleTarget.noscript%7Cext.wikimediamessages.styles%7Cmediawiki.widgets.styles%7Coojs-ui-core.icons%2Cstyles%7Coojs-ui.styles.indicators%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles%7Cwikibase.client.init&amp;only=styles&amp;skin=vector-2022"> <script async="" src="/w/load.php?lang=en&amp;modules=startup&amp;only=scripts&amp;raw=1&amp;skin=vector-2022"></script> <meta name="ResourceLoaderDynamicStyles" content=""> <link rel="stylesheet" href="/w/load.php?lang=en&amp;modules=site.styles&amp;only=styles&amp;skin=vector-2022"> <meta name="generator" content="MediaWiki 1.44.0-wmf.4"> <meta name="referrer" content="origin"> <meta name="referrer" content="origin-when-cross-origin"> <meta name="robots" content="max-image-preview:standard"> <meta name="format-detection" content="telephone=no"> <meta name="viewport" content="width=1120"> <meta property="og:site_name" content="MediaWiki"> <meta property="og:title" content="Help:Extension:Translate/Components - MediaWiki"> <meta property="og:type" content="website"> <link rel="alternate" media="only screen and (max-width: 640px)" href="//m.mediawiki.org/wiki/Help:Extension:Translate/Components"> <link rel="alternate" type="application/x-wiki" title="Edit" href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit"> <link rel="apple-touch-icon" href="/static/apple-touch/mediawiki.png"> <link rel="icon" href="/static/favicon/mediawiki.ico"> <link rel="search" type="application/opensearchdescription+xml" href="/w/rest.php/v1/search" title="MediaWiki (en)"> <link rel="EditURI" type="application/rsd+xml" href="//www.mediawiki.org/w/api.php?action=rsd"> <link rel="canonical" href="https://www.mediawiki.org/wiki/Help:Extension:Translate/Components"> <link rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/"> <link rel="alternate" type="application/atom+xml" title="MediaWiki Atom feed" href="/w/index.php?title=Special:RecentChanges&amp;feed=atom"> <link rel="dns-prefetch" href="//meta.wikimedia.org" /> <link rel="dns-prefetch" href="//login.wikimedia.org"> </head> <body class="ext-discussiontools-replytool-enabled ext-discussiontools-newtopictool-enabled ext-discussiontools-sourcemodetoolbar-enabled skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-12 ns-subject mw-editable page-Help_Extension_Translate_Components rootpage-Help_Extension_Translate skin-vector-2022 action-view"><a class="mw-jump-link" href="#bodyContent">Jump to content</a> <div class="vector-header-container"> <header class="vector-header mw-header"> <div class="vector-header-start"> <nav class="vector-main-menu-landmark" aria-label="Site"> <div id="vector-main-menu-dropdown" class="vector-dropdown vector-main-menu-dropdown vector-button-flush-left vector-button-flush-right" > <input type="checkbox" id="vector-main-menu-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-main-menu-dropdown" class="vector-dropdown-checkbox " aria-label="Main menu" > <label id="vector-main-menu-dropdown-label" for="vector-main-menu-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-menu mw-ui-icon-wikimedia-menu"></span> <span class="vector-dropdown-label-text">Main menu</span> </label> <div class="vector-dropdown-content"> <div id="vector-main-menu-unpinned-container" class="vector-unpinned-container"> <div id="vector-main-menu" class="vector-main-menu vector-pinnable-element"> <div class="vector-pinnable-header vector-main-menu-pinnable-header vector-pinnable-header-unpinned" data-feature-name="main-menu-pinned" data-pinnable-element-id="vector-main-menu" data-pinned-container-id="vector-main-menu-pinned-container" data-unpinned-container-id="vector-main-menu-unpinned-container" > <div class="vector-pinnable-header-label">Main menu</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-main-menu.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-main-menu.unpin">hide</button> </div> <div id="p-navigation" class="vector-menu mw-portlet mw-portlet-navigation" > <div class="vector-menu-heading"> Navigation </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-mainpage-description" class="mw-list-item"><a href="/wiki/MediaWiki" title="Visit the main page [z]" accesskey="z"><span>Main page</span></a></li><li id="n-mw-download" class="mw-list-item"><a href="/wiki/Download"><span>Get MediaWiki</span></a></li><li id="n-mw-extensions" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Category:Extensions"><span>Get extensions</span></a></li><li id="n-blog-text" class="mw-list-item"><a href="https://techblog.wikimedia.org/"><span>Tech blog</span></a></li><li id="n-mw-contribute" class="mw-list-item"><a href="/wiki/Special:MyLanguage/How_to_contribute"><span>Contribute</span></a></li> </ul> </div> </div> <div id="p-support" class="vector-menu mw-portlet mw-portlet-support" > <div class="vector-menu-heading"> Support </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-help" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Help:Contents" title="The place to find out"><span>User help</span></a></li><li id="n-mw-faq" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Manual:FAQ"><span>FAQ</span></a></li><li id="n-mw-manual" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Manual:Contents"><span>Technical manual</span></a></li><li id="n-mw-supportdesk" class="mw-list-item"><a href="/wiki/Project:Support_desk"><span>Support desk</span></a></li><li id="n-mw-communication" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Communication"><span>Communication</span></a></li> </ul> </div> </div> <div id="p-development" class="vector-menu mw-portlet mw-portlet-development" > <div class="vector-menu-heading"> Development </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-mw-developerportal" class="mw-list-item"><a href="https://developer.wikimedia.org/"><span>Developer portal</span></a></li><li id="n-svn-statistics" class="mw-list-item"><a href="/wiki/Development_statistics"><span>Code statistics</span></a></li> </ul> </div> </div> <div id="p-mediawiki.org" class="vector-menu mw-portlet mw-portlet-mediawiki_org" > <div class="vector-menu-heading"> mediawiki.org </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-portal" class="mw-list-item"><a href="/wiki/Project:Help" title="About the project, what you can do, where to find things"><span>Community portal</span></a></li><li id="n-recentchanges" class="mw-list-item"><a href="/wiki/Special:RecentChanges" title="A list of recent changes in the wiki [r]" accesskey="r"><span>Recent changes</span></a></li><li id="n-mw-translate" class="mw-list-item"><a href="/wiki/Special:LanguageStats"><span>Translate content</span></a></li><li id="n-randompage" class="mw-list-item"><a href="/wiki/Special:Random" title="Load a random page [x]" accesskey="x"><span>Random page</span></a></li><li id="n-mw-discussion" class="mw-list-item"><a href="/wiki/Project:Village_Pump"><span>Village pump</span></a></li><li id="n-Sandboxlink-portlet-label" class="mw-list-item"><a href="/wiki/Project:Sandbox"><span>Sandbox</span></a></li> </ul> </div> </div> <div id="p-lang" class="vector-menu mw-portlet mw-portlet-lang" > <div class="vector-menu-heading"> In other languages </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> <div class="after-portlet after-portlet-lang"><span class="wb-langlinks-add wb-langlinks-link"><a href="https://www.wikidata.org/wiki/Special:NewItem?site=mediawikiwiki&amp;page=Help%3AExtension%3ATranslate%2FComponents" title="Add interlanguage links" class="wbc-editpage">Add links</a></span></div> </div> </div> </div> </div> </div> </div> </nav> <a href="/wiki/MediaWiki" class="mw-logo"> <img class="mw-logo-icon" src="/static/images/icons/mediawikiwiki.svg" alt="" aria-hidden="true" height="50" width="50"> <span class="mw-logo-container skin-invert"> <img class="mw-logo-wordmark" alt="MediaWiki" src="/static/images/mobile/copyright/mediawikiwiki-wordmark.svg" style="width: 7.5em; height: 1.125em;"> </span> </a> </div> <div class="vector-header-end"> <div id="p-search" role="search" class="vector-search-box-vue vector-search-box-collapses vector-search-box-show-thumbnail vector-search-box-auto-expand-width vector-search-box"> <a href="/wiki/Special:Search" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only search-toggle" title="Search MediaWiki [f]" accesskey="f"><span class="vector-icon mw-ui-icon-search mw-ui-icon-wikimedia-search"></span> <span>Search</span> </a> <div class="vector-typeahead-search-container"> <div class="cdx-typeahead-search cdx-typeahead-search--show-thumbnail cdx-typeahead-search--auto-expand-width"> <form action="/w/index.php" id="searchform" class="cdx-search-input cdx-search-input--has-end-button"> <div id="simpleSearch" class="cdx-search-input__input-wrapper" data-search-loc="header-moved"> <div class="cdx-text-input cdx-text-input--has-start-icon"> <input class="cdx-text-input__input" type="search" name="search" placeholder="Search MediaWiki" aria-label="Search MediaWiki" autocapitalize="sentences" title="Search MediaWiki [f]" accesskey="f" id="searchInput" > <span class="cdx-text-input__icon cdx-text-input__start-icon"></span> </div> <input type="hidden" name="title" value="Special:Search"> </div> <button class="cdx-button cdx-search-input__end-button">Search</button> </form> </div> </div> </div> <nav class="vector-user-links vector-user-links-wide" aria-label="Personal tools"> <div class="vector-user-links-main"> <div id="p-vector-user-menu-preferences" class="vector-menu mw-portlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-uls" class="mw-list-item active user-links-collapsible-item"><a data-mw="interface" href="#" class="uls-trigger cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet"><span class="vector-icon mw-ui-icon-wikimedia-language mw-ui-icon-wikimedia-wikimedia-language"></span> <span>English</span></a> </li> </ul> </div> </div> <div id="p-vector-user-menu-userpage" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <nav class="vector-appearance-landmark" aria-label="Appearance"> <div id="vector-appearance-dropdown" class="vector-dropdown " title="Change the appearance of the page&#039;s font size, width, and color" > <input type="checkbox" id="vector-appearance-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-appearance-dropdown" class="vector-dropdown-checkbox " aria-label="Appearance" > <label id="vector-appearance-dropdown-label" for="vector-appearance-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-appearance mw-ui-icon-wikimedia-appearance"></span> <span class="vector-dropdown-label-text">Appearance</span> </label> <div class="vector-dropdown-content"> <div id="vector-appearance-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <div id="p-vector-user-menu-notifications" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-overflow" class="vector-menu mw-portlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="https://donate.wikimedia.org/?utm_source=donate&amp;utm_medium=sidebar&amp;utm_campaign=spontaneous&amp;uselang=en" class=""><span>Donate</span></a> </li> <li id="pt-createaccount-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:CreateAccount&amp;returnto=Help%3AExtension%3ATranslate%2FComponents" title="You are encouraged to create an account and log in; however, it is not mandatory" class=""><span>Create account</span></a> </li> <li id="pt-login-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:UserLogin&amp;returnto=Help%3AExtension%3ATranslate%2FComponents" title="You are encouraged to log in; however, it is not mandatory [o]" accesskey="o" class=""><span>Log in</span></a> </li> </ul> </div> </div> </div> <div id="vector-user-links-dropdown" class="vector-dropdown vector-user-menu vector-button-flush-right vector-user-menu-logged-out" title="More options" > <input type="checkbox" id="vector-user-links-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-user-links-dropdown" class="vector-dropdown-checkbox " aria-label="Personal tools" > <label id="vector-user-links-dropdown-label" for="vector-user-links-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-ellipsis mw-ui-icon-wikimedia-ellipsis"></span> <span class="vector-dropdown-label-text">Personal tools</span> </label> <div class="vector-dropdown-content"> <div id="p-personal" class="vector-menu mw-portlet mw-portlet-personal user-links-collapsible-item" title="User menu" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport" class="user-links-collapsible-item mw-list-item"><a href="https://donate.wikimedia.org/?utm_source=donate&amp;utm_medium=sidebar&amp;utm_campaign=spontaneous&amp;uselang=en"><span>Donate</span></a></li><li id="pt-createaccount" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:CreateAccount&amp;returnto=Help%3AExtension%3ATranslate%2FComponents" title="You are encouraged to create an account and log in; however, it is not mandatory"><span class="vector-icon mw-ui-icon-userAdd mw-ui-icon-wikimedia-userAdd"></span> <span>Create account</span></a></li><li id="pt-login" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:UserLogin&amp;returnto=Help%3AExtension%3ATranslate%2FComponents" title="You are encouraged to log in; however, it is not mandatory [o]" accesskey="o"><span class="vector-icon mw-ui-icon-logIn mw-ui-icon-wikimedia-logIn"></span> <span>Log in</span></a></li> </ul> </div> </div> <div id="p-user-menu-anon-editor" class="vector-menu mw-portlet mw-portlet-user-menu-anon-editor" > <div class="vector-menu-heading"> Pages for logged out editors <a href="/wiki/Help:Introduction" aria-label="Learn more about editing"><span>learn more</span></a> </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-anoncontribs" class="mw-list-item"><a href="/wiki/Special:MyContributions" title="A list of edits made from this IP address [y]" accesskey="y"><span>Contributions</span></a></li><li id="pt-anontalk" class="mw-list-item"><a href="/wiki/Special:MyTalk" title="Discussion about edits from this IP address [n]" accesskey="n"><span>Talk</span></a></li> </ul> </div> </div> </div> </div> </nav> </div> </header> </div> <div class="mw-page-container"> <div class="mw-page-container-inner"> <div class="vector-sitenotice-container"> <div id="siteNotice"><!-- CentralNotice --></div> </div> <div class="vector-column-start"> <div class="vector-main-menu-container"> <div id="mw-navigation"> <nav id="mw-panel" class="vector-main-menu-landmark" aria-label="Site"> <div id="vector-main-menu-pinned-container" class="vector-pinned-container"> </div> </nav> </div> </div> <div class="vector-sticky-pinned-container"> <nav id="mw-panel-toc" aria-label="Contents" data-event-name="ui.sidebar-toc" class="mw-table-of-contents-container vector-toc-landmark"> <div id="vector-toc-pinned-container" class="vector-pinned-container"> <div id="vector-toc" class="vector-toc vector-pinnable-element"> <div class="vector-pinnable-header vector-toc-pinnable-header vector-pinnable-header-pinned" data-feature-name="toc-pinned" data-pinnable-element-id="vector-toc" > <h2 class="vector-pinnable-header-label">Contents</h2> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-toc.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-toc.unpin">hide</button> </div> <ul class="vector-toc-contents" id="mw-panel-toc-list"> <li id="toc-mw-content-text" class="vector-toc-list-item vector-toc-level-1"> <a href="#" class="vector-toc-link"> <div class="vector-toc-text">Beginning</div> </a> </li> <li id="toc-Primary_extensible_components" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Primary_extensible_components"> <div class="vector-toc-text"> <span class="vector-toc-numb">1</span> <span>Primary extensible components</span> </div> </a> <button aria-controls="toc-Primary_extensible_components-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Toggle Primary extensible components subsection</span> </button> <ul id="toc-Primary_extensible_components-sublist" class="vector-toc-list"> <li id="toc-WebAPI" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#WebAPI"> <div class="vector-toc-text"> <span class="vector-toc-numb">1.1</span> <span>WebAPI</span> </div> </a> <ul id="toc-WebAPI-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-File_format_support_(FFS)" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#File_format_support_(FFS)"> <div class="vector-toc-text"> <span class="vector-toc-numb">1.2</span> <span>File format support (FFS)</span> </div> </a> <ul id="toc-File_format_support_(FFS)-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Message_groups" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Message_groups"> <div class="vector-toc-text"> <span class="vector-toc-numb">1.3</span> <span>Message groups</span> </div> </a> <ul id="toc-Message_groups-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Translation_aids_(helpers)" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Translation_aids_(helpers)"> <div class="vector-toc-text"> <span class="vector-toc-numb">1.4</span> <span>Translation aids (helpers)</span> </div> </a> <ul id="toc-Translation_aids_(helpers)-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Web_services" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Web_services"> <div class="vector-toc-text"> <span class="vector-toc-numb">1.5</span> <span>Web services</span> </div> </a> <ul id="toc-Web_services-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Message_checkers" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Message_checkers"> <div class="vector-toc-text"> <span class="vector-toc-numb">1.6</span> <span>Message checkers</span> </div> </a> <ul id="toc-Message_checkers-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-Other_core_components" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Other_core_components"> <div class="vector-toc-text"> <span class="vector-toc-numb">2</span> <span>Other core components</span> </div> </a> <button aria-controls="toc-Other_core_components-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Toggle Other core components subsection</span> </button> <ul id="toc-Other_core_components-sublist" class="vector-toc-list"> <li id="toc-Message_collection" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Message_collection"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.1</span> <span>Message collection</span> </div> </a> <ul id="toc-Message_collection-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Message" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Message"> <div class="vector-toc-text"> <span class="vector-toc-numb">2.2</span> <span>Message</span> </div> </a> <ul id="toc-Message-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-Utility_classes" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Utility_classes"> <div class="vector-toc-text"> <span class="vector-toc-numb">3</span> <span>Utility classes</span> </div> </a> <button aria-controls="toc-Utility_classes-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Toggle Utility classes subsection</span> </button> <ul id="toc-Utility_classes-sublist" class="vector-toc-list"> <li id="toc-Font_finder" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Font_finder"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.1</span> <span>Font finder</span> </div> </a> <ul id="toc-Font_finder-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Message_group_cache" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Message_group_cache"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.2</span> <span>Message group cache</span> </div> </a> <ul id="toc-Message_group_cache-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Message_group_utilities" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Message_group_utilities"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.3</span> <span>Message group utilities</span> </div> </a> <ul id="toc-Message_group_utilities-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Message_index" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Message_index"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.4</span> <span>Message index</span> </div> </a> <ul id="toc-Message_index-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Message_table" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Message_table"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.5</span> <span>Message table</span> </div> </a> <ul id="toc-Message_table-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Metadata_table" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Metadata_table"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.6</span> <span>Metadata table</span> </div> </a> <ul id="toc-Metadata_table-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Revtag" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Revtag"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.7</span> <span>Revtag</span> </div> </a> <ul id="toc-Revtag-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Stats_code" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Stats_code"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.8</span> <span>Stats code</span> </div> </a> <ul id="toc-Stats_code-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-String_matcher/mangler" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#String_matcher/mangler"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.9</span> <span>String matcher/mangler</span> </div> </a> <ul id="toc-String_matcher/mangler-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Ttmserver_(translation_memory)" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Ttmserver_(translation_memory)"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.10</span> <span>Ttmserver (translation memory)</span> </div> </a> <ul id="toc-Ttmserver_(translation_memory)-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Misc_stuff:_RC_integration,_preferences,_toolbox,_jobs" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Misc_stuff:_RC_integration,_preferences,_toolbox,_jobs"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.11</span> <span>Misc stuff: RC integration, preferences, toolbox, jobs</span> </div> </a> <ul id="toc-Misc_stuff:_RC_integration,_preferences,_toolbox,_jobs-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-Repository_layout" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Repository_layout"> <div class="vector-toc-text"> <span class="vector-toc-numb">4</span> <span>Repository layout</span> </div> </a> <ul id="toc-Repository_layout-sublist" class="vector-toc-list"> </ul> </li> </ul> </div> </div> </nav> </div> </div> <div class="mw-content-container"> <main id="content" class="mw-body"> <header class="mw-body-header vector-page-titlebar"> <nav aria-label="Contents" class="vector-toc-landmark"> <div id="vector-page-titlebar-toc" class="vector-dropdown vector-page-titlebar-toc vector-button-flush-left" > <input type="checkbox" id="vector-page-titlebar-toc-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-titlebar-toc" class="vector-dropdown-checkbox " aria-label="Toggle the table of contents" > <label id="vector-page-titlebar-toc-label" for="vector-page-titlebar-toc-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-listBullet mw-ui-icon-wikimedia-listBullet"></span> <span class="vector-dropdown-label-text">Toggle the table of contents</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-titlebar-toc-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-namespace">Help</span><span class="mw-page-title-separator">:</span><span class="mw-page-title-main">Extension:Translate/Components</span></h1> <div class="mw-indicators"> </div> </header> <div class="vector-page-toolbar"> <div class="vector-page-toolbar-container"> <div id="left-navigation"> <nav aria-label="Namespaces"> <div id="p-associated-pages" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-associated-pages" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-nstab-help" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Help:Extension:Translate/Components" title="View the help page [c]" accesskey="c"><span>Help</span></a></li><li id="ca-talk" class="new vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Help_talk:Extension:Translate/Components&amp;action=edit&amp;redlink=1" rel="discussion" class="new" title="Discussion about the content page (page does not exist) [t]" accesskey="t"><span>Discussion</span></a></li> </ul> </div> </div> <div id="vector-variants-dropdown" class="vector-dropdown emptyPortlet" > <input type="checkbox" id="vector-variants-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-variants-dropdown" class="vector-dropdown-checkbox " aria-label="Change language variant" > <label id="vector-variants-dropdown-label" for="vector-variants-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">English</span> </label> <div class="vector-dropdown-content"> <div id="p-variants" class="vector-menu mw-portlet mw-portlet-variants emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> </div> </div> </nav> </div> <div id="right-navigation" class="vector-collapsible"> <nav aria-label="Views"> <div id="p-views" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-views" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-view" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Help:Extension:Translate/Components"><span>Read</span></a></li><li id="ca-edit" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit" title="Edit the source code of this page [e]" accesskey="e"><span>Edit</span></a></li><li id="ca-history" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=history" title="Past revisions of this page [h]" accesskey="h"><span>View history</span></a></li> </ul> </div> </div> </nav> <nav class="vector-page-tools-landmark" aria-label="Page tools"> <div id="vector-page-tools-dropdown" class="vector-dropdown vector-page-tools-dropdown" > <input type="checkbox" id="vector-page-tools-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-tools-dropdown" class="vector-dropdown-checkbox " aria-label="Tools" > <label id="vector-page-tools-dropdown-label" for="vector-page-tools-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">Tools</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-tools-unpinned-container" class="vector-unpinned-container"> <div id="vector-page-tools" class="vector-page-tools vector-pinnable-element"> <div class="vector-pinnable-header vector-page-tools-pinnable-header vector-pinnable-header-unpinned" data-feature-name="page-tools-pinned" data-pinnable-element-id="vector-page-tools" data-pinned-container-id="vector-page-tools-pinned-container" data-unpinned-container-id="vector-page-tools-unpinned-container" > <div class="vector-pinnable-header-label">Tools</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-page-tools.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-page-tools.unpin">hide</button> </div> <div id="p-cactions" class="vector-menu mw-portlet mw-portlet-cactions emptyPortlet vector-has-collapsible-items" title="More options" > <div class="vector-menu-heading"> Actions </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-more-view" class="selected vector-more-collapsible-item mw-list-item"><a href="/wiki/Help:Extension:Translate/Components"><span>Read</span></a></li><li id="ca-more-edit" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit" title="Edit the source code of this page [e]" accesskey="e"><span>Edit</span></a></li><li id="ca-more-history" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=history"><span>View history</span></a></li> </ul> </div> </div> <div id="p-tb" class="vector-menu mw-portlet mw-portlet-tb" > <div class="vector-menu-heading"> General </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-whatlinkshere" class="mw-list-item"><a href="/wiki/Special:WhatLinksHere/Help:Extension:Translate/Components" title="A list of all wiki pages that link here [j]" accesskey="j"><span>What links here</span></a></li><li id="t-recentchangeslinked" class="mw-list-item"><a href="/wiki/Special:RecentChangesLinked/Help:Extension:Translate/Components" rel="nofollow" title="Recent changes in pages linked from this page [k]" accesskey="k"><span>Related changes</span></a></li><li id="t-upload" class="mw-list-item"><a href="//commons.wikimedia.org/wiki/Special:UploadWizard" title="Upload files [u]" accesskey="u"><span>Upload file</span></a></li><li id="t-specialpages" class="mw-list-item"><a href="/wiki/Special:SpecialPages" title="A list of all special pages [q]" accesskey="q"><span>Special pages</span></a></li><li id="t-permalink" class="mw-list-item"><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;oldid=6817941" title="Permanent link to this revision of this page"><span>Permanent link</span></a></li><li id="t-info" class="mw-list-item"><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=info" title="More information about this page"><span>Page information</span></a></li><li id="t-urlshortener" class="mw-list-item"><a href="/w/index.php?title=Special:UrlShortener&amp;url=https%3A%2F%2Fwww.mediawiki.org%2Fwiki%2FHelp%3AExtension%3ATranslate%2FComponents"><span>Get shortened URL</span></a></li><li id="t-urlshortener-qrcode" class="mw-list-item"><a href="/w/index.php?title=Special:QrCode&amp;url=https%3A%2F%2Fwww.mediawiki.org%2Fwiki%2FHelp%3AExtension%3ATranslate%2FComponents"><span>Download QR code</span></a></li> </ul> </div> </div> <div id="p-coll-print_export" class="vector-menu mw-portlet mw-portlet-coll-print_export" > <div class="vector-menu-heading"> Print/export </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="coll-create_a_book" class="mw-list-item"><a href="/w/index.php?title=Special:Book&amp;bookcmd=book_creator&amp;referer=Help%3AExtension%3ATranslate%2FComponents"><span>Create a book</span></a></li><li id="coll-download-as-rl" class="mw-list-item"><a href="/w/index.php?title=Special:DownloadAsPdf&amp;page=Help%3AExtension%3ATranslate%2FComponents&amp;action=show-download-screen"><span>Download as PDF</span></a></li><li id="t-print" class="mw-list-item"><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;printable=yes" title="Printable version of this page [p]" accesskey="p"><span>Printable version</span></a></li> </ul> </div> </div> <div id="p-wikibase-otherprojects" class="vector-menu mw-portlet mw-portlet-wikibase-otherprojects emptyPortlet" > <div class="vector-menu-heading"> In other projects </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> </div> </div> </div> </div> </nav> </div> </div> </div> <div class="vector-column-end"> <div class="vector-sticky-pinned-container"> <nav class="vector-page-tools-landmark" aria-label="Page tools"> <div id="vector-page-tools-pinned-container" class="vector-pinned-container"> </div> </nav> <nav class="vector-appearance-landmark" aria-label="Appearance"> <div id="vector-appearance-pinned-container" class="vector-pinned-container"> <div id="vector-appearance" class="vector-appearance vector-pinnable-element"> <div class="vector-pinnable-header vector-appearance-pinnable-header vector-pinnable-header-pinned" data-feature-name="appearance-pinned" data-pinnable-element-id="vector-appearance" data-pinned-container-id="vector-appearance-pinned-container" data-unpinned-container-id="vector-appearance-unpinned-container" > <div class="vector-pinnable-header-label">Appearance</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-appearance.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-appearance.unpin">hide</button> </div> </div> </div> </nav> </div> </div> <div id="bodyContent" class="vector-body" aria-labelledby="firstHeading" data-mw-ve-target-container> <div class="vector-body-before-content"> <div id="siteSub" class="noprint">From mediawiki.org</div> </div> <div id="contentSub"><div id="mw-content-subtitle"><div class="subpages">&lt; <bdi dir="ltr"><a href="/wiki/Special:MyLanguage/Help:Extension:Translate" title="Special:MyLanguage/Help:Extension:Translate">Help:Extension:Translate</a></bdi></div></div></div> <div id="mw-content-text" class="mw-body-content"><div class="mw-pt-translate-header noprint nomobile" dir="ltr" lang="en"><a href="/w/index.php?title=Special:Translate&amp;group=page-Help%3AExtension%3ATranslate%2FComponents&amp;action=page&amp;filter=&amp;action_source=translate_page" title="Special:Translate">Translate this page</a></div><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><div class="mw-pt-languages noprint navigation-not-searchable" lang="en" dir="ltr"><div class="mw-pt-languages-label">Languages:</div><ul class="mw-pt-languages-list"><li><a href="/wiki/Help:Extension:Translate/Components/de" class="mw-pt-progress mw-pt-progress--med" title="Hilfe:Erweiterung:Übersetzen/Komponenten (26% translated)" lang="de" dir="ltr">Deutsch</a></li> <li><span class="mw-pt-languages-ui mw-pt-languages-selected mw-pt-progress mw-pt-progress--complete" lang="en" dir="ltr">English</span></li> <li><a href="/wiki/Help:Extension:Translate/Components/nl" class="mw-pt-progress mw-pt-progress--complete" title="Help:Extension:Translate/Components/nl (100% translated)" lang="nl" dir="ltr">Nederlands</a></li> <li><a href="/wiki/Help:Extension:Translate/Components/tr" class="mw-pt-progress mw-pt-progress--low" title="Help:Extension:Translate/Components/tr (2% translated)" lang="tr" dir="ltr">Türkçe</a></li> <li><a href="/wiki/Help:Extension:Translate/Components/fr" class="mw-pt-progress mw-pt-progress--med" title="Aide:Extension:Translate/Composants (17% translated)" lang="fr" dir="ltr">français</a></li> <li><a href="/wiki/Help:Extension:Translate/Components/pt" class="mw-pt-progress mw-pt-progress--low" title="Ajuda:Extensão:Translate/Componentes (14% translated)" lang="pt" dir="ltr">português</a></li> <li><a href="/wiki/Help:Extension:Translate/Components/cs" class="mw-pt-progress mw-pt-progress--complete" title="Nápověda:Rozšíření:Translate/Součásti (100% translated)" lang="cs" dir="ltr">čeština</a></li> <li><a href="/wiki/Help:Extension:Translate/Components/fa" class="mw-pt-progress mw-pt-progress--low" title="Help:Extension:Translate/مؤلفه‌ها (1% translated)" lang="fa" dir="rtl">فارسی</a></li> <li><a href="/wiki/Help:Extension:Translate/Components/zh" class="mw-pt-progress mw-pt-progress--low" title="Help:Extension:翻譯/-{zh-hans:组件; zh-hant:元件;}- (3% translated)" lang="zh" dir="ltr">中文</a></li> <li><a href="/wiki/Help:Extension:Translate/Components/ja" class="mw-pt-progress mw-pt-progress--high" title="Help:Extension:Translate/コンポーネント (83% translated)" lang="ja" dir="ltr">日本語</a></li></ul></div> <style data-mw-deduplicate="TemplateStyles:r6806430">.mw-parser-output .extension-translate-navcolumn{margin-bottom:.5em;border:1px solid var(--border-color-base,#a2a9b1);padding:5px;background-color:var(--background-color-base,#fff)}@media(min-width:720px){.mw-parser-output .extension-translate-navcolumn{margin-left:.5em;width:21em}.mw-parser-output .extension-translate-navcolumn-align-primary{float:left;clear:left}.mw-parser-output .extension-translate-navcolumn-align-secondary{float:right;clear:right}}.mw-parser-output .extension-translate-navcolumn-title{font-size:larger;font-weight:bold;padding-bottom:.5em;border-bottom:solid 1.5em var(--border-color-success,#2cb491);margin-bottom:1em}</style> <div class="extension-translate-navcolumn plainlinks extension-translate-navcolumn-align-secondary"> <div class="extension-translate-navcolumn-title">Documentation for <a href="/wiki/Special:MyLanguage/Extension:Translate" title="Special:MyLanguage/Extension:Translate">Extension:Translate</a><span style="display:none"><a href="/wiki/Extension:Translate" title="Extension:Translate"> </a></span></div> <p><b>Translators</b> (<a href="/wiki/Special:MyLanguage/Help:Extension:Translate" title="Special:MyLanguage/Help:Extension:Translate">main help page</a><span style="display:none"><a href="/wiki/Help:Extension:Translate" title="Help:Extension:Translate"> </a></span>) </p> <ul><li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Translation_example" title="Special:MyLanguage/Help:Extension:Translate/Translation example">How to translate</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Translation_example" title="Help:Extension:Translate/Translation example"> </a></span></li> <li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Translation_best_practices" title="Special:MyLanguage/Help:Extension:Translate/Translation best practices">Best practices</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Translation_best_practices" title="Help:Extension:Translate/Translation best practices"> </a></span></li> <li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Statistics_and_reporting" title="Special:MyLanguage/Help:Extension:Translate/Statistics and reporting">Statistics and reporting</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Statistics_and_reporting" title="Help:Extension:Translate/Statistics and reporting"> </a></span></li> <li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Quality_assurance" title="Special:MyLanguage/Help:Extension:Translate/Quality assurance">Quality assurance</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Quality_assurance" title="Help:Extension:Translate/Quality assurance"> </a></span></li> <li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Message_group_states" title="Special:MyLanguage/Help:Extension:Translate/Message group states">Message group states</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Message_group_states" title="Help:Extension:Translate/Message group states"> </a></span></li> <li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Off-line_translation" title="Special:MyLanguage/Help:Extension:Translate/Off-line translation">Offline translation</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Off-line_translation" title="Help:Extension:Translate/Off-line translation"> </a></span></li> <li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Glossary" title="Special:MyLanguage/Help:Extension:Translate/Glossary">Glossary</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Glossary" title="Help:Extension:Translate/Glossary"> </a></span></li></ul> <p><b>Translation administrators</b> </p> <ul><li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_example" title="Special:MyLanguage/Help:Extension:Translate/Page translation example">How to prepare a page for translation</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Page_translation_example" title="Help:Extension:Translate/Page translation example"> </a></span></li> <li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Page_translation_administration" title="Special:MyLanguage/Help:Extension:Translate/Page translation administration">Page translation administration</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Page_translation_administration" title="Help:Extension:Translate/Page translation administration"> </a></span></li> <li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Unstructured_element_translation" title="Special:MyLanguage/Help:Extension:Translate/Unstructured element translation">Unstructured element translation</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Unstructured_element_translation" title="Help:Extension:Translate/Unstructured element translation"> </a></span></li> <li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Group_management" title="Special:MyLanguage/Help:Extension:Translate/Group management">Group management</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Group_management" title="Help:Extension:Translate/Group management"> </a></span></li> <li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Move_translatable_page" title="Special:MyLanguage/Help:Extension:Translate/Move translatable page">Move translatable page</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Move_translatable_page" title="Help:Extension:Translate/Move translatable page"> </a></span></li> <li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Import_Translations_via_CSV" title="Special:MyLanguage/Help:Extension:Translate/Import Translations via CSV">Import translations via CSV</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Import_Translations_via_CSV" title="Help:Extension:Translate/Import Translations via CSV"> </a></span></li> <li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Message_Bundles" title="Special:MyLanguage/Help:Extension:Translate/Message Bundles">Working with message bundles</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Message_Bundles" title="Help:Extension:Translate/Message Bundles"> </a></span></li></ul> <p><b>Sysadmins and developers</b> </p> <ul><li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Installation" title="Special:MyLanguage/Help:Extension:Translate/Installation">Installation</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Installation" title="Help:Extension:Translate/Installation"> </a></span></li> <li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Configuration" title="Special:MyLanguage/Help:Extension:Translate/Configuration">Configuration</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Configuration" title="Help:Extension:Translate/Configuration"> </a></span></li> <li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Getting_started_with_development" title="Special:MyLanguage/Help:Extension:Translate/Getting started with development">Getting started with development</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Getting_started_with_development" title="Help:Extension:Translate/Getting started with development"> </a></span></li> <li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Developer_guide" title="Special:MyLanguage/Help:Extension:Translate/Developer guide">Developer guide</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Developer_guide" title="Help:Extension:Translate/Developer guide"> </a></span></li> <li><b><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Components" title="Special:MyLanguage/Help:Extension:Translate/Components">Extending Translate</a></b><span style="display:none"><a class="mw-selflink selflink"> </a></span></li> <li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Validators" title="Special:MyLanguage/Help:Extension:Translate/Validators">Validators</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Validators" title="Help:Extension:Translate/Validators"> </a></span></li> <li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Insertables" title="Special:MyLanguage/Help:Extension:Translate/Insertables">Insertables</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Insertables" title="Help:Extension:Translate/Insertables"> </a></span></li> <li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Group_configuration" title="Special:MyLanguage/Help:Extension:Translate/Group configuration">Group configuration</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Group_configuration" title="Help:Extension:Translate/Group configuration"> </a></span></li> <li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Group_configuration_example" title="Special:MyLanguage/Help:Extension:Translate/Group configuration example">Group configuration example</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Group_configuration_example" title="Help:Extension:Translate/Group configuration example"> </a></span></li> <li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Translation_memories" title="Special:MyLanguage/Help:Extension:Translate/Translation memories">Translation memories</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Translation_memories" title="Help:Extension:Translate/Translation memories"> </a></span></li> <li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Translation_aids" title="Special:MyLanguage/Help:Extension:Translate/Translation aids">Translation aids</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Translation_aids" title="Help:Extension:Translate/Translation aids"> </a></span></li> <li><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Message_Bundles#Enabling_message_bundle_integration" title="Special:MyLanguage/Help:Extension:Translate/Message Bundles">Enabling message bundles</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Message_Bundles#Enabling_message_bundle_integration" title="Help:Extension:Translate/Message Bundles"> </a></span></li> <li><a class="external text" href="https://doc.wikimedia.org/Translate/master/php/classMediaWiki_1_1Extension_1_1Translate_1_1HookRunner.html">PHP hooks</a></li></ul> <p><small><a class="external text" href="https://www.mediawiki.org/w/index.php?title=Special:Translate&amp;group=page-Template%3AExtension-Translate&amp;language=&amp;action=page&amp;filter=">Translate this template</a></small> </p> </div> <p>Translate extension is extensible in many ways. The most likely ways to extend Translate is to add support for new file formats (link to section) or new message groups (link to section). Sometimes it is also useful to write a new message checks (link to section) or to extend Translate via hooks (link to section). Sometimes you might get along only by using the existing <a href="/wiki/Special:MyLanguage/Help:Extension:Translate/API#Web-API" title="Special:MyLanguage/Help:Extension:Translate/API">web API</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/API#Web-API" title="Help:Extension:Translate/API"> </a></span>. </p><p>In addition to the concepts already mentioned, there are many more important concepts and classes in Translate that are useful to understand when hacking Translate. This pages aims to comprehensively detail all components of Translate. </p> <meta property="mw:PageProp/toc"/> <div class="mw-heading mw-heading2 ext-discussiontools-init-section"><h2 id="Primary_extensible_components" data-mw-thread-id="h-Primary_extensible_components"><span data-mw-comment-start="" id="h-Primary_extensible_components"></span>Primary extensible components<span data-mw-comment-end="h-Primary_extensible_components"></span></h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit&amp;section=1" title="Edit section: Primary extensible components"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span><!--__DTELLIPSISBUTTON__{"threadItem":{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Primary_extensible_components","replies":["h-WebAPI-Primary_extensible_components","h-File_format_support_(FFS)-Primary_extensible_components","h-Message_groups-Primary_extensible_components","h-Translation_aids_(helpers)-Primary_extensible_components","h-Web_services-Primary_extensible_components","h-Message_checkers-Primary_extensible_components"]}}--></div> <div class="mw-heading mw-heading3"><h3 id="WebAPI" data-mw-thread-id="h-WebAPI-Primary_extensible_components"><span data-mw-comment-start="" id="h-WebAPI-Primary_extensible_components"></span>WebAPI<span data-mw-comment-end="h-WebAPI-Primary_extensible_components"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit&amp;section=2" title="Edit section: WebAPI"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li>In-depth documentation about <a href="/wiki/Special:MyLanguage/Help:Extension:Translate/API" title="Special:MyLanguage/Help:Extension:Translate/API">API</a></li></ul> <p>In addition to hooks and interfaces that can only be used from PHP code, the WebAPI provides access to many message group and translating related information and actions. It is based on the <a href="/wiki/Special:MyLanguage/API:Main_page" title="Special:MyLanguage/API:Main page">MediaWiki API framework</a>, supporting many output formats like json and xml. </p> <div class="mw-heading mw-heading3"><h3 id="File_format_support_(FFS)" data-mw-thread-id="h-File_format_support_(FFS)-Primary_extensible_components"><span id="File_format_support_.28FFS.29"></span><span data-mw-comment-start="" id="h-File_format_support_(FFS)-Primary_extensible_components"></span>File format support (FFS)<span data-mw-comment-end="h-File_format_support_(FFS)-Primary_extensible_components"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit&amp;section=3" title="Edit section: File format support (FFS)"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li><i>In-depth documentation about <a href="/wiki/Special:MyLanguage/Help:Extension:Translate/File_format_support" title="Special:MyLanguage/Help:Extension:Translate/File format support">file format support</a></i></li></ul> <p>The Translate extension supports translating of non-wiki content like software interface messages via File format support (FFS) classes. These classes implement the FFS interface and abstract away parsing and generating of file contents. The FFS classes are used by FileBasedMessageGroup class via the <a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Group_configuration" title="Special:MyLanguage/Help:Extension:Translate/Group configuration">YAML configuration files</a>. </p><p><br/> </p> <div class="mw-heading mw-heading3"><h3 id="Message_groups" data-mw-thread-id="h-Message_groups-Primary_extensible_components"><span data-mw-comment-start="" id="h-Message_groups-Primary_extensible_components"></span>Message groups<span data-mw-comment-end="h-Message_groups-Primary_extensible_components"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit&amp;section=4" title="Edit section: Message groups"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li><i>In-depth documentation about <a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Message_groups" title="Special:MyLanguage/Help:Extension:Translate/Message groups">message groups</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Message_groups" title="Help:Extension:Translate/Message groups"> </a></span></i></li></ul> <p>Message groups bring together a collection of messages. They come in various types: translatable pages, SVG files or software interface messages stored in various file formats. Each message group instance has a unique identifier, name and description. In the code message groups are primarily referenced by their identifier, while the <code>MessageGroups</code> class can be used to get the instances for a given ID. Message groups can also control many translation process related actions like allowed translation languages and the message group workflow states. Usually these behaviors fallback to the global defaults. </p><p>The two primary ways to register message groups to Translate are the <a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Hooks" title="Special:MyLanguage/Help:Extension:Translate/Hooks">TranslatePostInitGroups</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Hooks" title="Help:Extension:Translate/Hooks"> </a></span> hook and <a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Group_configuration_example" title="Special:MyLanguage/Help:Extension:Translate/Group configuration example">YAML configuration</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Group_configuration_example" title="Help:Extension:Translate/Group configuration example"> </a></span>. </p> <div class="mw-heading mw-heading3"><h3 id="Translation_aids_(helpers)" data-mw-thread-id="h-Translation_aids_(helpers)-Primary_extensible_components"><span id="Translation_aids_.28helpers.29"></span><span data-mw-comment-start="" id="h-Translation_aids_(helpers)-Primary_extensible_components"></span>Translation aids (helpers)<span data-mw-comment-end="h-Translation_aids_(helpers)-Primary_extensible_components"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit&amp;section=5" title="Edit section: Translation aids (helpers)"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li><i>In-depth documentation about <a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Translation_aids" title="Special:MyLanguage/Help:Extension:Translate/Translation aids">translation aids</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Translation_aids" title="Help:Extension:Translate/Translation aids"> </a></span></i></li></ul> <p>Translation aids are little modules that provide helpful and necessary information for the translator when translating. Different aids can provide suggestions from translation memory and machine translation, documentation about the message or even such a basic thing as the message definition – the text that needs to be translated. </p><p>Translate comes with many aid classes. Currently there is no hook to add new classes. Each class that extends the TranslationAid class only needs to implement one method called getData. It should return the information in structured format (nested arrays), which is then exposed via ApiQueryTranslationAids Web API module. In addition to the aid class, changes are needed to actually use the provided data in the translation editor(s). </p><p>One special case of translation aids are machine translation services. See the next section. </p> <div class="mw-heading mw-heading3"><h3 id="Web_services" data-mw-thread-id="h-Web_services-Primary_extensible_components"><span data-mw-comment-start="" id="h-Web_services-Primary_extensible_components"></span>Web services<span data-mw-comment-end="h-Web_services-Primary_extensible_components"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit&amp;section=6" title="Edit section: Web services"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Adding more machine translation services can easily be done by extending the TranslationWebService class. See the webservices subdirectory for examples. You will need some basic information to implement such a class: </p> <ul><li>URL for the service</li> <li>What language pairs are supported</li> <li>Whether they use language codes that differ from the codes used in MediaWiki</li> <li>Whether the service needs an API key</li></ul> <p>When you have this information, it is straightforward to write the mapCode, doPairs and doRequest methods. You should use the TranslationWebServiceException to signal errors. The errors are automatically logged and tracked, and if the service goes down, it will automatically be suspended to avoid unnecessary requests to it. The suggestions will automatically be displayed in the translation editor via the MachineTranslationAid class and the ApiQueryTranslationAids WebAPI module. See also $wgTranslateTranslationServices to see how those services are registered. </p> <div class="mw-heading mw-heading3"><h3 id="Message_checkers" data-mw-thread-id="h-Message_checkers-Primary_extensible_components"><span data-mw-comment-start="" id="h-Message_checkers-Primary_extensible_components"></span>Message checkers<span data-mw-comment-end="h-Message_checkers-Primary_extensible_components"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit&amp;section=7" title="Edit section: Message checkers"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li><i><a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Group_configuration" title="Special:MyLanguage/Help:Extension:Translate/Group configuration">How to define checkers for file based message groups</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Group_configuration" title="Help:Extension:Translate/Group configuration"> </a></span></i></li></ul> <p>We use computers to catch simple errors in translations, like unbalanced parenthesis or failing to use a variable placeholder. These checkers can emit warnings that are displayed in the translation editor (constantly updating). Any warning present in saved translation will also mark the translation as outdated (fuzzy in jargon). Each message group determines which checks it uses. </p><p><br/> </p> <div class="mw-heading mw-heading2 ext-discussiontools-init-section"><h2 id="Other_core_components" data-mw-thread-id="h-Other_core_components"><span data-mw-comment-start="" id="h-Other_core_components"></span>Other core components<span data-mw-comment-end="h-Other_core_components"></span></h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit&amp;section=8" title="Edit section: Other core components"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span><!--__DTELLIPSISBUTTON__{"threadItem":{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Other_core_components","replies":["h-Message_collection-Other_core_components","h-Message-Other_core_components"]}}--></div> <div class="mw-heading mw-heading3"><h3 id="Message_collection" data-mw-thread-id="h-Message_collection-Other_core_components"><span data-mw-comment-start="" id="h-Message_collection-Other_core_components"></span>Message collection<span data-mw-comment-end="h-Message_collection-Other_core_components"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit&amp;section=9" title="Edit section: Message collection"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Message collection provides access to the list of messages for a message group. It is used to load a set of languages for certain group in a certain language. It provides paging and filtering functionality. </p><p>There is currently a limitation that all messages in a collection must be in the same namespace. This prevents the creation of aggregate groups that include groups which have messages in different namespaces. </p><p>Here is short a example of how to use message collection to load all Finnish translations of group <i>core</i> and print the first ten of them: </p> <div class="mw-highlight mw-highlight-lang-php mw-content-ltr" dir="ltr"><pre><span></span><span class="nv">$group</span> <span class="o">=</span> <span class="nx">MessageGroups</span><span class="o">::</span><span class="na">getGroup</span><span class="p">(</span> <span class="s1">'core'</span> <span class="p">);</span> <span class="nv">$collection</span> <span class="o">=</span> <span class="nv">$group</span><span class="o">-></span><span class="na">initCollection</span><span class="p">(</span> <span class="s1">'fi'</span> <span class="p">);</span> <span class="nv">$collection</span><span class="o">-></span><span class="na">filter</span><span class="p">(</span> <span class="s1">'ignored'</span> <span class="p">);</span> <span class="nv">$collection</span><span class="o">-></span><span class="na">filter</span><span class="p">(</span> <span class="s1">'translated'</span><span class="p">,</span> <span class="k">false</span> <span class="p">);</span> <span class="nv">$collection</span><span class="o">-></span><span class="na">loadTranslations</span><span class="p">();</span> <span class="nv">$collection</span><span class="o">-></span><span class="na">slice</span><span class="p">(</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">10</span> <span class="p">);</span> <span class="k">foreach</span> <span class="p">(</span> <span class="nv">$collection</span><span class="o">-></span><span class="na">keys</span><span class="p">()</span> <span class="k">as</span> <span class="nv">$mkey</span> <span class="o">=></span> <span class="nv">$title</span> <span class="p">)</span> <span class="p">{</span> <span class="k">echo</span> <span class="nv">$title</span><span class="o">-></span><span class="na">getPrefixedText</span><span class="p">()</span> <span class="o">.</span> <span class="s1">': '</span><span class="p">;</span> <span class="k">echo</span> <span class="nv">$collection</span><span class="p">[</span><span class="nv">$mkey</span><span class="p">]</span><span class="o">-></span><span class="na">translation</span><span class="p">()</span> <span class="o">.</span> <span class="s2">"</span><span class="se">\n\n</span><span class="s2">"</span><span class="p">;</span> <span class="p">}</span> </pre></div> <div class="mw-heading mw-heading3"><h3 id="Message" data-mw-thread-id="h-Message-Other_core_components"><span data-mw-comment-start="" id="h-Message-Other_core_components"></span>Message<span data-mw-comment-end="h-Message-Other_core_components"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit&amp;section=10" title="Edit section: Message"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <div class="mw-heading mw-heading2 ext-discussiontools-init-section"><h2 id="Utility_classes" data-mw-thread-id="h-Utility_classes"><span data-mw-comment-start="" id="h-Utility_classes"></span>Utility classes<span data-mw-comment-end="h-Utility_classes"></span></h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit&amp;section=11" title="Edit section: Utility classes"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span><!--__DTELLIPSISBUTTON__{"threadItem":{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Utility_classes","replies":["h-Font_finder-Utility_classes","h-Message_group_cache-Utility_classes","h-Message_group_utilities-Utility_classes","h-Message_index-Utility_classes","h-Message_table-Utility_classes","h-Metadata_table-Utility_classes","h-Revtag-Utility_classes","h-Stats_code-Utility_classes","h-String_matcher\/mangler-Utility_classes","h-Ttmserver_(translation_memory)-Utility_classes","h-Misc_stuff:_RC_integration,_preferences,_toolbox,_jobs-Utility_classes"]}}--></div> <div class="mw-heading mw-heading3"><h3 id="Font_finder" data-mw-thread-id="h-Font_finder-Utility_classes"><span data-mw-comment-start="" id="h-Font_finder-Utility_classes"></span>Font finder<span data-mw-comment-end="h-Font_finder-Utility_classes"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit&amp;section=12" title="Edit section: Font finder"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>When rendering bitmap graphics, suitable fonts are needed for each language or script. To solve this problem, the FCFontFinder class was written. It uses the <code>fc-match</code> command of the package <code>fontconfig</code> (so this doesn't work on Windows) to find a suitable font. Many additional fonts should be installed on the server to make this useful. It can either return a path to a font file or the name of the font, whichever is more suitable. </p> <div class="mw-heading mw-heading3"><h3 id="Message_group_cache" data-mw-thread-id="h-Message_group_cache-Utility_classes"><span data-mw-comment-start="" id="h-Message_group_cache-Utility_classes"></span>Message group cache<span data-mw-comment-end="h-Message_group_cache-Utility_classes"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit&amp;section=13" title="Edit section: Message group cache"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>The messages of file-based message groups are stored in CDB files. Each language of each group has its own CDB cache file. The reason for cache files are twofold. </p><p>First they provide constant and efficient access to message data avoiding the potentially expensive parsing of files in various places. For example the list of message keys for each group can be loaded efficiently when rebuilding a message index. </p><p>The second reason is that the cache files are used together with the translations in the wiki to process external message changes. Having a snapshot of the state of translations in files and wiki (hopefully consistent at that point) allows us to automatically deduct whether something has been changed in the wiki or externally and make intelligent choices, leaving only real conflicts (messages changed both externally and on the wiki since last snapshot) to be resolved by the translation administrator. </p> <div class="mw-heading mw-heading3"><h3 id="Message_group_utilities" data-mw-thread-id="h-Message_group_utilities-Utility_classes"><span data-mw-comment-start="" id="h-Message_group_utilities-Utility_classes"></span>Message group utilities<span data-mw-comment-end="h-Message_group_utilities-Utility_classes"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit&amp;section=14" title="Edit section: Message group utilities"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <div class="mw-heading mw-heading3"><h3 id="Message_index" data-mw-thread-id="h-Message_index-Utility_classes"><span data-mw-comment-start="" id="h-Message_index-Utility_classes"></span>Message index<span data-mw-comment-end="h-Message_index-Utility_classes"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit&amp;section=15" title="Edit section: Message index"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Message index is a reverse map of all known messages. It provides efficient answer to the questions <i>is this a known message</i> and <i>what groups does this message belong to</i>. It needs to be fast for single and multiple message key lookups. Multiple different backends are implemented, with different trade-offs. </p> <ul><li>Serialized file is fast to parse, but don't provide random access and is very memory inefficient when the number of keys grow.</li> <li>CDB file takes more disk space, but provides random access and reasonably fast lookups, while loading everything into memory is slower.</li> <li>Database backend provides efficient random access and full load with the expense of little slower individual lookups. It also doesn't need to write to any files avoiding any permission problems.</li> <li>Also memory backend (memcached, apc) is provided, which could be useful alternatives to database backend in multiple server setups to reduce database contention.</li></ul> <p>Message index does not support incremental rebuilds. Thus rebuilding the index gets relatively resource intensive when the number of message groups and message keys increase. Depending on the message group, this might involve parsing files or doing database queries and loading the definitions, which can take a lot of memory. The message index rebuilding is triggered in various places in Translate, and by default it is executed immediately during the request. As it gets slower, it can be delayed via the MediaWiki job queue and run outside of web requests. </p> <div class="mw-heading mw-heading3"><h3 id="Message_table" data-mw-thread-id="h-Message_table-Utility_classes"><span data-mw-comment-start="" id="h-Message_table-Utility_classes"></span>Message table<span data-mw-comment-end="h-Message_table-Utility_classes"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit&amp;section=16" title="Edit section: Message table"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <div class="mw-heading mw-heading3"><h3 id="Metadata_table" data-mw-thread-id="h-Metadata_table-Utility_classes"><span data-mw-comment-start="" id="h-Metadata_table-Utility_classes"></span>Metadata table<span data-mw-comment-end="h-Metadata_table-Utility_classes"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit&amp;section=17" title="Edit section: Metadata table"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <div class="mw-heading mw-heading3"><h3 id="Revtag" data-mw-thread-id="h-Revtag-Utility_classes"><span data-mw-comment-start="" id="h-Revtag-Utility_classes"></span>Revtag<span data-mw-comment-end="h-Revtag-Utility_classes"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit&amp;section=18" title="Edit section: Revtag"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <div class="mw-heading mw-heading3"><h3 id="Stats_code" data-mw-thread-id="h-Stats_code-Utility_classes"><span data-mw-comment-start="" id="h-Stats_code-Utility_classes"></span>Stats code<span data-mw-comment-end="h-Stats_code-Utility_classes"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit&amp;section=19" title="Edit section: Stats code"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <div class="mw-heading mw-heading3"><h3 id="String_matcher/mangler" data-mw-thread-id="h-String_matcher/mangler-Utility_classes"><span id="String_matcher.2Fmangler"></span><span data-mw-comment-start="" id="h-String_matcher/mangler-Utility_classes"></span>String matcher/mangler<span data-mw-comment-end="h-String_matcher/mangler-Utility_classes"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit&amp;section=20" title="Edit section: String matcher/mangler"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <div class="mw-heading mw-heading3"><h3 id="Ttmserver_(translation_memory)" data-mw-thread-id="h-Ttmserver_(translation_memory)-Utility_classes"><span id="Ttmserver_.28translation_memory.29"></span><span data-mw-comment-start="" id="h-Ttmserver_(translation_memory)-Utility_classes"></span>Ttmserver (translation memory)<span data-mw-comment-end="h-Ttmserver_(translation_memory)-Utility_classes"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit&amp;section=21" title="Edit section: Ttmserver (translation memory)"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li><i>In-depth documentation at <a href="/wiki/Special:MyLanguage/Help:Extension:Translate/Translation_memories" title="Special:MyLanguage/Help:Extension:Translate/Translation memories">Translation memories</a><span style="display:none"><a href="/wiki/Help:Extension:Translate/Translation_memories" title="Help:Extension:Translate/Translation memories"> </a></span>.</i></li> <li><i>Blog post of history of this feature at <a rel="nofollow" class="external text" href="http://laxstrom.name/blag/2012/09/07/translation-memory-all-wikimedia-wikis/">Niklas' blog</a>.</i></li></ul> <p>Ttmserver is the name of translation memory interface. It supports multiple backends for inserting and querying translation suggestions. The code is located under <code>ttmserver</code> directory. </p> <div class="mw-heading mw-heading3"><h3 id="Misc_stuff:_RC_integration,_preferences,_toolbox,_jobs" data-mw-thread-id="h-Misc_stuff:_RC_integration,_preferences,_toolbox,_jobs-Utility_classes"><span id="Misc_stuff:_RC_integration.2C_preferences.2C_toolbox.2C_jobs"></span><span data-mw-comment-start="" id="h-Misc_stuff:_RC_integration,_preferences,_toolbox,_jobs-Utility_classes"></span>Misc stuff: RC integration, preferences, toolbox, jobs<span data-mw-comment-end="h-Misc_stuff:_RC_integration,_preferences,_toolbox,_jobs-Utility_classes"></span></h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit&amp;section=22" title="Edit section: Misc stuff: RC integration, preferences, toolbox, jobs"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <div class="mw-heading mw-heading2 ext-discussiontools-init-section"><h2 id="Repository_layout" data-mw-thread-id="h-Repository_layout"><span data-mw-comment-start="" id="h-Repository_layout"></span>Repository layout<span data-mw-comment-end="h-Repository_layout"></span></h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Help:Extension:Translate/Components&amp;action=edit&amp;section=23" title="Edit section: Repository layout"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span><!--__DTELLIPSISBUTTON__{"threadItem":{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Repository_layout","replies":[]}}--></div> <p>Files in the root of the repository include: </p> <ul><li>Standard MediaWiki extensions files like <code>Translate.php</code>, translations and some documentation files like <code>hooks.txt</code> and <code>README</code> which includes change notes.</li> <li>Major translate classes like <code>MessageCollection</code> and <code>Message</code> and some misc utilities not yet moved under utils.</li></ul> <p>Rest of the code is under subdirectories. Major parts have their own subdirectories each: </p> <ul><li><code>api</code> - for WebAPI code</li> <li><code>ffs</code> - for file format support code</li> <li><code>messagegroups</code> - for message groups</li> <li><code>scripts</code> - for command line scripts</li> <li><code>tag</code> - for page translation code</li> <li><code>ttmserver</code> - for translation memory code</li> <li><code>specials</code> - for all special pages</li> <li><code>tests</code> - for all PHP unit tests</li></ul> <p>Most of the code is under utils. Some additional folders for non-code: </p> <ul><li><code>data</code> - for miscellaneous data files</li> <li><code>libs</code> - for bundled library dependencies</li> <li><code>resources</code> - for all css, scripts and images</li> <li><code>sql</code> - for all SQL table definitions</li></ul> <!-- NewPP limit report Parsed by mw‐web.eqiad.main‐858c7455cb‐g7gp4 Cached time: 20241029114106 Cache expiry: 2592000 Reduced expiry: false Complications: [show‐toc] DiscussionTools time usage: 0.014 seconds CPU time usage: 0.240 seconds Real time usage: 0.323 seconds Preprocessor visited node count: 1914/1000000 Post‐expand include size: 24145/2097152 bytes Template argument size: 10088/2097152 bytes Highest expansion depth: 14/100 Expensive parser function count: 4/500 Unstrip recursion depth: 0/20 Unstrip post‐expand size: 5341/5000000 bytes Lua time usage: 0.032/10.000 seconds Lua memory usage: 1064333/52428800 bytes Number of Wikibase entities loaded: 0/400 --> <!-- Transclusion expansion time report (%,ms,calls,template) 100.00% 113.793 1 -total 87.74% 99.840 1 Template:Extension-Translate 85.61% 97.414 35 Template:Ll 59.89% 68.146 70 Template:Translatable 49.01% 55.773 35 Template:Pagelang 4.70% 5.346 1 Translations:Extension:Translate/Page_display_title/en 4.47% 5.090 1 Template:TNTN --> <!-- Saved in parser cache with key mediawikiwiki:pcache:idhash:98270-0!canonical and timestamp 20241029114106 and revision id 6817941. Rendering was triggered because: page-view --> </div><!--esi <esi:include src="/esitest-fa8a495983347898/content" /> --><noscript><img src="https://login.wikimedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" width="1" height="1" style="border: none; position: absolute;"></noscript> <div class="printfooter" data-nosnippet="">Retrieved from "<a dir="ltr" href="https://www.mediawiki.org/w/index.php?title=Help:Extension:Translate/Components&amp;oldid=6817941">https://www.mediawiki.org/w/index.php?title=Help:Extension:Translate/Components&amp;oldid=6817941</a>"</div></div> <div id="catlinks" class="catlinks" data-mw="interface"><div id="mw-normal-catlinks" class="mw-normal-catlinks"><a href="/wiki/Special:Categories" title="Special:Categories">Category</a>: <ul><li><a href="/wiki/Category:Extension:Translate" title="Category:Extension:Translate">Extension:Translate</a></li></ul></div></div> </div> </main> </div> <div class="mw-footer-container"> <footer id="footer" class="mw-footer" > <ul id="footer-info"> <li id="footer-info-lastmod"> This page was last edited on 29 October 2024, at 02:04.</li> <li id="footer-info-copyright">Text is available under the <a rel="nofollow" class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-ShareAlike License</a>; additional terms may apply. Text in <a class="external text" href="https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents">the Help: namespace</a> is available under the <a rel="nofollow" class="external text" href="https://creativecommons.org/publicdomain/zero/1.0/">Creative Commons CC0 License</a>. By using this site, you agree to the <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use">Terms of Use</a> and <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">Privacy Policy</a>.</li> </ul> <ul id="footer-places"> <li id="footer-places-privacy"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">Privacy policy</a></li> <li id="footer-places-about"><a href="/wiki/Project:About">About mediawiki.org</a></li> <li id="footer-places-disclaimers"><a href="/wiki/Project:General_disclaimer">Disclaimers</a></li> <li id="footer-places-wm-codeofconduct"><a href="https://www.mediawiki.org/wiki/Special:MyLanguage/Code_of_Conduct">Code of Conduct</a></li> <li id="footer-places-developers"><a href="https://developer.wikimedia.org">Developers</a></li> <li id="footer-places-statslink"><a href="https://stats.wikimedia.org/#/www.mediawiki.org">Statistics</a></li> <li id="footer-places-cookiestatement"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Cookie_statement">Cookie statement</a></li> <li id="footer-places-mobileview"><a href="//m.mediawiki.org/w/index.php?title=Help:Extension:Translate/Components&amp;mobileaction=toggle_view_mobile" class="noprint stopMobileRedirectToggle">Mobile view</a></li> </ul> <ul id="footer-icons" class="noprint"> <li id="footer-copyrightico"><a href="https://wikimediafoundation.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/static/images/footer/wikimedia-button.svg" width="84" height="29" alt="Wikimedia Foundation" loading="lazy"></a></li> <li id="footer-poweredbyico"><a href="https://www.mediawiki.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/w/resources/assets/poweredby_mediawiki.svg" alt="Powered by MediaWiki" width="88" height="31" loading="lazy"></a></li> </ul> </footer> </div> </div> </div> <div class="vector-settings" id="p-dock-bottom"> <ul></ul> </div><script>(RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgHostname":"mw-web.codfw.main-f69cdc8f6-6f8kn","wgBackendResponseTime":142,"wgDiscussionToolsPageThreads":[{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Primary_extensible_components","replies":[{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-WebAPI-Primary_extensible_components","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-File_format_support_(FFS)-Primary_extensible_components","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Message_groups-Primary_extensible_components","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Translation_aids_(helpers)-Primary_extensible_components","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Web_services-Primary_extensible_components","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Message_checkers-Primary_extensible_components","replies":[]}]},{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Other_core_components","replies":[{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Message_collection-Other_core_components","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Message-Other_core_components","replies":[]}]},{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Utility_classes","replies":[{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Font_finder-Utility_classes","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Message_group_cache-Utility_classes","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Message_group_utilities-Utility_classes","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Message_index-Utility_classes","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Message_table-Utility_classes","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Metadata_table-Utility_classes","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Revtag-Utility_classes","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Stats_code-Utility_classes","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-String_matcher/mangler-Utility_classes","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Ttmserver_(translation_memory)-Utility_classes","replies":[]},{"headingLevel":3,"name":"h-","type":"heading","level":0,"id":"h-Misc_stuff:_RC_integration,_preferences,_toolbox,_jobs-Utility_classes","replies":[]}]},{"headingLevel":2,"name":"h-","type":"heading","level":0,"id":"h-Repository_layout","replies":[]}],"wgPageParseReport":{"discussiontools":{"limitreport-timeusage":"0.014"},"limitreport":{"cputime":"0.240","walltime":"0.323","ppvisitednodes":{"value":1914,"limit":1000000},"postexpandincludesize":{"value":24145,"limit":2097152},"templateargumentsize":{"value":10088,"limit":2097152},"expansiondepth":{"value":14,"limit":100},"expensivefunctioncount":{"value":4,"limit":500},"unstrip-depth":{"value":0,"limit":20},"unstrip-size":{"value":5341,"limit":5000000},"entityaccesscount":{"value":0,"limit":400},"timingprofile":["100.00% 113.793 1 -total"," 87.74% 99.840 1 Template:Extension-Translate"," 85.61% 97.414 35 Template:Ll"," 59.89% 68.146 70 Template:Translatable"," 49.01% 55.773 35 Template:Pagelang"," 4.70% 5.346 1 Translations:Extension:Translate/Page_display_title/en"," 4.47% 5.090 1 Template:TNTN"]},"scribunto":{"limitreport-timeusage":{"value":"0.032","limit":"10.000"},"limitreport-memusage":{"value":1064333,"limit":52428800}},"cachereport":{"origin":"mw-web.eqiad.main-858c7455cb-g7gp4","timestamp":"20241029114106","ttl":2592000,"transientcontent":false}}});});</script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10