Skip to content

Commit e775647

Browse files
hive-botclaude
andcommitted
feat: accept any language code string in the language parameters
The language parameters of translateText(), translateDocument(), uploadDocument(), createGlossary() and createGlossaryWithCsv() now use the new SourceLanguageCodeInput, TargetLanguageCodeInput and LanguageCodeInput types, which accept any string while keeping autocompletion for the listed codes. Result types are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent d5115c8 commit e775647

6 files changed

Lines changed: 57 additions & 19 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6767
- Target languages `en` and `pt` are no longer rejected client-side as deprecated;
6868
the DeepL API translates them as `en-US` and `pt-PT`. `TargetLanguageCode` now
6969
includes `en` and `pt`.
70+
- The language parameters of `translateText()`, `translateDocument()`,
71+
`uploadDocument()`, `createGlossary()` and `createGlossaryWithCsv()` accept
72+
any language code string, so languages the API adds can be used without a new
73+
release of this package. They use the new `SourceLanguageCodeInput`,
74+
`TargetLanguageCodeInput` and `LanguageCodeInput` types, which keep editor
75+
autocompletion for the listed codes. Result types are unchanged.
7076

7177
### Deprecated
7278
- `TranslateTextOptions.__path` is deprecated. It is for internal use only

‎README.md‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,12 @@ languages without a variant use a default variant, for example `'en'` translates
116116
to `'en-US'` and `'pt'` to `'pt-PT'`. The source language also accepts `null`, to
117117
enable auto-detection of the source language.
118118

