Непрерывный перевод

Weblate строит такую инфраструктуру, чтобы ваш перевод непрерывно следовал за разработкой. Таким образом, переводчики могут работать над переводами всё время разработки, вместо того, чтобы работать с огромным количеством нового текста непосредственно перед выпуском.

См. также

Интеграция с Weblate описывает базовые способы интеграции вашей разработки с Weblate. Интеграции с хостингом кода перечисляет шаги настройки, специфичные для поставщиков, для распространённых сайтов хостинга кода.

Процесс следующий:

  1. Разработчики вносят изменения и отправляют их в репозиторий системы контроля версий.

  2. При необходимости файлы перевода обновляются, см. Представляем новые строки.

  3. Weblate извлекает изменения из репозитория VCS, разбирает файлы перевода и обновляет свою базу данных, см. Обновление репозиториев.

  4. Переводчики присылают переводы через веб-интерфейс Weblate, или загружают файлы, изменённые ими в автономном режиме.

  5. После завершения работы переводчиков Weblate фиксирует изменения в локальном репозитории (см. Отложенные коммиты).

  6. Изменения отправляются обратно в вышестоящий репозиторий (см. Отправка изменений из Weblate).

digraph translations { graph [fontname = "sans-serif", fontsize=10, ranksep=0.6, newrank=true]; node [fontname = "sans-serif", fontsize=10, margin=0.15]; edge [fontname = "sans-serif", fontsize=10]; subgraph cluster_codehosting { rank=same; graph [color=lightgrey, label="Upstream code hosting", style=filled ]; "VCS repository" [shape=cylinder]; } subgraph cluster_weblate { rank=same; graph [color=lightgrey, label="Weblate", style=filled ]; repo [label="Weblate repository", shape=cylinder]; database [label=Database, shape=cylinder]; } "Developers" [shape=box, fillcolor="#144d3f", fontcolor=white, style=filled]; "Translators" [shape=box, fillcolor="#144d3f", fontcolor=white, style=filled]; "Developers" -> "VCS repository" [label=" 1. Push "]; "VCS repository" -> "VCS repository" [label=" 2. Updating translations ", style=dotted]; "VCS repository" -> repo [label=" 3. Pull "]; repo -> database [label=" 3. Parse translations "]; "database" -> repo [label=" 5. Commit changes "]; "Translators" -> "database" [label=" 4. Translate "]; "repo" -> "VCS repository" [label=" 6. Push repository "]; }

Подсказка

Хостинг вышестоящего кода не обязателен, можно использовать Weblate с Локальные файлы, где есть только репозиторий внутри Weblate.

Обновление репозиториев

Вы должны каким-то образом настроить обновления репозиториев из их источников.

Всякий раз, когда Weblate обновляет репозиторий, будут срабатывать дополнения «после обновления», см. Дополнения.

Предотвращение конфликтов слияния

Конфликты слияния из Weblate возникают, когда один и тот же файл был изменён как в Weblate, так и за его пределами. В зависимости от ситуации существует несколько подходов к решению этой проблемы:

Избегайте конфликтов слияний, изменяя файлы перевода только в Weblate

С одноязычными файлами легко избежать редактирования за пределами Weblate — вы можете добавлять новые строки, не выходя из Weblate, и возложить на него любое редактирование файлов. Для двуязычных файлов, как правило, существует некий процесс извлечения сообщений из исходного кода для генерации файлов перевода. В некоторых случаях это можно разделить на две части:

  1. Извлечение генерирует шаблон (например, gettext POT генерируется с помощью xgettext).

  2. Дальнейший процесс объединяет его в актуальные переводы (файлы gettext PO обновляются с помощью msgmerge).

Вы можете выполнить второй шаг в Weblate, и это гарантирует, что все ожидающие изменения будут включены до выполнения этой операции.

Избежание конфликтов слияния путём блокировки Weblate при внешних изменениях

Интегрировать Weblate в ваш процесс обновления так, чтобы он сохранял изменения перед обновлением файлов вне Weblate, можно с помощью API REST для Weblate, заставляя Weblate отправить все ожидающие изменения и заблокировать перевод, пока вы вносите изменения на своей стороне.

