UNPKG

@sodacore/i18n

Version:

Sodacore i18n is a plugin that offers internationalisation and localisation support for the Sodacore framework.

78 lines (77 loc) 3.62 kB
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; import { Inject, Provide } from '@sodacore/di'; import I18nService from '../service/i18n'; let I18nProvider = class I18nProvider { constructor() { this.defaultLanguage = this.config?.defaultLang || null; } t(query, languageCode) { if (!this.i18nService.hasTranslations()) return query; return this.i18nService.translate(query, languageCode); } translate(query, languageCode, fallback) { if (!this.i18nService.hasTranslations()) return fallback ?? query; return this.i18nService.translate(query, languageCode ?? this.config?.defaultLang, fallback); } getAvailableTranslation(acceptedLanguages) { // If no translations, then return the default language. if (!this.i18nService.hasTranslations()) return null; // Collect the accepted languages. const languages = acceptedLanguages.split(',').map(item => { const [lang, priority] = item.split(';'); if (priority && priority.startsWith('q=')) { return { code: lang.trim(), priority: parseFloat(priority.split('=')[1]) }; } return { code: lang.trim(), priority: 1.0 }; // Default priority if not specified. }); // Get the available languages. const availableLanguages = this.i18nService.getAvailableLanguages(true); if (availableLanguages.length === 0) return null; // Find the best match based on priority. const bestMatch = languages.reduce((best, current) => { const langCode = current.code.toLowerCase(); const hasLanguage = availableLanguages.includes(langCode); if (this.defaultLanguage) { if (!hasLanguage && langCode === this.defaultLanguage.toLowerCase()) { return current; // Allow the default language to be selected. } } if (hasLanguage && (!best || current.priority > best.priority)) { return current; // Update best match if current has a higher priority. } return best; // Return the best match found so far. }, { code: 'en-GB', priority: 0 }); // Return. if (!bestMatch) return null; return this.defaultLanguage ? bestMatch.code.toLowerCase() === this.defaultLanguage.toLowerCase() ? null : bestMatch.code.toLowerCase() : bestMatch.code.toLowerCase(); } }; __decorate([ Inject('@i18n:config'), __metadata("design:type", Object) ], I18nProvider.prototype, "config", void 0); __decorate([ Inject(), __metadata("design:type", I18nService) ], I18nProvider.prototype, "i18nService", void 0); I18nProvider = __decorate([ Provide() ], I18nProvider); export default I18nProvider;