pcf-scripts
Version:
This package contains a module for building PowerApps Component Framework (PCF) controls. See project homepage how to install.
116 lines (114 loc) • 3.97 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.configureLocale = configureLocale;
exports.translate = translate;
exports.translateA = translateA;
const path = require("path");
const fs = require("fs");
let diagnosticMessages = {};
let diagnosticMessagesEn = {};
async function configureLocale(config) {
if (config.directory === '') {
return Promise.reject('E_Unspecified_Directory');
}
if (config.diagnosticFileName === '') {
return Promise.reject('E_Unspecified_Diagnostic_FileName');
}
if (config.locale === '') {
return Promise.reject('E_Unspecified_Locale');
}
if (config.runtime !== 'node' && config.runtime !== 'browser') {
return Promise.reject('E_Unsupported_Runtime');
}
const matchResult = /^([a-z]+)([_\-]([a-z]+))?$/.exec(config.locale.toLowerCase());
if (!matchResult) {
return Promise.reject('E_Unsupported_Locale');
}
const language = matchResult[1];
const territory = matchResult[3];
let result = await trySetLanguageAndTerritory(config, language, territory);
if (!result) {
// Fallback to language only
result = await trySetLanguageAndTerritory(config, language, undefined);
}
if (result && language !== 'en') {
// If a non english language was successfully loaded, then also load 'en' as a fallback
// for strings that may not have been translated yet.
let filePath = path.join(config.directory, 'en', config.diagnosticFileName);
const enFallbackStrings = await loadLocalizedStrings(config, filePath);
if (enFallbackStrings) {
diagnosticMessagesEn = JSON.parse(enFallbackStrings);
}
}
else {
// Fallback to en
result = await trySetLanguageAndTerritory(config, 'en', undefined);
}
if (!result) {
return Promise.reject('E_Locale_Configuration_Error');
}
return result;
}
function translate(key) {
if (diagnosticMessages[key]) {
return diagnosticMessages[key];
}
else {
return diagnosticMessagesEn[key];
}
}
function translateA(key, args) {
let format = diagnosticMessages[key];
if (!format) {
format = diagnosticMessagesEn[key];
}
return format.replace(/{(\d+)}/g, (_match, index) => '' + assertDefined(args[+index]));
}
async function trySetLanguageAndTerritory(config, language, territory) {
let filePath = path.join(config.directory, language);
if (territory) {
filePath = filePath + '-' + territory;
}
filePath = path.join(filePath, config.diagnosticFileName);
const fileContent = await loadLocalizedStrings(config, filePath);
if (fileContent) {
diagnosticMessages = JSON.parse(fileContent);
return Promise.resolve(true);
}
else {
return Promise.resolve(false);
}
}
function loadLocalizedStrings(config, filePath) {
return new Promise((resolve) => {
if (config.runtime === 'browser') {
const request = new XMLHttpRequest();
request.onreadystatechange = () => {
if (request.readyState === XMLHttpRequest.DONE) {
if (request.status === 200) {
return resolve(request.responseText);
}
else {
return resolve(undefined);
}
}
};
request.open('GET', filePath, true);
request.send();
}
else {
if (!fs.existsSync(filePath)) {
return resolve(undefined);
}
let fileContents = fs.readFileSync(filePath).toString();
return resolve(fileContents);
}
});
}
function assertDefined(value, _message) {
if (value === undefined || value === null) {
throw new Error('E_Arg_Mismatch');
}
return value;
}
//# sourceMappingURL=locale.js.map
;