UNPKG

appium-android-driver

Version:

Android UiAutomator and Chrome support for Appium

97 lines 3.97 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getStrings = getStrings; exports.ensureDeviceLocale = ensureDeviceLocale; 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 Object.entries(mapping)) { result[key] = typeof value === 'string' ? 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 (suggestions.length > 0) { errMsg += ` You may want to apply one of the following locales instead: ${suggestions}`; } throw new Error(errMsg, { cause: e }); } } // #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}`, { cause: e }); } } 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) => language?.toLowerCase() === locale.language?.toLowerCase() || country?.toLowerCase() === locale.country?.toLowerCase()); return support_1.util.isEmpty(suggestedLocales) ? supportedLocales : suggestedLocales; } function toLocaleAbbr({ language, country, script }) { return `${language}_${country}${script ? '-' + script : ''}`; } // #endregion //# sourceMappingURL=resources.js.map