Как я могу загрузить файлы перевода из каталога данных после того, как они были там сохранены? - PullRequest
0 голосов
/ 26 июня 2019

Я создаю приложение с использованием Ionic Framework и пытаюсь сделать так, чтобы как можно больше приложений было доступно для работы в автономном режиме, когда нет доступного подключения к Интернету.

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

После сохранения в каталоге данных я хотел бы настроить ngx-translate для чтения из этих файлов JSON в каталоге данных при вызове getTranslation.

До сих пор мне удалось создать собственный загрузчик и настроить ngx-translate для использования этого пользовательского загрузчика. Мне также удалось получить файлы перевода из одного места и сохранить их в другом. На данный момент, вместо того, чтобы извлекать их с сервера, я перемещаю их из каталога приложения www в каталог данных, так как у меня не настроена серверная среда, поэтому я стараюсь как можно чаще «имитировать» функциональность.

getTranslation(lang: string): Observable<any> {
  const subDirectory = 'i18n';
  const fileName = lang;
  const fileExtension = '.json';
  let rootDirectory = '';
  let rootDirectoryPath = '';
  let directory = '';
  let directoryPath = '';
  if (this.platform.is('cordova')) {
    this.platform.ready()
      .then(() => {
        rootDirectory = this.file.dataDirectory;
        rootDirectoryPath = rootDirectory;
        directory = rootDirectoryPath + subDirectory;
        directoryPath = directory + '/';
        console.log(directoryPath + fileName + fileExtension + ':');
        const translationFilePath = this.webview.convertFileSrc(directoryPath + fileName + fileExtension);
        // return this.http.get(translationFilePath);
        return this.http.get(translationFilePath)
          .pipe(map((res: JSON) => {
            return res;
          }));
      });
  } else {
    rootDirectory = '/assets/data';
    rootDirectoryPath = rootDirectory + '/';
    directory = rootDirectoryPath + subDirectory;
    directoryPath = directory + '/';
    console.log(directoryPath + fileName + fileExtension + ':');
    return this.http.get(directoryPath + fileName + fileExtension);
  }
}

Когда я работаю в браузере (а cordova недоступен), эта функция работает и возвращает файлы перевода из / assets / data для возможности перевода.

Однако, когда в приложении доступна cordova, я получаю сообщение об ошибке:

ERROR Error: Uncaught (in promise): TypeError: Cannot read property 'pipe' of undefined
TypeError: Cannot read property 'pipe' of undefined
    at t.getTranslation (main.db14319ec6098ffa1c27.js:1)
    at t.retrieveTranslations (main.db14319ec6098ffa1c27.js:1)
    at t.use (main.db14319ec6098ffa1c27.js:1)
    at main.db14319ec6098ffa1c27.js:1
    at new t (polyfills.30cd1d148106f6301a8e.js:1)
    at t.changeLanguage (main.db14319ec6098ffa1c27.js:1)
    at n.selectLanguage (19.8a90e2507f2b3a13dd11.js:1)
    at Object.handleEvent (19.8a90e2507f2b3a13dd11.js:1)
    at Object.handleEvent (main.db14319ec6098ffa1c27.js:1)
    at Object.handleEvent (main.db14319ec6098ffa1c27.js:1)
    at P (polyfills.30cd1d148106f6301a8e.js:1)
    at new t (polyfills.30cd1d148106f6301a8e.js:1)
    at t.changeLanguage (main.db14319ec6098ffa1c27.js:1)
    at n.selectLanguage (19.8a90e2507f2b3a13dd11.js:1)
    at Object.handleEvent (19.8a90e2507f2b3a13dd11.js:1)
    at Object.handleEvent (main.db14319ec6098ffa1c27.js:1)
    at Object.handleEvent (main.db14319ec6098ffa1c27.js:1)
    at na (main.db14319ec6098ffa1c27.js:1)
    at main.db14319ec6098ffa1c27.js:1
    at HTMLElement.<anonymous> (main.db14319ec6098ffa1c27.js:1)

Буду очень признателен за любые советы и поддержку.

1 Ответ

0 голосов
/ 26 июня 2019

Вы должны попробовать другой подход .. не загружайте его из файла, загружайте его из класса.

Использовать библиотеку: https://www.npmjs.com/package/@ngx-translate/core

Edit: Хорошо, я думаю, что ваша ошибка происходит, потому что ionic меняет относительный путь и способ, которым вы устанавливаете src = "" для изображений и т.д ..

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

...