Переводы полных описаний (
full desc) обычно вручную копируют и вставляют в CWS. Т.е. языков 52, это приходится делать 52 раза.С помощью специального скрипта можно автоматически загрузить полные описания для всех языков в CWS. Посмотрим, как это сделать:
- Переходим в панели управления на страницу редактирования расширения в Chrome Web Store в антидетект-браузере. На странице редактирования расширения переходим во вкладку
Store Listing. Обновляем страницу, иначе скрипт может не отработать:

- Нажимаем
F12или ПКМ →Просмотреть код:

- Переходим во вкладку
Console:

- Вставляем такой код во вкладку
Consoleкод и нажимаемEnter:
const ANIMATION_TIMEOUT = 500 const fileInput = document.createElement('input') fileInput.setAttribute("id", "filepicker") fileInput.setAttribute("type", 'file') fileInput.setAttribute("webkitdirectory", '') fileInput.setAttribute("multiple", '') fileInput.setAttribute("style", 'position: absolute;top: 0;z-index: 999;padding: 1rem;background: green;') document.documentElement.append(fileInput) document.getElementById("filepicker").addEventListener( "change", async (event) => { const files = event.target.files const locales = {} const localeFiles = Object.values(files).filter(f => f.name == 'messages.json').filter(f => f.type == 'application/json') for (const localeFile of localeFiles) { const localeCode = localeFile.webkitRelativePath.replace('_locales/', '').replace('/messages.json', '') const fileText = await localeFile.text() const localeJson = JSON.parse(fileText) if (localeJson.storeDesc) { locales[localeCode] = localeJson.storeDesc.message } else { console.error(`[${localeCode}] - no store desc for this locale: ${fileText}`) } } console.log("all locales:", locales) await uploadLocales(locales) }, false,); function sleep(time) { return new Promise((resolve) => setTimeout(resolve, time)); } async function uploadLocales(locales) { const dropdown = document.evaluate("//h3[text()='Current editing language']/../../div[2]//div[@jsshadow]/div/div", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue for (const entry of Object.entries(locales)) { let code = entry[0].replace('_', '-') const description = entry[1] // Check and replace 'he' with 'iw' if (code === 'he') { code = 'iw' } console.log('upload locale:', code) dropdown.click() try { [...document.evaluate("//ul[@aria-label='Language']", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.children] .filter(e => e.tagName == 'LI') .filter(e => e.getAttribute('data-value') == code)[0] .click() } catch (e) { console.error("cant find locale with code - ", code) continue } await sleep(ANIMATION_TIMEOUT) const textarea = document.evaluate("//textarea[@maxlength='16000']", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue textarea.dispatchEvent(new Event("focus")) textarea.value = description textarea.dispatchEvent(new Event('input', { bubbles: true, })) await sleep(ANIMATION_TIMEOUT) } }
Если Chrome начнет ругаться на вставку кода в консоли, то пропишите в ней
allow pasting. После этого можно будет вставить код.- В появившемся зеленом окне нажимаем
Choose Filesи загружаем свою папку с локалями:

- Появится всплывающее окно, в котором мы подтверждаем загрузку файлов. После этого начнется автоматическая загрузка всех файлов, и будут происходить действия, похожие на действия пользователя при загрузке файлов:

Если скрипт не запустился по какой-либо причине и загрузка не началась – обновите страницу и попробуйте снова.
- Сохраняем добавленные языки, нажав кнопку
Save draft:

- После сохранения обновляем страницу. Все языки должны заполниться, а наша зеленая плашка должна пропасть.
После проделанных манипуляций лучше вручную проверить, что все языки подгрузились полностью. Для этого нужно менять
Current editing language и проверять, что каждый язык прогрузился правильно.