如何在本地保存 Ionic 中的翻译文件(下载后)?
How to save in local the translation file (after download) in Ionic?
我需要从远程服务器下载翻译文件并将其保存在本地,以免每次重新加载应用程序时都下载这个文件。
文件已下载但无法保存
import { Storage } from '@ionic/storage';
...
constructor(
private http: HttpClient,
private storage: Storage
) {
}
getTranslation(lang: string): Observable<any> {
return new Observable((observer) => {
this.http.post(SERVER_BASE_URL, null, {headers: this.contentHeader}).subscribe((res: Response) => {
console.log('get translation from server');
console.log(res);
this.storage.set("test", res).then(response => {
console.log("save translation");
}).catch(error => {
console.log("error");
console.log(error);
})
observer.next(res);
observer.complete();
},
error => {
console.log('get translation from local');
// failed to retrieve from api, switch to local
this.http.get('/assets/i18n/' + lang + '.json').subscribe((res: Response) => {
observer.next(res);
observer.complete();
});
});
});
}
我曾尝试使用存储,但出现错误
"Cannot read property 'set' of undefined"
我已经在我的应用程序的其他部分使用了存储,并且它可以正常工作。所以我不明白为什么在 translationService 中它不起作用。
感谢您的帮助。
如果你想存储对象或列表那么
this.storage.set('test', JSON.stringify(this.res));
获取时
this.storage.get('test').then(value => {
let res = JSON.parse(value);
}).catch(err=>{
console.log(err)
})
如果你想保存文件
我试过在本地保存文件,我有同样的错误:无法读取未定义的属性 'writeFile'。
this.http.post(apiAddress, body, {headers: this.contentHeader}).subscribe((res: Response) => {
console.log('get translation from server');
console.log(res);
this.file.writeFile(
this.file.dataDirectory,
lang + '.json',
JSON.stringify(res),
{replace: true}).then(_ => {
console.log('Directory exists');
}).catch(err => {
console.log('Directory doesn\'t exist');
});
observer.next(res);
observer.complete();
},
error => {
console.log('get translation from local');
// failed to retrieve from api, switch to local
this.http.get('/assets/i18n/' + lang + '.json').subscribe((res: Response) => {
observer.next(res);
observer.complete();
});
});
我找到了我错过的东西。在 app.module.ts 中,我需要添加 "deps" 以使用依赖项...
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
// useFactory: (createTranslateLoader),
useClass: TranslationService,
deps: [HttpClient, File]
}
}),
感谢您的帮助。
我需要从远程服务器下载翻译文件并将其保存在本地,以免每次重新加载应用程序时都下载这个文件。
文件已下载但无法保存
import { Storage } from '@ionic/storage';
...
constructor(
private http: HttpClient,
private storage: Storage
) {
}
getTranslation(lang: string): Observable<any> {
return new Observable((observer) => {
this.http.post(SERVER_BASE_URL, null, {headers: this.contentHeader}).subscribe((res: Response) => {
console.log('get translation from server');
console.log(res);
this.storage.set("test", res).then(response => {
console.log("save translation");
}).catch(error => {
console.log("error");
console.log(error);
})
observer.next(res);
observer.complete();
},
error => {
console.log('get translation from local');
// failed to retrieve from api, switch to local
this.http.get('/assets/i18n/' + lang + '.json').subscribe((res: Response) => {
observer.next(res);
observer.complete();
});
});
});
}
我曾尝试使用存储,但出现错误 "Cannot read property 'set' of undefined"
我已经在我的应用程序的其他部分使用了存储,并且它可以正常工作。所以我不明白为什么在 translationService 中它不起作用。
感谢您的帮助。
如果你想存储对象或列表那么
this.storage.set('test', JSON.stringify(this.res));
获取时
this.storage.get('test').then(value => {
let res = JSON.parse(value);
}).catch(err=>{
console.log(err)
})
如果你想保存文件
我试过在本地保存文件,我有同样的错误:无法读取未定义的属性 'writeFile'。
this.http.post(apiAddress, body, {headers: this.contentHeader}).subscribe((res: Response) => {
console.log('get translation from server');
console.log(res);
this.file.writeFile(
this.file.dataDirectory,
lang + '.json',
JSON.stringify(res),
{replace: true}).then(_ => {
console.log('Directory exists');
}).catch(err => {
console.log('Directory doesn\'t exist');
});
observer.next(res);
observer.complete();
},
error => {
console.log('get translation from local');
// failed to retrieve from api, switch to local
this.http.get('/assets/i18n/' + lang + '.json').subscribe((res: Response) => {
observer.next(res);
observer.complete();
});
});
我找到了我错过的东西。在 app.module.ts 中,我需要添加 "deps" 以使用依赖项...
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
// useFactory: (createTranslateLoader),
useClass: TranslationService,
deps: [HttpClient, File]
}
}),
感谢您的帮助。