Zadaj pytanie i otrzymaj streszczenie dokumentu, odwołując się do tej strony i wybranego dostawcy AI
Treść tej strony została przetłumaczona przy użyciu sztucznej inteligencji.
Zobacz ostatnią wersję oryginalnej treści w języku angielskimJeśli masz pomysł na ulepszenie tej dokumentacji, zachęcamy do przesłania pull requesta na GitHubie.
Link do dokumentacji na GitHubieKopiuj dokument Markdown do schowka
Automatyzacja tłumaczeń w CI/CD bez publikowania złych tekstów
Ręczne tłumaczenie nie wytrzymuje zderzenia z nowoczesnym cyklem wydawniczym. Ktoś dodaje ciąg znaków w piątek, eksport następuje w kolejnym sprincie, a do tego czasu trzy kolejne języki pozostają w tyle. Sama automatyzacja jest prosta. Jednak zautomatyzowanie procesu bez cichego publikowania maszynowych tekstów do klientów to kwestia, nad którą warto się zastanowić.
Spis treści
Nie musisz migrować, aby zautomatyzować
Poniższe struktury pipeline'ów są niezależne od biblioteki, podobnie jak same narzędzia. Jeśli Twoje wiadomości to katalogi JSON dla i18next, next-intl, react-intl, vue-i18n lub next-translate, wtyczka Sync JSON odczytuje i zapisuje te pliki bezpośrednio w miejscu:
Skopiuj kod do schowka
Twoja aplikacja nadal importuje to, co importowała dotychczas. Poniższe zadania CI uzupełniają i weryfikują istniejące katalogi, a diff widoczny dla recenzenta to zmiana w locales/fr/checkout.json, a nie duża migracja kodu. Dostępna jest również wtyczka Sync PO dla przepływów gettext oraz adaptery kompatybilności, jeśli zależy Ci na zachowaniu obecnego runtime API.
Oddziel bramkę (gate) od uzupełniania (fill)
Dwa zupełnie różne zadania są nagminnie mylone.
Bramka (gate) to kontrola, która zgłasza błąd. Oznacza, że ta kompilacja nie może trafić na produkcję, ponieważ brakuje wymaganych tłumaczeń. Bramka niczego nie zapisuje.
Uzupełnianie (fill) to operacja modyfikacji. Generuje brakujące tłumaczenia i tworzy commit. Nigdy nie przerywa buildu z błędem.
Uruchamianie samego uzupełniania oznacza, że nic nigdy nie blokuje wdrożenia, a niesprawdzone tłumaczenia maszynowe trafiają do użytkowników. Uruchamianie samej bramki sprawia, że build staje się czerwony i człowiek musi za każdym razem ręcznie interweniować. Większość zespołów potrzebuje obu mechanizmów powiązanych z różnymi zdarzeniami: fill przy pull requeście, gate przy merge do gałęzi wydaniowej.
Gdzie można umieścić automatyzację
Otwórz tabelę w oknie modalnym, aby wyraźnie zobaczyć całą zawartość
| Etap | Wyzwalacz | Dobre do | Koszt |
|---|---|---|---|
| Hook pre-push | Lokalny git | Szybka informacja zwrotna, zero minut w CI | Działa na maszynie programisty i jego kluczu API |
| Pull request | Zadanie CI | Przegląd przed merge, bezpieczne sekrety | Minuty w CI oraz wywołania modeli na każdy PR |
| Gałąź wydania | Zadanie CI | Twarda bramka pokrycia | Tanie, brak zapytań do modeli |
| Runtime | CMS | Zmiany treści bez przebudowywania aplikacji | Zależność od zewnętrznej usługi |
Pre-push: najszybsza pętla
Husky uruchamia uzupełnianie, zanim kod opuści lokalną maszynę, dzięki czemu tłumaczenia trafiają do tego samego pusha co nowe ciągi znaków.
Skopiuj kod do schowka
--unpushed ogranicza pracę do treści, które nie zostały jeszcze wypchnięte do repozytorium, co zapobiega minutowym opóźnieniom przy każdym pushu. --mode complete wypełnia tylko brakujące wpisy bez przepisywania tych, które już mają wartość, dzięki czemu zweryfikowane tłumaczenie nigdy nie zostanie po cichu zastąpione.
W przypadku monorepo zawęź zakres do poszczególnych aplikacji:
Skopiuj kod do schowka
Minus jest oczywisty: każdy programista potrzebuje klucza API, a koszt spada na osobę wykonującą push. Dlatego w miarę rozwoju zespołu większość projektów przenosi ten etap do CI.
Pull request: uzupełnianie w miejscu recenzji
Ta sama praca w GitHub Actions, zawężona do diffa:
Skopiuj kod do schowka
Cztery szczegóły mają tu kluczowe znaczenie:
fetch-depth: 0jest niezbędne do działania--git-diff. Płytki klon nie ma bazy do wyliczenia różnic i uzupełnianie niczego nie wykona.[skip ci]w wiadomości commita zapobiega zapętleniu workflow. Bez tego commit uruchamia nowy przebieg, który znów commituje, drenując limit CI w jedną noc.concurrencyzcancel-in-progresszatrzymuje równoległe pushe przed jednoczesnym zapisem do tych samych plików.--git-diffogranicza działanie do zmian w PR. Pominięcie tego spowoduje ponowne tłumaczenie całego katalogu przy każdym uruchomieniu.
Tłumaczenia pojawiają się jako commit w gałęzi PR, co oznacza, że recenzent widzi je w diffie. To główny powód, dla którego warto to robić tutaj, a nie po wykonaniu merge.
Gałąź wydaniowa: bramka (gate)
Bramka nie potrzebuje dostępu do modeli i powinna działać błyskawicznie.
Skopiuj kod do schowka
Wspierana testem sprawdzającym pokrycie zamiast polegania na samym raporcie CLI:
Skopiuj kod do schowka
npx intlayer content test drukuje raport, ale kończy się z kodem 0, więc informuje, ale nie blokuje. Używaj tego lokalnie, a w CI polegaj na asercjach w teście. Więcej szczegółów w wykrywaniu brakujących tłumaczeń.
requiredLocales czyni bramkę znośną w praktyce
Bramka wymagająca kompletności wszystkich osiemnastu języków blokuje każde wydanie do czasu przygotowania najwolniejszego tłumaczenia i zostaje wyłączona w ciągu miesiąca.
Skopiuj kod do schowka
Zadeklaruj obsługiwane języki i wymagaj jako blokujące tylko te, które są krytyczne dla wydania. Reszta jest uzupełniana asynchronicznie i nie opóźnia wdrożeń.
Całkowite wyniesienie tłumaczeń poza repozytorium
Alternatywnym podejściem jest zadeklarowanie jednego języka w kodzie i zarządzanie pozostałymi zdalnie za pośrednictwem CMS z Live Sync. Zmiany treści nie wymagają wtedy ponownej kompilacji, co oddziela tempo prac edytorskich od cyklu wdrożeń programistycznych.
Skopiuj kod do schowka
Odpowiada to zespołom, w których treścią zajmują się osoby nietechniczne. Jest to kompromis: zyskujesz autonomię edytorską, ale tracisz pewność, że checkout gita w pełni opisuje stan renderowania aplikacji. Szczegóły w dokumentacji CMS.
Pamiętaj, że clientSecret to poświadczenie serwerowe. Powinno znajdować się w sekretach CI i środowisku serwera, nigdy w kodzie klienta.
Rzeczywiste ograniczenia
Wszystko powyżej automatyzuje pokrycie, a nie jakość. Maszynowe uzupełnienie zamienia widoczną lukę w lukę niewidoczną: audyt świeci na zielono, ponieważ klucz ma wartość, ale nikt jej nie przeczytał.
Jest to dopuszczalne w przypadku narzędzi wewnętrznych, changelogów czy języków w wersji beta. Nie jest to akceptowalne dla cenników, tekstów prawnych, komunikatów o błędach płatności ani niczego, co klient czyta przed podjęciem decyzji. Skieruj te teksty do człowieka i używaj --mode complete, aby zweryfikowane ciągi nie zostały nadpisane.
Dostarcz modelowi kontekst, aby jego wyniki były spójne:
Skopiuj kod do schowka
Częste błędy
- Brak
[skip ci]w automatycznym commicie. Zadanie zapętla się bez końca. - Płytki klon z
--git-diff. Brak bazy do porównania skutkuje cichym brakiem działań. - Uzupełnianie całego katalogu przy każdym uruchomieniu. Ograniczaj zakres za pomocą
--git-difflub--unpushed. - Używanie raportu CLI jako bramki. Zwraca kod 0 i nie przerywa buildu.
- Wymaganie każdego języka. Kontrola zostaje wyłączona przy pierwszym zablokowanym wydaniu.
- Zadanie uzupełniania bez żadnej bramki. Nic nie zgłasza błędów, a niesprawdzone teksty trafiają na produkcję.
- Klucze API modeli w repozytorium. Powinny być w sekretach CI, podobnie jak
clientSecret.
Warto przeczytać
- CI/CD: automatyczne generowanie tłumaczeń z Husky, GitHub Actions i CMS
- Testowanie treści i blokowanie buildu na podstawie pokrycia
- autoFill: generowanie plików deklaracji dla poszczególnych języków
- Dokumentacja konfiguracji:
locales,requiredLocales,editor - Raporty porównawcze wydajności między frameworkami
- Adapter kompatybilności i18next
- Jak wykrywać brakujące tłumaczenia
- Jak testować tłumaczenia bez kruchych testów
Komentarze
Nie ma jeszcze komentarzy. Bądź pierwszą osobą, która podzieli się swoimi przemyśleniami.
