CW-277-Allow-editing-nodes (#827)

* allow editing nodes

* fix buttons size

* fix comments
This commit is contained in:
Serhii 2023-03-15 15:24:38 +02:00 committed by GitHub
parent 305c3f1515
commit f458e5b349
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
29 changed files with 150 additions and 85 deletions

View file

@ -515,10 +515,14 @@ Future setup(
_nodeSource, _nodeSource,
type ?? getIt.get<AppStore>().wallet!.type, type ?? getIt.get<AppStore>().wallet!.type,
getIt.get<SettingsStore>(), getIt.get<SettingsStore>(),
getIt.get<NodeListViewModel>()
)); ));
getIt.registerFactory( getIt.registerFactoryParam<NodeCreateOrEditPage, Node?, bool?>(
() => NodeCreateOrEditPage(getIt.get<NodeCreateOrEditViewModel>())); (Node? editingNode, bool? isSelected) => NodeCreateOrEditPage(
nodeCreateOrEditViewModel: getIt.get<NodeCreateOrEditViewModel>(),
editingNode: editingNode,
isSelected: isSelected));
getIt.registerFactory(() => OnRamperPage( getIt.registerFactory(() => OnRamperPage(
settingsStore: getIt.get<AppStore>().settingsStore, settingsStore: getIt.get<AppStore>().settingsStore,

View file

@ -82,6 +82,7 @@ import 'package:cake_wallet/src/screens/ionia/cards/ionia_payment_status_page.da
import 'package:cake_wallet/anypay/any_pay_payment_committed_info.dart'; import 'package:cake_wallet/anypay/any_pay_payment_committed_info.dart';
import 'package:cake_wallet/ionia/ionia_any_pay_payment_info.dart'; import 'package:cake_wallet/ionia/ionia_any_pay_payment_info.dart';
import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/crypto_currency.dart';
import 'package:cw_core/node.dart';
late RouteSettings currentRouteSettings; late RouteSettings currentRouteSettings;
@ -307,8 +308,11 @@ Route<dynamic> createRoute(RouteSettings settings) {
builder: (_) => getIt.get<OtherSettingsPage>()); builder: (_) => getIt.get<OtherSettingsPage>());
case Routes.newNode: case Routes.newNode:
final args = settings.arguments as Map<String, dynamic>?;
return CupertinoPageRoute<void>( return CupertinoPageRoute<void>(
builder: (_) => getIt.get<NodeCreateOrEditPage>()); builder: (_) => getIt.get<NodeCreateOrEditPage>(
param1: args?['editingNode'] as Node?,
param2: args?['isSelected'] as bool?));
case Routes.login: case Routes.login:
return CupertinoPageRoute<void>( return CupertinoPageRoute<void>(

View file

@ -2,6 +2,7 @@ import 'package:cake_wallet/core/execution_state.dart';
import 'package:cake_wallet/src/screens/nodes/widgets/node_form.dart'; import 'package:cake_wallet/src/screens/nodes/widgets/node_form.dart';
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:cw_core/node.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:flutter_mobx/flutter_mobx.dart';
@ -13,7 +14,7 @@ import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart';
import 'package:cake_wallet/view_model/node_list/node_create_or_edit_view_model.dart'; import 'package:cake_wallet/view_model/node_list/node_create_or_edit_view_model.dart';
class NodeCreateOrEditPage extends BasePage { class NodeCreateOrEditPage extends BasePage {
NodeCreateOrEditPage(this.nodeCreateOrEditViewModel) NodeCreateOrEditPage({required this.nodeCreateOrEditViewModel,this.editingNode, this.isSelected})
: _formKey = GlobalKey<FormState>(), : _formKey = GlobalKey<FormState>(),
_addressController = TextEditingController(), _addressController = TextEditingController(),
_portController = TextEditingController(), _portController = TextEditingController(),
@ -62,9 +63,11 @@ class NodeCreateOrEditPage extends BasePage {
final TextEditingController _passwordController; final TextEditingController _passwordController;
@override @override
String get title => S.current.node_new; String get title => editingNode != null ? S.current.edit_node : S.current.node_new;
final NodeCreateOrEditViewModel nodeCreateOrEditViewModel; final NodeCreateOrEditViewModel nodeCreateOrEditViewModel;
final Node? editingNode;
final bool? isSelected;
@override @override
Widget body(BuildContext context) { Widget body(BuildContext context) {
@ -108,6 +111,7 @@ class NodeCreateOrEditPage extends BasePage {
content: NodeForm( content: NodeForm(
formKey: _formKey, formKey: _formKey,
nodeViewModel: nodeCreateOrEditViewModel, nodeViewModel: nodeCreateOrEditViewModel,
editingNode: editingNode,
), ),
bottomSectionPadding: EdgeInsets.only(bottom: 24), bottomSectionPadding: EdgeInsets.only(bottom: 24),
bottomSection: Observer( bottomSection: Observer(
@ -140,7 +144,8 @@ class NodeCreateOrEditPage extends BasePage {
return; return;
} }
await nodeCreateOrEditViewModel.save(); await nodeCreateOrEditViewModel.save(
editingNode: editingNode, saveAsCurrent: isSelected ?? false);
Navigator.of(context).pop(); Navigator.of(context).pop();
}, },
text: S.of(context).save, text: S.of(context).save,

View file

@ -3,6 +3,8 @@ import 'package:cake_wallet/core/node_port_validator.dart';
import 'package:cake_wallet/src/widgets/base_text_form_field.dart'; import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
import 'package:cake_wallet/src/widgets/standard_checkbox.dart'; import 'package:cake_wallet/src/widgets/standard_checkbox.dart';
import 'package:cake_wallet/view_model/node_list/node_create_or_edit_view_model.dart'; import 'package:cake_wallet/view_model/node_list/node_create_or_edit_view_model.dart';
import 'package:cw_core/node.dart';
import 'package:cw_haven/api/signatures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/generated/i18n.dart';
@ -12,22 +14,20 @@ class NodeForm extends StatelessWidget {
NodeForm({ NodeForm({
required this.nodeViewModel, required this.nodeViewModel,
required this.formKey, required this.formKey,
}) : _addressController = TextEditingController(), this.editingNode,
_portController = TextEditingController(), }) : _addressController = TextEditingController(text: editingNode?.uri.host.toString()),
_loginController = TextEditingController(), _portController = TextEditingController(text: editingNode?.uri.port.toString()),
_passwordController = TextEditingController() { _loginController = TextEditingController(text: editingNode?.login),
reaction((_) => nodeViewModel.address, (String address) { _passwordController = TextEditingController(text: editingNode?.password) {
if (address != _addressController.text) { if (editingNode != null) {
_addressController.text = address; nodeViewModel
} ..setAddress((editingNode!.uri.host.toString()))
}); ..setPort((editingNode!.uri.port.toString()))
..setPassword((editingNode!.password.toString()))
reaction((_) => nodeViewModel.port, (String port) { ..setLogin((editingNode!.login.toString()))
if (port != _portController.text) { ..setSSL((editingNode!.isSSL))
_portController.text = port; ..setTrusted((editingNode!.trusted));
} }
});
if (nodeViewModel.hasAuthCredentials) { if (nodeViewModel.hasAuthCredentials) {
reaction((_) => nodeViewModel.login, (String login) { reaction((_) => nodeViewModel.login, (String login) {
if (login != _loginController.text) { if (login != _loginController.text) {
@ -42,18 +42,15 @@ class NodeForm extends StatelessWidget {
}); });
} }
_addressController _addressController.addListener(() => nodeViewModel.address = _addressController.text);
.addListener(() => nodeViewModel.address = _addressController.text); _portController.addListener(() => nodeViewModel.port = _portController.text);
_portController _loginController.addListener(() => nodeViewModel.login = _loginController.text);
.addListener(() => nodeViewModel.port = _portController.text); _passwordController.addListener(() => nodeViewModel.password = _passwordController.text);
_loginController
.addListener(() => nodeViewModel.login = _loginController.text);
_passwordController
.addListener(() => nodeViewModel.password = _passwordController.text);
} }
final NodeCreateOrEditViewModel nodeViewModel; final NodeCreateOrEditViewModel nodeViewModel;
final GlobalKey<FormState> formKey; final GlobalKey<FormState> formKey;
final Node? editingNode;
final TextEditingController _addressController; final TextEditingController _addressController;
final TextEditingController _portController; final TextEditingController _portController;
@ -84,8 +81,7 @@ class NodeForm extends StatelessWidget {
child: BaseTextFormField( child: BaseTextFormField(
controller: _portController, controller: _portController,
hintText: S.of(context).node_port, hintText: S.of(context).node_port,
keyboardType: TextInputType.numberWithOptions( keyboardType: TextInputType.numberWithOptions(signed: false, decimal: false),
signed: false, decimal: false),
validator: NodePortValidator(), validator: NodePortValidator(),
)) ))
], ],

View file

@ -2,7 +2,6 @@ import 'package:cake_wallet/src/screens/settings/widgets/settings_cell_with_arro
import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
import 'package:cw_core/node.dart'; import 'package:cw_core/node.dart';
import 'package:cw_core/wallet_type.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:flutter_mobx/flutter_mobx.dart';
@ -90,12 +89,12 @@ class ConnectionSyncPage extends BasePage {
final dismissibleRow = Slidable( final dismissibleRow = Slidable(
key: Key('${node.keyIndex}'), key: Key('${node.keyIndex}'),
startActionPane: _actionPane(context, node), startActionPane: _actionPane(context, node, isSelected),
endActionPane: _actionPane(context, node), endActionPane: _actionPane(context, node, isSelected),
child: nodeListRow, child: nodeListRow,
); );
return isSelected ? nodeListRow : dismissibleRow; return dismissibleRow;
}, },
), ),
); );
@ -124,33 +123,42 @@ class ConnectionSyncPage extends BasePage {
); );
} }
ActionPane _actionPane(BuildContext context, Node node) => ActionPane( ActionPane _actionPane(BuildContext context, Node node, bool isSelected) => ActionPane(
motion: const ScrollMotion(), motion: const ScrollMotion(),
extentRatio: 0.3, extentRatio: isSelected ? 0.3 : 0.6,
children: [ children: [
SlidableAction( if (!isSelected)
onPressed: (context) async { SlidableAction(
final confirmed = await showPopUp<bool>( onPressed: (context) async {
context: context, final confirmed = await showPopUp<bool>(
builder: (BuildContext context) { context: context,
return AlertWithTwoActions( builder: (BuildContext context) {
alertTitle: S.of(context).remove_node, return AlertWithTwoActions(
alertContent: S.of(context).remove_node_message, alertTitle: S.of(context).remove_node,
rightButtonText: S.of(context).remove, alertContent: S.of(context).remove_node_message,
leftButtonText: S.of(context).cancel, rightButtonText: S.of(context).remove,
actionRightButton: () => Navigator.pop(context, true), leftButtonText: S.of(context).cancel,
actionLeftButton: () => Navigator.pop(context, false)); actionRightButton: () => Navigator.pop(context, true),
}) ?? actionLeftButton: () => Navigator.pop(context, false));
false; }) ??
false;
if (confirmed) { if (confirmed) {
await nodeListViewModel.delete(node); await nodeListViewModel.delete(node);
} }
}, },
backgroundColor: Colors.red, backgroundColor: Colors.red,
foregroundColor: Colors.white,
icon: CupertinoIcons.delete,
label: S.of(context).delete,
),
SlidableAction(
onPressed: (_) => Navigator.of(context).pushNamed(Routes.newNode,
arguments: {'editingNode': node, 'isSelected': isSelected}),
backgroundColor: Colors.blue,
foregroundColor: Colors.white, foregroundColor: Colors.white,
icon: CupertinoIcons.delete, icon: Icons.edit,
label: S.of(context).delete, label: S.of(context).edit,
), ),
], ],
); );

View file

@ -5,13 +5,16 @@ import 'package:mobx/mobx.dart';
import 'package:cw_core/node.dart'; import 'package:cw_core/node.dart';
import 'package:cw_core/wallet_type.dart'; import 'package:cw_core/wallet_type.dart';
import 'node_list_view_model.dart';
part 'node_create_or_edit_view_model.g.dart'; part 'node_create_or_edit_view_model.g.dart';
class NodeCreateOrEditViewModel = NodeCreateOrEditViewModelBase class NodeCreateOrEditViewModel = NodeCreateOrEditViewModelBase
with _$NodeCreateOrEditViewModel; with _$NodeCreateOrEditViewModel;
abstract class NodeCreateOrEditViewModelBase with Store { abstract class NodeCreateOrEditViewModelBase with Store {
NodeCreateOrEditViewModelBase(this._nodeSource, this._walletType, this._settingsStore) NodeCreateOrEditViewModelBase(this._nodeSource, this._walletType, this._settingsStore,
this.nodeListViewModel)
: state = InitialExecutionState(), : state = InitialExecutionState(),
connectionState = InitialExecutionState(), connectionState = InitialExecutionState(),
useSSL = false, useSSL = false,
@ -65,6 +68,7 @@ abstract class NodeCreateOrEditViewModelBase with Store {
final WalletType _walletType; final WalletType _walletType;
final Box<Node> _nodeSource; final Box<Node> _nodeSource;
final SettingsStore _settingsStore; final SettingsStore _settingsStore;
final NodeListViewModel nodeListViewModel;
@action @action
void reset() { void reset() {
@ -77,9 +81,30 @@ abstract class NodeCreateOrEditViewModelBase with Store {
} }
@action @action
Future<void> save({bool saveAsCurrent = false}) async { void setPort (String val) => port = val;
@action
void setAddress (String val) => address = val;
@action
void setLogin (String val) => login = val;
@action
void setPassword (String val) => password = val;
@action
void setSSL (bool val) => useSSL = val;
@action
void setTrusted (bool val) => trusted = val;
@action
Future<void> save({Node? editingNode, bool saveAsCurrent = false}) async {
try { try {
state = IsExecutingState(); state = IsExecutingState();
if (editingNode != null) {
await nodeListViewModel.delete(editingNode);
}
final node = final node =
Node(uri: uri, type: _walletType, login: login, password: password, Node(uri: uri, type: _walletType, login: login, password: password,
useSSL: useSSL, trusted: trusted); useSSL: useSSL, trusted: trusted);

View file

@ -682,5 +682,6 @@
"send_to_this_address" : "أرسل ${currency} ${tag}إلى هذا العنوان", "send_to_this_address" : "أرسل ${currency} ${tag}إلى هذا العنوان",
"arrive_in_this_address" : "سيصل ${currency} ${tag}إلى هذا العنوان", "arrive_in_this_address" : "سيصل ${currency} ${tag}إلى هذا العنوان",
"do_not_send": "لا ترسل", "do_not_send": "لا ترسل",
"error_dialog_content": "عفوًا ، لقد حصلنا على بعض الخطأ.\n\nيرجى إرسال تقرير التعطل إلى فريق الدعم لدينا لتحسين التطبيق." "error_dialog_content": "عفوًا ، لقد حصلنا على بعض الخطأ.\n\nيرجى إرسال تقرير التعطل إلى فريق الدعم لدينا لتحسين التطبيق.",
"edit_node": "تحرير العقدة"
} }

View file

@ -684,5 +684,6 @@
"send_to_this_address" : "Send ${currency} ${tag}to this address", "send_to_this_address" : "Send ${currency} ${tag}to this address",
"arrive_in_this_address" : "${currency} ${tag}ще отидат на този адрес", "arrive_in_this_address" : "${currency} ${tag}ще отидат на този адрес",
"do_not_send": "Не изпращай", "do_not_send": "Не изпращай",
"error_dialog_content": "Получихме грешка.\n\nМоля, изпратете доклада до нашия отдел поддръжка, за да подобрим приложението." "error_dialog_content": "Получихме грешка.\n\nМоля, изпратете доклада до нашия отдел поддръжка, за да подобрим приложението.",
"edit_node": "Редактиране на възел"
} }

View file

@ -684,5 +684,6 @@
"send_to_this_address" : "Poslat ${currency} ${tag}na tuto adresu", "send_to_this_address" : "Poslat ${currency} ${tag}na tuto adresu",
"arrive_in_this_address" : "${currency} ${tag}přijde na tuto adresu", "arrive_in_this_address" : "${currency} ${tag}přijde na tuto adresu",
"do_not_send": "Neodesílat", "do_not_send": "Neodesílat",
"error_dialog_content": "Nastala chyba.\n\nProsím odešlete zprávu o chybě naší podpoře, aby mohli zajistit opravu." "error_dialog_content": "Nastala chyba.\n\nProsím odešlete zprávu o chybě naší podpoře, aby mohli zajistit opravu.",
"edit_node": "Upravit uzel"
} }

View file

@ -684,5 +684,6 @@
"send_to_this_address" : "Senden Sie ${currency} ${tag}an diese Adresse", "send_to_this_address" : "Senden Sie ${currency} ${tag}an diese Adresse",
"arrive_in_this_address" : "${currency} ${tag}wird an dieser Adresse ankommen", "arrive_in_this_address" : "${currency} ${tag}wird an dieser Adresse ankommen",
"do_not_send": "Nicht senden", "do_not_send": "Nicht senden",
"error_dialog_content": "Hoppla, wir haben einen Fehler.\n\nBitte senden Sie den Absturzbericht an unser Support-Team, um die Anwendung zu verbessern." "error_dialog_content": "Hoppla, wir haben einen Fehler.\n\nBitte senden Sie den Absturzbericht an unser Support-Team, um die Anwendung zu verbessern.",
"edit_node": "Knoten bearbeiten"
} }

View file

@ -684,5 +684,6 @@
"send_to_this_address" : "Send ${currency} ${tag}to this address", "send_to_this_address" : "Send ${currency} ${tag}to this address",
"arrive_in_this_address" : "${currency} ${tag}will arrive in this address", "arrive_in_this_address" : "${currency} ${tag}will arrive in this address",
"do_not_send": "Don't send", "do_not_send": "Don't send",
"error_dialog_content": "Oops, we got some error.\n\nPlease send the crash report to our support team to make the application better." "error_dialog_content": "Oops, we got some error.\n\nPlease send the crash report to our support team to make the application better.",
"edit_node": "Edit Node"
} }

View file

@ -684,5 +684,6 @@
"send_to_this_address" : "Enviar ${currency} ${tag}a esta dirección", "send_to_this_address" : "Enviar ${currency} ${tag}a esta dirección",
"arrive_in_this_address" : "${currency} ${tag}llegará a esta dirección", "arrive_in_this_address" : "${currency} ${tag}llegará a esta dirección",
"do_not_send": "no enviar", "do_not_send": "no enviar",
"error_dialog_content": "Vaya, tenemos un error.\n\nEnvíe el informe de bloqueo a nuestro equipo de soporte para mejorar la aplicación." "error_dialog_content": "Vaya, tenemos un error.\n\nEnvíe el informe de bloqueo a nuestro equipo de soporte para mejorar la aplicación.",
"edit_node": "Edit Node"
} }

