UNPKG

appium-android-driver

Version:

Android UiAutomator and Chrome support for Appium

102 lines 4.22 kB
"use strict"; 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