Скрипт для выполнения обновлений может выглядеть следующим образом:

# Lock Weblate translation
wlc lock
# Push changes from Weblate to upstream repository
wlc push
# Pull changes from upstream repository to your local copy
git pull
# Update translation files, this example is for Django
./manage.py makemessages --keep-pot -a
git commit -m 'Locale updates' -- locale
# Push changes to upstream repository
git push
# Tell Weblate to pull changes (not needed if Weblate follows your repo
# automatically)
wlc pull
# Unlock translations
wlc unlock

Если у вас есть несколько компонентов, совместно использующих один и тот же репозиторий, вам необходимо заблокировать их все по отдельности:

wlc lock foo/bar
wlc lock foo/baz
wlc lock foo/baj

Примечание

В примере используется Клиент Weblate, которому требуется настройка (ключи API) для удалённого управления Weblate. Вы также можете добиться этого с помощью любого HTTP-клиента вместо Клиент Weblate, например curl; см. раздел API REST для Weblate.

Обслуживание репозитория

Представление Обслуживание репозитория показывает статус репозитория для проекта, компонента или перевода и позволяет привилегированным пользователям запускать операции обслуживания из пользовательского интерфейса.

Те же действия могут быть также вызваны с помощью API REST для Weblate или, для поддерживаемого подмножества, Клиент Weblate.

Доступность отдельных действий зависит от разрешений, настроенной системы контроля версий, настроена ли отправка, и может ли выбранный объект быть заблокирован.

Действие

Что это делает

Типичное использование

Коммит

Фиксирует ожидающие изменения, хранящиеся в Weblate, в локальном репозитории.

Сбросить ожидающие изменения Weblate перед выполнением работы с репозиторием в другом месте.

Отправить

Отправляет зафиксированные изменения локального репозитория в настроенный вышестоящий репозиторий.

Отправить зафиксированные переводы в вышестоящий репозиторий, когда автоматическая отправка отключена или задержана.

Обновить

Извлекает изменения из вышестоящего репозитория и интегрирует их, используя настроенный в компоненте Стиль слияния.

Синхронизировать Weblate с вышестоящим репозиторием, используя стратегию интеграции по умолчанию.

Обновить со слиянием

Извлекает изменения из вышестоящего репозитория и интегрирует их с явным слиянием.

Переопределить стиль слияния по умолчанию для одного обновления.

Обновить со сменой базы

Извлекает изменения из вышестоящего репозитория и перемещает локальные коммиты Weblate поверх вышестоящих.

Сохранять линейную историю, если это соответствует вашему рабочему процессу.

Обновить со слиянием без ускорения

Извлекает изменения из вышестоящего репозитория и создаёт явный коммит слияния, даже если возможно ускорение.

Сохранять коммиты слияния для аудита или управления ветками.

Заблокировать / Разблокировать

Запрещает или разрешает переводчикам вносить дальнейшие изменения в Weblate.

Заморозить изменения переводов во время обслуживания репозитория вне Weblate.

Сбросить и отклонить

Сбрасывает локальный репозиторий Weblate к состоянию вышестоящего и отбрасывает ожидающие изменения Weblate.

Используйте, когда вышестоящий репозиторий должен перезаписать локальное состояние репозитория Weblate.

Сбросить и применить заново

Сбрасывает локальный репозиторий Weblate к состоянию вышестоящего, сохраняя ожидающие переводы. См. Поведение восстановления при сбросе и повторном применении.

Восстановиться после расхождения истории, сохраняя ожидающие переводы Weblate.

Очистка

Удаляет неотслеживаемые файлы и устаревшие ветки из локальной рабочей копии репозитория.

Очистить остаточные файлы или устаревшее состояние репозитория в рабочей копии Weblate.

Синхронизировать

Заставляет Weblate записать все известные переводы обратно в файлы репозитория.

Исправить случаи, когда файлы репозитория рассинхронизировались с состоянием базы данных.

Пересканировать

Повторно считывает файлы переводов из локального репозитория в Weblate.

Импортировать изменения файлов после ручной работы с репозиторием или создания файлов.

Поведение восстановления при сбросе и повторном применении

