Remove repeated demo notes from product screens (#28)

This commit is contained in:
Stephan D committed 2026-09-12 12:06:30 +02:00
1 parent 2ae8086d40
commit 54f50ad6b7
16 files changed
+86 -306

No files matched your search

+18
View File
@@ -238,3 +238,21 @@ tests were needed. The PR is not merged.
unmerged. Task and PR have frontend label, tech owner and SXCHNGE project.
Browser demo walkthrough also completed exchange and payout, confirming source
currency handoffs and exact fee/debit/receipt values on the result screen.
### Workspace copy cleanup — follow-up to #28
At the user's request, removed repeated demo/preview banners from the workspace,
transaction forms, auth, email confirmation, identity and limits. Confirmation
and result copy now uses ordinary product wording in EN/RU; the mobile wordmark
remains without the extra note. Removed unused localization entries and duplicate
email-state copy. Existing journey measurement, simulation flags, service behavior,
funds explanations and recovery controls are unchanged. Development constraints
belong in this record and package README, not repeated throughout the product UI.
Delivery continues in [PR #29](https://git.sendico.io/tech/sxchnge/pulls/29) on
`workspace-28`. This copy change does not connect real authentication, email,
payment, support or backoffice services.
Validation: all 115 frontend tests, app analysis, app Dart formatting, web build
and diff checks pass. Updated existing copy expectations; telemetry tests still
verify simulated events never count as real business success. No new click events
were needed for this presentation-only cleanup.
-5
View File
@@ -133,11 +133,6 @@ class _AuthFormState extends State<AuthForm> {
),
),
),
const SizedBox(height: 16),
Text(
l.earlyPreview,
style: text.bodySmall!.copyWith(color: colors.onSurfaceVariant),
),
const SizedBox(height: 24),
Text(
_signUp ? l.signupHeading : l.loginHeading,
@@ -221,13 +221,13 @@ abstract class AppLocalizations {
/// No description provided for @loginPreview.
///
/// In en, this message translates to:
/// **'Demo login completed. No real session was created. Your credentials have not been sent or saved.'**
/// **'You’re signed in.'**
String get loginPreview;
/// No description provided for @signupPreview.
///
/// In en, this message translates to:
/// **'Demo sign-up completed. No real account was created. Your credentials have not been sent or saved.'**
/// **'Your account is ready.'**
String get signupPreview;
/// No description provided for @alreadyMember.
@@ -254,12 +254,6 @@ abstract class AppLocalizations {
/// **'Create an account'**
String get createAnAccount;
/// No description provided for @earlyPreview.
///
/// In en, this message translates to:
/// **'EARLY PREVIEW · Login and sign-up are not live yet.'**
String get earlyPreview;
/// No description provided for @brandEyebrow.
///
/// In en, this message translates to:
@@ -476,16 +470,10 @@ abstract class AppLocalizations {
/// **'No email? Check your spam folder or request another below.'**
String get verificationHint;
/// No description provided for @verificationDemo.
///
/// In en, this message translates to:
/// **'DEMO · No real email is sent and no account is verified.'**
String get verificationDemo;
/// No description provided for @verificationDemoLink.
///
/// In en, this message translates to:
/// **'Open demo confirmation link'**
/// **'Continue to confirmation'**
String get verificationDemoLink;
/// No description provided for @verificationStep.
@@ -494,30 +482,6 @@ abstract class AppLocalizations {
/// **'CONFIRM YOUR EMAIL'**
String get verificationStep;
/// No description provided for @demoSentHeading.
///
/// In en, this message translates to:
/// **'Demo email prepared.'**
String get demoSentHeading;
/// No description provided for @demoSentBody.
///
/// In en, this message translates to:
/// **'No email was sent. Use the demo confirmation below to preview the next step.'**
String get demoSentBody;
/// No description provided for @demoVerifiedHeading.
///
/// In en, this message translates to:
/// **'Demo verification\ncomplete.'**
String get demoVerifiedHeading;
/// No description provided for @demoVerifiedBody.
///
/// In en, this message translates to:
/// **'You’ve previewed email confirmation. No account was verified. Return to login to explore the demo.'**
String get demoVerifiedBody;
/// No description provided for @verificationRecipient.
///
/// In en, this message translates to:
@@ -530,12 +494,6 @@ abstract class AppLocalizations {
/// **'Change email'**
String get verificationChangeEmail;
/// No description provided for @demoResend.
///
/// In en, this message translates to:
/// **'Prepare demo email again'**
String get demoResend;
/// No description provided for @kycTitle.
///
/// In en, this message translates to:
@@ -548,12 +506,6 @@ abstract class AppLocalizations {
/// **'Your account, at your pace. Verify your identity when you need higher limits.'**
String get kycIntro;
/// No description provided for @kycDemo.
///
/// In en, this message translates to:
/// **'DEMO · Use sample images only. Photos stay in memory, are never uploaded, and disappear when you leave or reload. Review decisions are simulated.'**
String get kycDemo;
/// No description provided for @kycUnverified.
///
/// In en, this message translates to:
@@ -665,7 +617,7 @@ abstract class AppLocalizations {
/// No description provided for @kycSupportBody.
///
/// In en, this message translates to:
/// **'Support is not connected in this preview. In the live app, you will be able to request a review here without submitting documents again.'**
/// **'Support is currently unavailable. Please try again later.'**
String get kycSupportBody;
/// No description provided for @kycBasic.
@@ -686,12 +638,6 @@ abstract class AppLocalizations {
/// **'Your limits'**
String get kycLimits;
/// No description provided for @kycLimitsDemo.
///
/// In en, this message translates to:
/// **'Illustrative limits from the demo service. These are not a live offer.'**
String get kycLimitsDemo;
/// No description provided for @kycDay.
///
/// In en, this message translates to:
@@ -815,7 +761,7 @@ abstract class AppLocalizations {
/// No description provided for @kycClose.
///
/// In en, this message translates to:
/// **'Back to account preview'**
/// **'Back to account'**
String get kycClose;
/// No description provided for @kycReviewHelp.
@@ -836,12 +782,6 @@ abstract class AppLocalizations {
/// **'Submit for review'**
String get kycSubmit;
/// No description provided for @kycSubmitDemo.
///
/// In en, this message translates to:
/// **'Simulate submission'**
String get kycSubmitDemo;
/// No description provided for @kycWorking.
///
/// In en, this message translates to:
@@ -941,7 +881,7 @@ abstract class AppLocalizations {
/// No description provided for @kycDemoControls.
///
/// In en, this message translates to:
/// **'Demo: simulate a backoffice decision'**
/// **'Review scenarios'**
String get kycDemoControls;
/// No description provided for @kycDemoApprove.
@@ -1112,12 +1052,6 @@ abstract class AppLocalizations {
/// **'Refresh'**
String get wRefresh;
/// No description provided for @wDemo.
///
/// In en, this message translates to:
/// **'Demo workspace · No real money moves.'**
String get wDemo;
/// No description provided for @wSource.
///
/// In en, this message translates to:
@@ -1151,7 +1085,7 @@ abstract class AppLocalizations {
/// No description provided for @wRecipientHint.
///
/// In en, this message translates to:
/// **'Sample recipient — demo only'**
/// **'Recipient name or reference'**
String get wRecipientHint;
/// No description provided for @wReview.
@@ -1223,7 +1157,7 @@ abstract class AppLocalizations {
/// No description provided for @wConfirm.
///
/// In en, this message translates to:
/// **'Confirm demo transaction'**
/// **'Confirm transaction'**
String get wConfirm;
/// No description provided for @wEdit.
@@ -1310,18 +1244,6 @@ abstract class AppLocalizations {
/// **'The transaction did not complete. The amount and fee are available in your account again.'**
String get wFailedOutgoing;
/// No description provided for @wDemoMethod.
///
/// In en, this message translates to:
/// **'Demo transfer'**
String get wDemoMethod;
/// No description provided for @wDemoMethodHelp.
///
/// In en, this message translates to:
/// **'Try the flow with sample data. No bank or payment provider is contacted.'**
String get wDemoMethodHelp;
/// No description provided for @wUnavailable.
///
/// In en, this message translates to:
@@ -1463,7 +1385,7 @@ abstract class AppLocalizations {
/// No description provided for @wLanguageSaved.
///
/// In en, this message translates to:
/// **'Saved to your demo account.'**
/// **'Saved to your account.'**
String get wLanguageSaved;
/// No description provided for @wLanguageFailed.
@@ -1487,7 +1409,7 @@ abstract class AppLocalizations {
/// No description provided for @wSecurityBody.
///
/// In en, this message translates to:
/// **'Live sessions, password changes and two-step verification are not connected in this demo.'**
/// **'Password and security settings are not available yet.'**
String get wSecurityBody;
/// No description provided for @wIdentity.
@@ -70,12 +70,10 @@ class AppLocalizationsEn extends AppLocalizations {
String get letsGo => 'Let’s go';
@override
String get loginPreview =>
'Demo login completed. No real session was created. Your credentials have not been sent or saved.';
String get loginPreview => 'You’re signed in.';
@override
String get signupPreview =>
'Demo sign-up completed. No real account was created. Your credentials have not been sent or saved.';
String get signupPreview => 'Your account is ready.';
@override
String get alreadyMember => 'Already part of sxchnge?';
@@ -89,10 +87,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get createAnAccount => 'Create an account';
@override
String get earlyPreview =>
'EARLY PREVIEW · Login and sign-up are not live yet.';
@override
String get brandEyebrow => 'A LITTLE CHANGE. A BIG NEXT STEP.';
@@ -211,38 +205,17 @@ class AppLocalizationsEn extends AppLocalizations {
'No email? Check your spam folder or request another below.';
@override
String get verificationDemo =>
'DEMO · No real email is sent and no account is verified.';
@override
String get verificationDemoLink => 'Open demo confirmation link';
String get verificationDemoLink => 'Continue to confirmation';
@override
String get verificationStep => 'CONFIRM YOUR EMAIL';
@override
String get demoSentHeading => 'Demo email prepared.';
@override
String get demoSentBody =>
'No email was sent. Use the demo confirmation below to preview the next step.';
@override
String get demoVerifiedHeading => 'Demo verification\ncomplete.';
@override
String get demoVerifiedBody =>
'You’ve previewed email confirmation. No account was verified. Return to login to explore the demo.';
@override
String get verificationRecipient => 'Recipient';
@override
String get verificationChangeEmail => 'Change email';
@override
String get demoResend => 'Prepare demo email again';
@override
String get kycTitle => 'Verification & limits';
@@ -250,10 +223,6 @@ class AppLocalizationsEn extends AppLocalizations {
String get kycIntro =>
'Your account, at your pace. Verify your identity when you need higher limits.';
@override
String get kycDemo =>
'DEMO · Use sample images only. Photos stay in memory, are never uploaded, and disappear when you leave or reload. Review decisions are simulated.';
@override
String get kycUnverified => 'Not verified';
@@ -319,7 +288,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get kycSupportBody =>
'Support is not connected in this preview. In the live app, you will be able to request a review here without submitting documents again.';
'Support is currently unavailable. Please try again later.';
@override
String get kycBasic => 'Basic';
@@ -330,10 +299,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get kycLimits => 'Your limits';
@override
String get kycLimitsDemo =>
'Illustrative limits from the demo service. These are not a live offer.';
@override
String get kycDay => 'Daily volume';
@@ -400,7 +365,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get kycSkip => 'Keep basic limits';
@override
String get kycClose => 'Back to account preview';
String get kycClose => 'Back to account';
@override
String get kycReviewHelp =>
@@ -412,9 +377,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get kycSubmit => 'Submit for review';
@override
String get kycSubmitDemo => 'Simulate submission';
@override
String get kycWorking => 'Processing… Please keep this page open.';
@@ -476,7 +438,7 @@ class AppLocalizationsEn extends AppLocalizations {
'Your review status has changed. Refresh it before continuing.';
@override
String get kycDemoControls => 'Demo: simulate a backoffice decision';
String get kycDemoControls => 'Review scenarios';
@override
String get kycDemoApprove => 'Approve';
@@ -566,9 +528,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get wRefresh => 'Refresh';
@override
String get wDemo => 'Demo workspace · No real money moves.';
@override
String get wSource => 'From account';
@@ -585,7 +544,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get wRecipient => 'Recipient';
@override
String get wRecipientHint => 'Sample recipient — demo only';
String get wRecipientHint => 'Recipient name or reference';
@override
String get wReview => 'Review';
@@ -623,7 +582,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get wNewQuote => 'Refresh quote';
@override
String get wConfirm => 'Confirm demo transaction';
String get wConfirm => 'Confirm transaction';
@override
String get wEdit => 'Edit details';
@@ -675,13 +634,6 @@ class AppLocalizationsEn extends AppLocalizations {
String get wFailedOutgoing =>
'The transaction did not complete. The amount and fee are available in your account again.';
@override
String get wDemoMethod => 'Demo transfer';
@override
String get wDemoMethodHelp =>
'Try the flow with sample data. No bank or payment provider is contacted.';
@override
String get wUnavailable =>
'Could not refresh. The displayed information may be out of date. Try again.';
@@ -762,7 +714,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get wLanguageHelp => 'Used throughout your account.';
@override
String get wLanguageSaved => 'Saved to your demo account.';
String get wLanguageSaved => 'Saved to your account.';
@override
String get wLanguageFailed =>
@@ -777,7 +729,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get wSecurityBody =>
'Live sessions, password changes and two-step verification are not connected in this demo.';
'Password and security settings are not available yet.';
@override
String get wIdentity => 'Identity verification';
@@ -70,12 +70,10 @@ class AppLocalizationsRu extends AppLocalizations {
String get letsGo => 'Продолжить';
@override
String get loginPreview =>
'Демонстрационный вход выполнен. Реальная сессия не создана. Учётные данные не отправлены и не сохранены.';
String get loginPreview => 'Вы вошли в аккаунт.';
@override
String get signupPreview =>
'Демонстрационная регистрация выполнена. Реальный аккаунт не создан. Учётные данные не отправлены и не сохранены.';
String get signupPreview => 'Ваш аккаунт готов.';
@override
String get alreadyMember => 'Уже есть аккаунт sxchnge?';
@@ -89,10 +87,6 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get createAnAccount => 'Зарегистрироваться';
@override
String get earlyPreview =>
'ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ · Вход и регистрация пока недоступны.';
@override
String get brandEyebrow => 'МАЛЕНЬКАЯ ПЕРЕМЕНА. БОЛЬШОЙ ШАГ.';
@@ -212,38 +206,17 @@ class AppLocalizationsRu extends AppLocalizations {
'Нет письма? Проверьте папку «Спам» или запросите новое ниже.';
@override
String get verificationDemo =>
'ДЕМО · Письмо не отправляется, реальный аккаунт не подтверждается.';
@override
String get verificationDemoLink => 'Открыть демоссылку подтверждения';
String get verificationDemoLink => 'Перейти к подтверждению';
@override
String get verificationStep => 'ПОДТВЕРДИТЕ ПОЧТУ';
@override
String get demoSentHeading => 'Демописьмо готово.';
@override
String get demoSentBody =>
'Письмо не отправлено. Используйте демоссылку ниже, чтобы посмотреть следующий шаг.';
@override
String get demoVerifiedHeading => 'Демоподтверждение\nзавершено.';
@override
String get demoVerifiedBody =>
'Вы посмотрели подтверждение почты. Реальный аккаунт не подтверждён. Вернитесь ко входу, чтобы продолжить знакомство с демоверсией.';
@override
String get verificationRecipient => 'Получатель';
@override
String get verificationChangeEmail => 'Изменить почту';
@override
String get demoResend => 'Подготовить демописьмо ещё раз';
@override
String get kycTitle => 'Верификация и лимиты';
@@ -251,10 +224,6 @@ class AppLocalizationsRu extends AppLocalizations {
String get kycIntro =>
'Ваш аккаунт — ваш темп. Подтвердите личность, когда понадобятся более высокие лимиты.';
@override
String get kycDemo =>
'ДЕМО · Используйте только тестовые изображения. Фото хранятся в памяти, не отправляются и удаляются при выходе или перезагрузке. Решения проверки имитируются.';
@override
String get kycUnverified => 'Личность не подтверждена';
@@ -319,8 +288,7 @@ class AppLocalizationsRu extends AppLocalizations {
String get kycSupport => 'Обратиться в поддержку';
@override
String get kycSupportBody =>
'В демоверсии поддержка не подключена. В рабочем приложении здесь можно будет запросить пересмотр без повторной отправки документов.';
String get kycSupportBody => 'Поддержка сейчас недоступна. Попробуйте позже.';
@override
String get kycBasic => 'Базовый';
@@ -331,10 +299,6 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get kycLimits => 'Ваши лимиты';
@override
String get kycLimitsDemo =>
'Пример лимитов из демосервиса. Это не действующее предложение.';
@override
String get kycDay => 'Объём за день';
@@ -401,7 +365,7 @@ class AppLocalizationsRu extends AppLocalizations {
String get kycSkip => 'Оставить базовые лимиты';
@override
String get kycClose => 'К демоаккаунту';
String get kycClose => 'К аккаунту';
@override
String get kycReviewHelp =>
@@ -413,9 +377,6 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get kycSubmit => 'Отправить на проверку';
@override
String get kycSubmitDemo => 'Имитировать отправку';
@override
String get kycWorking => 'Обработка… Не закрывайте страницу.';
@@ -477,7 +438,7 @@ class AppLocalizationsRu extends AppLocalizations {
'Статус проверки изменился. Обновите его, прежде чем продолжить.';
@override
String get kycDemoControls => 'Демо: имитация решения сотрудника';
String get kycDemoControls => 'Сценарии проверки';
@override
String get kycDemoApprove => 'Одобрить';
@@ -567,9 +528,6 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get wRefresh => 'Обновить';
@override
String get wDemo => 'Демонстрация · Реальные деньги не переводятся.';
@override
String get wSource => 'Со счёта';
@@ -586,7 +544,7 @@ class AppLocalizationsRu extends AppLocalizations {
String get wRecipient => 'Получатель';
@override
String get wRecipientHint => 'Тестовый получатель — только демо';
String get wRecipientHint => 'Имя или реквизиты получателя';
@override
String get wReview => 'Проверить';
@@ -624,7 +582,7 @@ class AppLocalizationsRu extends AppLocalizations {
String get wNewQuote => 'Обновить расчёт';
@override
String get wConfirm => 'Подтвердить тестовую операцию';
String get wConfirm => 'Подтвердить операцию';
@override
String get wEdit => 'Изменить данные';
@@ -675,13 +633,6 @@ class AppLocalizationsRu extends AppLocalizations {
String get wFailedOutgoing =>
'Операция не выполнена. Сумма и комиссия снова доступны на вашем счёте.';
@override
String get wDemoMethod => 'Тестовый перевод';
@override
String get wDemoMethodHelp =>
'Попробуйте сценарий с тестовыми данными. Банки и платёжные системы не подключены.';
@override
String get wUnavailable =>
'Не удалось обновить данные. Информация может быть устаревшей. Повторите попытку.';
@@ -760,7 +711,7 @@ class AppLocalizationsRu extends AppLocalizations {
String get wLanguageHelp => 'Используется во всём аккаунте.';
@override
String get wLanguageSaved => 'Сохранено в тестовом аккаунте.';
String get wLanguageSaved => 'Сохранено в аккаунте.';
@override
String get wLanguageFailed =>
@@ -775,7 +726,7 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get wSecurityBody =>
'В этой демонстрации не подключены рабочие сессии, смена пароля и двухэтапная проверка.';
'Настройки пароля и безопасности пока недоступны.';
@override
String get wIdentity => 'Подтверждение личности';
+1 -1
View File
@@ -77,7 +77,7 @@ class IdentityForm extends StatelessWidget {
FilledButton(
key: const ValueKey('kyc-submit'),
onPressed: p.canSubmit ? p.submit : null,
child: Text(p.isDemo ? l.kycSubmitDemo : l.kycSubmit),
child: Text(l.kycSubmit),
),
if (p.step > 0)
TextButton(onPressed: p.busy ? null : p.back, child: Text(l.kycBack)),
-2
View File
@@ -47,8 +47,6 @@ class LimitsPanel extends StatelessWidget {
data.tier == AccountTier.basic ? l.kycBasic : l.kycVerifiedTier,
style: t.textTheme.titleLarge,
),
if (data.simulated)
Text(l.kycLimitsDemo, style: t.textTheme.bodySmall),
const SizedBox(height: 12),
if (data.rows.isEmpty) Text(l.kycLimitsEmpty),
for (final row in data.rows) ...[
-15
View File
@@ -149,21 +149,6 @@ class IdentityPageState extends State<IdentityPage> {
),
const SizedBox(height: 12),
Text(l.kycIntro, style: t.textTheme.bodyLarge),
const SizedBox(height: 20),
if (p.isDemo)
Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: t.colorScheme.tertiaryContainer,
borderRadius: BorderRadius.circular(16),
),
child: Text(
l.kycDemo,
style: TextStyle(
color: t.colorScheme.onTertiaryContainer,
),
),
),
const SizedBox(height: 24),
if (p.busy) ...[
const LinearProgressIndicator(),
+10 -23
View File
@@ -20,13 +20,12 @@
"hideConfirmation": "Hide confirmation",
"createAccount": "Create account",
"letsGo": "Let’s go",
"loginPreview": "Demo login completed. No real session was created. Your credentials have not been sent or saved.",
"signupPreview": "Demo sign-up completed. No real account was created. Your credentials have not been sent or saved.",
"loginPreview": "You’re signed in.",
"signupPreview": "Your account is ready.",
"alreadyMember": "Already part of sxchnge?",
"newHere": "New around here?",
"loginInstead": "Log in instead",
"createAnAccount": "Create an account",
"earlyPreview": "EARLY PREVIEW · Login and sign-up are not live yet.",
"brandEyebrow": "A LITTLE CHANGE. A BIG NEXT STEP.",
"brandHeading": "Good moves.\nStart here.",
"brandIntro": "A fresh way forward.\nMake it yours with sxchnge.",
@@ -63,19 +62,12 @@
"verificationRetry": "Retry verification",
"verificationBack": "Back to login",
"verificationHint": "No email? Check your spam folder or request another below.",
"verificationDemo": "DEMO · No real email is sent and no account is verified.",
"verificationDemoLink": "Open demo confirmation link",
"verificationDemoLink": "Continue to confirmation",
"verificationStep": "CONFIRM YOUR EMAIL",
"demoSentHeading": "Demo email prepared.",
"demoSentBody": "No email was sent. Use the demo confirmation below to preview the next step.",
"demoVerifiedHeading": "Demo verification\ncomplete.",
"demoVerifiedBody": "You’ve previewed email confirmation. No account was verified. Return to login to explore the demo.",
"verificationRecipient": "Recipient",
"verificationChangeEmail": "Change email",
"demoResend": "Prepare demo email again",
"kycTitle": "Verification & limits",
"kycIntro": "Your account, at your pace. Verify your identity when you need higher limits.",
"kycDemo": "DEMO · Use sample images only. Photos stay in memory, are never uploaded, and disappear when you leave or reload. Review decisions are simulated.",
"kycUnverified": "Not verified",
"kycPending": "In review",
"kycApproved": "Identity verified",
@@ -94,11 +86,10 @@
"kycResubmit": "Replace photos",
"kycRefresh": "Refresh status & limits",
"kycSupport": "Contact support",
"kycSupportBody": "Support is not connected in this preview. In the live app, you will be able to request a review here without submitting documents again.",
"kycSupportBody": "Support is currently unavailable. Please try again later.",
"kycBasic": "Basic",
"kycVerifiedTier": "Verified",
"kycLimits": "Your limits",
"kycLimitsDemo": "Illustrative limits from the demo service. These are not a live offer.",
"kycDay": "Daily volume",
"kycMonth": "Monthly volume",
"kycCurrent": "Current cap",
@@ -119,11 +110,10 @@
"kycNext": "Continue",
"kycBack": "Back",
"kycSkip": "Keep basic limits",
"kycClose": "Back to account preview",
"kycClose": "Back to account",
"kycReviewHelp": "Check that both photos are readable and show the same passport. A staff member will review them; submission does not immediately raise your limits.",
"kycConfirm": "These photos show me and my own valid passport.",
"kycSubmit": "Submit for review",
"kycSubmitDemo": "Simulate submission",
"kycWorking": "Processing… Please keep this page open.",
"kycDiscardTitle": "Discard these photos?",
"kycDiscardBody": "Your draft is only in memory. Leaving will remove the selected photos; you can start again later.",
@@ -140,7 +130,7 @@
"kycErrorSession": "Your session has expired. Return to login, then check your verification status.",
"kycErrorRate": "Too many requests. Wait a moment before trying again.",
"kycErrorConflict": "Your review status has changed. Refresh it before continuing.",
"kycDemoControls": "Demo: simulate a backoffice decision",
"kycDemoControls": "Review scenarios",
"kycDemoApprove": "Approve",
"kycDemoCorrect": "Request clearer passport",
"kycDemoSelfie": "Request clearer selfie",
@@ -169,13 +159,12 @@
"wEmptyActivity": "Your next move starts here. Your transactions will appear below.",
"wEmptyAccounts": "Your accounts are not ready yet. Try refreshing.",
"wRefresh": "Refresh",
"wDemo": "Demo workspace · No real money moves.",
"wSource": "From account",
"wDestination": "To account",
"wReceiveAccount": "Receiving account",
"wAmount": "Amount",
"wRecipient": "Recipient",
"wRecipientHint": "Sample recipient — demo only",
"wRecipientHint": "Recipient name or reference",
"wReview": "Review",
"wReviewTitle": "One last look.",
"wFee": "Fee",
@@ -187,7 +176,7 @@
"wQuoteNotice": "These terms are valid for 60 seconds. Confirm them before continuing.",
"wExpired": "This quote expired. Refresh it and review the new terms.",
"wNewQuote": "Refresh quote",
"wConfirm": "Confirm demo transaction",
"wConfirm": "Confirm transaction",
"wEdit": "Edit details",
"wClose": "Close",
"wWorking": "Working on it…",
@@ -202,8 +191,6 @@
"wCompletePayout": "Your payout is complete. The amount and fee have been deducted from your account.",
"wFailedTopUp": "The top-up did not complete. No money was added to your account.",
"wFailedOutgoing": "The transaction did not complete. The amount and fee are available in your account again.",
"wDemoMethod": "Demo transfer",
"wDemoMethodHelp": "Try the flow with sample data. No bank or payment provider is contacted.",
"wUnavailable": "Could not refresh. The displayed information may be out of date. Try again.",
"wInvalidAmount": "Enter an amount greater than zero, using the currency’s decimal precision.",
"wInsufficient": "Not enough available money for this amount and fee. Top up or enter a smaller amount.",
@@ -227,11 +214,11 @@
"wPreferences": "Make it yours.",
"wLanguage": "Account language",
"wLanguageHelp": "Used throughout your account.",
"wLanguageSaved": "Saved to your demo account.",
"wLanguageSaved": "Saved to your account.",
"wLanguageFailed": "Changed for this session, but not saved to your account. Retry below.",
"wProfileError": "Account preferences could not be loaded. Try again.",
"wSecurity": "Security",
"wSecurityBody": "Live sessions, password changes and two-step verification are not connected in this demo.",
"wSecurityBody": "Password and security settings are not available yet.",
"wIdentity": "Identity verification",
"wIdentityHelp": "Optional verification for higher limits.",
"wBackLogin": "Back to login",
+10 -23
View File
@@ -20,13 +20,12 @@
"hideConfirmation": "Скрыть повтор пароля",
"createAccount": "Создать аккаунт",
"letsGo": "Продолжить",
"loginPreview": "Демонстрационный вход выполнен. Реальная сессия не создана. Учётные данные не отправлены и не сохранены.",
"signupPreview": "Демонстрационная регистрация выполнена. Реальный аккаунт не создан. Учётные данные не отправлены и не сохранены.",
"loginPreview": "Вы вошли в аккаунт.",
"signupPreview": "Ваш аккаунт готов.",
"alreadyMember": "Уже есть аккаунт sxchnge?",
"newHere": "Впервые здесь?",
"loginInstead": "Войти в аккаунт",
"createAnAccount": "Зарегистрироваться",
"earlyPreview": "ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ · Вход и регистрация пока недоступны.",
"brandEyebrow": "МАЛЕНЬКАЯ ПЕРЕМЕНА. БОЛЬШОЙ ШАГ.",
"brandHeading": "Всё начинается\nс перемен.",
"brandIntro": "Новый путь вперёд.\nОткройте его вместе со sxchnge.",
@@ -63,19 +62,12 @@
"verificationRetry": "Повторить подтверждение",
"verificationBack": "Вернуться ко входу",
"verificationHint": "Нет письма? Проверьте папку «Спам» или запросите новое ниже.",
"verificationDemo": "ДЕМО · Письмо не отправляется, реальный аккаунт не подтверждается.",
"verificationDemoLink": "Открыть демоссылку подтверждения",
"verificationDemoLink": "Перейти к подтверждению",
"verificationStep": "ПОДТВЕРДИТЕ ПОЧТУ",
"demoSentHeading": "Демописьмо готово.",
"demoSentBody": "Письмо не отправлено. Используйте демоссылку ниже, чтобы посмотреть следующий шаг.",
"demoVerifiedHeading": "Демоподтверждение\nзавершено.",
"demoVerifiedBody": "Вы посмотрели подтверждение почты. Реальный аккаунт не подтверждён. Вернитесь ко входу, чтобы продолжить знакомство с демоверсией.",
"verificationRecipient": "Получатель",
"verificationChangeEmail": "Изменить почту",
"demoResend": "Подготовить демописьмо ещё раз",
"kycTitle": "Верификация и лимиты",
"kycIntro": "Ваш аккаунт — ваш темп. Подтвердите личность, когда понадобятся более высокие лимиты.",
"kycDemo": "ДЕМО · Используйте только тестовые изображения. Фото хранятся в памяти, не отправляются и удаляются при выходе или перезагрузке. Решения проверки имитируются.",
"kycUnverified": "Личность не подтверждена",
"kycPending": "На проверке",
"kycApproved": "Личность подтверждена",
@@ -94,11 +86,10 @@
"kycResubmit": "Заменить фото",
"kycRefresh": "Обновить статус и лимиты",
"kycSupport": "Обратиться в поддержку",
"kycSupportBody": "В демоверсии поддержка не подключена. В рабочем приложении здесь можно будет запросить пересмотр без повторной отправки документов.",
"kycSupportBody": "Поддержка сейчас недоступна. Попробуйте позже.",
"kycBasic": "Базовый",
"kycVerifiedTier": "Подтверждённый",
"kycLimits": "Ваши лимиты",
"kycLimitsDemo": "Пример лимитов из демосервиса. Это не действующее предложение.",
"kycDay": "Объём за день",
"kycMonth": "Объём за месяц",
"kycCurrent": "Текущий лимит",
@@ -119,11 +110,10 @@
"kycNext": "Продолжить",
"kycBack": "Назад",
"kycSkip": "Оставить базовые лимиты",
"kycClose": "К демоаккаунту",
"kycClose": "К аккаунту",
"kycReviewHelp": "Убедитесь, что оба фото читаемы и на них один паспорт. Их проверит сотрудник. Отправка не повышает лимиты сразу.",
"kycConfirm": "На фото я и мой действующий паспорт.",
"kycSubmit": "Отправить на проверку",
"kycSubmitDemo": "Имитировать отправку",
"kycWorking": "Обработка… Не закрывайте страницу.",
"kycDiscardTitle": "Удалить выбранные фото?",
"kycDiscardBody": "Черновик хранится только в памяти. При выходе выбранные фото будут удалены. Позже можно начать заново.",
@@ -140,7 +130,7 @@
"kycErrorSession": "Сессия истекла. Войдите снова и проверьте статус верификации.",
"kycErrorRate": "Слишком много запросов. Немного подождите и повторите попытку.",
"kycErrorConflict": "Статус проверки изменился. Обновите его, прежде чем продолжить.",
"kycDemoControls": "Демо: имитация решения сотрудника",
"kycDemoControls": "Сценарии проверки",
"kycDemoApprove": "Одобрить",
"kycDemoCorrect": "Запросить чёткое фото паспорта",
"kycDemoSelfie": "Запросить чёткое селфи",
@@ -169,13 +159,12 @@
"wEmptyActivity": "Ваш следующий шаг начинается здесь. Здесь появятся ваши операции.",
"wEmptyAccounts": "Ваши счета ещё не готовы. Попробуйте обновить страницу.",
"wRefresh": "Обновить",
"wDemo": "Демонстрация · Реальные деньги не переводятся.",
"wSource": "Со счёта",
"wDestination": "На счёт",
"wReceiveAccount": "Счёт для зачисления",
"wAmount": "Сумма",
"wRecipient": "Получатель",
"wRecipientHint": "Тестовый получатель — только демо",
"wRecipientHint": "Имя или реквизиты получателя",
"wReview": "Проверить",
"wReviewTitle": "Проверьте детали.",
"wFee": "Комиссия",
@@ -187,7 +176,7 @@
"wQuoteNotice": "Эти условия действуют 60 секунд. Подтвердите их, прежде чем продолжить.",
"wExpired": "Срок действия расчёта истёк. Обновите его и проверьте новые условия.",
"wNewQuote": "Обновить расчёт",
"wConfirm": "Подтвердить тестовую операцию",
"wConfirm": "Подтвердить операцию",
"wEdit": "Изменить данные",
"wClose": "Закрыть",
"wWorking": "Обрабатываем…",
@@ -202,8 +191,6 @@
"wCompletePayout": "Вывод завершён. Сумма и комиссия списаны с вашего счёта.",
"wFailedTopUp": "Пополнение не выполнено. На счёт ничего не зачислено.",
"wFailedOutgoing": "Операция не выполнена. Сумма и комиссия снова доступны на вашем счёте.",
"wDemoMethod": "Тестовый перевод",
"wDemoMethodHelp": "Попробуйте сценарий с тестовыми данными. Банки и платёжные системы не подключены.",
"wUnavailable": "Не удалось обновить данные. Информация может быть устаревшей. Повторите попытку.",
"wInvalidAmount": "Введите сумму больше нуля с допустимым для валюты числом знаков после запятой.",
"wInsufficient": "Для этой суммы и комиссии недостаточно доступных средств. Пополните счёт или уменьшите сумму.",
@@ -227,11 +214,11 @@
"wPreferences": "Настройте под себя.",
"wLanguage": "Язык аккаунта",
"wLanguageHelp": "Используется во всём аккаунте.",
"wLanguageSaved": "Сохранено в тестовом аккаунте.",
"wLanguageSaved": "Сохранено в аккаунте.",
"wLanguageFailed": "Изменено для текущей сессии, но не сохранено в аккаунте. Повторите попытку ниже.",
"wProfileError": "Не удалось загрузить настройки аккаунта. Повторите попытку.",
"wSecurity": "Безопасность",
"wSecurityBody": "В этой демонстрации не подключены рабочие сессии, смена пароля и двухэтапная проверка.",
"wSecurityBody": "Настройки пароля и безопасности пока недоступны.",
"wIdentity": "Подтверждение личности",
"wIdentityHelp": "Необязательная проверка для повышения лимитов.",
"wBackLogin": "Вернуться ко входу",
+5 -14
View File
@@ -127,11 +127,10 @@ class _VerificationPageState extends State<VerificationPage> {
!_lastWasSend &&
widget.token != null;
final title = switch (status) {
VerificationStatus.sent => demo ? l.demoSentHeading : l.checkInbox,
VerificationStatus.sent => l.checkInbox,
VerificationStatus.sending => l.verificationSending,
VerificationStatus.checking => l.verificationChecking,
VerificationStatus.verified =>
demo ? l.demoVerifiedHeading : l.verificationVerified,
VerificationStatus.verified => l.verificationVerified,
VerificationStatus.expired => l.verificationExpired,
VerificationStatus.invalid => l.verificationInvalid,
VerificationStatus.error => l.verificationInternal,
@@ -141,9 +140,8 @@ class _VerificationPageState extends State<VerificationPage> {
: l.verificationRequest,
};
final body = switch (status) {
VerificationStatus.sent => demo ? l.demoSentBody : l.verificationSent,
VerificationStatus.verified =>
demo ? l.demoVerifiedBody : l.verificationVerifiedBody,
VerificationStatus.sent => l.verificationSent,
VerificationStatus.verified => l.verificationVerifiedBody,
VerificationStatus.expired => l.verificationExpiredBody,
VerificationStatus.invalid => l.verificationInvalidBody,
VerificationStatus.error => l.verificationInternalBody,
@@ -200,13 +198,6 @@ class _VerificationPageState extends State<VerificationPage> {
color: colors.primary,
),
),
if (demo) ...[
const SizedBox(height: 12),
Text(
l.verificationDemo,
style: theme.textTheme.bodyMedium,
),
],
const SizedBox(height: 12),
Semantics(
liveRegion: true,
@@ -258,7 +249,7 @@ class _VerificationPageState extends State<VerificationPage> {
key: const ValueKey('verification-resend'),
onPressed: _send,
child: Text(
demo ? l.demoResend : l.verificationResend,
l.verificationResend,
textAlign: TextAlign.center,
),
),
+6 -10
View File
@@ -63,16 +63,12 @@ class _WorkspaceShellState extends State<WorkspaceShell> {
final wide = MediaQuery.sizeOf(context).width >= 900;
final content = Column(
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 12),
child: Column(
crossAxisAlignment: wide
? CrossAxisAlignment.end
: CrossAxisAlignment.start,
children: [
if (!wide) ...[const BrandWordmark(), const SizedBox(height: 8)],
Text(l.wDemo, style: t.textTheme.bodySmall),
],
if (!wide)
const Padding(
padding: EdgeInsets.symmetric(horizontal: 24, vertical: 12),
child: Align(
alignment: Alignment.centerLeft,
child: BrandWordmark(),
),
),
Expanded(child: widget.child),
-2
View File
@@ -138,8 +138,6 @@ class TransferPageState extends State<TransferPage> {
],
),
const SizedBox(height: 20),
Text(l.wDemoMethodHelp, style: t.textTheme.bodySmall),
const SizedBox(height: 24),
Focus(
key: _content,
focusNode: _focus,
+1 -1
View File
@@ -129,7 +129,7 @@ void main() {
same(router),
);
expect(find.byKey(const ValueKey('verification-verified')), findsOneWidget);
expect(find.text('Демоподтверждение\nзавершено.'), findsOneWidget);
expect(find.text('Ваша почта\nподтверждена.'), findsOneWidget);
});
testWidgets(
+4 -4
View File
@@ -111,7 +111,7 @@ void main() {
);
testWidgets(
'signup to demo verification is correlated and never claims a business success',
'signup verification keeps simulated analytics with ordinary product copy',
(tester) async {
final sink = DummyAnalyticsService();
await open(tester, '/', sink);
@@ -130,10 +130,10 @@ void main() {
'example-password',
);
await tap(tester, find.byKey(const ValueKey('submit')));
expect(find.text('Demo email prepared.'), findsOneWidget);
expect(find.textContaining('We’ve sent you'), findsNothing);
expect(find.text('Check your inbox.'), findsOneWidget);
expect(find.textContaining('We’ve sent you'), findsOneWidget);
await tap(tester, find.byKey(const ValueKey('demo-confirmation')));
expect(find.text('Demo verification\ncomplete.'), findsOneWidget);
expect(find.text('Your email\nis verified.'), findsOneWidget);
expect(sink.events.map((e) => e.journeyId).toSet().length, 1);
expect(sink.events.where((e) => e.terminal).length, 1);
expect(
+1 -1
View File
@@ -57,7 +57,7 @@ void main() {
find.byKey(ValueKey('verification-${scenario.value}')),
findsOneWidget,
);
expect(find.textContaining('DEMO'), findsOneWidget);
expect(find.textContaining('DEMO'), findsNothing);
expect(tester.takeException(), isNull);
},
);