View file

@ -682,5 +682,6 @@
"send_to_this_address" : "Envoyez ${currency} ${tag}à cette adresse", "send_to_this_address" : "Envoyez ${currency} ${tag}à cette adresse",
"arrive_in_this_address" : "${currency} ${tag}arrivera à cette adresse", "arrive_in_this_address" : "${currency} ${tag}arrivera à cette adresse",
"do_not_send": "N'envoyez pas", "do_not_send": "N'envoyez pas",
"error_dialog_content": "Oups, nous avons eu une erreur.\n\nVeuillez envoyer le rapport de plantage à notre équipe d'assistance pour améliorer l'application." "error_dialog_content": "Oups, nous avons eu une erreur.\n\nVeuillez envoyer le rapport de plantage à notre équipe d'assistance pour améliorer l'application.",
"edit_node": "Modifier le nœud"
} }

View file

@ -684,5 +684,6 @@
"send_to_this_address" : "इस पते पर ${currency} ${tag}भेजें", "send_to_this_address" : "इस पते पर ${currency} ${tag}भेजें",
"arrive_in_this_address" : "${currency} ${tag}इस पते पर पहुंचेंगे", "arrive_in_this_address" : "${currency} ${tag}इस पते पर पहुंचेंगे",
"do_not_send": "मत भेजो", "do_not_send": "मत भेजो",
"error_dialog_content": "ओह, हमसे कुछ गड़बड़ी हुई है.\n\nएप्लिकेशन को बेहतर बनाने के लिए कृपया क्रैश रिपोर्ट हमारी सहायता टीम को भेजें।" "error_dialog_content": "ओह, हमसे कुछ गड़बड़ी हुई है.\n\nएप्लिकेशन को बेहतर बनाने के लिए कृपया क्रैश रिपोर्ट हमारी सहायता टीम को भेजें।",
"edit_node": "नोड संपादित करें"
} }

