所以我正在创建一个移动应用程序,我的所有数据都保存在 firebase firestore 中。我那里的数据都是英文的。我想根据用户在其设备中设置的语言环境自动翻译我从 firestore 获得的数据。现在,我做了一些研究,似乎翻译 API 可以帮助我解决这个问题(例如谷歌翻译 API),但我不确定从哪里开始。我还想缓存我必须的文本,以防止在获取相同文本时产生额外费用。
我的主要流程是这样的:
这就是我到目前为止所做的,你看到任何问题吗?
class TranslationService {
final String _apiKey;
final String _apiUrl;
late final Database _db;
TranslationService(this._apiKey, this._apiUrl) {
_initDatabase();
}
Future<List<String>> translate(List<String> texts, String targetLanguage) async {
final translations = <String>[];
for (final text in texts) {
final cachedTranslation = await _getTranslationFromDb(text);
if (cachedTranslation != null) {
translations.add(cachedTranslation);
continue;
}
final translation = await _callTranslationApi(text, targetLanguage);
await _saveTranslationToDb(text, translation);
translations.add(translation);
}
return translations;
}
Future<void> _initDatabase() async {
_db = await openDatabase('translations.db', version: 1,
onCreate: (Database db, int version) async {
await db.execute(
'CREATE TABLE translations (id INTEGER PRIMARY KEY, text TEXT, translation TEXT)');
});
}
Future<String?> _getTranslationFromDb(String text) async {
final result = await _db.query('translations',
where: 'text = ?', whereArgs: [text], limit: 1);
if (result.isEmpty) {
return null;
} else {
return result.first['translation'] as String?;
}
}
Future<void> _saveTranslationToDb(String text, String translation) async {
await _db.insert('translations', {'text': text, 'translation': translation});
}
Future<String> _callTranslationApi(String text, String targetLanguage) async {
final url = Uri.parse('$_apiUrl?key=$_apiKey');
final response = await http.post(
url,
headers: {'Content-Type': 'application/json'},
body: json.encode({'q': text, 'target': targetLanguage}),
);
final responseBody = response.body;
final translation = json.decode(responseBody)['data']['translations'][0]['translatedText'].toString();
return translation;
}
}