@polyglot-hub/nest-sdk
v0.1.1
Published
polyglot-hub.io для NestJS: PolyglotModule, PolyglotService и контроллер переводов для фронтенда
Readme
@polyglot-hub/nest-sdk
polyglot-hub.io для NestJS: модуль, сервис для кода бэкенда и контроллер,
через который фронтенд получает переводы без service key. Работает на Express и Fastify.
Обёртка над @polyglot-hub/sdk.
npm i @polyglot-hub/nest-sdkПодключение
Ключи приложения. В polyglot-hub.io откройте приложение:
appId— в адресе (/apps/<appId>/…) и на вкладке «Подключение»,serviceKey— в «Настройках». Положите их в окружение бэкенда:POLYGLOT_APP_ID=… POLYGLOT_SERVICE_KEY=… # секрет: не коммитить и не отдавать в браузерМодуль — в корневом модуле приложения:
import {Module} from '@nestjs/common'; import {ConfigModule, ConfigService} from '@nestjs/config'; import {PolyglotModule} from '@polyglot-hub/nest-sdk'; @Module({ imports: [ ConfigModule.forRoot({isGlobal: true}), PolyglotModule.forRootAsync({ inject: [ConfigService], useFactory: (config: ConfigService) => ({ appId: config.getOrThrow('POLYGLOT_APP_ID'), serviceKey: config.getOrThrow('POLYGLOT_SERVICE_KEY'), ttl: 60_000, // кеш ответов polyglot-hub в памяти, мс; 0 — без кеша }), controllerPath: 'i18n', // GET /i18n/locales и GET /i18n/:locale для фронтенда; не задан — без контроллера }), ], }) export class AppModule {}Без
ConfigModule—PolyglotModule.forRoot({appId, serviceKey, controllerPath}). Модуль глобальный (isGlobal: false— чтобы импортировать явно). Глобальный префикс (app.setGlobalPrefix('api')) добавляется к пути:/api/i18n/….Фронтенд —
@polyglot-hub/sdkс адресом контроллера:import {createPolyglot} from '@polyglot-hub/sdk'; export const polyglot = createPolyglot({endpoint: 'https://api.my-app.com/i18n'}); await polyglot.init(); // запомненный язык → язык браузера → первый язык приложения polyglot.locales; // [{iso: 'ru', title: 'Русский'}, …] — для переключателя polyglot.getLang('cart.title');Фронтенд на другом домене — разрешите его в
app.enableCors({origin: […]}). React, хранение выбранного языка (storage) и остальное API клиента — в README@polyglot-hub/sdk.Проверка:
curl http://localhost:3000/i18n/locales # [{"iso":"ru","title":"Русский"}, …] curl http://localhost:3000/i18n/ru # {"cart.title":"Корзина", …}
В коде бэкенда
import {Injectable} from '@nestjs/common';
import {PolyglotService} from '@polyglot-hub/nest-sdk';
@Injectable()
export class MailService {
constructor(private readonly polyglot: PolyglotService) {}
async orderSubject(locale: string, count: number) {
const t = await this.polyglot.getTranslator(locale);
return t.getPluralLang('mail.order.items', count); // «5 товаров»
}
}PolyglotService: getTranslations(locale), getLocales(), getTranslator(locale), clearCache().
Если polyglot-hub недоступен, отдаётся последний удачный ответ из кеша; иначе — 502 без деталей.