View file

@ -684,5 +684,6 @@
"send_to_this_address" : "Pošaljite ${currency} ${tag}na ovu adresu", "send_to_this_address" : "Pošaljite ${currency} ${tag}na ovu adresu",
"arrive_in_this_address" : "${currency} ${tag}će stići na ovu adresu", "arrive_in_this_address" : "${currency} ${tag}će stići na ovu adresu",
"do_not_send": "Ne šalji", "do_not_send": "Ne šalji",
"error_dialog_content": "Ups, imamo grešku.\n\nPošaljite izvješće o padu našem timu za podršku kako bismo poboljšali aplikaciju." "error_dialog_content": "Ups, imamo grešku.\n\nPošaljite izvješće o padu našem timu za podršku kako bismo poboljšali aplikaciju.",
"edit_node": "Uredi čvor"
} }

View file

@ -666,5 +666,6 @@
"unmatched_currencies": "Mata uang dompet Anda saat ini tidak cocok dengan yang ditandai QR", "unmatched_currencies": "Mata uang dompet Anda saat ini tidak cocok dengan yang ditandai QR",
"orbot_running_alert": "Pastikan Orbot sedang berjalan sebelum menghubungkan ke node ini.", "orbot_running_alert": "Pastikan Orbot sedang berjalan sebelum menghubungkan ke node ini.",
"contact_list_contacts": "Kontak", "contact_list_contacts": "Kontak",
"contact_list_wallets": "Dompet Saya" "contact_list_wallets": "Dompet Saya",
"edit_node": "Sunting Node"
} }

