Changed restore wallet from seed screen. Added node.imonero.org:18081 to list of default nodes.

M committed Jan 16, 2020 at 18:05 UTC 6154c6dfa5e3534e1b66b7d9b03be2c03094070a
16 files changed +313 -165
assets/node_list.yml
+3
@@ -18,4 +18,7 @@
18 is_default: false
19 -
20 uri: opennode.xmr-tw.org:18089
21 + is_default: false
22 +-
23 + uri: node.imonero.org:18081
24 is_default: false
\ No newline at end of file
lib/generated/i18n.dart
+63
@@ -286,6 +286,9 @@ class S implements WidgetsLocalizations {
286 String wallet_list_failed_to_remove(String wallet_name, String error) => "Failed to remove ${wallet_name} wallet. ${error}";
287 String wallet_list_loading_wallet(String wallet_name) => "Loading ${wallet_name} wallet";
288 String wallet_list_removing_wallet(String wallet_name) => "Removing ${wallet_name} wallet";
289 + String get paste => "Paste";
290 + String get restore_from_seed_placeholder => "Please enter or paste your seed here";
291 + String get add_new_word => "Add new word";
292 }
293
294 class $de extends S {
@@ -824,6 +827,12 @@ class $de extends S {
827 String wallet_list_failed_to_load(String wallet_name, String error) => "Laden fehlgeschlagen ${wallet_name} Wallet. ${error}";
828 @override
829 String wallet_list_removing_wallet(String wallet_name) => "Entfernen ${wallet_name} Wallet";
830 + @override
831 + String get paste => "Einfügen";
832 + @override
833 + String get restore_from_seed_placeholder => "Bitte geben Sie hier Ihren Code ein";
834 + @override
835 + String get add_new_word => "Neues Wort hinzufügen";
836 }
837
838 class $hi extends S {
@@ -1362,6 +1371,12 @@ class $hi extends S {
1371 String wallet_list_failed_to_load(String wallet_name, String error) => "लोड करने में विफल ${wallet_name} बटुआ. ${error}";
1372 @override
1373 String wallet_list_removing_wallet(String wallet_name) => "निकाला जा रहा है ${wallet_name} बटुआ";
1374 + @override
1375 + String get paste => "पेस्ट करें";
1376 + @override
1377 + String get restore_from_seed_placeholder => "कृपया अपना कोड वाक्यांश यहां दर्ज करें या पेस्ट करें";
1378 + @override
1379 + String get add_new_word => "नया शब्द जोड़ें";
1380 }
1381
1382 class $ru extends S {
@@ -1900,6 +1915,12 @@ class $ru extends S {
1915 String wallet_list_failed_to_load(String wallet_name, String error) => "Ошибка при загрузке ${wallet_name} кошелька. ${error}";
1916 @override
1917 String wallet_list_removing_wallet(String wallet_name) => "Удаление ${wallet_name} кошелька";
1918 + @override
1919 + String get paste => "Вставить";
1920 + @override
1921 + String get restore_from_seed_placeholder => "Введите или вставте код фразу вашего кошелька";
1922 + @override
1923 + String get add_new_word => "Добавить новое слово";
1924 }
1925
1926 class $ko extends S {
@@ -2438,6 +2459,12 @@ class $ko extends S {
2459 String wallet_list_failed_to_load(String wallet_name, String error) => "불러 오지 못했습니다 ${wallet_name} 지갑. ${error}";
2460 @override
2461 String wallet_list_removing_wallet(String wallet_name) => "풀이 ${wallet_name} 지갑";
2462 + @override
2463 + String get paste => "풀";
2464 + @override
2465 + String get restore_from_seed_placeholder => "여기에 코드 문구를 입력하거나 붙여 넣으십시오.";
2466 + @override
2467 + String get add_new_word => "새로운 단어 추가";
2468 }
2469
2470 class $pt extends S {
@@ -2976,6 +3003,12 @@ class $pt extends S {
3003 String wallet_list_failed_to_load(String wallet_name, String error) => "Falha ao abrir a carteira ${wallet_name}. ${error}";
3004 @override
3005 String wallet_list_removing_wallet(String wallet_name) => "Removendo a carteira ${wallet_name}";
3006 + @override
3007 + String get paste => "Colar";
3008 + @override
3009 + String get restore_from_seed_placeholder => "Digite ou cole sua frase de código aqui";
3010 + @override
3011 + String get add_new_word => "Adicionar nova palavra";
3012 }
3013
3014 class $ja extends S {
@@ -3514,6 +3547,12 @@ class $ja extends S {
3547 String wallet_list_failed_to_load(String wallet_name, String error) => "読み込みに失敗しました ${wallet_name} 財布. ${error}";
3548 @override
3549 String wallet_list_removing_wallet(String wallet_name) => "取りはずし ${wallet_name} 財布";
3550 + @override
3551 + String get paste => "ペースト";
3552 + @override
3553 + String get restore_from_seed_placeholder => "ここにコードフレーズを入力または貼り付けてください";
3554 + @override
3555 + String get add_new_word => "新しい単語を追加";
3556 }
3557
3558 class $en extends S {
@@ -4056,6 +4095,12 @@ class $pl extends S {
4095 String wallet_list_failed_to_load(String wallet_name, String error) => "Nie udało się załadować ${wallet_name} portfel. ${error}";
4096 @override
4097 String wallet_list_removing_wallet(String wallet_name) => "Usuwanie ${wallet_name} portfel";
4098 + @override
4099 + String get paste => "Pasta";
4100 + @override
4101 + String get restore_from_seed_placeholder => "Wpisz lub wklej tutaj swoją frazę kodową";
4102 + @override
4103 + String get add_new_word => "Dodaj nowe słowo";
4104 }
4105
4106 class $es extends S {
@@ -4594,6 +4639,12 @@ class $es extends S {
4639 String wallet_list_failed_to_load(String wallet_name, String error) => "No se pudo cargar ${wallet_name} la billetera. ${error}";
4640 @override
4641 String wallet_list_removing_wallet(String wallet_name) => "Retirar ${wallet_name} billetera";
4642 + @override
4643 + String get paste => "Pegar";
4644 + @override
4645 + String get restore_from_seed_placeholder => "Ingrese o pegue su frase de código aquí";
4646 + @override
4647 + String get add_new_word => "Agregar palabra nueva";
4648 }
4649
4650 class $nl extends S {
@@ -5132,6 +5183,12 @@ class $nl extends S {
5183 String wallet_list_failed_to_load(String wallet_name, String error) => "Laden mislukt ${wallet_name} portemonnee. ${error}";
5184 @override
5185 String wallet_list_removing_wallet(String wallet_name) => "Verwijderen ${wallet_name} portemonnee";
5186 + @override
5187 + String get paste => "Plakken";
5188 + @override
5189 + String get restore_from_seed_placeholder => "Voer hier uw codefrase in of plak deze";
5190 + @override
5191 + String get add_new_word => "Nieuw woord toevoegen";
5192 }
5193
5194 class $zh extends S {
@@ -5670,6 +5727,12 @@ class $zh extends S {
5727 String wallet_list_failed_to_load(String wallet_name, String error) => "加载失败 ${wallet_name} 钱包. ${error}";
5728 @override
5729 String wallet_list_removing_wallet(String wallet_name) => "拆下 ${wallet_name} 钱包";
5730 + @override
5731 + String get paste => "糊";
5732 + @override
5733 + String get restore_from_seed_placeholder => "请在此处输入或粘贴您的代码短语";
5734 + @override
5735 + String get add_new_word => "添加新词";
5736 }
5737
5738 class GeneratedLocalizationsDelegate extends LocalizationsDelegate<S> {
lib/src/screens/restore/restore_wallet_from_seed_page.dart
+22 -38
@@ -6,7 +6,6 @@ import 'package:flutter/services.dart';
6 import 'package:shared_preferences/shared_preferences.dart';
7 import 'package:cake_wallet/routes.dart';
8 import 'package:cake_wallet/generated/i18n.dart';
9 -import 'package:cake_wallet/src/widgets/primary_button.dart';
9 import 'package:cake_wallet/src/domain/services/wallet_list_service.dart';
10 import 'package:cake_wallet/src/domain/services/wallet_service.dart';
11 import 'package:cake_wallet/src/screens/base_page.dart';
@@ -22,15 +21,27 @@ class RestoreWalletFromSeedPage extends BasePage {
21 final WalletListService walletsService;
22 final WalletService walletService;
23 final SharedPreferences sharedPreferences;
24 + final formKey = GlobalKey<_RestoreFromSeedFormState>();
25
26 @override
27 String get title => S.current.restore_title_from_seed;
28
29 @override
30 - Widget body(BuildContext context) => RestoreFromSeedForm();
30 + Widget trailing(BuildContext context) => SizedBox(
31 + width: 80,
32 + height: 20,
33 + child: FlatButton(
34 + child: Text(S.of(context).clear),
35 + padding: EdgeInsets.all(0),
36 + onPressed: () => formKey?.currentState?.clear()));
37 +
38 + @override
39 + Widget body(BuildContext context) => RestoreFromSeedForm(key: formKey);
40 }
41
42 class RestoreFromSeedForm extends StatefulWidget {
43 + RestoreFromSeedForm({Key key}) : super(key: key);
44 +
45 @override
46 _RestoreFromSeedFormState createState() => _RestoreFromSeedFormState();
47 }
@@ -39,6 +50,8 @@ class _RestoreFromSeedFormState extends State<RestoreFromSeedForm> {
50 final _seedKey = GlobalKey<SeedWidgetState>();
51 bool _reactionSet = false;
52
53 + void clear() => _seedKey.currentState.clear();
54 +
55 @override
56 Widget build(BuildContext context) {
57 final walletRestorationStore = Provider.of<WalletRestorationStore>(context);
@@ -50,42 +63,13 @@ class _RestoreFromSeedFormState extends State<RestoreFromSeedForm> {
63 onTap: () =>
64 SystemChannels.textInput.invokeMethod<void>('TextInput.hide'),
65 child: Container(
53 - padding: EdgeInsets.only(left: 20.0, right: 20.0, bottom: 20.0),
54 - child: Column(
55 - children: <Widget>[
56 - Expanded(
57 - child: SeedWidget(
58 - key: _seedKey,
59 - onMnemoticChange: (seed) => walletRestorationStore.setSeed(seed),
60 - )),
61 - Container(
62 - alignment: Alignment.bottomCenter,
63 - child: PrimaryButton(
64 - onPressed: () {
65 - walletRestorationStore.validateSeed(_seedKey.currentState.items);
66 - _seedKey.currentState.setErrorMessage(walletRestorationStore.errorMessage);
67 -
68 - if (!walletRestorationStore.isValid) {
69 - _seedKey.currentState.invalidate();
70 - return;
71 - }
72 -
73 - _seedKey.currentState.validated();
74 -
75 - Navigator.of(context).pushNamed(
76 - Routes.restoreWalletFromSeedDetails,
77 - arguments: _seedKey.currentState.items);
78 - },
79 - text: S.of(context).restore_next,
80 - color: Theme.of(context)
81 - .primaryTextTheme
82 - .button
83 - .backgroundColor,
84 - borderColor: Theme.of(context)
85 - .primaryTextTheme
86 - .button
87 - .decorationColor))
88 - ],
66 + padding: EdgeInsets.only(left: 20.0, right: 20.0),
67 + child: SeedWidget(
68 + key: _seedKey,
69 + onMnemoticChange: (seed) => walletRestorationStore.setSeed(seed),
70 + onFinish: () => Navigator.of(context).pushNamed(
71 + Routes.restoreWalletFromSeedDetails,
72 + arguments: _seedKey.currentState.items),
73 ),
74 ),
75 );
lib/src/widgets/primary_button.dart
+7 -4
@@ -7,12 +7,15 @@ class PrimaryButton extends StatelessWidget {
7 {@required this.onPressed,
8 @required this.text,
9 @required this.color,
10 - @required this.borderColor});
10 + @required this.borderColor,
11 +
12 + this.isDisabled = false});
13
14 final VoidCallback onPressed;
15 final Color color;
16 final Color borderColor;
17 final String text;
18 + final bool isDisabled;
19
20 @override
21 Widget build(BuildContext context) {
@@ -20,15 +23,15 @@ class PrimaryButton extends StatelessWidget {
23 minWidth: double.infinity,
24 height: 56.0,
25 child: FlatButton(
23 - onPressed: onPressed,
24 - color: color,
26 + onPressed: isDisabled ? null : onPressed,
27 + color: isDisabled ? Colors.grey : color,
28 shape: RoundedRectangleBorder(
29 side: BorderSide(color: borderColor),
30 borderRadius: BorderRadius.circular(10.0)),
31 child: Text(text,
32 style: TextStyle(
33 fontSize: 16.0,
31 - color: Theme.of(context).primaryTextTheme.button.color)),
34 + color: isDisabled ? Palette.darkGrey : Theme.of(context).primaryTextTheme.button.color)),
35 ));
36 }
37 }
lib/src/widgets/seed_widget.dart
+162 -112
@@ -1,3 +1,4 @@
1 +import 'package:cake_wallet/src/widgets/primary_button.dart';
2 import 'package:flutter/cupertino.dart';
3 import 'package:flutter/material.dart';
4 import 'package:flutter/services.dart';
@@ -7,26 +8,35 @@ import 'package:cake_wallet/src/domain/common/mnemotic_item.dart';
8 import 'package:cake_wallet/generated/i18n.dart';
9
10 class SeedWidget extends StatefulWidget {
10 - SeedWidget({Key key, this.onMnemoticChange}) : super(key: key);
11 + SeedWidget({Key key, this.onMnemoticChange, this.onFinish}) : super(key: key);
12
13 final Function(List<MnemoticItem>) onMnemoticChange;
14 + final Function() onFinish;
15
16 @override
17 SeedWidgetState createState() => SeedWidgetState();
18 }
19
20 class SeedWidgetState extends State<SeedWidget> {
21 + static const maxLength = 25;
22 +
23 List<MnemoticItem> items = <MnemoticItem>[];
24 final _seedController = TextEditingController();
25 + final _seedTextFieldKey = GlobalKey();
26 MnemoticItem selectedItem;
27 bool isValid;
28 String errorMessage;
29
30 + MnemoticItem currentMnemotic;
31 + bool isCurrentMnemoticValid;
32 +
33 @override
34 void initState() {
35 super.initState();
28 - isValid = true;
29 - _seedController.addListener(() => mnemoticFromText(_seedController.text));
36 + isValid = false;
37 + isCurrentMnemoticValid = false;
38 + _seedController
39 + .addListener(() => changeCurrentMnemotic(_seedController.text));
40 }
41
42 void addMnemotic(String text) {
@@ -66,10 +76,14 @@ class SeedWidgetState extends State<SeedWidget> {
76 }
77
78 void selectMnemotic(MnemoticItem item) {
69 - setState(() => selectedItem = item);
70 - _seedController
71 - ..text = item.text
72 - ..selection = TextSelection.collapsed(offset: item.text.length);
79 + setState(() {
80 + selectedItem = item;
81 + currentMnemotic = item;
82 +
83 + _seedController
84 + ..text = item.text
85 + ..selection = TextSelection.collapsed(offset: item.text.length);
86 + });
87 }
88
89 void onMnemoticTap(MnemoticItem item) {
@@ -107,6 +121,7 @@ class SeedWidgetState extends State<SeedWidget> {
121 void clear() {
122 setState(() {
123 items = [];
124 + selectedItem = null;
125 _seedController.text = '';
126
127 if (widget.onMnemoticChange != null) {
@@ -132,119 +147,154 @@ class SeedWidgetState extends State<SeedWidget> {
147 mnemoticFromText(text);
148 }
149
150 + void changeCurrentMnemotic(String text) {
151 + setState(() {
152 + if (text == null) {
153 + currentMnemotic = null;
154 + isCurrentMnemoticValid = false;
155 + return;
156 + }
157 +
158 + currentMnemotic = MnemoticItem(text: text, dic: EnglishMnemonics.words);
159 + isCurrentMnemoticValid = currentMnemotic.isCorrect();
160 + });
161 + }
162 +
163 + void saveCurrentMnemoticToItems() {
164 + setState(() {
165 + if (selectedItem != null) {
166 + selectedItem.changeText(currentMnemotic.text);
167 + selectedItem = null;
168 + } else {
169 + items.add(currentMnemotic);
170 + }
171 +
172 + currentMnemotic = null;
173 + _seedController.text = '';
174 + });
175 + }
176 +
177 @override
178 Widget build(BuildContext context) {
179 return Container(
180 child: Column(children: [
139 - TextFormField(
140 - onFieldSubmitted: (text) => onFieldSubmitted(text),
141 - style: TextStyle(fontSize: 14.0),
142 - controller: _seedController,
143 - textInputAction: TextInputAction.done,
144 - decoration: InputDecoration(
145 - suffixIcon: GestureDetector(
146 - behavior: HitTestBehavior.opaque,
147 - child: SizedBox(
148 - width: 65,
149 - child: Row(
150 - mainAxisAlignment: MainAxisAlignment.spaceBetween,
151 - children: <Widget>[
152 - InkWell(
153 - onTap: () {
154 - clear();
155 - FocusScope.of(context).unfocus();
156 - },
157 - child: Container(
158 - height: 20,
159 - width: 20,
160 - padding: EdgeInsets.all(3),
161 - decoration: BoxDecoration(
162 - color: Palette.wildDarkBlueWithOpacity,
163 - borderRadius: BorderRadius.circular(10.0)),
164 - child: Image.asset(
165 - 'assets/images/x.png',
166 - color: Palette.wildDarkBlue,
167 - ),
168 - ),
169 - ),
170 - InkWell(
171 - onTap: () async => Clipboard.getData('text/plain')
172 - .then((clipboard) => replaceText(clipboard.text)),
173 - child: Container(
174 - height: 35,
175 - width: 35,
176 - padding: EdgeInsets.all(7),
177 - decoration: BoxDecoration(
178 - color: Palette.wildDarkBlueWithOpacity,
179 - borderRadius: BorderRadius.circular(10.0)),
180 - child: Image.asset('assets/images/paste_button.png',
181 - height: 5, width: 5, color: Palette.wildDarkBlue),
182 - ),
183 - )
184 - ],
185 - ),
186 - ),
187 - ),
188 - errorText: errorMessage,
189 - hintStyle: TextStyle(color: Theme.of(context).hintColor),
190 - hintText: S.of(context).widgets_seed,
191 - focusedBorder: UnderlineInputBorder(
192 - borderSide: BorderSide(color: Palette.cakeGreen, width: 2.0)),
193 - enabledBorder: UnderlineInputBorder(
194 - borderSide: BorderSide(
195 - color:
196 - isValid ? Theme.of(context).focusColor : Palette.red,
197 - width: 1.0))),
198 - ),
199 - SizedBox(height: 20),
200 - Expanded(
201 - child: GridView.count(
202 - physics: NeverScrollableScrollPhysics(),
203 - crossAxisCount: 3,
204 - childAspectRatio: 3.3,
205 - mainAxisSpacing: 10,
206 - crossAxisSpacing: 10,
207 - children: List.generate(items.length, (index) {
208 - final item = items[index];
209 - final isValid = item.isCorrect();
210 - final isSelected = selectedItem == item;
211 -
212 - return InkWell(
213 - onTap: () => onMnemoticTap(item),
214 - child: Container(
215 - decoration: BoxDecoration(
216 - color: isValid ? Palette.brightBlue : Palette.red,
217 - border: Border.all(
218 - color:
219 - isSelected ? Palette.violet : Colors.transparent),
220 - borderRadius: BorderRadius.circular(15.0)),
221 - padding: EdgeInsets.fromLTRB(10, 0, 10, 0),
222 - child: Row(
223 - mainAxisAlignment: MainAxisAlignment.spaceBetween,
224 - children: [
225 - Text(
181 + Flexible(
182 + fit: FlexFit.tight,
183 + flex: 6,
184 + child: SingleChildScrollView(
185 + child: Wrap(
186 + children: items.map((item) {
187 + final isValid = item.isCorrect();
188 + final isSelected = selectedItem == item;
189 +
190 + return InkWell(
191 + onTap: () => onMnemoticTap(item),
192 + child: Container(
193 + decoration: BoxDecoration(
194 + color: isValid ? Colors.transparent : Palette.red),
195 + margin: EdgeInsets.only(right: 7, bottom: 8),
196 + child: Text(
197 item.toString(),
198 style: TextStyle(
199 color:
200 isValid ? Palette.blueGrey : Palette.lightGrey,
230 - fontSize: 12,
231 - fontWeight: FontWeight.w600),
232 - ),
233 - InkWell(
234 - onTap: () => deleteMnemotic(item),
235 - child: Image.asset(
236 - 'assets/images/x.png',
237 - height: 15,
238 - width: 15,
239 - color: Palette.wildDarkBlue,
240 - ))
241 - ],
242 - ),
243 - ),
244 - );
245 - }),
246 - ),
247 - ),
201 + fontSize: 18,
202 + fontWeight:
203 + isSelected ? FontWeight.w900 : FontWeight.w400,
204 + decoration: isSelected
205 + ? TextDecoration.underline
206 + : TextDecoration.none),
207 + )),
208 + );
209 + }).toList()),
210 + )),
211 + Flexible(
212 + fit: FlexFit.tight,
213 + flex: 8,
214 + child: Column(
215 + mainAxisAlignment: MainAxisAlignment.spaceBetween,
216 + children: <Widget>[
217 + Column(children: <Widget>[
218 + TextFormField(
219 + key: _seedTextFieldKey,
220 + onFieldSubmitted: (text) => isCurrentMnemoticValid
221 + ? saveCurrentMnemoticToItems()
222 + : null,
223 + style: TextStyle(fontSize: 14.0),
224 + controller: _seedController,
225 + textInputAction: TextInputAction.done,
226 + decoration: InputDecoration(
227 + suffixIcon: GestureDetector(
228 + behavior: HitTestBehavior.opaque,
229 + child: ConstrainedBox(
230 + constraints: BoxConstraints(maxWidth: 145),
231 + child: Row(
232 + mainAxisAlignment: MainAxisAlignment.end,
233 + children: <Widget>[
234 + Text(
235 + '${items.length}/${SeedWidgetState.maxLength}',
236 + style: TextStyle(
237 + color: Colors.grey, fontSize: 12)),
238 + SizedBox(width: 10),
239 + InkWell(
240 + onTap: () async =>
241 + Clipboard.getData('text/plain').then(
242 + (clipboard) =>
243 + replaceText(clipboard.text)),
244 + child: Container(
245 + height: 35,
246 + padding: EdgeInsets.all(7),
247 + decoration: BoxDecoration(
248 + color:
249 + Palette.wildDarkBlueWithOpacity,
250 + borderRadius:
251 + BorderRadius.circular(10.0)),
252 + child: Text(S.of(context).paste)),
253 + )
254 + ],
255 + ),
256 + ),
257 + ),
258 + hintStyle:
259 + TextStyle(color: Theme.of(context).hintColor),
260 + hintText: S.of(context).restore_from_seed_placeholder,
261 + focusedBorder: UnderlineInputBorder(
262 + borderSide: BorderSide(
263 + color: Palette.cakeGreen, width: 2.0)),
264 + enabledBorder: UnderlineInputBorder(
265 + borderSide: BorderSide(
266 + color: Theme.of(context).focusColor,
267 + width: 1.0))),
268 + enableInteractiveSelection: false,
269 + ),
270 + ]),
271 + Padding(
272 + padding: EdgeInsets.only(bottom: 20),
273 + child: (selectedItem == null && items.length == maxLength)
274 + ? PrimaryButton(
275 + text: S.of(context).restore_next,
276 + onPressed: () => widget.onFinish != null
277 + ? widget.onFinish()
278 + : null,
279 + color: Theme.of(context)
280 + .primaryTextTheme
281 + .button
282 + .backgroundColor,
283 + borderColor: Theme.of(context)
284 + .primaryTextTheme
285 + .button
286 + .decorationColor)
287 + : PrimaryButton(
288 + text: selectedItem != null
289 + ? S.of(context).save
290 + : S.of(context).add_new_word,
291 + onPressed: () => isCurrentMnemoticValid
292 + ? saveCurrentMnemoticToItems()
293 + : null,
294 + isDisabled: !isCurrentMnemoticValid,
295 + color: PaletteDark.darkThemeBlueButton,
296 + borderColor: Palette.brightBlue))
297 + ]))
298 ]),
299 );
300 }
res/values/strings_de.arb
+6 -1
@@ -331,4 +331,9 @@
331 "trade_state_finished" : "Fertig",
332
333 "change_language" : "Sprache ändern",
334 - "change_language_to" : "Ändern Sie die Sprache in ${language}?"}
\ No newline at end of file
334 + "change_language_to" : "Ändern Sie die Sprache in ${language}?",
335 +
336 + "paste" : "Einfügen",
337 + "restore_from_seed_placeholder" : "Bitte geben Sie hier Ihren Code ein",
338 + "add_new_word" : "Neues Wort hinzufügen"
339 +}
\ No newline at end of file
res/values/strings_en.arb
+5 -1
@@ -331,5 +331,9 @@
331 "trade_state_finished" : "Finished",
332
333 "change_language" : "Change language",
334 - "change_language_to" : "Change language to ${language}?"
334 + "change_language_to" : "Change language to ${language}?",
335 +
336 + "paste" : ""paste"",
337 + "restore_from_seed_placeholder" : "Please enter or "paste" your seed here",
338 + "add_new_word" : "Add new word"
339 }
\ No newline at end of file
res/values/strings_es.arb
+5 -1
@@ -331,5 +331,9 @@
331 "trade_state_finished" : "Terminado",
332
333 "change_language" : "Cambiar idioma",
334 - "change_language_to" : "Cambiar el idioma a ${language}?"
334 + "change_language_to" : "Cambiar el idioma a ${language}?",
335 +
336 + "paste" : "Pegar",
337 + "restore_from_seed_placeholder" : "Ingrese o pegue su frase de código aquí",
338 + "add_new_word" : "Agregar palabra nueva"
339 }
\ No newline at end of file
res/values/strings_hi.arb
+5 -1
@@ -331,5 +331,9 @@
331 "trade_state_finished" : "ख़त्म होना",
332
333 "change_language" : "भाषा बदलो",
334 - "change_language_to" : "को भाषा बदलें ${language}?"
334 + "change_language_to" : "को भाषा बदलें ${language}?",
335 +
336 + "paste" : "पेस्ट करें",
337 + "restore_from_seed_placeholder" : "कृपया अपना कोड वाक्यांश यहां दर्ज करें या पेस्ट करें",
338 + "add_new_word" : "नया शब्द जोड़ें"
339 }
\ No newline at end of file
res/values/strings_ja.arb
+6 -1
@@ -331,5 +331,10 @@
331 "trade_state_finished" : "完成した",
332
333 "change_language" : "言語を変えてください",
334 - "change_language_to" : "言語を変更 ${language}?"
334 + "change_language_to" : "言語を変更 ${language}?",
335 +
336 + "paste" : "ペースト",
337 + "restore_from_seed_placeholder" : "ここにコードフレーズを入力または貼り付けてください",
338 + "add_new_word" : "新しい単語を追加",
339 + "add_new_word" : "새로운 단어 추가"
340 }
\ No newline at end of file
res/values/strings_ko.arb
+4 -1
@@ -331,5 +331,8 @@
331 "trade_state_finished" : "끝마친",
332
333 "change_language" : "언어 변경",
334 - "change_language_to" : "언어를로 변경 ${language}?"
334 + "change_language_to" : "언어를로 변경 ${language}?",
335 +
336 + "paste" : "풀",
337 + "restore_from_seed_placeholder" : "여기에 코드 문구를 입력하거나 붙여 넣으십시오."
338 }
\ No newline at end of file
res/values/strings_nl.arb
+5 -1
@@ -331,5 +331,9 @@
331 "trade_state_finished" : "Afgewerkt",
332
333 "change_language" : "Verander de taal",
334 - "change_language_to" : "Verander de taal in ${language}?"
334 + "change_language_to" : "Verander de taal in ${language}?",
335 +
336 + "paste" : "Plakken",
337 + "restore_from_seed_placeholder" : "Voer hier uw codefrase in of plak deze",
338 + "add_new_word" : "Nieuw woord toevoegen"
339 }
\ No newline at end of file
res/values/strings_pl.arb
+5 -1
@@ -331,5 +331,9 @@
331 "trade_state_finished" : "Skończone",
332
333 "change_language" : "Zmień język",
334 - "change_language_to" : "Zmień język na ${language}?"
334 + "change_language_to" : "Zmień język na ${language}?",
335 +
336 + "paste" : "Pasta",
337 + "restore_from_seed_placeholder" : "Wpisz lub wklej tutaj swoją frazę kodową",
338 + "add_new_word" : "Dodaj nowe słowo"
339 }
\ No newline at end of file
res/values/strings_pt.arb
+5 -1
@@ -331,5 +331,9 @@
331 "trade_state_finished" : "Finalizada",
332
333 "change_language" : "Mudar idioma",
334 - "change_language_to" : "Alterar idioma para ${language}?"
334 + "change_language_to" : "Alterar idioma para ${language}?",
335 +
336 + "paste" : "Colar",
337 + "restore_from_seed_placeholder" : "Digite ou cole sua frase de código aqui",
338 + "add_new_word" : "Adicionar nova palavra"
339 }
res/values/strings_ru.arb
+5 -1
@@ -331,5 +331,9 @@
331 "trade_state_finished" : "Окончено",
332
333 "change_language" : "Изменить язык",
334 - "change_language_to" : "Изменить язык на ${language}?"
334 + "change_language_to" : "Изменить язык на ${language}?",
335 +
336 + "paste" : "Вставить",
337 + "restore_from_seed_placeholder" : "Введите или вставте код фразу вашего кошелька",
338 + "add_new_word" : "Добавить новое слово"
339 }
\ No newline at end of file
res/values/strings_zh.arb
+5 -1
@@ -331,5 +331,9 @@
331 "trade_state_finished" : "已完成",
332
333 "change_language" : "改變語言",
334 - "change_language_to" : "將語言更改為 ${language}?"
334 + "change_language_to" : "將語言更改為 ${language}?",
335 +
336 + "paste" : "糊",
337 + "restore_from_seed_placeholder" : "请在此处输入或粘贴您的代码短语",
338 + "add_new_word" : "添加新词"
339 }
\ No newline at end of file