sql >> データベース >  >> RDS >> SQLite

オフライン国際化アプリの作成方法:複数の言語をサポート

    localeの列があります 複数の言語をサポートするSqliteデータベースにあるため、異なる言語のデータを見つけるには、SQLクエリ条件を変更するだけで済みます。

    VegetableDaoを変更します 言語クエリ条件を追加するには

    [project_root]/lib/app/data/dao/vegetalbe_dao.dart

    import 'package:floor/floor.dart';
    import 'package:strapi_flutter_internation_poc/app/data/entity/vegetable.dart';
    
    @dao
    abstract class VegetableDao {
      @Query('SELECT * FROM vegetables_v WHERE  locale = :locale')
      Future<List<VegetableV>> findAll(String locale);
    }
    
    

    変更後、フロアコードジェネレータを再実行します

    flutter packages pub run build_runner build
    

    HomeController

    [project_root]/lib/app/modules/home/controllers/home_controller.dart

      Future<void> getAllVegetables() async {
        final result = await DbService.to.db.vegetableDao.findAll('en');
        vegetables.value = result;
      }
    

    このように表示されるデータはすべて英語です

    次に、GetXの国際化機能を統合します

    新しいlanguage_serviceを作成する

    [project_root]/lib/app/common/services/language_service.dart

    ここでは、get_storage デフォルト言語のキャッシュとして使用されます。 Flutterプロジェクトでこのライブラリの依存関係を増やすことを忘れないでください。コマンドget install get_storageを使用します インストールをすばやく完了します。

    import 'dart:ui' as ui;
    
    import 'package:flutter/material.dart';
    import 'package:get/get.dart';
    import 'package:get_storage/get_storage.dart';
    
    class LanguageService extends GetxService {
      static LanguageService get to => Get.find();
    
      var box = GetStorage();
      var locale = Locale('en', 'US');
      var localeKey = 'en';
    
      Future<LanguageService> init() async {
        if (box.read('language') != null) {
          if (box.read('language') == 'zh-CN') {
            locale = Locale('zh', 'CN');
            localeKey = 'zh-CN';
          } else {
            locale = Locale('en', 'US');
            localeKey = 'en';
          }
        } else {
          if (ui.window.locale.languageCode == 'zh') {
            locale = Locale('zh', 'CN');
            localeKey = 'zh-CN';
          } else {
            locale = Locale('en', 'US');
            localeKey = 'en';
          }
        }
    
        return this;
      }
    
      void changeLocale(l) {
        if (l == Locale('zh', 'CN')) {
          localeKey = 'zh-CN';
          updateLocale(Locale('zh', 'CN'));
        } else if (l == Locale('en', 'US')) {
          localeKey = 'en';
          updateLocale(Locale('en', 'US'));
        }
        box.write('language', localeKey);
      }
    
      void updateLocale(_l) {
        locale = _l;
        Get.updateLocale(_l);
      }
    }
    
    

    GetX Cliは、GetXフレームワークに必要な多言語構成をJSONファイルからすばやく生成できます。

    [project_root]/assets/localesの下に2つの新しいJSONファイルを作成します

    en_US.json

    {
      "app": {
        "name": "VAF"
      },
      "locale": {
        "title": "Language",
        "zh": "中文",
        "en": "English"
      }
    }
    

    zh_CN.json

    {
      "app": {
        "name": "蔬果"
      },
      "locale": {
        "title": "语言",
        "zh": "中文",
        "en": "English"
      }
    }
    

    走る

    get generate locales assets/locales
    

    out [project_root]/lib/generated/locales.g.dart

    class AppTranslation {
      static Map<String, Map<String, String>> translations = {
        'zh_CN': Locales.zh_CN,
        'en_US': Locales.en_US,
      };
    }
    
    class LocaleKeys {
      LocaleKeys._();
      static const app_name = 'app_name';
      static const locale_title = 'locale_title';
      static const locale_zh = 'locale_zh';
      static const locale_en = 'locale_en';
    }
    
    class Locales {
      static const zh_CN = {
        'app_name': '蔬果',
        'locale_title': '语言',
        'locale_zh': '中文',
        'locale_en': 'English',
      };
      static const en_US = {
        'app_name': 'VAF',
        'locale_title': 'Language',
        'locale_zh': '中文',
        'locale_en': 'English',
      };
    }
    
    

    main.dartにLanguageServiceの初期化を追加します

    Future<void> initServices() async {
      print('starting services ...');
      await Get.putAsync(() => DbService().init());
      await Get.putAsync(() => LanguageService().init());
      print('All services started...');
    }
    

    runAppを変更します 多言語構成を追加するには

      runApp(
        GetMaterialApp(
          title: "Application",
          initialRoute: AppPages.INITIAL,
          getPages: AppPages.routes,
          translationsKeys: AppTranslation.translations,
          locale: LanguageService.to.locale,
          fallbackLocale: Locale('zh', 'CN'),
        ),
      );
    

    コントローラでクエリ条件を調整します

    final result = await DbService.to.db.vegetableDao.findAll('en');
    


        final result = await DbService.to.db.vegetableDao
            .findAll(LanguageService.to.localeKey);
    

    多言語リソースを参照するようにインターフェイスのテキストを変更します

          appBar: AppBar(
            title: Text('Vegetables'),
            centerTitle: true,
          ),
    


          appBar: AppBar(
            title: Text(LocaleKeys.app_name.tr),
            centerTitle: true,
          ),
    

    もう一度実行して、デフォルトで中国語になっているインターフェースを確認します

    少し改善して、言語を切り替えるボタンを追加します

    appBar: AppBar(
            title: Text(LocaleKeys.app_name.tr),
            centerTitle: true,
            actions: [
              IconButton(
                  onPressed: () {
                    Get.dialog(SimpleDialog(
                      title: Text(LocaleKeys.locale_title.tr),
                      children: <Widget>[
                        SimpleDialogOption(
                          onPressed: () {
                            LanguageService.to.changeLocale(Locale('en', 'US'));
                          },
                          child: Padding(
                            padding: const EdgeInsets.symmetric(vertical: 6),
                            child: Text(LocaleKeys.locale_en.tr),
                          ),
                        ),
                        SimpleDialogOption(
                          onPressed: () {
                            LanguageService.to.changeLocale(Locale('zh', 'CN'));
                          },
                          child: Padding(
                            padding: const EdgeInsets.symmetric(vertical: 6),
                            child: Text(LocaleKeys.locale_zh.tr),
                          ),
                        ),
                      ],
                    ));
                  },
                  icon: Icon(Icons.language))
            ],
          ),
    

    言語の切り替えを完了するのに非常に便利で迅速です


    1. Laravel5PDOExceptionがドライバーを見つけられませんでした

    2. MySQLデータベースの一般的な問題を修正する方法は?

    3. SQL Server(T-SQL)で10進数を16進数に変換する3つの方法

    4. max_allowed_pa​​cketサイズを変更する方法