View file

@ -684,5 +684,6 @@
"send_to_this_address" : "Invia ${currency} ${tag}a questo indirizzo", "send_to_this_address" : "Invia ${currency} ${tag}a questo indirizzo",
"arrive_in_this_address" : "${currency} ${tag}arriverà a questo indirizzo", "arrive_in_this_address" : "${currency} ${tag}arriverà a questo indirizzo",
"do_not_send": "Non inviare", "do_not_send": "Non inviare",
"error_dialog_content": "Ups, imamo grešku.\n\nPošaljite izvješće o padu našem timu za podršku kako bismo poboljšali aplikaciju." "error_dialog_content": "Spiacenti, abbiamo riscontrato un errore.\n\nSi prega di inviare il rapporto sull'arresto anomalo al nostro team di supporto per migliorare l'applicazione.",
"edit_node": "Modifica nodo"
} }

View file

@ -684,5 +684,6 @@
"send_to_this_address" : "${currency} ${tag}をこのアドレスに送金", "send_to_this_address" : "${currency} ${tag}をこのアドレスに送金",
"arrive_in_this_address" : "${currency} ${tag}はこの住所に到着します", "arrive_in_this_address" : "${currency} ${tag}はこの住所に到着します",
"do_not_send": "送信しない", "do_not_send": "送信しない",
"error_dialog_content": "Spiacenti, abbiamo riscontrato un errore.\n\nSi prega di inviare il rapporto sull'arresto anomalo al nostro team di supporto per migliorare l'applicazione." "error_dialog_content": "エラーが発生しました。\n\nアプリケーションを改善するために、クラッシュ レポートをサポート チームに送信してください。",
"edit_node": "ノードを編集"
} }

