Help:Extension:Translate/Пам'ять перекладів

From MediaWiki.org
Jump to navigation Jump to search
This page is a translated version of the page Help:Extension:Translate/Translation memories and the translation is 59% complete.
Outdated translations are marked like this.
Other languages:
Deutsch • ‎English • ‎Lëtzebuergesch • ‎Nederlands • ‎Zazaki • ‎dansk • ‎español • ‎français • ‎lietuvių • ‎polski • ‎português • ‎português do Brasil • ‎български • ‎русский • ‎українська • ‎العربية • ‎فارسی • ‎தமிழ் • ‎中文 • ‎日本語

The Translate extension translation memory supports multiple backends. The available backends are database, Solr and ElasticSearch. This page helps you install the best one for you and explains their specifications in deeper detail.

Unlike other translation aids, for instance external machine translation services, the translation memory is constantly updated by new translations in your wiki. Advanced search across translations is also available at Special:SearchTranslations if you choose Solr or ElasticSearch.

Comparison

The database backend is used by default: it has no dependencies and doesn't need configuration. The database backend can't be shared among multiple wikis and it does not scale to large amounts of translated content. Hence we also support Solr and ElasticSearch backends. It is also possible to use another wiki's translation memory via their web API is open. Unlike the others, remote backends are not updated with translations from the current wiki.

Локальна база даних Віддалено через API Платформа Solr
Увімкнено за замовчуванням Так Ні Ні
Може мати декілька джерел Ні Так Так
Оновлюється з локальними перекладами Так Ні Так
Прямий доступ до бази даних Так Ні Ні
Доступ до джерела Редактор Посилання Редактор (в локальному режимі) або посилання
Може поширюватись як сервіс API Так Так Так
Performance Does not scale well Unknown Reasonable

Requirements

ElasticSearch backend

ElasticSearch is relatively easy to set up. If it is not available in your distribution packages, you can get it from their website. You will also need to get the Elastica extension. Finally, please see puppet/modules/elasticsearch/files/elasticsearch.yml for specific configuration needed by Translate.

The bootstrap script will create necessary schemas. If you are using ElasticSearch backend with multiple wikis, they will share the translation memory by default, unless you set the index parameter in the configuration.

When upgrading to the next major version of elasticsearch (e.g. upgrading from 2.x to 5.x), it is highly recommended to read the release notes and the documentation regarding the upgrade process. Elastic offers a migration plugin that may help you to prepare your system before installing the next version. Follow these steps carefully otherwise elasticsearch may refuse to upgrade and you may end up in a delicate situation where you cannot rollback to the previous version.

Once the next major version is installed it's probable that the next time you run ttmserver-export.php it fails. This is because elasticsearch will perform an internal migration progress that may create an incompatible mapping with the one ttmserver-export.php wants to update. You have to use the --reindex flag to force a full rebuild of the index.

As a rule of thumb it is recommended to run ttmserver-export.php with the --reindex flag after major upgrades. You will ensure that your indices are always created with the current elasticsearch version which is a requirement for major upgrades.

Solr backend

Ось загальні швидкі кроки встановлення і налаштування Solr для TTMServer. Ви маєте адаптувати їх до своєї ситуації.

# Solr needs java
sudo apt-get install openjdk-6-jre-headless
# Download and extract solr from: http://lucene.apache.org/solr/downloads.html
wget http://www.nic.funet.fi/pub/mirrors/apache.org/lucene/solr/3.6.0/apache-solr-3.6.0.tgz
tar xzf apache-solr-*.tgz
cd apache-solr-*/example
# Copy the config from the extension directory
cp .../Translate/ttmserver/schema.xml solr/conf
# Start the server
java -jar start.jar

Щоб використовувати Solr backend, Вам також потрібна бібліотека Solarium. Найпростіше встановити MediaWiki розширення Solarium. Див. приклад конфігурації Solr backend у розділі налаштувань на цій сторінці. Ви можете зробити додаткові налаштунки Solarium через ключ config, як зроблено, наприклад, у налаштуваннях Вікімедіа.

Installation

After putting the requirements in place, installation requires you to tweak the configuration and then execute the bootstrap.

Configuration

Усі допомоги перекладу включно з пам'яттю перекладу налаштовуються у налаштуваннях конфігурацій $wgTranslateTranslationServices. Приклад конфігурацій TTMServers:

The primary translation memory backend must use the key TTMServer. The primary backend receives translation updates and is used by Special:SearchTranslations.

Example configuration of TTMServers:

