Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement automatic translation updates #11437

Merged
merged 4 commits into from
Jul 26, 2022
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions .github/workflows/translation.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
name: Automatic Translation

on: push

jobs:
translation:
name: Translation Update
runs-on: ubuntu-latest
timeout-minutes: 60

steps:
- name: Checkout
uses: actions/checkout@v3

- name: Use Node.js 16.x
uses: actions/setup-node@v1
with:
node-version: 16.x
registry-url: "https://registry.npmjs.org"

- name: Use Python 3.x
uses: actions/setup-python@v2
with:
python-version: "3.x"

- name: Install and Build
shell: bash
run: |
yarn --skip-integrity-check --network-timeout 100000
env:
NODE_OPTIONS: --max_old_space_size=4096
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # https://github.com/microsoft/vscode-ripgrep/issues/9

- name: Perform Automatic Translation
run: |
node ./scripts/translation-update.js
env:
DEEPL_API_TOKEN: ${{ secrets.DEEPL_API_TOKEN }}
14 changes: 12 additions & 2 deletions dev-packages/localization-manager/src/localization-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,10 +92,12 @@ export class LocalizationManager {
free_api: options.freeApi,
target_lang: targetLanguage.toUpperCase() as DeeplLanguage,
source_lang: options.sourceLanguage?.toUpperCase() as DeeplLanguage,
text: map.text
text: map.text.map(e => this.addIgnoreTags(e)),
tag_handling: ['xml'],
ignore_tags: ['x']
});
translationResponse.translations.forEach(({ text }, i) => {
map.localize(i, text);
map.localize(i, this.removeIgnoreTags(text));
});
console.log(chalk.green(`Successfully translated ${map.text.length} value${map.text.length > 1 ? 's' : ''} for language "${targetLanguage}"`));
} catch (e) {
Expand All @@ -106,6 +108,14 @@ export class LocalizationManager {
}
}

protected addIgnoreTags(text: string): string {
return text.replace(/\{\d*\}/g, match => '<x>' + match + '</x>');
msujew marked this conversation as resolved.
Show resolved Hide resolved
}

protected removeIgnoreTags(text: string): string {
return text.replace(/<x>(\{\d+\})<\/x>/g, (_, group) => group);
msujew marked this conversation as resolved.
Show resolved Hide resolved
}