View file

@ -684,5 +684,6 @@
"send_to_this_address" : "이 주소로 ${currency} ${tag}송금", "send_to_this_address" : "이 주소로 ${currency} ${tag}송금",
"arrive_in_this_address" : "${currency} ${tag}이(가) 이 주소로 도착합니다", "arrive_in_this_address" : "${currency} ${tag}이(가) 이 주소로 도착합니다",
"do_not_send": "보내지 마세요", "do_not_send": "보내지 마세요",
"error_dialog_content": "죄송합니다. 오류가 발생했습니다.\n\n응용 프로그램을 개선하려면 지원 팀에 충돌 보고서를 보내주십시오." "error_dialog_content": "죄송합니다. 오류가 발생했습니다.\n\n응용 프로그램을 개선하려면 지원 팀에 충돌 보고서를 보내주십시오.",
"edit_node": "노드 편집"
} }

View file

@ -684,5 +684,6 @@
"send_to_this_address" : "ဤလိပ်စာသို့ ${currency} ${tag}သို့ ပို့ပါ။", "send_to_this_address" : "ဤလိပ်စာသို့ ${currency} ${tag}သို့ ပို့ပါ။",
"arrive_in_this_address" : "${currency} ${tag}ဤလိပ်စာသို့ ရောက်ရှိပါမည်။", "arrive_in_this_address" : "${currency} ${tag}ဤလိပ်စာသို့ ရောက်ရှိပါမည်။",
"do_not_send": "မပို့ပါနှင့်", "do_not_send": "မပို့ပါနှင့်",
"error_dialog_content": "အိုး၊ ကျွန်ုပ်တို့တွင် အမှားအယွင်းအချို့ရှိသည်။\n\nအပလီကေးရှင်းကို ပိုမိုကောင်းမွန်စေရန်အတွက် ပျက်စီးမှုအစီရင်ခံစာကို ကျွန်ုပ်တို့၏ပံ့ပိုးကူညီရေးအဖွဲ့ထံ ပေးပို့ပါ။" "error_dialog_content": "အိုး၊ ကျွန်ုပ်တို့တွင် အမှားအယွင်းအချို့ရှိသည်။\n\nအပလီကေးရှင်းကို ပိုမိုကောင်းမွန်စေရန်အတွက် ပျက်စီးမှုအစီရင်ခံစာကို ကျွန်ုပ်တို့၏ပံ့ပိုးကူညီရေးအဖွဲ့ထံ ပေးပို့ပါ။",
"edit_node": "Node ကို တည်းဖြတ်ပါ။"
} }