Операция Сбросить и применить заново сохраняет ожидающие переводы из Weblate, одновременно сбрасывая состояние локального репозитория до соответствия вышестоящему.

Операция может восстановить ожидающие переводы, только когда файлы целевого языка всё ещё существуют после сброса или когда Weblate может создать их для компонента, например, используя действительный Шаблон для новых переводов.

Если ни одно из этих условий не выполнено, Weblate сохраняет ожидающие изменения в своей базе данных и сообщает об ошибке восстановления, вместо того чтобы позже завершиться ошибкой с общей ошибкой разбора.

Избежание конфликтов слияния путём сосредоточения на операциях Git

Даже когда Weblate является единственным источником изменений в файлах перевода, конфликты могут возникать при использовании дополнения Уплотнение Git-коммитов, когда Стиль слияния настроен на Rebase , или когда вы склеиваете коммиты вне Weblate (например, при слиянии запроса на извлечение).

Причина конфликтов слияния в данном случае иная — у Weblate могут быть новые локальные коммиты после того, как вы объединили более ранние коммиты Weblate в вышестоящем репозитории. Обычно это происходит, если слияние не автоматизировано и изменения ожидают проверки человеком дни или недели. Затем Git иногда больше не может определить, что изменения из вышестоящего репозитория соответствуют изменениям Weblate, и отказывается выполнять смену базы.

Склеивающее слияние (squash merge) изменений Weblate усложняет восстановление. Склеивающее слияние создаёт новый коммит вместо сохранения отдельных коммитов Weblate в истории вышестоящего репозитория. В локальном репозитории Weblate всё ещё есть исходные коммиты, и Git больше не может доказать, что вышестоящий репозиторий уже содержит их. Если конфликт также был разрешён вручную, содержимое файлов может отличаться от обоих репозиториев, поэтому Weblate может продолжать не обновляться, даже после того как запрос на извлечение был объединён вышестоящим репозиторием.

Если вышестоящий репозиторий больше не содержит коммиты Weblate, потому что они были склеены при слиянии, обновления репозитория может быть недостаточно. Используйте Сброс и повторное применение в Обслуживание репозитория, чтобы сбросить Weblate к вышестоящему состоянию, сохраняя ожидающие перевода строки; см. Поведение восстановления при сбросе и повторном применении. Используйте Сброс и удаление, только если вышестоящий репозиторий должен полностью заменить локальные изменения Weblate.

Чтобы решить эту проблему, необходимо либо минимизировать количество ожидающих изменений в Weblate при слиянии запроса на извлечение, либо полностью избежать конфликтов, не уплотняя изменения.

Вот несколько вариантов, как этого избежать:

  • Не используйте Уплотнение Git-коммитов и не применяйте склеивание при слиянии изменений Weblate. Склеивание — это причина, по которой Git может больше не распознавать изменения после объединения.

  • При разрешении конфликтов вне Weblate объединяйте коммиты Weblate с помощью обычного коммита слияния и отправляйте этот результат вышестоящему репозиторию. Не применяйте склеивающее слияние к запросу на извлечение, разрешающему конфликт.

  • Позвольте Weblate зафиксировать оставшиеся изменения перед слиянием. Это обновит запрос на извлечение со всеми его изменениями, и оба репозитория будут синхронизированы.

  • Используйте функции рецензирования в Weblate (см. Рабочие процессы перевода), чтобы автоматически объединять запросы на GitHub после прохождения CI.

  • Использование блокировки в Weblate позволяет избежать изменений во время рассмотрения запроса на GitHub.

См. также

Клиент Weblate

Уведомления хостинга кода

Инструкции по приложениям и веб-обработчикам, специфичные для поставщиков, для GitHub, GitLab, Bitbucket, Pagure, Azure Repos, Gitea, Forgejo и Gitee рассмотрены в Интеграции с хостингом кода.

Уведомления, специфичные для поставщика

Эти устаревшие якоря сохранены для совместимости. Текущая настройка приложений и веб-обработчиков, специфичных для поставщика, документирована в Интеграции с хостингом кода.

Автоматическое ночное обновление репозиториев