Налаштування за замовчуванням
$wgTranslateTranslationServices['TTMServer'] = array(
        'database' => false, // Passed to wfGetDB
        'cutoff' => 0.75,
        'type' => 'ttmserver',
        'public' => false,
);
Налаштування Remote API
$wgTranslateTranslationServices['example'] = array(
        'url' => 'http://example.com/w/api.php',
        'displayname' => 'example.com',
        'cutoff' => 0.75,
        'timeout' => 3,
        'type' => 'ttmserver',
        'class' => 'RemoteTTMServer',
);
ElasticSearch backend configuration
$wgTranslateTranslationServices['TTMServer'] = array(
        'type' => 'ttmserver',
        'class' => 'ElasticSearchTTMServer',
        'cutoff' => 0.75,
        /*
         * See http://elastica.io/getting-started/installation.html
         * See https://github.com/ruflin/Elastica/blob/master/lib/Elastica/Client.php
        'config' => This will be passed to \Elastica\Client
         */
);
ElasticSearch multible backends configuration (supported by MLEB 2017.04)
// Defines the default service used for read operations
// Allows to quickly switch to another backend
$wgTranslateTranslationDefaultService = 'cluster1';
$wgTranslateTranslationServices['cluster1'] = array(
        'type' => 'ttmserver',
        'class' => 'ElasticSearchTTMServer',
        'cutoff' => 0.75,
        /*
         * Defines the list of services to replicate writes to.
         * Only "writable" services are allowed here.
         */
        'mirrors' => [ 'cluster2' ],
        'config' => [ 'servers' => [ 'host' => 'elastic1001.cluster1.mynet' ] ]
);
$wgTranslateTranslationServices['cluster2'] = array(
        'type' => 'ttmserver',
        'class' => 'ElasticSearchTTMServer',
        'cutoff' => 0.75,
        /*
         * if "cluster2" is defined as the default service it will start to replicate writes to "cluster1".
         */
        'mirrors' => [ 'cluster1' ],
        'config' => [ 'servers' => [ 'host' => 'elastic2001.cluster2.mynet' ] ]
);
Налаштування платформи Solr
$wgTranslateTranslationServices['TTMServer'] = array(
        'type' => 'ttmserver',
        'class' => 'SolrTTMServer',
        'cutoff' => 0.75,
        /* See http://wiki.solarium-project.org/index.php/V2:Basic_usage
        'config' => This will be passed to Solarium_Client
         */
);

Можливі ключі і значення:

Ключ Застосовується до Опис
config Solr Щодо налаштувань інсталяції Solr на Solarium див. нижче.
cutoff усе Мінімальний поріг задоволення запиту. Відображаються тільки кращі запити, навіть якщо будуть і інші, що досягли порогу.
database локально Якщо Ви хочете зберігати пам'ять перекладів в іншому місці, можна вказати назву бази даних тут. Вам також потрібно налаштувати у стабілізаторі завантаження MediaWiki, як під'єднатись до цієї бази даних.
displayname віддалено Текст, що показується у спливаючій підказці під час наведення курсором на посилання на джерело пропозиції перекладу (маркер).
index ElasticSearch The index to use in ElasticSearch. Default: ttmserver.
public усе Чи можна на цей TTMServer подати запит через api.php цієї вікі.
replicas ElasticSearch If you are running a cluster, you can increase the number of replicas. Default: 0.
shards ElasticSearch How many shards to use. Default: 5.
timeout віддалено Як довго чекати на відповідь віддаленого сервісу.
type усе Тип TTMServer в плані формату результатів.
url віддалено URL до api.php віддаленого TTMServer.
use_wikimedia_extra ElasticSearch Boolean, when the extra plugin is deployed you can disable dynamic scripting on elastic v1.x. This plugin is now mandatory for elastic 2.x clusters.
mirrors Writable services Array of strings, defines the list of services to replicate writes to, it allows to keep multiple TTM services up to date. Useful for fast switch-overs or to reduce downtime during planned maintenance operations (Added in MLEB 2017.04)
Ви повинні використовувати ключ TTMServer як індекс масиву до $wgTranslateTranslationServices, якщо хочете, щоб пам'ять перекладу оновлювалась новими перекладами. Віддалені TTMServers не можуть використовуватись для цього, оскільки їх не можна оновити. As of MLEB 2017.04 the key TTMServer can be configured with the configuration variable $wgTranslateTranslationDefaultService.

Зараз для баз даних підтримується лише MySQL.

Bootstrap