View file

@ -684,5 +684,6 @@
"send_to_this_address" : "Stuur ${currency} ${tag}naar dit adres", "send_to_this_address" : "Stuur ${currency} ${tag}naar dit adres",
"arrive_in_this_address" : "${currency} ${tag}komt aan op dit adres", "arrive_in_this_address" : "${currency} ${tag}komt aan op dit adres",
"do_not_send": "Niet sturen", "do_not_send": "Niet sturen",
"error_dialog_content": "Oeps, er is een fout opgetreden.\n\nStuur het crashrapport naar ons ondersteuningsteam om de applicatie te verbeteren." "error_dialog_content": "Oeps, er is een fout opgetreden.\n\nStuur het crashrapport naar ons ondersteuningsteam om de applicatie te verbeteren.",
"edit_node": "Knooppunt bewerken"
} }

View file

@ -684,5 +684,6 @@
"send_to_this_address" : "Wyślij ${currency} ${tag}na ten adres", "send_to_this_address" : "Wyślij ${currency} ${tag}na ten adres",
"arrive_in_this_address" : "${currency} ${tag}dotrze na ten adres", "arrive_in_this_address" : "${currency} ${tag}dotrze na ten adres",
"do_not_send": "Nie wysyłaj", "do_not_send": "Nie wysyłaj",
"error_dialog_content": "Ups, wystąpił błąd.\n\nPrześlij raport o awarii do naszego zespołu wsparcia, aby ulepszyć aplikację." "error_dialog_content": "Ups, wystąpił błąd.\n\nPrześlij raport o awarii do naszego zespołu wsparcia, aby ulepszyć aplikację.",
"edit_node": "Edytuj węzeł"
} }

