Локализация платформонезависимой части приложения

This commit is contained in:
Ivan Murashov
2017-09-04 18:57:30 +03:00
parent 3c494347dc
commit 6e8269b4df
19 changed files with 176 additions and 133 deletions

View File

@@ -2,13 +2,12 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'common.dart';
import 'network.dart';
import 'consts.dart';
abstract class BaseState<T> extends State<T> {
abstract class BaseState<T> extends State<StatefulWidget> {
bool loading = false;
String error = null;
String error;
String textFieldValue = '';
TextEditingController controller = new TextEditingController();
@@ -22,7 +21,7 @@ abstract class BaseState<T> extends State<T> {
backgroundColor: primaryColor, actions: getMenuButtons(context));
}
@overide getMenuButtons(BuildContext context) {
getMenuButtons(BuildContext context) {
return <Widget>[getFaqButton()];
}
@@ -38,7 +37,7 @@ abstract class BaseState<T> extends State<T> {
return new Stack(children: <Widget>[getScreenContent(), getProgressIndicator()]);
}
Widget getScreenContent(BuildContext context);
Widget getScreenContent();
String getTitle();
@@ -80,7 +79,7 @@ abstract class BaseState<T> extends State<T> {
getDecoratedTextWidget() {
return new Container(margin: new EdgeInsets.only(left: verticalMargin, right: verticalMargin),
padding: getPaddingForTextWidget(),
decoration: getDecoraionForTextWidget(),
decoration: getDecorationForTextWidget(),
child: getTextWidget());
}
@@ -94,7 +93,7 @@ abstract class BaseState<T> extends State<T> {
}
/// Метод возвращает BoxDecoration для _getDecoratedInputField
getDecoraionForTextWidget() {
getDecorationForTextWidget() {
return new BoxDecoration(color: getTextFilledBackground(),
border: new Border.all(color: textBorderColor, width: 1.0),
borderRadius: new BorderRadius.all(new Radius.circular(4.0)));
@@ -138,10 +137,10 @@ abstract class BaseState<T> extends State<T> {
return new Container(height: buttonHeight, child: new FlatButton(child: new Text(title,
style: new TextStyle(color: textColor)),
onPressed: () => startScanner(context)),
decoration: _getDecoraionForScanButton());
decoration: getDecorationForScanButton());
}
_getDecoraionForScanButton() {
getDecorationForScanButton() {
return new BoxDecoration(
border: new Border.all(color: primaryColor, width: 1.0),
borderRadius: new BorderRadius.all(new Radius.circular(4.0)));

View File

@@ -3,9 +3,10 @@ import 'package:flutter/material.dart';
import 'consts.dart';
import 'network.dart';
import 'registration.dart';
import 'purchase.dart';
import 'package:checker/registration/registration.dart';
import 'package:checker/purchase/purchase.dart';
import 'faq.dart';
import 'strings.dart';
// Канал для взаимодействия с кодом платформы.
const platform = const MethodChannel('com.dinect.checker/instance_id');
@@ -46,7 +47,7 @@ logout(BuildContext context) {
}
};
showYesNoDialog(context, 'Подтверждение', 'Вы действительно хотите выйти и ввести другой номер магазина?', positiveCalback);
showYesNoDialog(context, Strings.of(context).confirmation(), Strings.of(context).askChangeStore(), positiveCalback);
}
forceLogout(BuildContext context) {
@@ -100,12 +101,12 @@ showYesNoDialog(BuildContext context, String title, String content, VoidCallback
content: new Text(content),
actions: <Widget>[
new FlatButton(
child: new Text('Нет'),
child: new Text(Strings.of(context).no()),
onPressed: () {
Navigator.of(context).pop();
}
),
new FlatButton(
child: new Text('Да'),
child: new Text(Strings.of(context).yes()),
onPressed: positiveCallback)]));
}

View File

@@ -3,8 +3,8 @@ import 'package:flutter/material.dart';
// Serious constants
const String appName = "Dinect";
const String url = 'https://pos-api-autoclub.dinect.com/20130701/';
const String appToken = 'bdea0f3ba9034b688019a7cac753d1209e2b227f';
const String url = 'https://pos-api-int.dinect.com/20130701/';
const String appToken = '9fec83cdca38c357e6b65dbb17514cdd36bf2a08';
// Assets
const String logo_png = 'assets/registration_logo.png';
@@ -29,6 +29,5 @@ const Color faqTitlesColor = const Color(0xff404040);
// Dimens
const double verticalMargin = 28.0;
const double buttonVerticalMargin = 42.0;
const double buttonHeight = 48.0;
const double iconHeight = 20.0;

View File

@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'base_state.dart';
import 'consts.dart';
@@ -38,7 +37,7 @@ class EntryItem extends StatelessWidget {
class FAQScreen extends StatefulWidget {
FAQScreen(this.b);
bool b;
final bool b;
@override State createState() => new FAQScreenState<FAQScreen>(b);
}
@@ -46,16 +45,20 @@ class FAQScreen extends StatefulWidget {
class FAQScreenState<T> extends BaseState<FAQScreen> {
FAQScreenState(this.returnToScanner);
bool returnToScanner;
final bool returnToScanner;
@override String getTitle() {
return "FAQ";
}
@overide getMenuButtons(BuildContext context) {
@override getMenuButtons(BuildContext context) {
return <Widget>[getLogoutButton()];
}
@override String getHint() {
return null;
}
/// Метод возвращает ListView с блоками faq.
@override Widget getScreenContent() {
return new WillPopScope(onWillPop: onWillPop, child: new ListView.builder(

View File

@@ -8,10 +8,10 @@ import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';
import 'package:intl/src/intl_helpers.dart';
import 'stock_messages_messages_en.dart' as messages_messages_en;
import 'stock_messages_messages_es.dart' as messages_messages_es;
import 'stock_messages_messages_ru.dart' as messages_messages_ru;
import 'stock_messages_messages_ua.dart' as messages_messages_ua;
import 'messages_en.dart' as messages_messages_en;
import 'messages_es.dart' as messages_messages_es;
import 'messages_ru.dart' as messages_messages_ru;
import 'messages_ua.dart' as messages_messages_ua;
typedef Future<dynamic> LibraryLoader();
Map<String, LibraryLoader> _deferredLibraries = {

View File

@@ -25,10 +25,10 @@ class MessageLookup extends MessageLookupByLibrary {
"carry_purchase" : MessageLookupByLibrary.simpleMessage("Сarrying out a purchase"),
"complite_activ" : MessageLookupByLibrary.simpleMessage("Complete registration"),
"complite_purchase" : MessageLookupByLibrary.simpleMessage("Complete purchase"),
"confirm_purchase" : MessageLookupByLibrary.simpleMessage("You confirm the purchase for N USD"),
"confirm_purchase" : MessageLookupByLibrary.simpleMessage("You confirm the purchase for %s USD"),
"confirmation" : MessageLookupByLibrary.simpleMessage("Сonfirmation"),
"no" : MessageLookupByLibrary.simpleMessage("No"),
"purchase_complite" : MessageLookupByLibrary.simpleMessage("A purchase of N USD was complite"),
"purchase_complite" : MessageLookupByLibrary.simpleMessage("A purchase of %s USD was complite"),
"registration" : MessageLookupByLibrary.simpleMessage("Registration"),
"request_sent_wait_activ" : MessageLookupByLibrary.simpleMessage("The activation request for the application has been sent, wait for confirm activation"),
"reward" : MessageLookupByLibrary.simpleMessage("Reward"),

View File

@@ -25,10 +25,10 @@ class MessageLookup extends MessageLookupByLibrary {
"carry_purchase" : MessageLookupByLibrary.simpleMessage("Realizar la compra"),
"complite_activ" : MessageLookupByLibrary.simpleMessage("Terminar el registro"),
"complite_purchase" : MessageLookupByLibrary.simpleMessage("Terminar la compra"),
"confirm_purchase" : MessageLookupByLibrary.simpleMessage("¿Confirmais la compra por N euros?"),
"confirm_purchase" : MessageLookupByLibrary.simpleMessage("¿Confirmais la compra por %s euros?"),
"confirmation" : MessageLookupByLibrary.simpleMessage("Confirmacón"),
"no" : MessageLookupByLibrary.simpleMessage("No"),
"purchase_complite" : MessageLookupByLibrary.simpleMessage("La compra por N euros está realizada"),
"purchase_complite" : MessageLookupByLibrary.simpleMessage("La compra por %s euros está realizada"),
"registration" : MessageLookupByLibrary.simpleMessage("El registro"),
"request_sent_wait_activ" : MessageLookupByLibrary.simpleMessage("El requieremento de activación de aplicación esta mandado, esperad la activación por el administrador."),
"reward" : MessageLookupByLibrary.simpleMessage("Gratificación"),

View File

@@ -25,10 +25,10 @@ class MessageLookup extends MessageLookupByLibrary {
"carry_purchase" : MessageLookupByLibrary.simpleMessage("Проведение покупки"),
"complite_activ" : MessageLookupByLibrary.simpleMessage("Завершить регистрацию"),
"complite_purchase" : MessageLookupByLibrary.simpleMessage("Завершить покупку"),
"confirm_purchase" : MessageLookupByLibrary.simpleMessage("Вы подтверждаете покупку на N рублей"),
"confirm_purchase" : MessageLookupByLibrary.simpleMessage("Вы подтверждаете покупку на %s рублей"),
"confirmation" : MessageLookupByLibrary.simpleMessage("Подтверждение"),
"no" : MessageLookupByLibrary.simpleMessage("Нет"),
"purchase_complite" : MessageLookupByLibrary.simpleMessage("Покупка на сумму N рублей проведена"),
"purchase_complite" : MessageLookupByLibrary.simpleMessage("Покупка на сумму %s рублей проведена"),
"registration" : MessageLookupByLibrary.simpleMessage("Регистрация"),
"request_sent_wait_activ" : MessageLookupByLibrary.simpleMessage("Запрос на активацию приложения отправлен, дождитесь подтверждения активации администратором"),
"reward" : MessageLookupByLibrary.simpleMessage("Вознаграждение"),

View File

@@ -25,10 +25,10 @@ class MessageLookup extends MessageLookupByLibrary {
"carry_purchase" : MessageLookupByLibrary.simpleMessage("Проведення покупки"),
"complite_activ" : MessageLookupByLibrary.simpleMessage("Завершити реєстрацію"),
"complite_purchase" : MessageLookupByLibrary.simpleMessage("Завершити купівлю"),
"confirm_purchase" : MessageLookupByLibrary.simpleMessage("Ви підтверджуєте покупку на N гривень"),
"confirm_purchase" : MessageLookupByLibrary.simpleMessage("Ви підтверджуєте покупку на %s гривень"),
"confirmation" : MessageLookupByLibrary.simpleMessage("Підтвердження"),
"no" : MessageLookupByLibrary.simpleMessage("Ні"),
"purchase_complite" : MessageLookupByLibrary.simpleMessage("Купівля на суму N гривень проведена"),
"purchase_complite" : MessageLookupByLibrary.simpleMessage("Купівля на суму %s гривень проведена"),
"registration" : MessageLookupByLibrary.simpleMessage("Реєстрація"),
"request_sent_wait_activ" : MessageLookupByLibrary.simpleMessage("Запит на активацію додатку відправлений, дочекайтеся підтвердження активації адміністратором"),
"reward" : MessageLookupByLibrary.simpleMessage("Винагорода"),

View File

@@ -1,16 +1,16 @@
import 'package:flutter/material.dart';
import 'splash.dart';
import 'consts.dart';
import 'stock_strings.dart';
import 'strings.dart';
import 'dart:async';
import 'i18n/stock_messages_all.dart';
import 'i18n/messages_all.dart';
import 'package:intl/intl.dart';
Future<LocaleQueryData> _onLocaleChanged(Locale locale) async {
final String localeString = locale.toString();
await initializeMessages(localeString);
Intl.defaultLocale = localeString;
return StockStrings.instance;
return Strings.instance;
}
/// Точка входа в приложение.

View File

@@ -1,5 +1,4 @@
import 'package:flutter/services.dart';
import 'dart:async';
import 'consts.dart';

View File

@@ -1,14 +1,13 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'dart:convert';
import 'dart:async';
import 'dart:core';
import 'main.dart';
import 'common.dart';
import 'consts.dart';
import 'network.dart';
import 'base_state.dart';
import 'package:checker/strings.dart';
import 'package:checker/common.dart';
import 'package:checker/consts.dart';
import 'package:checker/network.dart';
import 'package:checker/base_state.dart';
import 'purchase_success.dart';
/// Экран проведения покупки.
@@ -16,8 +15,8 @@ class PurchaseScreen extends StatefulWidget {
PurchaseScreen(this.user, this.card);
String user;
String card;
final String user;
final String card;
@override State createState() => new PurchaseScreenState<PurchaseScreen>(user, card);
}
@@ -37,25 +36,39 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
@override Widget getScreenContent() {
return new Column(
children: <Widget>[new Expanded(child: new ListView(children: <Widget>[
getValueWithTitle('ФИО', user['first_name'] == null ? '' : user['first_name']),
getValueWithTitle('Карта', card),
getValueWithTitle('Вознаграждение', loyality),
getValueWithTitle(Strings.of(context).userName(), user['first_name'] == null ? '' : user['first_name']),
getValueWithTitle(Strings.of(context).card(), card),
getValueWithTitle(Strings.of(context).reward(), loyality),
getHintLabel(),
getDecoratedTextWidget(),
buildButton(new EdgeInsets.only(top: 36.0, left: buttonVerticalMargin, right: buttonVerticalMargin), buildRaisedButton(context, 'ЗАВЕРШИТЬ ПОКУПКУ', () => onPurchaseClick(context))),
buildButton(new EdgeInsets.only(top: 24.0, left: buttonVerticalMargin, right: buttonVerticalMargin), buildFlatButton(context, 'СКАНИРОВАТЬ', primaryColor))
buildButton(getScreenMargins(36.0), getCompleteButton()),
buildButton(getScreenMargins(24.0), getScanButton())
]))]);
}
getScreenMargins(double top) {
double side = 42.0;
return new EdgeInsets.only(top: top, left: side, right: side);
}
getCompleteButton() {
String title = Strings.of(context).completePurchase();
return buildRaisedButton(context, title, () => onPurchaseClick(context));
}
getScanButton() {
return buildFlatButton(context, Strings.of(context).scan(), primaryColor);
}
@override String getTitle() {
return "Проведение покупки";
return Strings.of(context).carryingPurchase();
}
@override getHint() {
return 'Сумма';
return Strings.of(context).sum();
}
@overide getMenuButtons(BuildContext context) {
@override getMenuButtons(BuildContext context) {
return <Widget>[getFaqButton(), getLogoutButton()];
}
@@ -130,7 +143,7 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
try {
sumTotal = num.parse(text);
} catch(exception, stacktrace) {
} catch(exception) {
print(exception);
try {
int idx = text.indexOf('.');
@@ -140,7 +153,7 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
fractionalPart = fractionalPart.substring(0, 2);
}
return '${integerPart}.${fractionalPart}';
} catch(exception, stacktrace){
} catch(exception){
print(exception);
}
}
@@ -150,17 +163,17 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
onPurchaseClick(BuildContext context) {
String val = _parseSum(controller.text);
showDialog(context: context, child: new AlertDialog(
title: new Text('Подтверждение'),
content: new Text('Вы подтверждаете покупку на ${val} руб?'),
title: new Text(Strings.of(context).confirmation()),
content: new Text(getContentMessage(val)),
actions: <Widget>[
new FlatButton(
child: new Text('Нет'),
child: new Text(Strings.of(context).no()),
onPressed: () {
Navigator.of(context).pop();
},
),
new FlatButton(
child: new Text('Да'),
child: new Text(Strings.of(context).yes()),
onPressed: () {
purchase(val);
},
@@ -168,7 +181,11 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
]));
}
purchase(String sum_total) async {
getContentMessage(String val) {
return Strings.of(context).confirmPurchase(val);
}
purchase(String sumTotal) async {
if (await platform.invokeMethod('isOnline')) {
@@ -180,7 +197,7 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
'doc_id': result,
'curr_iso_code': '643',
'commit': 'true',
'sum_total': sum_total
'sum_total': sumTotal
};
var headers = {
@@ -192,7 +209,7 @@ class PurchaseScreenState<T> extends BaseState<PurchaseScreen> {
print(response.body);
Navigator.of(context).pop();
pushRoute(context, new PurchaseSuccessScreen(sum_total, user['first_name'] == null ? '' : user['first_name']));
pushRoute(context, new PurchaseSuccessScreen(sumTotal, user['first_name'] == null ? '' : user['first_name']));
}).catchError((error) {
print(error.toString());

View File

@@ -1,18 +1,16 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'main.dart';
import 'common.dart';
import 'consts.dart';
import 'base_state.dart';
import 'purchase.dart';
import 'package:checker/common.dart';
import 'package:checker/consts.dart';
import 'package:checker/strings.dart';
import 'package:checker/base_state.dart';
/// Экран проведения покупки.
class PurchaseSuccessScreen extends StatefulWidget {
PurchaseSuccessScreen(this.val, this.name);
String val;
String name;
final String val;
final String name;
@override State createState() => new PurchaseSuccessScreenState(val, name);
}
@@ -24,28 +22,46 @@ class PurchaseSuccessScreenState<T> extends BaseState<PurchaseSuccessScreen> {
String sum;
String username;
@overide getMenuButtons(BuildContext context) {
@override getMenuButtons(BuildContext context) {
return <Widget>[getFaqButton(), getLogoutButton()];
}
@override String getTitle() {
return "Проведение покупки";
return Strings.of(context).carryingPurchase();
}
@override String getHint() {
return null;
}
@override Widget getScreenContent() {
return new Column(children: <Widget>[
getValueWithTitle('Покупатель', username),
getValueWithTitle(Strings.of(context).buyer(), username),
getSuccessMessage(),
new Expanded(child: new Center()),
buildButton(new EdgeInsets.only(bottom: 74.0, left: buttonVerticalMargin, right: buttonVerticalMargin), buildRaisedButton(context, 'СКАНИРОВАТЬ', () => startScanner(context)))
buildButton(getScreenMargins(74.0), getScanButton())
]);
}
getScreenMargins(double bottom) {
double side = 42.0;
return new EdgeInsets.only(bottom: bottom, left: side, right: side);
}
getScanButton() {
String title = Strings.of(context).scan();
return buildRaisedButton(context, title, () => startScanner(context));
}
getSuccessMessage() {
return new Row(children: <Widget>[new Expanded(child: new Container(margin: new EdgeInsets.only(top: 20.0), height: 64.0,
decoration: new BoxDecoration(color: greenBackground),
child: new Center(child: new Text('Покупка на сумму ${sum} руб. проведена', textAlign: TextAlign.center,
child: new Center(child: new Text(getMessageTitle(), textAlign: TextAlign.center,
style: new TextStyle(fontWeight: FontWeight.bold, color: tokenActiveTextColor)))))]);
}
getMessageTitle() {
return Strings.of(context).purchaseCompleted(sum);
}
}

View File

@@ -1,11 +1,12 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'common.dart';
import 'consts.dart';
import 'network.dart';
import 'dart:convert'; // Пакет для обработки json с ответом от сервера.
import 'base_state.dart';
import 'package:checker/common.dart';
import 'package:checker/consts.dart';
import 'package:checker/network.dart';
import 'package:checker/base_state.dart';
import 'package:checker/strings.dart';
class FinishRegistrationScreen extends StatefulWidget {
@override State createState() => new _RegistrationScreenState();
@@ -23,11 +24,11 @@ class _RegistrationScreenState extends BaseState<FinishRegistrationScreen> {
}
@override String getTitle() {
return "Регистрация";
return Strings.of(context).registration();
}
@override getHint() {
return 'ID магазина';
return Strings.of(context).idStore();
}
@override Widget getScreenContent() {
@@ -36,7 +37,9 @@ class _RegistrationScreenState extends BaseState<FinishRegistrationScreen> {
getHintLabel(),
getDecoratedTextWidget(),
getMessage(),
buildRaisedButton(context, _tokenActive ? 'ЗАВЕРШИТЬ РЕГИСТРАЦИЮ' : 'ОБНОВИТЬ СТАТУС АКТИВАЦИИ', () => handleTap())
buildRaisedButton(context, _tokenActive
? Strings.of(context).completeRegistration()
: Strings.of(context).refreshActivationStatus(), () => handleTap())
]);
}
@@ -96,7 +99,9 @@ class _RegistrationScreenState extends BaseState<FinishRegistrationScreen> {
/// Получаем текст сообщения, в зависимости от статуса активации.
getMessageString() {
return _tokenActive ? tokenActiveMessage : tokenWaitMessage;
return _tokenActive
? Strings.of(context).completeRegistration()
: Strings.of(context).refreshActivationStatus();
}
/// Фоновое изображение для сообщения.

View File

@@ -1,12 +1,11 @@
import 'package:flutter/material.dart';
import 'dart:convert'; // Пакет для обработки json с ответом от сервера.
import 'common.dart';
import 'network.dart';
import 'consts.dart';
import 'package:checker/common.dart';
import 'package:checker/network.dart';
import 'package:checker/base_state.dart';
import 'package:checker/strings.dart';
import 'activate_token.dart';
import 'base_state.dart';
import 'stock_strings.dart';
/// Экран регистрации магазина и кассы.
class RegistrationScreen extends StatefulWidget {
@@ -16,11 +15,11 @@ class RegistrationScreen extends StatefulWidget {
class _RegistrationScreenState extends BaseState<RegistrationScreen> {
@override String getTitle() {
return StockStrings.of(context).registration();
return Strings.of(context).registration();
}
@override getHint() {
return 'ID магазина';
return Strings.of(context).idStore();
}
// Список виджетов, автоматически прокручиваемый вверх при открытии клавиатуры.
@@ -38,7 +37,7 @@ class _RegistrationScreenState extends BaseState<RegistrationScreen> {
// Возвращает кнопку регистрации.
getButton() {
return new Container(margin: new EdgeInsets.only(top: 36.0), child:
buildRaisedButton(context, 'ЗАРЕГИСТРИРОВАТЬ', getOnPressed()));
buildRaisedButton(context, Strings.of(context).signUp(), getOnPressed()));
}
// Возвращает обработчик нажатий на кнопку регистрации.

View File

@@ -5,8 +5,8 @@ import 'dart:convert';
import 'common.dart';
import 'network.dart';
import 'consts.dart';
import 'registration.dart';
import 'activate_token.dart';
import 'package:checker/registration/registration.dart';
import 'package:checker/registration/activate_token.dart';
class SplashScreen extends StatelessWidget {

View File

@@ -1,39 +0,0 @@
import 'package:intl/intl.dart';
import 'package:flutter/widgets.dart';
import 'dart:async';
class StockStrings extends LocaleQueryData {
static StockStrings of(BuildContext context) {
return LocaleQuery.of(context);
}
static final StockStrings instance = new StockStrings();
String ID_Store() => Intl.message('ID_Store');
String sign_up() => Intl.message('sign_up');
String registration() => Intl.message('registration');
String specify_din_store() => Intl.message('specify_din_store');
String confirmation() => Intl.message('confirmation');
String ask_change_store() => Intl.message('ask_change_store');
String yes() => Intl.message('yes');
String no() => Intl.message('no');
String request_sent_wait_activ() => Intl.message('request_sent_wait_activ');
String update_activ_status() => Intl.message('update_activ_status');
String app_activ() => Intl.message('app_activ');
String complite_activ() => Intl.message('complite_activ');
String card_scaner() => Intl.message('card_scaner');
String user_name() => Intl.message('user_name');
String card() => Intl.message('card');
String reward() => Intl.message('reward');
String sum() => Intl.message('sum');
String carry_purchase() => Intl.message('carry_purchase');
String complite_purchase() => Intl.message('complite_purchase');
String scan() => Intl.message('scan');
String confirm_purchase() => Intl.message('confirm_purchase');
String buyer() => Intl.message('buyer');
String purchase_complite() => Intl.message('purchase_complite');
String ID_not_found() => Intl.message('ID_not_found');
}

43
lib/strings.dart Normal file
View File

@@ -0,0 +1,43 @@
import 'package:intl/intl.dart';
import 'package:flutter/widgets.dart';
import 'package:sprintf/sprintf.dart';
class Strings extends LocaleQueryData {
static Strings of(BuildContext context) {
return LocaleQuery.of(context);
}
static final Strings instance = new Strings();
String confirmPurchase(String val) {
return sprintf(Intl.message('confirm_purchase'), val);
}
String purchaseCompleted(String val) {
return sprintf(Intl.message('purchase_complite'), val);
}
String idStore() => Intl.message('ID_Store');
String signUp() => Intl.message('sign_up');
String registration() => Intl.message('registration');
String specifyDinStore() => Intl.message('specify_din_store');
String confirmation() => Intl.message('confirmation');
String askChangeStore() => Intl.message('ask_change_store');
String yes() => Intl.message('yes');
String no() => Intl.message('no');
String requestSentWaitActivation() => Intl.message('request_sent_wait_activ');
String refreshActivationStatus() => Intl.message('update_activ_status');
String appActivated() => Intl.message('app_activ');
String completeRegistration() => Intl.message('complite_activ');
String cardScanner() => Intl.message('card_scaner');
String userName() => Intl.message('user_name');
String card() => Intl.message('card');
String reward() => Intl.message('reward');
String sum() => Intl.message('sum');
String carryingPurchase() => Intl.message('carry_purchase');
String completePurchase() => Intl.message('complite_purchase');
String scan() => Intl.message('scan');
String buyer() => Intl.message('buyer');
String idNotFound() => Intl.message('ID_not_found');
}

View File

@@ -5,6 +5,7 @@ dependencies:
http: '>=0.11.3+12'
intl: '>=0.14.0 <0.16.0'
intl_translation: '>=0.14.0 <0.16.0'
sprintf: "^3.0.2"
flutter:
sdk: flutter