flutter 다중 언어 처리, json 파일 블랙스크린 불러오는 문제 해결

3533 단어
flutter 다국어 처리
  • 현재 저로서는 우아한 두 가지 처리 방식을 접하게 되었습니다.
  • 첫 번째는 추상류를 설정하는 것이다. 서로 다른 언어가 서로 다른 실현을 하고 초기화할 때나 언어가 전환될 때 대응하는 언어의 실례를 만들면 된다. 장점은 우아함을 실현하는 것이고 단점은 유지하기 어렵다
  • 두 번째는 json 파일을 사용하는 것이다. 각 언어는 하나의 json 파일이고 초기화할 때 대응하는 언어의 json 파일을 불러오면 된다. 장점은 유지보수가 편리하다는 것이다. 단점은 실현 방식이 비교적 좌절되고 json을 불러올 때 시간이 많이 걸리기 때문에 블랙이 되어 flutter의 splash인터페이스
  • 에 들어갈 수 있다는 것이다.
  • 이제 간편한 유지 보수와 성능을 원하면 어떻게 합니까?

  • json 파일을dart 파일로 바꾸고 맵으로 문자열 저장
  • dart로 이 json 파일을 직접 유지할 수 있을지 초보적으로 생각했다.dart의 맵과 json은 변수 이름이 하나 모자라기 때문이다
  • zh.json : {
    "appNam":"    ",
    "appVersion": "    "
    }
    en.json : {  
    "appNam":"app name",
    "appVersion": "app version"
    }
    
  • 를 사용하여 var localMap = json.decode(await rootBundle.loadString(zh.json)) json 파일을 불러오고 뒤에 필요한 모든 부분을 localMap["appName"]로 사용하면 됩니다. 현재 영어라면 en을 불러옵니다.json 파일
  • 여기서 문제가 하나 있다. 일반적인 조작은 사용자 정의Localizations Delegate를 load 방법에서 다중 언어를 초기화하고 사용자 정의deleget을 Material App에 있는localizations Delegates에 주는 것이다. 만약에 여기에 await를 사용한다면 앱이 어두워져야 Material App의 홈 페이지에 들어갈 수 있다는 것을 의미한다
  • main() {
        runApp(MyApp());
    }
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home:splashPage(),//     
          localizationsDelegates:MyLocalizationsDelegate()
        )
      }
    }
    //      map
    class MyLocalizations {
        static MyLocalizations instance;
        Map globalLocalMap;
    }
    //        delegate,flutter        load  
    class MyLocalizationsDelegate extends LocalizationsDelegate {
      MyLocalizations local = MyLocalizations();
      @override
      Future load(Locale locale) async {
          local.globalLocalMap = json.decode(await rootBundle.loadString(zh.json));
          MyLocalizations.instance = local;
          return SynchronousFuture(MyLocalizations.instance);
      }
    }
    
  • 위에서 보듯이load 방법에서 json 파일을 불러오면 app 블랙스크린을 초래할 수 있으며 시간은 await
  • 에 달려 있다.
    json을dart 파일로 바꾸기
  • json 대신 개의art 파일을 사용하여 json을 불러오는 동작을 제거하고 블랙스크린
  • 을 피합니다
    zh.dart :
    var zh = {
    "appNam":"    ",
    "appVersion": "    "
    };
    en.dart :
    var en = {
    "appNam":"app name",
    "appVersion": "app version"
    }
    
  • 이때load 방법을 고칩니다. n 또는zh의 맵을 사용할 때만 이 변수를 불러올 수 있기 때문에 모두 메모리에 불러오는 문제가 없습니다
  • class MyLocalizationsDelegate extends LocalizationsDelegate {
      MyLocalizations local = MyLocalizations();
      @override
      Future load(Locale locale) async {
          if ("en" == locale.languageCode) {
              local.globalLocalMap = en;//   en,  en.dart       map
          } else if ("zh" == locale.languageCode) {
              local.globalLocalMap = zh;
          } else {
              local.globalLocalMap = zh;//          app   ,     
          }
          MyLocalizations.instance = local;
          return SynchronousFuture(MyLocalizations.instance);
      }
    }
    
  • 성능 및 유지 관리 문제 해결
  • 제3자 도구를 사용하여 다중 언어를 유지할 수 있다. 예를 들어phraseapp
  • phraseapp는 어떤 언어의 json 파일을 업로드하고 다른 언어의 json 파일을 생성할 수 있다
  • 여러 언어의 json 파일을 얻으면 수동으로dart로 전환할 수도 있고 스크립트
  • 로 전환할 수도 있다.
  • 스크립트 회색은 항상 간단합니다. 구체적으로는 붙이지 않습니다.sed로 첫 줄 "{"를 "var 기호로 바꾸고 $로 바꾸세요
  • 최근에 다국어 처리가 생겨서 해결되면 공유하고 flutter 흰둥이 하나, 소통 지정을 환영합니다~

    좋은 웹페이지 즐겨찾기