View file

@ -683,5 +683,6 @@
"send_to_this_address" : "Envie ${currency} ${tag}para este endereço", "send_to_this_address" : "Envie ${currency} ${tag}para este endereço",
"arrive_in_this_address" : "${currency} ${tag}chegará neste endereço", "arrive_in_this_address" : "${currency} ${tag}chegará neste endereço",
"do_not_send": "não envie", "do_not_send": "não envie",
"error_dialog_content": "Ops, houve algum erro.\n\nPor favor, envie o relatório de falha para nossa equipe de suporte para melhorar o aplicativo." "error_dialog_content": "Ops, houve algum erro.\n\nPor favor, envie o relatório de falha para nossa equipe de suporte para melhorar o aplicativo.",
"edit_node": "Editar nó"
} }

View file

@ -684,5 +684,6 @@
"send_to_this_address" : "Отправить ${currency} ${tag}на этот адрес", "send_to_this_address" : "Отправить ${currency} ${tag}на этот адрес",
"arrive_in_this_address" : "${currency} ${tag}придет на этот адрес", "arrive_in_this_address" : "${currency} ${tag}придет на этот адрес",
"do_not_send": "Не отправлять", "do_not_send": "Не отправлять",
"error_dialog_content": "Ой, у нас какая-то ошибка.\n\nПожалуйста, отправьте отчет о сбое в нашу службу поддержки, чтобы сделать приложение лучше." "error_dialog_content": "Ой, у нас какая-то ошибка.\n\nПожалуйста, отправьте отчет о сбое в нашу службу поддержки, чтобы сделать приложение лучше.",
"edit_node": "Редактировать узел"
} }

View file

