Автоматизированно выгружаем все языки расширения в CWS

Переводы полных описаний (full desc) обычно вручную копируют и вставляют в CWS. Т.е. языков 52, это приходится делать 52 раза.
С помощью специального скрипта можно автоматически загрузить полные описания для всех языков в CWS. Посмотрим, как это сделать:
  1. Переходим в панели управления на страницу редактирования расширения в Chrome Web Store в антидетект-браузере. На странице редактирования расширения переходим во вкладку Store Listing . Обновляем страницу, иначе скрипт может не отработать:
    1. notion image
  1. Нажимаем F12 или ПКМ → Просмотреть код :
    1. notion image
  1. Переходим во вкладку Console :
    1. notion image
  1. Вставляем такой код во вкладку Console код и нажимаем Enter:
    1. 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. После этого можно будет вставить код.
  1. В появившемся зеленом окне нажимаем Choose Files и загружаем свою папку с локалями:
    1. notion image
  1. Появится всплывающее окно, в котором мы подтверждаем загрузку файлов. После этого начнется автоматическая загрузка всех файлов, и будут происходить действия, похожие на действия пользователя при загрузке файлов:
    1. notion image
      💡
      Если скрипт не запустился по какой-либо причине и загрузка не началась – обновите страницу и попробуйте снова.
  1. Сохраняем добавленные языки, нажав кнопку Save draft:
    1. notion image
  1. После сохранения обновляем страницу. Все языки должны заполниться, а наша зеленая плашка должна пропасть.
💡
После проделанных манипуляций лучше вручную проверить, что все языки подгрузились полностью. Для этого нужно менять Current editing language и проверять, что каждый язык прогрузился правильно.