Строковый XML-файл во Флаттере - PullRequest
0 голосов
/ 27 апреля 2018

В тексте строки флаттера непосредственно установлен виджет TextField, например:

new Text('Hello,  How are you?')

Это правильный путь? или мы можем сохранить всю строку в одном файле и использовать ее как:

<string name="name_hint">Hello, How are you?</string>

Возможно ли это?

Ответы [ 5 ]

0 голосов
/ 01 августа 2019

enter image description here

Для тех из вас, кто не хочет использовать какой-либо сторонний плагин, вот как вы можете это сделать.

  1. Создать папку strings в asset. Поместите в него свой языковой файл.

    asset
      strings
      - en.json // for english 
      - ru.json  // for russian
    
  2. Теперь в en.json напишите вашу строку, например.

    {
      "text1": "Hello",
      "text2": "World"
    }
    

    Аналогично, в ru.json,

    {
      "text1": "Привет",
      "text2": "Мир"
    }
    
  3. Добавьте это в pubspec.yaml файл (обратите внимание на пробелы)

    flutter:
    
      uses-material-design: true
    
      assets:
        - assets/json/en.json
        - assets/json/ru.json
    
  4. Теперь все готово для использования этих строк в вашем приложении. Вот пример кода, AppBar показывает переведенный текст.

    void main() {
      runApp(
        MaterialApp(
          locale: Locale("ru"), // switch between en and ru to see effect
          localizationsDelegates: [const DemoLocalizationsDelegate(), GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate],
          supportedLocales: [const Locale('en', ''), const Locale('ru', '')],
          home: HomePage(),
        ),
      );
    }
    
    class HomePage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: Text(DemoLocalizations.of(context).getText("text2") ?? "Error")),
        );
      }
    }
    
    // this class is used for localizations
    class DemoLocalizations {
      static DemoLocalizations of(BuildContext context) {
        return Localizations.of<DemoLocalizations>(context, DemoLocalizations);
      }
    
      String getText(String key) => language[key];
    }
    
    Map<String, dynamic> language;
    
    class DemoLocalizationsDelegate extends LocalizationsDelegate<DemoLocalizations> {
      const DemoLocalizationsDelegate();
    
      @override
      bool isSupported(Locale locale) => ['en', 'ru'].contains(locale.languageCode);
    
      @override
      Future<DemoLocalizations> load(Locale locale) async {
        String string = await rootBundle.loadString("assets/json/${locale.languageCode}.json");
        language = json.decode(string);
        return SynchronousFuture<DemoLocalizations>(DemoLocalizations());
      }
    
      @override
      bool shouldReload(DemoLocalizationsDelegate old) => false;
    }
    
0 голосов
/ 26 февраля 2019
  create "Strings.dart" file and add the below line==>


 class Strings
 {
      static String welcomeScreen="WelCome Page";
      static String loadingMessage="Loading Please Wait...!";
 }

 And then call the file using the below line using the widget
 Text(Strings.loadingMessage)

 Make sure that the String.dart file has been imported
0 голосов
/ 17 июля 2018

Вы можете использовать методы, представленные в разделах интернационализации документации, для управления как централизованным управлением строками, так и переводами (если вам нужны переводы)

https://flutter.io/tutorials/internationalization/

Это может быть излишним для простого приложения с несколькими строками.

0 голосов
/ 06 декабря 2018

Flutter в настоящее время не имеет выделенной ресурсоподобной системы для строк. На данный момент лучше всего хранить текст в классе как статические поля и получать к ним доступ оттуда. Например:

class Strings {
  static const String welcomeMessage = "Welcome To Flutter";
}

Затем в своем коде вы можете получить доступ к своим строкам следующим образом:

Text(Strings.welcomeMessage)

источник


Редактировать май 19:

Теперь этот пакет , который позволяет создавать файлы JSON с вашими строками. Это позволит вам создавать строки для множественного числа, полов и языков и т. Д.

Вы можете создать отдельный файл json для каждого языка, например:

string_en.json

{
"thanks": "Thanks."
}

string_nl.json

{    
"thanks": "Dankjewel."
}

А затем используйте это для доступа к нему

S.of(context).thanks;

Он будет знать, какой язык выбрать, основываясь на языке по умолчанию вашего телефона.

0 голосов
/ 27 апреля 2018

Это правильный путь. Во флаттере вам не нужны файлы .xml или .css для управления вашим макетом / материалом.

Все управляется с помощью кода дротика. Что делает все намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...