Я создаю приложение с использованием 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)
Буду очень признателен за любые советы и поддержку.