2

Есть ли способ извлечь из моего расширения Google Chrome список всех доступных переводов?Могу ли я получить список доступных языковых переводов из моего расширения Chrome?

Например, мое приложение может содержать следующие папки:

_locales\en\messages.json 
_locales\fr\messages.json 
_locales\es\messages.json 

Есть ли способ узнать, что это en, fr и es внутри самого расширения?

И второй вопрос, есть ли способ проанализировать конкретный файл messages.json как данные JSON? Я имею в виду немного больше возможностей, чем то, что предоставляется chrome.i18n.getMessage().

ответ

4

Да на оба вопроса, благодаря способности читать собственную папку внутреннего абонента:

chrome.runtime.getPackageDirectoryEntry(function callback)

Возвращает DirectoryEntry для каталога пакета.

Например, вы можете получить список локалей таким образом (не эластичным, добавить свои собственные проверки ошибок):

function getLocales(callback) { 
    chrome.runtime.getPackageDirectoryEntry(function(root) { 
    root.getDirectory("_locales", {create: false}, function(localesdir) { 
     var reader = localesdir.createReader(); 
     // Assumes that there are fewer than 100 locales; otherwise see DirectoryReader docs 
     reader.readEntries(function(results) { 
     callback(results.map(function(de){return de.name;}).sort()); 
     }); 
    }); 
    }); 
} 

getLocales(function(data){console.log(data);}); 

Кроме того, вы можете использовать это, чтобы получить FileEntry для файла messages.json и разобрать его.
Редактировать: или вы можете использовать XHR, как описано в Marco's answer, как только вы узнаете имя папки.

+0

Спасибо. Говоря об ошибках, я не могу найти хорошую документацию. Скажем, для 'root.getDirectory()' какие параметры 'errorCallback' (или последний параметр, который вы пропустили) вызвали в случае ошибки? – c00000fd

+0

Чтобы ответить на мой собственный вопрос, 'errorCallback', или последний параметр для' root.getDirectory() ', имеет два удобных свойства' message' и 'name', которые имеют некоторую информацию об ошибке. – c00000fd

+0

Также просто обновление, я не могу отметить это как ответ, так как пример кода Xan является неполным. Если кто-то заинтересован, вот рабочий пример: https://developer.mozilla.org/en-US/docs/Web/API/DirectoryReader#example – c00000fd

1

Чтобы узнать, какова текущая локаль, используемый пользователем, вы можете сделать это:

currentLocale = chrome.i18n.getMessage("@@ui_locale"); 

Теперь currentLocale будет что-то вроде "en" или "fr" или wathever это локаль используется пользователем. Теперь вы можете использовать его для создания URL-адресов, специфичных для локали.

Чтобы использовать ваш messages.json как объект Javascript вы можете:

  1. Получить текущей локали
  2. Запрос на messages.json файл с XMLHttpRequest
  3. Разобрать содержимое в объект с помощью метода JSON.parse().

Допустим, у вас есть messages.json файл вроде этого:

{ 
    "hello": { 
     "message": "Hello world!", 
     "description": "Sample text used for testing." 
    } 
} 

Вы теперь будете делать XHR, чтобы получить файл, что-то вроде этого:

var currentLocale = chrome.i18n.getMessage("@@ui_locale"), 
    xhr = new XMLHttpRequest(), 
    messages; 

xhr.open("GET", "/_locales/"+currentLocale+"messages.json", false); 
xhr.send(); 

messages = JSON.parse(xhr.responseText); 

// now you can access the messages like this: 
alert(messages["hello"].message); 

И» Вы увидите сообщение.

Смежные вопросы