119+
The language parameters accept any language code returned by
120+
`getSourceLanguages()` and `getTargetLanguages()`, not only the members of the
121+
`SourceLanguageCode` and `TargetLanguageCode` types. In TypeScript, a code held
122+
in a `string` variable can be passed without a cast; the codes are sent to the
123+
API unchanged apart from the case standardization.
124+
119125
The last argument to `translateText()` is optional, and specifies extra
120126
translation options, see [Text translation options](#text-translation-options)
121127
below.

‎src/translator.ts‎

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ import {
3333
GlossaryInfo,
3434
GlossaryLanguagePair,
3535
Language,
36-
LanguageCode,
37-
SourceLanguageCode,
38-
TargetLanguageCode,
36+
LanguageCodeInput,
37+
SourceLanguageCodeInput,
38+
TargetLanguageCodeInput,
3939
TranslateTextOptions,
4040
TranslatorOptions,
4141
TextResult,
@@ -238,8 +238,8 @@ export class Translator {
238238
*/
239239
async translateText<T extends string | string[]>(
240240
texts: T,
241-
sourceLang: SourceLanguageCode | null,
242-
targetLang: TargetLanguageCode,
241+
sourceLang: SourceLanguageCodeInput | null,
242+
targetLang: TargetLanguageCodeInput,
243243
options?: TranslateTextOptions,
244244
): Promise<T extends string ? TextResult : TextResult[]> {
245245
const data = buildURLSearchParams(
@@ -289,8 +289,8 @@ export class Translator {
289289
async translateDocument(
290290
inputFile: string | Buffer | fs.ReadStream | fs.promises.FileHandle,
291291
outputFile: string | fs.WriteStream | fs.promises.FileHandle,
292-
sourceLang: SourceLanguageCode | null,
293-
targetLang: TargetLanguageCode,
292+
sourceLang: SourceLanguageCodeInput | null,
293+
targetLang: TargetLanguageCodeInput,
294294
options?: DocumentTranslateOptions,
295295
): Promise<DocumentStatus> {
296296
// Helper function to open output file if provided as filepath and remove it on error
@@ -369,8 +369,8 @@ export class Translator {
369369
*/
370370
async uploadDocument(
371371
inputFile: string | Buffer | fs.ReadStream | fs.promises.FileHandle,
372-
sourceLang: SourceLanguageCode | null,
373-
targetLang: TargetLanguageCode,
372+
sourceLang: SourceLanguageCodeInput | null,
373+
targetLang: TargetLanguageCodeInput,
374374
options?: DocumentTranslateOptions,
375375
): Promise<DocumentHandle> {
376376
if (isString(inputFile)) {
@@ -507,8 +507,8 @@ export class Translator {
507507
*/
508508
async createGlossary(
509509
name: string,
510-
sourceLang: LanguageCode,
511-
targetLang: LanguageCode,
510+
sourceLang: LanguageCodeInput,
511+
targetLang: LanguageCodeInput,
512512
entries: GlossaryEntries,
513513
): Promise<GlossaryInfo> {
514514
if (Object.keys(entries.entries()).length === 0) {
@@ -530,8 +530,8 @@ export class Translator {
530530
*/
531531
async createGlossaryWithCsv(
532532
name: string,
533-
sourceLang: LanguageCode,
534-
targetLang: LanguageCode,
533+
sourceLang: LanguageCodeInput,
534+
targetLang: LanguageCodeInput,
535535
csvFile: string | Buffer | fs.ReadStream | fs.promises.FileHandle,
536536
): Promise<GlossaryInfo> {
537537
let csvContent;
@@ -613,8 +613,8 @@ export class Translator {
613613
*/
614614
private async internalUploadDocument(
615615
fileBuffer: Buffer,
616-
sourceLang: SourceLanguageCode | null,
617-
targetLang: TargetLanguageCode,
616+
sourceLang: SourceLanguageCodeInput | null,
617+
targetLang: TargetLanguageCodeInput,
618618
filename: string,
619619
options?: DocumentTranslateOptions,
620620
): Promise<DocumentHandle> {
@@ -678,8 +678,8 @@ export class Translator {
678678
*/
679679
private async internalCreateGlossary(
680680
name: string,
681-
sourceLang: LanguageCode,
682-
targetLang: LanguageCode,
681+
sourceLang: LanguageCodeInput,
682+
targetLang: LanguageCodeInput,
683683
entriesFormat: string,
684684
entries: string,
685685
): Promise<GlossaryInfo> {

‎src/types.ts‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,24 @@ export type TargetLanguageCode =
456456
*/
457457
export type LanguageCode = SourceLanguageCode | TargetLanguageCode;
458458

459+
/**
460+
* Accepted for source-language parameters: any {@link SourceLanguageCode}, or any other language
461+
* code string (e.g. one returned by getSourceLanguages() that this package does not list yet).
462+
*/
463+
export type SourceLanguageCodeInput = SourceLanguageCode | (string & Record<never, never>);
464+
465+
/**
466+
* Accepted for target-language parameters: any {@link TargetLanguageCode}, or any other language
467+
* code string (e.g. one returned by getTargetLanguages() that this package does not list yet).
468+
*/
469+
export type TargetLanguageCodeInput = TargetLanguageCode | (string & Record<never, never>);
470+
471+
/**
472+
* Accepted for language parameters that take source or target languages: any
473+
* {@link LanguageCode}, or any other language code string.
474+
*/
475+
export type LanguageCodeInput = LanguageCode | (string & Record<never, never>);
476+
459477
/**
460478
* Language codes that do not include a regional variant, for example 'en' is included, but 'en-US'
461479
* is not.

‎src/utils.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
GlossaryInfo,
1010
GlossaryId,
1111
LanguageCode,
12+
LanguageCodeInput,
1213
NonRegionalLanguageCode,
1314
RequestParameters,
1415
SentenceSplittingMode,
@@ -160,8 +161,8 @@ function joinTagList(tagList: TagList): string {
160161
* @private
161162
*/
162163
export function buildURLSearchParams(
163-
sourceLang: LanguageCode | null,
164-
targetLang: LanguageCode,
164+
sourceLang: LanguageCodeInput | null,
165+
targetLang: LanguageCodeInput,
165166
formality: Formality | undefined,
166167
glossary: GlossaryId | GlossaryInfo | MultilingualGlossaryInfo | undefined,
167168
extraRequestParameters: RequestParameters | undefined,

‎tests/offline/translateText.test.ts‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ describe('Translator.translateText', () => {
2727
await makeTranslator().translateText('abc', null, 'de');
2828
});
2929

30+
it('accepts a target language held in a string variable', async () => {
31+
expectTranslateBody({ ...baseBody, target_lang: 'de-AT' });
32+
const targets: string[] = ['de-AT'];
33+
34+
await makeTranslator().translateText('abc', null, targets[0]);
35+
});
36+
3037
it('parses the detected language, billed characters and model type', async () => {
3138
expectTranslateBody(baseBody, {
3239
translations: [

0 commit comments

Comments
 (0)