Weblate по ночам автоматически извлекает изменения из удалённых репозиториев для повышения производительности при последующем слиянии изменений. По желанию вы можете превратить его и в ночное слияние, включив параметр AUTO_UPDATE.

Отправка изменений из Weblate

Каждый компонент перевода может иметь настроенный URL-адрес для отправки (см. URL для отправки в репозиторий), и в этом случае Weblate сможет отправлять изменения в удалённый репозиторий. Weblate также можно настроить на автоматическую отправку изменений при каждом коммите, см. Отправлять при коммите.

Сведения о таблице параметров отправки и рабочих процессах запросов на извлечение, слияние и рецензирование, специфичных для поставщика, см. в Отправка изменений из Weblate.

См. также

Для настройки ключей SSH смотрите раздел Доступ к репозиториям, а для получения информации о том, когда Weblate решает закоммитить изменения — раздел Отложенные коммиты.

Защищённые ветки

Если вы используете Weblate на защищённой ветке, вы можете настроить его на использование запросов на извлечение и выполнение рецензирования переводов (что может быть проблематично для языков, которых вы не знаете). Альтернативный подход заключается в отмене этого ограничения для пользователя Weblate.

Например, на GitHub’е это можно сделать в настройках репозитория:

../_images/github-protected.png

Взаимодействие с другими пользователями

Weblate облегчает взаимодействие с другими пользователями с помощью своего API.

См. также

API REST для Weblate

Отложенные коммиты

Weblate группирует коммиты одного и того же автора в один коммит, если это возможно. Такая группировка значительно сокращает количество коммитов, однако вам может понадобиться явно указать ему сделать коммиты в случае, если вы хотите синхронизировать репозиторий, например, для выполнения слияния (по умолчанию это действие разрешено для группы Управляющие, смотрите раздел Список привилегий).

Изменения в этом режиме коммитятся при выполнении любого из следующих условий:

Подсказка

Коммиты создаются для каждого компонента. Так что в случае, если у вас много компонентов, у вас всё равно будет множество коммитов. В этом случае вы можете использовать надстройку Уплотнение Git-коммитов.

Если вы хотите фиксировать изменения чаще и без проверки возраста, вы можете запланировать регулярную задачу для выполнения фиксации. Это можно сделать с помощью периодических задач в Интерфейс администратора Django. Сначала создайте желаемый интервал (например, 120 секунд). Затем добавьте новую периодическую задачу и выберите weblate.trans.tasks.commit_pending в качестве задачи с {"hours": 0} в качестве ключевых аргументов и желаемого интервала.

Обработка репозитория скриптами

Способ настройки взаимодействия Weblate с репозиторием — это Дополнения. Обратитесь к Выполнение скриптов из надстройки за информацией о том, как выполнять внешние скрипты через дополнения.

Поддержание единого перевода в разных компонентах

Если у вас несколько компонентов перевода, вы возможно захотите убедиться, что одни и те же строки имеют один и тот же перевод. Этого можно достичь на нескольких уровнях.

Распространение перевода

При включённой функции Разрешить распространение перевода (которая включена по умолчанию, смотрите раздел Настройки компонента), все новые переводы автоматически копируются во все компоненты с совпадающими строками. Такие переводы должным образом засчитываются текущему пользователю-переводчику во всех компонентах.

Предпосылки распространения:

  • Все компоненты должны находиться в одном проекте (связывания компонентов недостаточно).

  • Включите Разрешить распространение перевода для автоматического повторного использования переводов для совпадающих строк.

  • Распространение перевода требует, чтобы в одноязычных форматах файлов перевода ключи строк совпадали, так что об этом следует помнить при создании ключей перевода.

  • Строки распространяются во время перевода, строки, загруженные из репозитория, не распространяются.

Совет

Эта функция в настоящее время имеет ограничения, и мы хотим сделать её более универсальной. Пожалуйста, поделитесь своим мнением на https://github.com/WeblateOrg/weblate/issues/3166.

Проверка согласованности

Проверка Противоречия срабатывает всякий раз, когда строки отличаются друг от друга. Вы можете использовать это, чтобы отрецензировать такие различия вручную и выбрать правильный перевод.

Автоматический перевод

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