protected buildLocalizationMap(source: Localization, target: Localization): LocalizationMap {
const functionMap = new Map<number, (value: string) => void>();
const text: string[] = [];
Expand Down
34 changes: 32 additions & 2 deletions packages/core/i18n/nls.cs.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{
"disassemblyView": "Pohled na demontáž",
"theia": {
"callhierarchy": {
"noCallers": "Nebyl zjištěn žádný volající.",
Expand Down Expand Up @@ -58,18 +59,31 @@
"addConfigurationPlaceholder": "Vyberte kořenový pracovní prostor, do kterého chcete přidat konfiguraci",
"continueAll": "Pokračovat ve všem",
"copyExpressionValue": "Kopírování hodnoty výrazu",
"disassembly-view": {
"show-source-code": "Zobrazení zdrojového kódu v zobrazení disassembleru."
},
"instruction-breakpoint": "Bod přerušení instrukcí",
"instructionAddress": "Adresa",
"instructionBytes": "Byty",
"instructionNotAvailable": "Demontáž není k dispozici.",
"instructionText": "Pokyny",
"missingConfiguration": "Dynamická konfigurace '{0}:{1}' chybí nebo není použitelná",
"open-disassembly-view": "Otevřený pohled na demontáž",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know any Czech, but this differs quite substantially from the corresponding VSCode translation:
image

Might it be possible to do a nls.json update so that we can use checked translations where available before we implement this?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We wouldn't do the nls.metadata.json update in this repo (as that would break translation in an unexpected fashion), but probably somewhere else where we can simply download the file from. I generally agree with your idea and we can likely implement this in the translation-update.js script. However, would it be alright with you to tackle this in a separate PR/issue? I believe it'd be quite a lot of work and a bit outside of the scope of this PR.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I created an issue here: #11443

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds reasonable 👍

"pauseAll": "Pozastavit vše",
"reveal": "Odhalení",
"threads": "Vlákna",
"toggleTracing": "Povolení/zakázání sledování komunikace s ladicími adaptéry"
},
"disassembly-view": {
"disassemblyTableColumnLabel": "pokyny"
},
"editor": {
"diffEditor.maxFileSize": "Maximální velikost souboru v MB, pro kterou se vypočítávají rozdíly. Použijte hodnotu 0 pro žádný limit.",
"editor.accessibilityPageSize": "Řídí počet řádků v editoru, které může čtečka obrazovky přečíst najednou. Při detekci čtečky obrazovky automaticky nastavíme výchozí hodnotu na 500. Upozornění: Pro čísla větší než výchozí to má vliv na výkon.",
"editor.autoClosingDelete": "Řídí, zda má editor při mazání odstranit sousední uzavírací uvozovky nebo závorky.",
"editor.autoClosingDelete1": "Odstraňte sousední uzavírací uvozovky nebo závorky pouze v případě, že byly vloženy automaticky.",
"editor.bracketPairColorization.enabled": "Ovládá, zda je obarvení dvojice závorek povoleno, nebo ne. Pro přepsání barev zvýraznění závorek použijte 'workbench.colorCustomizations'.",
"editor.bracketPairColorization.independentColorPoolPerBracketType": "Řídí, zda má každý typ závorky svůj vlastní nezávislý fond barev.",
"editor.codeLensFontSize": "Ovládá velikost písma v pixelech pro CodeLens. Při nastavení na `0` se použije 90 % hodnoty `#editor.fontSize#`.",
"editor.find.autoFindInSelection0": "Nikdy automaticky nezapínat funkci Najít ve výběru (výchozí nastavení).",
"editor.find.autoFindInSelection1": "Vždy automaticky zapněte funkci Najít ve výběru.",
Expand All @@ -88,13 +102,23 @@
"editor.guides.bracketPairsHorizontal1": "Povolí vodorovná vodítka pouze pro aktivní pár držáků.",
"editor.guides.bracketPairsHorizontal2": "Zakáže vodítka vodorovných dvojic konzol.",
"editor.guides.highlightActiveBracketPair": "Řídí, zda má editor zvýraznit aktivní dvojici závorek.",
"editor.guides.highlightActiveIndentation0": "Zvýrazní aktivního průvodce odsazením.",
"editor.guides.highlightActiveIndentation1": "Zvýrazní aktivní vodítko odsazení, i když jsou zvýrazněna vodítka závorek.",
"editor.guides.highlightActiveIndentation2": "Nezvýrazňujte aktivního průvodce odsazením.",
"editor.hover.above": "Pokud je místo, raději se zobrazí nad řádkem.",
"editor.inlayHints.enabled": "Povolí v editoru nápovědy pro vložení.",
"editor.inlayHints.enabled0": "Nápovědy pro vložení jsou povoleny",
"editor.inlayHints.enabled1": "Vložené nápovědy se zobrazují ve výchozím nastavení a skrývají se při podržení `Ctrl+Alt`",
"editor.inlayHints.enabled2": "Vložené nápovědy jsou ve výchozím nastavení skryté a zobrazí se při podržení `Ctrl+Alt`.",
"editor.inlayHints.enabled3": "Nápovědy pro vložení jsou zakázány",
"editor.inlayHints.fontFamily": "Řídí rodinu písma vložených nápověd v editoru. Je-li nastaveno na prázdnou hodnotu, použije se `#editor.fontFamily#`.",
"editor.inlayHints.fontSize": "Ovládá velikost písma vložených nápověd v editoru. Pokud je nakonfigurovaná hodnota menší než `5` nebo větší než velikost písma editoru, použije se výchozí hodnota 90 % z `#editor.fontSize#`.",
"editor.inlineSuggest.enabled": "Ovládá, zda se mají v editoru automaticky zobrazovat návrhy na řádkování.",
"editor.language.colorizedBracketPairs": "Definuje dvojice závorek, které jsou obarveny podle úrovně vnoření, pokud je obarvení dvojic závorek povoleno.",
"editor.lineHeight": "Ovládá výšku čáry.\n - Chcete-li automaticky vypočítat výšku řádku z velikosti písma, použijte hodnotu 0.\n - Hodnoty mezi 0 a 8 se použijí jako násobitel s velikostí písma.\n - Hodnoty větší nebo rovné 8 budou použity jako efektivní hodnoty.",
"editor.quickSuggestions0": "Rychlé návrhy se zobrazují uvnitř widgetu pro navrhování",
"editor.quickSuggestions1": "Rychlé návrhy se zobrazují jako text duchů",
"editor.quickSuggestions2": "Rychlé návrhy jsou zakázány",
"editor.renderLineHighlightOnlyWhenFocus": "Řídí, zda má editor vykreslovat zvýraznění aktuálního řádku pouze tehdy, když je editor zaměřen.",
"editor.renderWhitespace3": "Vykresluje pouze koncové bílé znaky.",
"editor.scrollbar.horizontal": "Ovládá viditelnost vodorovného posuvníku.",
Expand Down Expand Up @@ -170,6 +194,7 @@
"newPlugin": "Vytvoření nového pluginu"
},
"git": {
"aFewSecondsAgo": "před několika sekundami",
"addSignedOff": "Přidat Signed-off-by",
"amendReuseMessag": "Chcete-li znovu použít poslední zprávu o revizi, stiskněte klávesu \"Enter\" nebo klávesu \"Escape\" pro zrušení.",
"amendRewrite": "Přepsání předchozí zprávy o revizi. Stisknutím klávesy 'Enter' potvrdíte nebo klávesou 'Escape' zrušíte.",
Expand Down Expand Up @@ -203,7 +228,8 @@
"keybindingCollidesValidation": "vazba kláves v současné době koliduje",
"requiredKeybindingValidation": "je vyžadována hodnota keybindingu",
"resetKeybindingConfirmation": "Opravdu chcete obnovit výchozí hodnotu této vazby kláves?",
"resetKeybindingTitle": "Obnovení vazby kláves pro {0}"
"resetKeybindingTitle": "Obnovení vazby kláves pro {0}",
"resetMultipleKeybindingsWarning": "Pokud pro tento příkaz existuje více klávesových vazeb, budou resetovány všechny."
},
"localize": {
"offlineTooltip": "Nelze se připojit k backendu."
Expand Down Expand Up @@ -357,7 +383,11 @@
"openVSX": "Otevření registru VSX",
"recommendedExtensions": "Seznam názvů rozšíření doporučených pro použití v tomto pracovním prostoru.",
"searchPlaceholder": "Hledat rozšíření v {0}",
"showRecommendedExtensions": "Řídí, zda se mají zobrazovat oznámení pro doporučení rozšíření."
"showRecommendedExtensions": "Řídí, zda se mají zobrazovat oznámení pro doporučení rozšíření.",
"vsx-extensions-contribution": {
"update-version-uninstall-error": "Chyba při odstraňování rozšíření: {0}.",
"update-version-version-error": "Nepodařilo se nainstalovat verzi {0} {1} ."
}
},
"webview": {
"goToReadme": "Přejít na README",
Expand Down
34 changes: 32 additions & 2 deletions packages/core/i18n/nls.de.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{
"disassemblyView": "Demontage Ansicht",
"theia": {
"callhierarchy": {
"noCallers": "Es wurden keine Anrufer entdeckt.",
Expand Down Expand Up @@ -58,18 +59,31 @@
"addConfigurationPlaceholder": "Wählen Sie das Stammverzeichnis des Arbeitsbereichs, dem Sie die Konfiguration hinzufügen möchten",
"continueAll": "Alle fortsetzen",
"copyExpressionValue": "Ausdruckswert kopieren",
"disassembly-view": {
"show-source-code": "Quellcode in der Disassemblierungsansicht anzeigen."
},
"instruction-breakpoint": "Anweisung Haltepunkt",
"instructionAddress": "Adresse",
"instructionBytes": "Bytes",
"instructionNotAvailable": "Demontage nicht möglich.",
"instructionText": "Anleitung",
"missingConfiguration": "Die dynamische Konfiguration '{0}:{1}' fehlt oder ist nicht anwendbar",
"open-disassembly-view": "Demontageansicht öffnen",
"pauseAll": "Pause Alle",
"reveal": "Enthüllen",
"threads": "Threads",
"toggleTracing": "Aktivieren/Deaktivieren der Verfolgung der Kommunikation mit Debug-Adaptern"
},
"disassembly-view": {
"disassemblyTableColumnLabel": "Anweisungen"
},
"editor": {
"diffEditor.maxFileSize": "Maximale Dateigröße in MB, für die Diffs berechnet werden sollen. Verwenden Sie 0 für keine Begrenzung.",
"editor.accessibilityPageSize": "Steuert die Anzahl der Zeilen im Editor, die von einem Screenreader auf einmal vorgelesen werden können. Wenn wir einen Screenreader erkennen, setzen wir automatisch den Standardwert auf 500. Achtung: Dies hat Auswirkungen auf die Leistung, wenn die Zahl größer als der Standardwert ist.",
"editor.autoClosingDelete": "Steuert, ob der Editor beim Löschen angrenzende schließende Anführungszeichen oder Klammern entfernen soll.",
"editor.autoClosingDelete1": "Entfernen Sie angrenzende schließende Anführungszeichen oder Klammern nur, wenn sie automatisch eingefügt wurden.",
"editor.bracketPairColorization.enabled": "Steuert, ob die Einfärbung von Klammerpaaren aktiviert ist oder nicht. Verwenden Sie 'workbench.colorCustomizations', um die Farben der Klammerhervorhebung zu überschreiben.",
"editor.bracketPairColorization.independentColorPoolPerBracketType": "Steuert, ob jeder Klammertyp seinen eigenen unabhängigen Farbpool hat.",
"editor.codeLensFontSize": "Steuert die Schriftgröße in Pixeln für CodeLens. Bei Einstellung `0` werden 90% von `#editor.fontSize#` verwendet.",
"editor.find.autoFindInSelection0": "Niemals die automatische Suche in der Auswahl aktivieren (Standard).",
"editor.find.autoFindInSelection1": "Schalten Sie \"In Auswahl suchen\" immer automatisch ein.",
Expand All @@ -88,13 +102,23 @@
"editor.guides.bracketPairsHorizontal1": "Aktiviert horizontale Hilfslinien nur für das aktive Halterungspaar.",
"editor.guides.bracketPairsHorizontal2": "Deaktiviert die horizontalen Klammerpaarführungen.",
"editor.guides.highlightActiveBracketPair": "Steuert, ob der Editor das aktive Klammerpaar hervorheben soll.",
"editor.guides.highlightActiveIndentation0": "Hebt die aktive Einzugshilfe hervor.",
"editor.guides.highlightActiveIndentation1": "Hebt die aktive Einzugshilfe hervor, auch wenn Klammerhilfen hervorgehoben sind.",
"editor.guides.highlightActiveIndentation2": "Markieren Sie nicht die aktive Einzugsschablone.",
"editor.hover.above": "Bevorzugen Sie es, über der Linie zu schweben, wenn Platz vorhanden ist.",
"editor.inlayHints.enabled": "Aktiviert die Inlay-Hinweise im Editor.",
"editor.inlayHints.enabled0": "Inlay-Hinweise sind aktiviert",
"editor.inlayHints.enabled1": "Inlay-Hinweise werden standardmäßig angezeigt und bei gedrückter Tastenkombination \"Strg+Alt\" ausgeblendet",
"editor.inlayHints.enabled2": "Inlay-Hinweise sind standardmäßig ausgeblendet und werden angezeigt, wenn die Tastenkombination \"Strg+Alt\" gedrückt wird.",
"editor.inlayHints.enabled3": "Inlay-Hinweise sind deaktiviert",
"editor.inlayHints.fontFamily": "Steuert die Schriftfamilie der Inlay-Hinweise im Editor. Wenn leer, wird die `#editor.fontFamily#` verwendet.",
"editor.inlayHints.fontSize": "Steuert die Schriftgröße von Inlay-Hinweisen im Editor. Eine Vorgabe von 90% von `#editor.fontSize#` wird verwendet, wenn der konfigurierte Wert kleiner als `5` oder größer als die Schriftgröße des Editors ist.",
"editor.inlineSuggest.enabled": "Legt fest, ob automatisch Inline-Vorschläge im Editor angezeigt werden sollen.",
"editor.language.colorizedBracketPairs": "Definiert die Klammerpaare, die nach ihrer Verschachtelungsebene eingefärbt werden, wenn die Einfärbung von Klammerpaaren aktiviert ist.",
"editor.lineHeight": "Steuert die Zeilenhöhe.\n - Verwenden Sie 0, um die Zeilenhöhe automatisch anhand der Schriftgröße zu berechnen.\n - Werte zwischen 0 und 8 werden als Multiplikator mit der Schriftgröße verwendet.\n - Werte, die größer oder gleich 8 sind, werden als effektive Werte verwendet.",
"editor.quickSuggestions0": "Schnellvorschläge werden innerhalb des Vorschlags-Widgets angezeigt",
"editor.quickSuggestions1": "Schnellvorschläge werden als Geistertext angezeigt",
"editor.quickSuggestions2": "Schnellvorschläge sind deaktiviert",
"editor.renderLineHighlightOnlyWhenFocus": "Steuert, ob der Editor die aktuelle Zeile nur dann hervorheben soll, wenn der Editor fokussiert ist.",
"editor.renderWhitespace3": "Nur nachgestellte Leerzeichen werden wiedergegeben.",
"editor.scrollbar.horizontal": "Steuert die Sichtbarkeit der horizontalen Bildlaufleiste.",
Expand Down Expand Up @@ -170,6 +194,7 @@
"newPlugin": "Ein neues Plugin erstellen"
},
"git": {
"aFewSecondsAgo": "vor ein paar Sekunden",
"addSignedOff": "Abgezeichnet von hinzufügen",
"amendReuseMessag": "Um die letzte Meldung wieder zu verwenden, drücken Sie \"Enter\" oder \"Escape\", um den Vorgang abzubrechen.",
"amendRewrite": "Vorherige Übermittlungsnachricht neu schreiben. Bestätigen Sie mit \"Enter\" oder brechen Sie mit \"Escape\" ab.",
Expand Down Expand Up @@ -203,7 +228,8 @@
"keybindingCollidesValidation": "Tastenkombinationen kollidieren",
"requiredKeybindingValidation": "Schlüsselbindung Wert ist erforderlich",
"resetKeybindingConfirmation": "Möchten Sie diese Tastaturbelegung wirklich auf den Standardwert zurücksetzen?",
"resetKeybindingTitle": "Tastaturbelegung für {0} zurücksetzen"
"resetKeybindingTitle": "Tastaturbelegung für {0} zurücksetzen",
"resetMultipleKeybindingsWarning": "Wenn mehrere Tastenkombinationen für diesen Befehl existieren, werden alle zurückgesetzt."
},
"localize": {
"offlineTooltip": "Kann keine Verbindung zum Backend herstellen."
Expand Down Expand Up @@ -357,7 +383,11 @@
"openVSX": "Open VSX Registry",
"recommendedExtensions": "Eine Liste mit den Namen der Erweiterungen, die für die Verwendung in diesem Arbeitsbereich empfohlen werden.",
"searchPlaceholder": "Erweiterungen suchen in {0}",
"showRecommendedExtensions": "Steuert, ob Benachrichtigungen für Erweiterungsempfehlungen angezeigt werden."
"showRecommendedExtensions": "Steuert, ob Benachrichtigungen für Erweiterungsempfehlungen angezeigt werden.",
"vsx-extensions-contribution": {
"update-version-uninstall-error": "Fehler beim Entfernen der Erweiterung: {0}.",
"update-version-version-error": "Die Installation der Version {0} von {1} ist fehlgeschlagen."
}
},
"webview": {
"goToReadme": "Zum README gehen",
Expand Down
Loading