Skip to content

Commit

Permalink
🔧 Make TypeScript more strict and fix issues caused by this
Browse files Browse the repository at this point in the history
leolabs committed Dec 27, 2024
1 parent 4747a36 commit 6d6802c
Showing 6 changed files with 134 additions and 103 deletions.
170 changes: 92 additions & 78 deletions src/services/amazon-translate.ts
Original file line number Diff line number Diff line change
@@ -2,90 +2,93 @@ import { Translate } from '@aws-sdk/client-translate';
import { decode } from 'html-entities';
import { TranslationService, TString } from '.';
import {
Matcher, reInsertInterpolations, replaceInterpolations
Matcher,
reInsertInterpolations,
replaceInterpolations,
} from '../matchers';
import fs from 'fs';
export class AmazonTranslate implements TranslationService {
private translate: Translate;
private interpolationMatcher: Matcher;
private supportedLanguages: object = {
'af': 'af',
'sq': 'sq',
'am': 'am',
'ar': 'ar',
'hy': 'hy',
'az': 'az',
'bn': 'bn',
'bs': 'bs',
'bg': 'bg',
'ca': 'ca',
'zh': 'zh',
private translate?: Translate;
private interpolationMatcher?: Matcher;
private decodeEscapes?: boolean;

private supportedLanguages = {
af: 'af',
sq: 'sq',
am: 'am',
ar: 'ar',
hy: 'hy',
az: 'az',
bn: 'bn',
bs: 'bs',
bg: 'bg',
ca: 'ca',
zh: 'zh',
'zh-tw': 'zh-TW',
'hr': 'hr',
'cs': 'cs',
'da': 'da',
hr: 'hr',
cs: 'cs',
da: 'da',
'fa-af': 'fa-AF',
'nl': 'nl',
'en': 'en',
'et': 'et',
'fa': 'fa',
'tl': 'tl',
'fi': 'fi',
'fr': 'fr',
nl: 'nl',
en: 'en',
et: 'et',
fa: 'fa',
tl: 'tl',
fi: 'fi',
fr: 'fr',
'fr-ca': 'fr-CA',
'ka': 'ka',
'de': 'de',
'el': 'el',
'gu': 'gu',
'ht': 'ht',
'ha': 'ha',
'he': 'he',
'hi': 'hi',
'hu': 'hu',
'is': 'is',
'id': 'id',
'ga': 'ga',
'it': 'it',
'ja': 'ja',
'kn': 'kn',
'kk': 'kk',
'ko': 'ko',
'lv': 'lv',
'lt': 'lt',
'mk': 'mk',
'ms': 'ms',
'ml': 'ml',
'mt': 'mt',
'mr': 'mr',
'mn': 'mn',
'no': 'no',
'ps': 'ps',
'pl': 'pl',
'pt': 'pt',
ka: 'ka',
de: 'de',
el: 'el',
gu: 'gu',
ht: 'ht',
ha: 'ha',
he: 'he',
hi: 'hi',
hu: 'hu',
is: 'is',
id: 'id',
ga: 'ga',
it: 'it',
ja: 'ja',
kn: 'kn',
kk: 'kk',
ko: 'ko',
lv: 'lv',
lt: 'lt',
mk: 'mk',
ms: 'ms',
ml: 'ml',
mt: 'mt',
mr: 'mr',
mn: 'mn',
no: 'no',
ps: 'ps',
pl: 'pl',
pt: 'pt',
'pt-pt': 'pt-PT',
'pa': 'pa',
'ro': 'ro',
'ru': 'ru',
'sr': 'sr',
'si': 'si',
'sk': 'sk',
'sl': 'sl',
'so': 'so',
'es': 'es',
pa: 'pa',
ro: 'ro',
ru: 'ru',
sr: 'sr',
si: 'si',
sk: 'sk',
sl: 'sl',
so: 'so',
es: 'es',
'es-mx': 'es-MX',
'sw': 'sw',
'sv': 'sv',
'ta': 'ta',
'te': 'te',
'th': 'th',
'tr': 'tr',
'uk': 'uk',
'ur': 'ur',
'uz': 'uz',
'vi': 'vi',
'cy': 'cy',
sw: 'sw',
sv: 'sv',
ta: 'ta',
te: 'te',
th: 'th',
tr: 'tr',
uk: 'uk',
ur: 'ur',
uz: 'uz',
vi: 'vi',
cy: 'cy',
};
private decodeEscapes: boolean;

public name = 'Amazon Translate';

@@ -94,15 +97,19 @@ export class AmazonTranslate implements TranslationService {
interpolationMatcher?: Matcher,
decodeEscapes?: boolean,
) {
const configJson = config ? JSON.parse(fs.readFileSync(config).toString()) : {};
const configJson = config
? JSON.parse(fs.readFileSync(config).toString())
: {};
this.translate = new Translate(configJson);

this.interpolationMatcher = interpolationMatcher;
this.decodeEscapes = decodeEscapes;
}

supportsLanguage(language: string) {
return Object.keys(this.supportedLanguages).includes(language.toLowerCase());
return Object.keys(this.supportedLanguages).includes(
language.toLowerCase(),
);
}

async translateStrings(strings: TString[], from: string, to: string) {
@@ -113,13 +120,20 @@ export class AmazonTranslate implements TranslationService {
this.interpolationMatcher,
);

if (!this.translate) {
throw new Error('Translate API not initialized');
}

const { TranslatedText } = await this.translate.translateText({
Text: clean,
SourceLanguageCode: this.supportedLanguages[from.toLowerCase()],
TargetLanguageCode: this.supportedLanguages[to.toLowerCase()],
});

const reInsterted = reInsertInterpolations(TranslatedText, replacements);
const reInsterted = reInsertInterpolations(
TranslatedText ?? '',
replacements,
);

return {
key: key,
16 changes: 10 additions & 6 deletions src/services/azure-translator.ts
Original file line number Diff line number Diff line change
@@ -35,18 +35,18 @@ const TRANSLATE_ENDPOINT =

export class AzureTranslator implements TranslationService {
public name = 'Azure';
private apiKey: string;
private apiKey?: string;
private region?: string;
private interpolationMatcher: Matcher;
private supportedLanguages: Set<string>;
private decodeEscapes: boolean;
private interpolationMatcher?: Matcher;
private supportedLanguages?: Set<string>;
private decodeEscapes?: boolean;

async initialize(
config?: string,
interpolationMatcher?: Matcher,
decodeEscapes?: boolean,
) {
const [apiKey, region] = config.split(',');
const [apiKey, region] = config?.split(',') ?? [];
if (!apiKey) throw new Error(`Please provide an API key for Azure.`);

this.apiKey = apiKey;
@@ -70,7 +70,7 @@ export class AzureTranslator implements TranslationService {
}

supportsLanguage(language: string) {
return this.supportedLanguages.has(language.toLowerCase());
return !!this.supportedLanguages?.has(language.toLowerCase());
}

async translateBatch(batch: TString[], from: string, to: string) {
@@ -83,6 +83,10 @@ export class AzureTranslator implements TranslationService {
return { key, value, clean, replacements };
});

if (!this.apiKey) {
throw new Error('Missing API Key');
}

const headers = {
'Ocp-Apim-Subscription-Key': this.apiKey,
'Content-Type': 'application/json; charset=UTF-8',
31 changes: 18 additions & 13 deletions src/services/deepl.ts
Original file line number Diff line number Diff line change
@@ -13,20 +13,20 @@ import {
export class DeepL implements TranslationService {
public name: string;
private apiEndpoint: string;
private glossariesDir: string | undefined;
private automaticGlossary: boolean;
private appName: string;
private context: string;
private apiKey: string;
private glossariesDir?: string;
private automaticGlossary?: boolean;
private appName?: string;
private context?: string;
private apiKey?: string;
/**
* Number to tokens to translate at once
*/
private batchSize: number = 1000;
private supportedLanguages: Set<string>;
private formalityLanguages: Set<string>;
private interpolationMatcher: Matcher;
private decodeEscapes: boolean;
private formality: 'default' | 'less' | 'more';
private batchSize = 1000;
private supportedLanguages?: Set<string>;
private formalityLanguages?: Set<string>;
private interpolationMatcher?: Matcher;
private decodeEscapes?: boolean;
private formality?: 'default' | 'less' | 'more';

/**
* Creates a new instance of the DeepL translation service
@@ -71,6 +71,10 @@ export class DeepL implements TranslationService {
}

async fetchLanguages() {
if (!this.apiKey) {
throw new Error('Missing API key');
}

const url = new URL(`${this.apiEndpoint}/languages`);
url.searchParams.append('auth_key', this.apiKey);
url.searchParams.append('type', 'target');
@@ -86,6 +90,7 @@ export class DeepL implements TranslationService {
name: string;
supports_formality: boolean;
}> = await response.json();

return languages;
}

@@ -117,11 +122,11 @@ export class DeepL implements TranslationService {
}

supportsLanguage(language: string) {
return this.supportedLanguages.has(language.toLowerCase());
return !!this.supportedLanguages?.has(language.toLowerCase());
}

supportsFormality(language: string) {
return this.formalityLanguages.has(language.toLowerCase());
return !!this.formalityLanguages?.has(language.toLowerCase());
}

async translateStrings(
15 changes: 11 additions & 4 deletions src/services/google-translate.ts
Original file line number Diff line number Diff line change
@@ -14,10 +14,10 @@ const codeMap = {
};

export class GoogleTranslate implements TranslationService {
private translate: v2.Translate;
private interpolationMatcher: Matcher;
private translate?: v2.Translate;
private interpolationMatcher?: Matcher;
private supportedLanguages: string[] = [];
private decodeEscapes: boolean;
private decodeEscapes?: boolean;

public name = 'Google Translate';

@@ -45,8 +45,11 @@ export class GoogleTranslate implements TranslationService {
}

async getAvailableLanguages() {
if (!this.translate) {
throw new Error("Google Translate hasn't been initialized yet.");
}

const [languages] = await this.translate.getLanguages();
console.log(languages);
return languages.map((l) => l.code.toLowerCase());
}

@@ -67,6 +70,10 @@ export class GoogleTranslate implements TranslationService {
async translateStrings(strings: TString[], from: string, to: string) {
return Promise.all(
strings.map(async ({ key, value }) => {
if (!this.translate) {
throw new Error("Google Translate hasn't been initialized yet.");
}

const { clean, replacements } = replaceInterpolations(
value,
this.interpolationMatcher,
2 changes: 1 addition & 1 deletion src/services/manual.ts
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@ import {
import { TranslationService } from '.';

export class ManualTranslation implements TranslationService {
private interpolationMatcher: Matcher;
private interpolationMatcher?: Matcher;
public name = 'Manual Translation';

async initialize(config?, interpolationMatcher?: Matcher) {
3 changes: 2 additions & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
@@ -6,8 +6,9 @@
"resolveJsonModule": true,
"lib": ["esnext", "DOM"],
"outDir": "./lib",
"strict": false,
"strict": true,
"noImplicitAny": false,
"skipLibCheck": true,
"target": "ESNext"
},
"files": ["src/index.ts"]

0 comments on commit 6d6802c

Please sign in to comment.