@ -682,5 +682,6 @@
"send_to_this_address" : "ส่ง ${currency} ${tag}ไปยังที่อยู่นี้", "send_to_this_address" : "ส่ง ${currency} ${tag}ไปยังที่อยู่นี้",
"arrive_in_this_address" : "${currency} ${tag}จะมาถึงที่อยู่นี้", "arrive_in_this_address" : "${currency} ${tag}จะมาถึงที่อยู่นี้",
"do_not_send": "อย่าส่ง", "do_not_send": "อย่าส่ง",
"error_dialog_content": "อ๊ะ เราพบข้อผิดพลาดบางอย่าง\n\nโปรดส่งรายงานข้อขัดข้องไปยังทีมสนับสนุนของเราเพื่อปรับปรุงแอปพลิเคชันให้ดียิ่งขึ้น" "error_dialog_content": "อ๊ะ เราพบข้อผิดพลาดบางอย่าง\n\nโปรดส่งรายงานข้อขัดข้องไปยังทีมสนับสนุนของเราเพื่อปรับปรุงแอปพลิเคชันให้ดียิ่งขึ้น",
"edit_node": "แก้ไขโหนด"
} }

View file

@ -684,5 +684,6 @@
"send_to_this_address" : "Bu adrese ${currency} ${tag}gönder", "send_to_this_address" : "Bu adrese ${currency} ${tag}gönder",
"arrive_in_this_address" : "${currency} ${tag}bu adrese ulaşacak", "arrive_in_this_address" : "${currency} ${tag}bu adrese ulaşacak",
"do_not_send": "Gönderme", "do_not_send": "Gönderme",
"error_dialog_content": "Hay aksi, bir hatamız var.\n\nUygulamayı daha iyi hale getirmek için lütfen kilitlenme raporunu destek ekibimize gönderin." "error_dialog_content": "Hay aksi, bir hatamız var.\n\nUygulamayı daha iyi hale getirmek için lütfen kilitlenme raporunu destek ekibimize gönderin.",
"edit_node": "Düğümü Düzenle"
} }

View file

@ -683,5 +683,6 @@
"send_to_this_address" : "Надіслати ${currency} ${tag}на цю адресу", "send_to_this_address" : "Надіслати ${currency} ${tag}на цю адресу",
"arrive_in_this_address" : "${currency} ${tag}надійде на цю адресу", "arrive_in_this_address" : "${currency} ${tag}надійде на цю адресу",
"do_not_send": "Не надсилайте", "do_not_send": "Не надсилайте",
"error_dialog_content": "На жаль, ми отримали помилку.\n\nБудь ласка, надішліть звіт про збій нашій команді підтримки, щоб покращити додаток." "error_dialog_content": "На жаль, ми отримали помилку.\n\nБудь ласка, надішліть звіт про збій нашій команді підтримки, щоб покращити додаток.",
"edit_node": "Редагувати вузол"
} }

View file

@ -685,5 +685,6 @@
"send_to_this_address" : "اس پتے پر ${currency} ${tag} بھیجیں۔", "send_to_this_address" : "اس پتے پر ${currency} ${tag} بھیجیں۔",
"arrive_in_this_address" : "${currency} ${tag}اس پتے پر پہنچے گا۔", "arrive_in_this_address" : "${currency} ${tag}اس پتے پر پہنچے گا۔",
"do_not_send" : "مت بھیجیں۔", "do_not_send" : "مت بھیجیں۔",
"error_dialog_content" : "افوہ، ہمیں کچھ خرابی ملی۔\n\nایپلی کیشن کو بہتر بنانے کے لیے براہ کرم کریش رپورٹ ہماری سپورٹ ٹیم کو بھیجیں۔" "error_dialog_content" : "افوہ، ہمیں کچھ خرابی ملی۔\n\nایپلی کیشن کو بہتر بنانے کے لیے براہ کرم کریش رپورٹ ہماری سپورٹ ٹیم کو بھیجیں۔",
"edit_node": "نوڈ میں ترمیم کریں۔"
} }

View file

@ -682,5 +682,6 @@
"send_to_this_address" : "发送 ${currency} ${tag}到这个地址", "send_to_this_address" : "发送 ${currency} ${tag}到这个地址",
"arrive_in_this_address" : "${currency} ${tag}将到达此地址", "arrive_in_this_address" : "${currency} ${tag}将到达此地址",
"do_not_send": "不要发送", "do_not_send": "不要发送",
"error_dialog_content": "糟糕,我们遇到了一些错误。\n\n请将崩溃报告发送给我们的支持团队以改进应用程序。" "error_dialog_content": "糟糕,我们遇到了一些错误。\n\n请将崩溃报告发送给我们的支持团队以改进应用程序。",
"edit_node": "编辑节点"
} }