Открывайте pull request после каждого запуска
- id: translate uses: IEvangelist/resource-translator@v3 with: sourceLocale: en subscriptionKey: ${{ secrets.TRANSLATOR_KEY }} endpoint: ${{ secrets.TRANSLATOR_ENDPOINT }} region: ${{ secrets.TRANSLATOR_REGION }}
- if: steps.translate.outputs.has-new-translations == 'true' uses: peter-evans/create-pull-request@v7 with: branch: machine-translation title: ${{ steps.translate.outputs.summary-title }} body: ${{ steps.translate.outputs.summary-details }} labels: localizationMonorepos: перевод области для каждого пакета
with: sourceLocale: en include: | apps/web/**/*.en.resx packages/shared/**/*.en.json exclude: | **/dist/** **/__tests__/**Глоссарий для торговых наименований и терминов продукции
Поставьте .github/resource-translator.yml в репо:
glossary: Acme: Contoso Octocat: Octocat ".NET": ".NET" "C++": "C++"Термины глоссария применяются после переводе, поэтому машинный перевод сохраняет предпочтительный брендинг, даже если модель заменила его на синоним.
Категория пользовательского переводчика (отрасль / домен)
with: sourceLocale: en subscriptionKey: ${{ secrets.TRANSLATOR_KEY }} endpoint: ${{ secrets.TRANSLATOR_ENDPOINT }} categoryId: 1234abcd-5678-90ef-... Обучайте категорию Azure Custom Translator на корпусе, который отражает вашу отраслевую лексику и тон (юридический, медицинский, маркетинг, внутренняя инженерия и т.д.), и сдайте его ID через categoryId. Это самый сильный рычаг тонирования, который предлагает Azure.
Регулирование тембра + строгий запасной вариант
# .github/resource-translator.yml# Industry / domain — choose your tone via a Custom Translator categorycategoryId: legal-en
# Treat profanity strictly for content aimed at younger audiencesprofanityAction: MarkedprofanityMarker: Tag
# Fail the run rather than silently fall back to the general modelallowFallback: false Объедините categoryId Custom Translator с profanityAction и allowFallback: false, чтобы обеспечить единый голос, и провалить рабочий процесс, если выбранная категория не имеет развертывания для одного из целевых локалов.
Пробный запуск перед запуском рабочего процесса
with: dryRun: true failOnError: false Действие по-прежнему издаёт сводные выводы и сводку шагов, но файлы не записываются. Комбинируйте failOnError: false, чтобы выявлять каждую проблему как предупреждение во время итерации.