When you have chosen Solr or ElasticSearch and set up the requirements and configuration, run ttmserver-export.php to bootstrap the translation memory. Bootstrapping is also required when changing translation memory backend. If you are using a shared translation memory backend for multiple wikis, you'll need to bootstrap each of them separately.

Sites with lots of translations should consider using multiple threads with the --thread parameter to speed up the process. The time depends heavily on how complete the message group completion stats are (incomplete ones will be calculated during the bootstrap). New translations are automatically added by a hook. New sources (message definitions) are added when the first translation is created.

Bootstrap does the following things, which don't happen otherwise:

  • adding and updating the translation memory schema;
  • populating the translation memory with existing translations;
  • cleaning up unused translation entries by emptying and re-populating the translation memory.

When the translation of a message is updated, the previous translation is removed from the translation memory. However, when translations are updated against a new definition, a new entry is added but the old definition and its old translations remain in the database until purged. When a message changes definition or is removed from all message groups, nothing happens immediately. Saving a translation as fuzzy does not add a new translation nor delete an old one in the translation memory.

Доступ до TTMServer через API

Якщо Ви хотіли б впровадити власний сервіс TTMServer, тут подано деякі технічні параметри.

Параметри запиту:

Ваш сервіс повинен прийняти такі параметри:

Ключ Значення
format json
action ttmserver
service Необов'язковий ідентифікатор сервісу, якщо є декілька спільних пам'ятей перекладу. Якщо не вказаний, приймається сервіс за замовчуванням.
sourcelanguage Код мови, що використовується у MediaWiki, див. мовні теги IETF і ISO693?
targetlanguage Код мови, що використовується у MediaWiki, див. мовні теги IETF і ISO693?
test Вихідний текст мовою джерела

Ваш сервіс повинен надавати об'єкт JSON, що мусить мати ключ ttmserver з масивом об'єктів. Ці об'єкти повинні містити такі дані:

Ключ Значення
source Оригінальний текст джерела.
target Підказка перекладу.
context Локальний ідентифікатор для джерела, необов'язково.
location URL на сторінку, де можна побачити, як підказка використовується.
quality Десяткове число в діапазоні [0..1], що описує якість підказки. 1 означає максимальне співпадіння.

Приклад:

{
        "ttmserver": [
                {
                        "source": "January",
                        "target": "tammikuu",
                        "context": "Wikimedia:Messages\\x5b'January'\\x5d\/en",
                        "location": "https:\/\/translatewiki.net\/wiki\/Wikimedia:Messages%5Cx5b%27January%27%5Cx5d\/fi",
                        "quality": 0.85714285714286
                },
                {
                        "source": "January",
                        "target": "tammikuu",
                        "context": "Mantis:S month january\/en",
                        "location": "https:\/\/translatewiki.net\/wiki\/Mantis:S_month_january\/fi",
                        "quality": 0.85714285714286
                },
                {
                        "source": "January",
                        "target": "Tammikuu",
                        "context": "FUDforum:Month 1\/en",
                        "location": "https:\/\/translatewiki.net\/wiki\/FUDforum:Month_1\/fi",
                        "quality": 0.85714285714286
                },
                {
                        "source": "January",
                        "target": "tammikuun",
                        "context": "MediaWiki:January-gen\/en",
                        "location": "https:\/\/translatewiki.net\/wiki\/MediaWiki:January-gen\/fi",
                        "quality": 0.85714285714286
                },
                {
                        "source": "January",
                        "target": "tammikuu",
                        "context": "MediaWiki:January\/en",
                        "location": "https:\/\/translatewiki.net\/wiki\/MediaWiki:January\/fi",
                        "quality": 0.85714285714286
                }
        ]
}

Database backend

Backend містить три таблиці: translate_tms, translate_tmt і translate_tmf. Вони відповідають джерелам, цілям та повному тексту. Ви можете знайти визначення таблиць у sql/translate_tm.sql. Джерела містять усі визначення повідомлень. Незважаючи на те, що зазвичай вони написані тією ж мовою, скажімо, англійською, мова тексту також зберігається, крім рідкісних винятків.

Кожен запис має унікальний id і два додаткові поля, "length" і "context". "Length" використовується як перший фільтр довжини, так що при подачі запиту не треба порівнювати текст, який ми шукаємо, з кожним записом у базі даних. У "context" прописується назва сторінки, з якої цей текст, наприклад "MediaWiki:Jan/en". Виходячи з цієї інформації, ми можемо видати підказку на "MediaWiki:Jan/de", що дає можливість перекладачам швидко працювати, та й просто визначати, де використано такий вид перекладу.

