谷歌翻译 API 来翻译来自 Firebase Firestore 的数据并包含一个缓存系统? [关闭]

问题描述 投票:0回答:0

所以我正在创建一个移动应用程序,我的所有数据都保存在 firebase firestore 中。我那里的数据都是英文的。我想根据用户在其设备中设置的语言环境自动翻译我从 firestore 获得的数据。现在,我做了一些研究,似乎翻译 API 可以帮助我解决这个问题(例如谷歌翻译 API),但我不确定从哪里开始。我还想缓存我必须的文本,以防止在获取相同文本时产生额外费用。

我的主要流程是这样的:

  1. 从 Firestore 中检索信息。
  2. 收集需要翻译的文字,检查是否有 的文本已经保存在缓存中。是的话就没必要 再次翻译它,所以把它从列表中删除。
  3. 使用翻译 API 翻译剩余的文本。
  4. 将缓存的文本与新翻译的文本结合起来。

这就是我到目前为止所做的,你看到任何问题吗?

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;
  }
}
flutter firebase google-cloud-firestore caching translation
© www.soinside.com 2019 - 2024. All rights reserved.