From a0c6f95eeafb77597a180d3fdfb33f5278a65ca3 Mon Sep 17 00:00:00 2001 From: Leo Bernard Date: Thu, 19 Mar 2020 16:06:49 +0100 Subject: [PATCH] :sparkles: Improve language detection system --- src/index.ts | 11 +- src/services/deepl.ts | 8 +- src/services/dry-run.ts | 15 +-- src/services/google-translate.ts | 26 +++-- src/services/index.ts | 14 ++- src/services/manual.ts | 9 +- src/util/languages.ts | 186 ------------------------------- 7 files changed, 43 insertions(+), 226 deletions(-) delete mode 100644 src/util/languages.ts diff --git a/src/index.ts b/src/index.ts index 8a5656a..afa7b5b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -130,16 +130,11 @@ const translate = async ( console.log(); console.log(`✨ Initializing ${translationService.name}...`); - translationService.initialize(config, matcherMap[matcher]); - process.stdout.write(chalk`├── Getting available languages `); - const availableLanguages = await translationService.getAvailableLanguages(); - console.log( - chalk`({green.bold ${String(availableLanguages.length)} languages})`, - ); + await translationService.initialize(config, matcherMap[matcher]); console.log(chalk`└── {green.bold Done}`); console.log(); - if (!availableLanguages.includes(sourceLang)) { + if (!translationService.supportsLanguage(sourceLang)) { throw new Error( `${translationService.name} doesn't support the source language ${sourceLang}`, ); @@ -232,7 +227,7 @@ const translate = async ( let removedTranslations = 0; for (const language of targetLanguages) { - if (!availableLanguages.includes(language)) { + if (!translationService.supportsLanguage(language)) { console.log( chalk`🙈 {yellow.bold ${translationService.name} doesn't support} {red.bold ${language}}{yellow.bold . Skipping this language.}`, ); diff --git a/src/services/deepl.ts b/src/services/deepl.ts index b9c8787..571ce9b 100644 --- a/src/services/deepl.ts +++ b/src/services/deepl.ts @@ -14,7 +14,7 @@ export class DeepL implements TranslationService { private apiKey: string; private interpolationMatcher: Matcher; - initialize(config?: string, interpolationMatcher?: Matcher) { + async initialize(config?: string, interpolationMatcher?: Matcher) { if (!config) { throw new Error(`Please provide an API key for DeepL.`); } @@ -23,8 +23,10 @@ export class DeepL implements TranslationService { this.apiKey = config; } - async getAvailableLanguages() { - return ['en', 'de', 'fr', 'es', 'pt', 'it', 'nl', 'pl', 'ru']; + supportsLanguage(language: string) { + return ['en', 'de', 'fr', 'es', 'pt', 'it', 'nl', 'pl', 'ru'].includes( + language, + ); } async translateStrings( diff --git a/src/services/dry-run.ts b/src/services/dry-run.ts index 8e31973..0dff952 100644 --- a/src/services/dry-run.ts +++ b/src/services/dry-run.ts @@ -1,21 +1,16 @@ -import { TranslationService } from '.'; -import languages from '../util/languages'; +import { TranslationService, TString } from '.'; import chalk from 'chalk'; export class DryRun implements TranslationService { public name = 'Dry Run'; - initialize() {} + async initialize() {} - async getAvailableLanguages() { - return languages; + supportsLanguage() { + return true; } - async translateStrings( - strings: { key: string; value: string }[], - from: string, - to: string, - ) { + async translateStrings(strings: TString[]) { console.log(); if (strings.length > 0) { diff --git a/src/services/google-translate.ts b/src/services/google-translate.ts index d1bd929..c03d76b 100644 --- a/src/services/google-translate.ts +++ b/src/services/google-translate.ts @@ -4,11 +4,12 @@ import { reInsertInterpolations, Matcher, } from '../matchers'; -import { TranslationService } from '.'; +import { TranslationService, TString } from '.'; export class GoogleTranslate implements TranslationService { private translate: Translate; private interpolationMatcher: Matcher; + private supportedLanguages: string[] = []; public name = 'Google Translate'; @@ -19,13 +20,14 @@ export class GoogleTranslate implements TranslationService { ); } - initialize(config?: string, interpolationMatcher?: Matcher) { + async initialize(config?: string, interpolationMatcher?: Matcher) { this.translate = new Translate({ autoRetry: true, keyFilename: config || undefined, }); this.interpolationMatcher = interpolationMatcher; + this.supportedLanguages = await this.getAvailableLanguages(); } async getAvailableLanguages() { @@ -33,11 +35,11 @@ export class GoogleTranslate implements TranslationService { return languages.map(l => l.code.toLowerCase()); } - async translateStrings( - strings: { key: string; value: string }[], - from: string, - to: string, - ) { + supportsLanguage(language: string) { + return this.supportedLanguages.includes(language); + } + + async translateStrings(strings: TString[], from: string, to: string) { return Promise.all( strings.map(async ({ key, value }) => { const { clean, replacements } = replaceInterpolations( @@ -45,10 +47,12 @@ export class GoogleTranslate implements TranslationService { this.interpolationMatcher, ); - const translationResult = (await this.translate.translate(clean, { - from, - to, - }))[0]; + const translationResult = ( + await this.translate.translate(clean, { + from, + to, + }) + )[0]; return { key: key, diff --git a/src/services/index.ts b/src/services/index.ts index fd4cb70..0ebfbce 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -9,12 +9,20 @@ export interface TranslationResult { value: string; translated: string; } + +export interface TString { + key: string; + value: string; +} export interface TranslationService { name: string; - initialize: (config?: string, interpolationMatcher?: Matcher) => void; - getAvailableLanguages: () => Promise; + initialize: ( + config?: string, + interpolationMatcher?: Matcher, + ) => Promise; + supportsLanguage: (language: string) => boolean; translateStrings: ( - strings: { key: string; value: string }[], + strings: TString[], from: string, to: string, ) => Promise; diff --git a/src/services/manual.ts b/src/services/manual.ts index a71c34e..52427d1 100644 --- a/src/services/manual.ts +++ b/src/services/manual.ts @@ -4,19 +4,18 @@ import { reInsertInterpolations, Matcher, } from '../matchers'; -import languages from '../util/languages'; import { TranslationService } from '.'; export class ManualTranslation implements TranslationService { private interpolationMatcher: Matcher; public name = 'Manual Translation'; - initialize(config?, interpolationMatcher?: Matcher) { + async initialize(config?, interpolationMatcher?: Matcher) { this.interpolationMatcher = interpolationMatcher; } - async getAvailableLanguages() { - return languages; + supportsLanguage() { + return true; } async translateStrings( @@ -45,7 +44,7 @@ export class ManualTranslation implements TranslationService { name: 'result', message: `[${from} -> ${to}] ${ key !== value ? `(${key}) ` : '' - }${value}:`, + }"${value}":`, }, ]); diff --git a/src/util/languages.ts b/src/util/languages.ts deleted file mode 100644 index b149ac2..0000000 --- a/src/util/languages.ts +++ /dev/null @@ -1,186 +0,0 @@ -export default [ - 'aa', - 'ab', - 'ae', - 'af', - 'ak', - 'am', - 'an', - 'ar', - 'as', - 'av', - 'ay', - 'az', - 'ba', - 'be', - 'bg', - 'bh', - 'bi', - 'bm', - 'bn', - 'bo', - 'br', - 'bs', - 'ca', - 'ce', - 'ch', - 'co', - 'cr', - 'cs', - 'cu', - 'cv', - 'cy', - 'da', - 'de', - 'dv', - 'dz', - 'ee', - 'el', - 'en', - 'eo', - 'es', - 'et', - 'eu', - 'fa', - 'ff', - 'fi', - 'fj', - 'fo', - 'fr', - 'fy', - 'ga', - 'gd', - 'gl', - 'gn', - 'gu', - 'gv', - 'ha', - 'he', - 'hi', - 'ho', - 'hr', - 'ht', - 'hu', - 'hy', - 'hz', - 'ia', - 'id', - 'ie', - 'ig', - 'ii', - 'ik', - 'io', - 'is', - 'it', - 'iu', - 'ja', - 'jv', - 'ka', - 'kg', - 'ki', - 'kj', - 'kk', - 'kl', - 'km', - 'kn', - 'ko', - 'kr', - 'ks', - 'ku', - 'kv', - 'kw', - 'ky', - 'la', - 'lb', - 'lg', - 'li', - 'ln', - 'lo', - 'lt', - 'lu', - 'lv', - 'mg', - 'mh', - 'mi', - 'mk', - 'ml', - 'mn', - 'mr', - 'ms', - 'mt', - 'my', - 'na', - 'nb', - 'nd', - 'ne', - 'ng', - 'nl', - 'nn', - 'no', - 'nr', - 'nv', - 'ny', - 'oc', - 'oj', - 'om', - 'or', - 'os', - 'pa', - 'pi', - 'pl', - 'ps', - 'pt', - 'qu', - 'rm', - 'rn', - 'ro', - 'ru', - 'rw', - 'sa', - 'sc', - 'sd', - 'se', - 'sg', - 'si', - 'sk', - 'sl', - 'sm', - 'sn', - 'so', - 'sq', - 'sr', - 'ss', - 'st', - 'su', - 'sv', - 'sw', - 'ta', - 'te', - 'tg', - 'th', - 'ti', - 'tk', - 'tl', - 'tn', - 'to', - 'tr', - 'ts', - 'tt', - 'tw', - 'ty', - 'ug', - 'uk', - 'ur', - 'uz', - 've', - 'vi', - 'vo', - 'wa', - 'wo', - 'xh', - 'yi', - 'yo', - 'za', - 'zh', - 'zu', -];