Другий крок фільтрації забезпечується повнотекстовим пошуком. Визначення змішані за спеціальним алгоритмом. Спершу текст розбивається на сегменти (слова) з допомогою Language::segmentByWord MediaWiki. Якщо сегментів достатньо, відсівається все, що не є літерами слів, і впорядковується. Потім беремо перші десять унікальних слів довжиною щонайменше 5 байтів (5 букв англійською, але навіть і менші слова у мовах з мультибайтними кодовими точками). Ці слова потім зберігаються у повнотекстовому індексі для подальшої фільтрації у довших рядках.

Коли ми відфільтрувати список кандидатів, дістаємо з цільової таблиці те, що співпадає. Потім застосовується алгоритм відстані редагування Левенштейна для останнього фільтрування і ранжування. Давайте визначимо:

відстань редагування
текст, для якого шукаються підказки
Tc 
текст підказки
To 
вихідний текст, перекладом якого є Tc

Якість підказки Tc обраховується як E/min(length(Tc),length(To)). Залежно від довжини (length) рядків, ми користуємося або вбудованою функцією Левенштейна PHP, або, якщо будь-який з рядків довший, ніж 255 байтів, реалізацією алгоритму Левенштейна. [1] Не перевірялось чи вбудована реалізація алгоритму Левенштейна коректно відображає мультибайтні символи. Це може бути ще одним слабким місцем, якщо мова джерела не англійська (іншими є повнотекстовий пошук і сегментація).

Solr backend

Solr Solr search platform backend works similar to the database backend, except that it uses a dedicated search engine for increased speed. The results are by default ranked with the levenshtein algorithm on the Solr side, but other available string matching algorithms can also be used, like ngram matching for example.

У Solr немає таблиць. Натомість є документи з полями. Ось приклад документу:

  <doc>
    <str name="wiki">sandwiki-bw_</str>
    <str name="uri">http://localhost/wiki/MediaWiki:Action-read/bn</str>
    <str name="messageid">MediaWiki:Action-read</str>
    <str name="globalid">sandwiki-bw_-MediaWiki:Action-read-813862/bn</str>
    <str name="language">bn</str>
    <str name="content">এই পাতাটি পড়ুন</str>
    <arr name="group">
      <str>core</str>
      <str>core-1.20</str>
      <str>core-1.19</str>
      <str>mediawiki</str>
    </arr>
    <long name="_version_">1421795636117766144</long>
  </doc>

Кожен переклад і документація повідомлення мають свій документ. Щоб, власне кажучи, отримати підказки, ми спершу робимо пошук по відсортованому за подібністю рядків алгоритму для всіх документів вихідною мовою. Далі робимо інший запит на переклади для цих повідомлень, якщо вони є.

Використовуються численні перехоплення, щоб підтримувати базу даних пам'яті перекладів оновленою майже в реальному часі. Якщо користувач перекладає схожі повідомлення одне за одним, попередній переклад може (якщо він підходить) відобразитись як підказка для наступного повідомлення.

Новий переклад (якщо не застарілий)

  1. Створити документ

Оновлений переклад (якщо не застарілий)

  1. Видалити wiki:X language:Y message:Z
  2. Створити документ

Оновлене визначення повідомлення

  1. Створити новий документ

Усі існуючі документи для повідомлення залишаються, бо мають різні globalid.

Переклад застарілий

  1. Видалити wiki:X language:Y message:Z

Зміна приналежності повідомлення до групи

  1. Видалити wiki:Z message:Z
  2. Створити документ (для усіх мов)

Повідомлення більше не використовується

  1. Видалити wiki:Z message:Z
  2. Створити документ (для усіх мов)

Усі подальші зміни до визначень або перекладів не оновлюються у пам'яті перекладів.

Запит до пам'яті перекладів

  1. Зібрати подібні повідомлення зі strdist("message definition",content)
  2. Зібрати переклади з globalid:[A,B,C]

Пошуковий запит

  1. Знайти усі співпадіння з text:"пошуковий запит"

Може звужуватись до мови або групи повідомлень.

Поля ідентифікатора Поле globalid ідентифікує переклад або визначення повідомлення унікально, комбінуючи такі поля:

  • вікі ідентифікатор (ID бази даних MediaWiki)
  • ідентифікатор повідомлення (Заголовок базової сторінки)
  • ідентифікатор версії повідомлення (ID версії сторінки визначення повідомлення)
  • мова повідомлення

Використовуваний формат: wiki-message-version/language.

На додачу, ми виділили окремі поля для вікі id, id повідомлення та мови, щоб зробити можливими запити на видалене, перераховані вище.