appium-android-driver
Version:
Android UiAutomator and Chrome support for Appium
102 lines • 4.22 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getStrings = getStrings;
exports.ensureDeviceLocale = ensureDeviceLocale;
const lodash_1 = __importDefault(require("lodash"));
const support_1 = require("@appium/support");
/**
* Gets the localized strings from the application.
*
* @param language The language code to retrieve strings for. If not provided,
* the device's current language will be used.
* @returns Promise that resolves to a mapping of string keys to their localized values.
*/
async function getStrings(language = null) {
if (!language) {
language = await this.adb.getDeviceLanguage();
this.log.info(`No language specified, returning strings for: ${language}`);
}
// Clients require the resulting mapping to have both keys
// and values of type string
const preprocessStringsMap = (mapping) => {
const result = {};
for (const [key, value] of lodash_1.default.toPairs(mapping)) {
result[key] = lodash_1.default.isString(value) ? value : JSON.stringify(value);
}
return result;
};
return preprocessStringsMap(await extractStringsFromResources.bind(this)(language));
}
/**
* Ensures the device locale is set to the specified language, country, and optional script.
*
* @param language The language code (e.g., 'en', 'fr').
* @param country The country code (e.g., 'US', 'FR').
* @param script Optional script code.
* @returns Promise that resolves when the locale is set and verified.
* @throws {Error} If the locale cannot be set or verified.
*/
async function ensureDeviceLocale(language, country, script) {
try {
await this.settingsApp.setDeviceLocale(language, country, script);
if (!(await this.adb.ensureCurrentLocale(language, country, script))) {
throw new Error('Locale verification has failed');
}
}
catch (e) {
this.log.debug(e.stack);
let errMsg = `Cannot set the device locale to '${toLocaleAbbr({ language, country, script })}'.`;
let suggestions = [];
try {
suggestions = (await fetchLocaleSuggestions.bind(this)(language, country)).map(toLocaleAbbr);
}
catch (e1) {
this.log.debug(e1.stack);
}
if (!lodash_1.default.isEmpty(suggestions)) {
errMsg += ` You may want to apply one of the following locales instead: ${suggestions}`;
}
throw new Error(errMsg);
}
}
// #region Internal helpers
async function extractStringsFromResources(language, opts = null) {
const caps = opts ?? this.opts;
let app = caps.app;
let tmpRoot;
try {
if (!app && caps.appPackage) {
tmpRoot = await support_1.tempDir.openDir();
try {
app = await this.adb.pullApk(caps.appPackage, tmpRoot);
}
catch (e) {
throw new Error(`Could not extract app strings, failed to pull an apk from '${caps.appPackage}'. Original error: ${e.message}`);
}
}
if (!app || !(await support_1.fs.exists(app))) {
throw new Error(`Could not extract app strings, no app or package specified`);
}
return (await this.adb.extractStringsFromApk(app, language ?? null)).apkStrings;
}
finally {
if (tmpRoot) {
await support_1.fs.rimraf(tmpRoot);
}
}
}
async function fetchLocaleSuggestions(language, country) {
const supportedLocales = await this.settingsApp.listSupportedLocales();
const suggestedLocales = supportedLocales
.filter((locale) => lodash_1.default.toLower(language) === lodash_1.default.toLower(locale.language)
|| lodash_1.default.toLower(country) === lodash_1.default.toLower(locale.country));
return lodash_1.default.isEmpty(suggestedLocales) ? supportedLocales : suggestedLocales;
}
function toLocaleAbbr({ language, country, script }) {
return `${language}_${country}${script ? ('-' + script) : ''}`;
}
// #endregion
//# sourceMappingURL=resources.js.map