@steroidsjs/nest-translation
v0.0.1
Published
Steroids Nest Translation Module
Downloads
44
Keywords
Readme
Steroids Nest Translation Module
Модуль для перевода строк в http-ответах
Настройка приложения
Для перевода строк необходимо настроить приложение. Нужно:
- Импортировать
TranslationModule:
import {Module} from '@steroidsjs/nest/infrastructure/decorators/Module';
import {TranslationModule} from '@steroidsjs/nest-translation/infrastructure/TranslationModule';
@Module({
module: (config) => {
const module = baseConfig.module(config);
return {
...module,
imports: [
TranslationModule.forRoot(),
...module.imports,
].filter(Boolean),
};
},
})
export class AppModule {}- Переопределить
RestApplication, чтобы переводить ошибки валидации и nestjs http исключения:
import {RestApplication as BaseRestApplication} from '@steroidsjs/nest/infrastructure/applications/rest/RestApplication';
import {TranslationHelper} from '@steroidsjs/nest-translation/domain/helpers/TranslationHelper';
import {
TranslationValidationExceptionFilter,
} from '@steroidsjs/nest-translation/infrastructure/filters/TranslationValidationExceptionFilter';
import {
TranslationHttpExceptionFilter,
} from '@steroidsjs/nest-translation/infrastructure/filters/TranslationHttpExceptionFilter';
import {I18nService} from 'nestjs-i18n';
export class RestApplication extends BaseRestApplication {
protected initFilters() {
this._app.useGlobalFilters(
// Используем вместо ValidationExceptionFilter
new TranslationValidationExceptionFilter(),
// Используем вместо HttpExceptionFilter
new TranslationHttpExceptionFilter(),
...otherFilters,
);
}
protected initTranslation() {
TranslationHelper.translationService = this._app.get(I18nService);
}
async init(): Promise<void> {
await super.init();
this.initTranslation();
}
}Использование
Чтобы перевести строку, нужно использовать функцию TranslationHelper.translate или короткий алиас __.
По умолчанию желаемый язык ответа передаётся в хедере Accept-Language, но можно кастомизировать логику, передав
нужные значения в вызов TranslationModule.forRoot (интерфейс ITranslationModuleConfig).
Рассмотрим пример:
import {Controller, Get} from '@nestjs/common';
import {ApiHeader, ApiTags} from '@nestjs/swagger';
import {ValidationException} from '@steroidsjs/nest/usecases/exceptions/ValidationException';
import {BadRequestException} from '@steroidsjs/nest/usecases/exceptions';
import {__, TranslationHelper} from '@steroidsjs/nest-translation/domain/helpers/TranslationHelper';
@ApiHeader({
name: 'Accept-Language',
description: 'Язык ответа',
required: false,
schema: {
type: 'string',
default: 'ru',
},
})
@ApiTags('Translation')
@Controller('/translation')
export class TranslationController {
@Get('')
stringTest() {
return __('Привет мир!');
}
@Get('/arg')
stringArgTest() {
return TranslationHelper.translate('Привет {worldArg}!', {
args: {
worldArg: TranslationHelper.translate('мир'),
},
});
}
@Get('/error/val')
errorValidationTest() {
throw new ValidationException({field: 'Ошибка'});
}
@Get('/error/bad-request')
errorBadRequestTest() {
throw new BadRequestException('Плохой запрос');
}
}Передача аргументов в строке показана в функции stringArgTest. Не стоит использовать js шаблонные строки, как, например, Привет ${мир}.
Наконец, чтобы собрать файлы с переводами, нужно выполнить команду:
yarn cli extract-translationsЕсли использовать настройки по умолчанию, то из примера выше соберётся два файла в папке translations:
ru.json:
{
"Плохой запрос": "Плохой запрос",
"Ошибка": "Ошибка",
"Привет {worldArg}!": "Привет {worldArg}!",
"мир": "мир",
"Привет мир!": "Привет мир!"
}en.json:
{
"Плохой запрос": "",
"Ошибка": "",
"Привет {worldArg}!": "",
"мир": "",
"Привет мир!": ""
}При использовании языка en если в файле значение ключа будет пустой строкой, то в качестве значения будет использоваться сам ключ.
