@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
JavaScript
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;