diff --git a/Bitkit/AppScene.swift b/Bitkit/AppScene.swift
index 334d4875..83df9fe3 100644
--- a/Bitkit/AppScene.swift
+++ b/Bitkit/AppScene.swift
@@ -187,7 +187,7 @@ struct AppScene: View {
private func handleCurrencyStaleData(_: Bool) {
if currency.hasStaleData {
- app.toast(type: .error, title: t("other__rates_unavailable_title"), description: t("other__rates_unavailable_description"))
+ app.toast(type: .error, title: "Rates currently unavailable", description: "An error has occurred. Please try again later.")
}
}
diff --git a/Bitkit/Components/Activity/ActivityBanner.swift b/Bitkit/Components/Activity/ActivityBanner.swift
index b190cbdf..e97eec15 100644
--- a/Bitkit/Components/Activity/ActivityBanner.swift
+++ b/Bitkit/Components/Activity/ActivityBanner.swift
@@ -26,7 +26,7 @@ struct ActivityBanner: View {
.frame(width: 20, height: 20)
.foregroundColor(accentColor)
- Text(t("wallet__activity_transfer_in_progress"))
+ Text(tTodo("TRANSFER IN PROGRESS"))
.font(Fonts.black(size: 20))
.foregroundColor(.textPrimary)
.kerning(0)
diff --git a/Bitkit/Components/Home/Suggestions.swift b/Bitkit/Components/Home/Suggestions.swift
index c6c5ab9e..5e138ee3 100644
--- a/Bitkit/Components/Home/Suggestions.swift
+++ b/Bitkit/Components/Home/Suggestions.swift
@@ -82,7 +82,7 @@ let cards: [SuggestionCardData] = [
SuggestionCardData(
id: "notifications",
title: t("cards__notifications__title"),
- description: t("cards__notifications__description"),
+ description: tTodo("When Bitkit is closed"),
imageName: "bell-figure",
color: .purple24,
action: .notifications
diff --git a/Bitkit/MainNavView.swift b/Bitkit/MainNavView.swift
index ed2dece0..cf522206 100644
--- a/Bitkit/MainNavView.swift
+++ b/Bitkit/MainNavView.swift
@@ -189,8 +189,8 @@ struct MainNavView: View {
Logger.error("Failed to sync push notifications with backend: \(error)")
app.toast(
type: .error,
- title: t("other__notification_registration_failed_title"),
- description: t("other__notification_registration_failed_description")
+ title: tTodo("Notification Registration Failed"),
+ description: tTodo("Bitkit was unable to register for push notifications.")
)
}
}
@@ -210,8 +210,8 @@ struct MainNavView: View {
Logger.error("Failed to sync push notifications: \(error)")
app.toast(
type: .error,
- title: t("other__notification_registration_failed_title"),
- description: t("other__notification_registration_failed_description")
+ title: tTodo("Notification Registration Failed"),
+ description: tTodo("Bitkit was unable to register for push notifications.")
)
}
}
@@ -271,14 +271,14 @@ struct MainNavView: View {
case .contacts:
if app.hasSeenContactsIntro {
// ContactsView()
- Text(t("common__coming_soon"))
+ Text("Coming Soon")
} else {
ContactsIntroView()
}
case .profile:
if app.hasSeenProfileIntro {
// ProfileView()
- Text(t("common__coming_soon"))
+ Text("Coming Soon")
} else {
ProfileIntroView()
}
@@ -306,7 +306,7 @@ struct MainNavView: View {
case let .activityDetail(activity): ActivityItemView(item: activity)
case let .activityExplorer(activity): ActivityExplorerView(item: activity)
case .buyBitcoin: BuyBitcoinView()
- case .contacts: Text(t("common__coming_soon"))
+ case .contacts: Text("Coming Soon")
case .contactsIntro: ContactsIntroView()
case .savingsWallet: SavingsWalletView()
case .spendingWallet: SpendingWalletView()
@@ -327,7 +327,7 @@ struct MainNavView: View {
case .savingsConfirm: SavingsConfirmView()
case .savingsAdvanced: SavingsAdvancedView()
case .savingsProgress: SavingsProgressView()
- case .profile: Text(t("common__coming_soon"))
+ case .profile: Text("Coming Soon")
case .profileIntro: ProfileIntroView()
case .scanner: ScannerScreen()
diff --git a/Bitkit/Managers/ScannerManager.swift b/Bitkit/Managers/ScannerManager.swift
index 2df87785..d794d0ea 100644
--- a/Bitkit/Managers/ScannerManager.swift
+++ b/Bitkit/Managers/ScannerManager.swift
@@ -150,8 +150,8 @@ class ScannerManager: ObservableObject {
else {
app.toast(
type: .error,
- title: t("other__scan__error__title_process"),
- description: t("other__scan__error__image_load")
+ title: "Error",
+ description: tTodo("Sorry. Bitkit wasn't able to load this image.")
)
return
}
@@ -159,8 +159,8 @@ class ScannerManager: ObservableObject {
guard let cgImage = image.cgImage else {
app.toast(
type: .error,
- title: t("other__scan__error__title_process"),
- description: t("other__scan__error__image_process")
+ title: "Error",
+ description: tTodo("Sorry. Bitkit wasn't able to process this image.")
)
return
}
@@ -171,8 +171,8 @@ class ScannerManager: ObservableObject {
DispatchQueue.main.async {
app.toast(
type: .error,
- title: t("other__scan__error__title"),
- description: t("other__scan__error__detection")
+ title: tTodo("Detection Error"),
+ description: tTodo("Failed to process the image for QR codes.")
)
}
return
@@ -183,8 +183,8 @@ class ScannerManager: ObservableObject {
DispatchQueue.main.async {
app.toast(
type: .error,
- title: t("other__scan__error__title_no_qr"),
- description: t("other__scan__error__no_qr")
+ title: tTodo("No QR Code Found"),
+ description: tTodo("Sorry. Bitkit wasn't able to detect a QR code in this image.")
)
}
return
@@ -198,8 +198,8 @@ class ScannerManager: ObservableObject {
DispatchQueue.main.async {
app.toast(
type: .error,
- title: t("other__scan__error__title_no_qr"),
- description: t("other__scan__error__no_qr")
+ title: tTodo("No QR Code Found"),
+ description: tTodo("Sorry. Bitkit wasn't able to detect a QR code in this image.")
)
}
return
@@ -230,8 +230,8 @@ class ScannerManager: ObservableObject {
Logger.error(error, context: "Failed to process image")
app.toast(
type: .error,
- title: t("other__scan__error__title_process"),
- description: t("other__scan__error__image_process")
+ title: tTodo("Error"),
+ description: tTodo("Sorry. An error occurred when trying to process this image.")
)
}
}
diff --git a/Bitkit/Resources/Localization/en.lproj/Localizable.strings b/Bitkit/Resources/Localization/en.lproj/Localizable.strings
index 1312c4fe..84df6832 100644
--- a/Bitkit/Resources/Localization/en.lproj/Localizable.strings
+++ b/Bitkit/Resources/Localization/en.lproj/Localizable.strings
@@ -37,7 +37,6 @@
"common__continue" = "Continue";
"common__cancel" = "Cancel";
"common__close" = "Close";
-"common__coming_soon" = "Coming Soon";
"common__are_you_sure" = "Are You Sure?";
"common__yes_proceed" = "Yes, Proceed";
"common__try_again" = "Try Again";
@@ -53,24 +52,17 @@
"common__done" = "Done";
"common__delete" = "Delete";
"common__delete_yes" = "Yes, Delete";
-"common__error" = "Error";
-"common__off" = "Off";
"common__ok" = "OK";
"common__ok_random" = "Awesome!\nNice!\nCool!\nGreat!\nFantastic!\nSweet!\nExcellent!\nTerrific!";
-"common__on" = "On";
-"common__qr_code" = "QR Code";
"common__reset" = "Reset";
"common__retry" = "Retry";
"common__later" = "Later";
-"common__show_all" = "Show All";
-"common__show_details" = "Show Details";
"common__skip" = "Skip";
"common__copied" = "Copied To Clipboard";
"common__yes" = "Yes";
"common__no" = "No";
"common__back" = "Back";
"common__learn_more" = "Learn More";
-"common__success" = "Success";
"common__understood" = "Understood";
"common__connect" = "Connect";
"common__min" = "Min";
@@ -144,7 +136,6 @@
"lightning__spending_confirm__amount" = "To spending";
"lightning__spending_confirm__total" = "Total";
"lightning__spending_confirm__default" = "Use Defaults";
-"lightning__spending_confirm__background_setup" = "Set up in background";
"lightning__spending_advanced__title" = "Receiving\ncapacity";
"lightning__spending_advanced__fee" = "Liquidity fee";
"lightning__liquidity__title" = "Liquidity\n& routing";
@@ -285,10 +276,10 @@
"lightning__wait_text_top" = "Please wait for Bitkit to connect to the payment network (±10 seconds).";
"lightning__wait_text_bottom" = "Connecting & Syncing...";
"onboarding__tos_header" = "Bitkit\nterms of use";
-"onboarding__tos_checkbox" = "Terms of Use";
-"onboarding__tos_checkbox_value" = "By continuing you declare that you have read and accept the terms of use.";
+"onboarding__tos_checkbox" = "Terms of use";
+"onboarding__tos_checkbox_value" = "I declare that I have read and accept the terms of use.";
"onboarding__pp_checkbox" = "Privacy Policy";
-"onboarding__pp_checkbox_value" = "By continuing you declare that you have read and accept the privacy policy.";
+"onboarding__pp_checkbox_value" = "I declare that I have read and accept the privacy policy.";
"onboarding__welcome_title" = "You can ₿ \nthe change";
"onboarding__welcome_text" = "Use Bitkit to pay anyone, anywhere, any time, and spend your bitcoin on the things you value in life.";
"onboarding__get_started" = "Get Started";
@@ -378,24 +369,13 @@
"other__scan_err_decoding" = "Decoding Error";
"other__scan_err_interpret_title" = "Unable To Interpret Provided Data";
"other__scan_err_not_payable_msg" = "This QR code does not appear to contain payment data.";
-"other__notification_registration_failed_title" = "Notification Registration Failed";
-"other__notification_registration_failed_description" = "Bitkit was unable to register for push notifications.";
"other__rate_error_title" = "Bitcoin Price Update Failed";
"other__rate_error_msg_date" = "Bitkit could not update the current Bitcoin exchange rate. Using price from {date}";
"other__rate_error_msg_nodate" = "Bitkit could not update the current Bitcoin exchange rate. Please try again later.";
-"other__rates_unavailable_title" = "Rates currently unavailable";
-"other__rates_unavailable_description" = "An error has occurred. Please try again later.";
-"other__lightning_not_running_title" = "Lightning not running";
-"other__lightning_not_running_description" = "Please try again later.";
-"other__unsupported_invoice_title" = "Unsupported";
-"other__unsupported_invoice_description" = "This type of invoice is not supported yet";
"other__lnurl_pay_error" = "Unable To Pay (LNURL)";
"other__lnurl_ln_error_msg" = "Could not start local Lightning node. Please try again or restart Bitkit.";
"other__lnurl_pay_error_no_capacity" = "Not enough outbound/sending capacity to complete lnurl-pay request.";
"other__lnurl_channel_error" = "Unable To Open Channel (LNURL)";
-"other__lnurl_channel_loading" = "Loading channel information...";
-"other__lnurl_channel_load_failed" = "Failed to load channel information";
-"other__lnurl_channel_node_id_missing" = "Node ID is missing";
"other__lnurl_channel_error_raw" = "An error occured when you tried paying: {raw}";
"other__lnurl_channel_header" = "Lightning Connection";
"other__lnurl_channel_title" = "New\nlightning\nconnection";
@@ -413,8 +393,6 @@
"other__lnurl_auth_success_title" = "Signed In";
"other__lnurl_auth_success_msg_domain" = "You successfully signed in to {domain}.";
"other__lnurl_auth_success_msg_no_domain" = "You successfully signed in.";
-"other__lnurl_withdr_failure_title" = "Withdrawal Failed";
-"other__lnurl_withdr_failure_text" = "Your withdrawal was unsuccessful. Please scan the QR code again or contact support.";
"other__lnurl_withdr_error" = "Withdraw Failed (LNURL)";
"other__lnurl_withdr_error_generic" = "Sorry, an error occurred.";
"other__lnurl_withdr_error_no_capacity" = "Not enough receiving capacity to complete withdraw request.";
@@ -437,14 +415,6 @@
"other__transfer_notification__body" = "Open Bitkit to complete your transfer";
"other__scan__error__generic" = "Bitkit is unable to read the provided data.";
"other__scan__error__expired" = "This Lightning invoice has expired.";
-"other__scan__error__detection" = "Failed to process the image for QR codes.";
-"other__scan__error__image_load" = "Sorry. Bitkit wasn't able to load this image.";
-"other__scan__error__image_process" = "Sorry. Bitkit wasn't able to process this image.";
-"other__scan__error__no_qr" = "Sorry. Bitkit wasn't able to detect a QR code in this image.";
-"other__scan__error__title" = "Detection Error";
-"other__scan__error__title_no_qr" = "No QR Code Found";
-"other__scan__error__title_process" = "Error";
-"other__scan__manual_prompt" = "Enter QR Code String";
"other__gift__claiming__title" = "Claiming Gift";
"other__gift__claiming__text" = "Claiming your Bitkit gift code...";
"other__gift__error__title" = "Gift Code Error";
@@ -453,8 +423,6 @@
"other__gift__used__title" = "Used Code";
"other__gift__used__text" = "This Bitkit gift code has already been used, and the funds have been paid out.";
"other__gift__used__button" = "OK";
-"other__gift__used_up__title" = "Out of Gifts";
-"other__gift__used_up__text" = "Sorry, you're too late! All gifts for this code have already been claimed.";
"other__shop__intro__title" = "Shop";
"other__shop__intro__description" = "Get your life on the Bitcoin standard. Spend your Bitcoin on digital gift cards, eSIMs, phone refills, and more.";
"other__shop__intro__button" = "Get Started";
@@ -462,28 +430,6 @@
"other__shop__discover__tabs__shop" = "Shop";
"other__shop__discover__tabs__map" = "Map";
"other__shop__discover__label" = "Gift card categories";
-"other__shop__category_apparel" = "Apparel";
-"other__shop__category_automobiles" = "Automobiles";
-"other__shop__category_cruises" = "Cruises";
-"other__shop__category_ecommerce" = "Ecommerce";
-"other__shop__category_electronics" = "Electronics";
-"other__shop__category_entertainment" = "Entertainment";
-"other__shop__category_experiences" = "Experiences";
-"other__shop__category_flights" = "Flights";
-"other__shop__category_food" = "Food";
-"other__shop__category_food_delivery" = "Food Delivery";
-"other__shop__category_games" = "Games";
-"other__shop__category_gifts" = "Gifts";
-"other__shop__category_groceries" = "Groceries";
-"other__shop__category_health_beauty" = "Health & Beauty";
-"other__shop__category_home" = "Home";
-"other__shop__category_multi_brand" = "Multi-Brand";
-"other__shop__category_pets" = "Pets";
-"other__shop__category_restaurants" = "Restaurants";
-"other__shop__category_retail" = "Retail";
-"other__shop__category_streaming" = "Streaming";
-"other__shop__category_travel" = "Travel";
-"other__shop__category_voip" = "VoIP";
"other__shop__discover__gift-cards__title" = "Gift Cards";
"other__shop__discover__gift-cards__description" = "Shop with Bitcoin";
"other__shop__discover__esims__title" = "ESims";
@@ -574,10 +520,6 @@
"security__display_seed" = "Show Seed Phrase";
"security__contact_support" = "Contact Support";
"security__wipe_app" = "Wipe App";
-"security__wipe_failed_title" = "Wipe Failed";
-"security__wipe_failed_description" = "Bitkit was unable to reset your wallet data. Please try again.";
-"security__recovery_mnemonic_error_title" = "Mnemonic Error";
-"security__recovery_mnemonic_error_text" = "Unable to load mnemonic phrase";
"security__close_app" = "Close Bitkit";
"security__export_title" = "Export To Phone";
"security__export_text" = "You can export a copy of your wallet data as a .ZIP file. This file is encrypted with the password you set below.";
@@ -655,10 +597,6 @@
"settings__general__language" = "Language";
"settings__general__language_title" = "Language";
"settings__general__language_other" = "Interface language";
-"settings__general__language_changed_title" = "Language Changed";
-"settings__general__language_changed_message" = "The app needs to be restarted for the language change to take full effect.";
-"settings__logs__delete_confirm" = "Are you sure you want to delete all log files? This action cannot be undone.";
-"settings__logs__zip_failed" = "Failed to create log zip file";
"settings__widgets__nav_title" = "Widgets";
"settings__widgets__showWidgets" = "Widgets";
"settings__widgets__showWidgetTitles" = "Show Widget Titles";
@@ -829,11 +767,6 @@
"settings__addr__sats_found" = "₿ {totalBalance} found";
"settings__addr__gen_20" = "Generate 20 More";
"settings__addr__check_balances" = "Check Balances";
-"settings__addr__error_loading_title" = "Error Loading Addresses";
-"settings__addr__error_loading_more_title" = "Error Loading More Addresses";
-"settings__addr__balances_updated_title" = "Balances Updated";
-"settings__addr__balances_updated_description" = "Address balances have been refreshed";
-"settings__addr__error_checking_balances_title" = "Error Checking Balances";
"settings__addr__copied" = "Copied to clipboard";
"settings__es__error_host_port" = "Please specify a host and port to connect to.";
"settings__es__error_host" = "Please specify a host to connect to.";
@@ -864,8 +797,6 @@
"settings__rgs__button_connect" = "Connect";
"settings__rgs__update_success_title" = "Rapid-Gossip-Sync Server Updated";
"settings__rgs__update_success_description" = "You may need to restart the app once or twice for this change to take effect.";
-"settings__rgs__error_peer" = "RGS Error";
-"settings__rgs__server_error_description" = "Bitkit could not establish a connection to the RGS server.";
"settings__wr__error_wr" = "Web Relay Error";
"settings__wr__error_url" = "Please specify a URL to connect to.";
"settings__wr__error_https" = "Not a valid HTTPS url.";
@@ -992,11 +923,6 @@
"wallet__send_regular" = "Regular Payment";
"wallet__send_error_slash_ln" = "Unfortunately contact could not be paid instantly. You can try a regular payment (more expensive, slower).";
"wallet__send_error_tx_failed" = "Transaction Failed";
-"wallet__send_error" = "Send Error";
-"wallet__send_insufficient_funds_title" = "Insufficient Funds";
-"wallet__send_insufficient_funds_description" = "You do not have enough funds in the selected wallet.";
-"wallet__send_no_utxos_title" = "No UTXOs";
-"wallet__send_no_utxos_description" = "You do not have any UTXOs to spend.";
"wallet__send_error_create_tx" = "Unable to broadcast the transaction. Please try again.";
"wallet__tag_remove_error_title" = "Removing Tag Failed";
"wallet__tag_remove_error_description" = "Bitkit was unable to find the transaction data.";
@@ -1022,11 +948,9 @@
"wallet__send_coin_selection_output_to_small_description" = "Please remove UTXOs or increase your send amount to proceed.";
"wallet__send_fee_error_min" = "Unable to decrease the fee any further.";
"wallet__send_fee_custom" = "Set Custom Fee";
-"wallet__send_fee_use_suggested" = "Use Suggested Fee";
"wallet__send_fee_total" = "₿ {feeSats} for this transaction";
"wallet__send_fee_total_fiat" = "₿ {feeSats} for this transaction ({fiatSymbol}{fiatFormatted})";
"wallet__note" = "Note";
-"wallet__lnurl_pay_confirm__fee_instant" = "Instant (±$0.02)";
"wallet__lnurl_pay_confirm__comment" = "Comment";
"wallet__lnurl_pay_confirm__comment_placeholder" = "Optional comment to receiver";
"wallet__tags" = "Tags";
@@ -1034,8 +958,6 @@
"wallet__tags_add_button" = "Add";
"wallet__tags_add_error_header" = "Adding Tag Failed";
"wallet__tags_add_error_description" = "Bitkit was unable to find the transaction data.";
-"wallet__tags_add_error_no_payment_id" = "Payment ID not available";
-"wallet__tags_delete_error_header" = "Failed to delete tag";
"wallet__tags_new" = "New tag";
"wallet__tags_new_enter" = "Enter a new tag";
"wallet__tags_previously" = "Previously used tags";
@@ -1068,8 +990,6 @@
"wallet__receive_show_qr" = "Show QR Code";
"wallet__receive_text_lnfunds" = "Want to receive Lightning funds?";
"wallet__receive_spending" = "Receive on Spending Balance";
-"wallet__receive_spending_title" = "Receive on spending balance";
-"wallet__receive_spending_description" = "Enjoy instant and cheap\ntransactions with friends, family,\nand merchants.";
"wallet__receive_connect_initial" = "To set up your spending balance, a {networkFee} network fee and {serviceFee} service provider fee will be deducted.";
"wallet__receive_connect_additional" = "To receive more instant Bitcoin, Bitkit has to increase your liquidity. A {networkFee} network fee and {serviceFee} service provider fee will be deducted from the amount you specified.";
"wallet__receive_liquidity__nav_title" = "Spending Balance Setup";
@@ -1078,14 +998,10 @@
"wallet__receive_liquidity__text_additional" = "Your Spending Balance uses the Lightning Network to make your payments cheaper, faster, and more private.\n\nThis works like internet access, but you pay for liquidity & routing instead of bandwidth.\n\nBitkit needs to increase the receiving capacity of your spending balance to process this payment.";
"wallet__receive_liquidity__label" = "Spending Balance Liquidity";
"wallet__receive_liquidity__label_additional" = "Additional Spending Balance Liquidity";
-"wallet__receive_background_setup" = "Enable background setup";
-"wallet__receive_background_setup_text" = "Enable background setup to safely exit Bitkit while your balance is being configured.";
"wallet__receive_cjit_error" = "Transaction Failed";
"wallet__receive_cjit_error_msg" = "Failed to send funds to your spending account.";
"wallet__receive_will" = "You will receive";
"wallet__receive_ldk_init" = "Spending Balance Initializing...";
-"wallet__receive_lightning_not_ready_title" = "Lightning not ready";
-"wallet__receive_lightning_not_ready_description" = "Lightning node must be running to create an invoice";
"wallet__minimum" = "MINIMUM";
"wallet__activity" = "Activity";
"wallet__activity_show_all" = "Show All Activity";
@@ -1096,13 +1012,11 @@
"wallet__activity_pending" = "Pending";
"wallet__activity_failed" = "Failed";
"wallet__activity_transfer" = "Transfer";
-"wallet__activity_transfer_in_progress" = "TRANSFER IN PROGRESS";
"wallet__activity_transfer_savings_pending" = "From Spending (±{duration})";
"wallet__activity_transfer_savings_done" = "From Spending";
"wallet__activity_transfer_spending_pending" = "From Savings (±{duration})";
"wallet__activity_transfer_spending_done" = "From Savings";
"wallet__activity_transfer_to_spending" = "To Spending";
-"wallet__fund_receive_title" = "Fund Receive";
"wallet__activity_transfer_to_savings" = "To Savings";
"wallet__activity_transfer_pending" = "Transfer (±{duration})";
"wallet__activity_confirms_in" = "Confirms in {feeRateDescription}";
@@ -1157,8 +1071,6 @@
"wallet__activity_group_year" = "This year";
"wallet__details_savings_title" = "Savings";
"wallet__details_spending_title" = "Spending";
-"wallet__transfer_to_savings" = "Transfer To Savings";
-"wallet__transfer_to_spending" = "Transfer To Spending";
"wallet__savings__title" = "Savings";
"wallet__savings__onboarding" = "Send\nbitcoin\nto your\nsavings balance";
"wallet__spending__title" = "Spending";
diff --git a/Bitkit/ViewModels/AppViewModel.swift b/Bitkit/ViewModels/AppViewModel.swift
index f78eb62f..29428c61 100644
--- a/Bitkit/ViewModels/AppViewModel.swift
+++ b/Bitkit/ViewModels/AppViewModel.swift
@@ -150,7 +150,7 @@ extension AppViewModel {
}
func toast(_ error: Error) {
- toast(type: .error, title: t("common__error"), description: error.localizedDescription)
+ toast(type: .error, title: "Error", description: error.localizedDescription)
}
func hideToast() {
@@ -172,7 +172,7 @@ extension AppViewModel {
case let .onChain(invoice):
if let lnInvoice = invoice.params?["lightning"] {
guard lightningService.status?.isRunning == true else {
- toast(type: .error, title: t("other__lightning_not_running_title"), description: t("other__lightning_not_running_description"))
+ toast(type: .error, title: "Lightning not running", description: "Please try again later.")
return
}
// Lightning invoice param found, prefer lightning payment if possible
@@ -188,7 +188,7 @@ extension AppViewModel {
handleScannedOnchainInvoice(invoice)
case let .lightning(invoice):
guard lightningService.status?.isRunning == true else {
- toast(type: .error, title: t("other__lightning_not_running_title"), description: t("other__lightning_not_running_description"))
+ toast(type: .error, title: "Lightning not running", description: "Please try again later.")
return
}
@@ -196,7 +196,7 @@ extension AppViewModel {
if lightningService.canSend(amountSats: invoice.amountSatoshis) {
handleScannedLightningInvoice(invoice, bolt11: uri)
} else {
- toast(type: .error, title: t("wallet__send_insufficient_funds_title"), description: t("wallet__send_insufficient_funds_description"))
+ toast(type: .error, title: "Insufficient Funds", description: "You do not have enough funds to send this payment.")
}
case let .lnurlPay(data: lnurlPayData):
Logger.debug("LNURL: \(lnurlPayData)")
@@ -212,7 +212,7 @@ extension AppViewModel {
handleLnurlAuth(lnurlAuthData, lnurl: uri)
case let .nodeId(url, network):
guard lightningService.status?.isRunning == true else {
- toast(type: .error, title: t("other__lightning_not_running_title"), description: t("other__lightning_not_running_description"))
+ toast(type: .error, title: "Lightning not running", description: "Please try again later.")
return
}
@@ -223,7 +223,7 @@ extension AppViewModel {
sheetViewModel.showSheet(.gift, data: GiftConfig(code: code, amount: Int(amount)))
default:
Logger.warn("Unhandled invoice type: \(data)")
- toast(type: .error, title: t("other__unsupported_invoice_title"), description: t("other__unsupported_invoice_description"))
+ toast(type: .error, title: "Unsupported", description: "This type of invoice is not supported yet")
}
}
@@ -248,7 +248,7 @@ extension AppViewModel {
private func handleLnurlPayInvoice(_ data: LnurlPayData) {
// Check if lightning service is running
guard lightningService.status?.isRunning == true else {
- toast(type: .error, title: t("other__lightning_not_running_title"), description: t("other__lightning_not_running_description"))
+ toast(type: .error, title: "Lightning not running", description: "Please try again later.")
return
}
@@ -274,7 +274,7 @@ extension AppViewModel {
private func handleLnurlWithdraw(_ data: LnurlWithdrawData) {
// Check if lightning service is running
guard lightningService.status?.isRunning == true else {
- toast(type: .error, title: t("other__lightning_not_running_title"), description: t("other__lightning_not_running_description"))
+ toast(type: .error, title: "Lightning not running", description: "Please try again later.")
return
}
@@ -314,7 +314,7 @@ extension AppViewModel {
private func handleLnurlChannel(_ data: LnurlChannelData) {
// Check if lightning service is running
guard lightningService.status?.isRunning == true else {
- toast(type: .error, title: t("other__lightning_not_running_title"), description: t("other__lightning_not_running_description"))
+ toast(type: .error, title: "Lightning not running", description: "Please try again later.")
return
}
@@ -325,7 +325,7 @@ extension AppViewModel {
private func handleLnurlAuth(_ data: LnurlAuthData, lnurl: String) {
// Check if lightning service is running
guard lightningService.status?.isRunning == true else {
- toast(type: .error, title: t("other__lightning_not_running_title"), description: t("other__lightning_not_running_description"))
+ toast(type: .error, title: "Lightning not running", description: "Please try again later.")
return
}
diff --git a/Bitkit/Views/Backup/BackupMnemonic.swift b/Bitkit/Views/Backup/BackupMnemonic.swift
index 25377408..fb7bbcdf 100644
--- a/Bitkit/Views/Backup/BackupMnemonic.swift
+++ b/Bitkit/Views/Backup/BackupMnemonic.swift
@@ -15,8 +15,8 @@ struct BackupMnemonicView: View {
private var note: String {
showMnemonic
- ? t("security__mnemonic_cannot_recover")
- : t("security__mnemonic_never_share")
+ ? "Bitkit cannot access your funds and cannot help recover them if you lose your recovery phrase. Keep it safe!"
+ : "Make sure no one can see your screen. Never share your recovery phrase with anyone, as it may result in loss of funds."
}
private var mnemonicAccessibilityLabel: String {
@@ -77,11 +77,11 @@ struct BackupMnemonicView: View {
if Env.isDebug || Env.isTestFlight {
let mnemonicString = mnemonic.joined(separator: " ")
UIPasteboard.general.string = mnemonicString
- app.toast(type: .success, title: t("common__copied"))
+ app.toast(type: .success, title: t("common__copied"), description: "Mnemonic copied to clipboard")
}
}
- BodySText(note, textColor: .brandAccent, accentFont: Fonts.bold)
+ BodySText(tTodo(note), textColor: .brandAccent, accentFont: Fonts.bold)
Spacer()
diff --git a/Bitkit/Views/Backup/BackupPassphrase.swift b/Bitkit/Views/Backup/BackupPassphrase.swift
index e1157762..ecebb682 100644
--- a/Bitkit/Views/Backup/BackupPassphrase.swift
+++ b/Bitkit/Views/Backup/BackupPassphrase.swift
@@ -33,7 +33,7 @@ struct BackupPassphrase: View {
.frame(maxWidth: .infinity)
BodySText(
- t("security__pass_never_share"),
+ tTodo("Never share your passphrase with anyone, as it may result in loss of funds. Keep it secret!"),
accentColor: .brandAccent,
accentFont: Fonts.bold
)
diff --git a/Bitkit/Views/Gift/GiftUsedUp.swift b/Bitkit/Views/Gift/GiftUsedUp.swift
index eb874366..1a72fb34 100644
--- a/Bitkit/Views/Gift/GiftUsedUp.swift
+++ b/Bitkit/Views/Gift/GiftUsedUp.swift
@@ -6,10 +6,10 @@ struct GiftUsedUp: View {
var body: some View {
VStack(alignment: .leading, spacing: 0) {
- SheetHeader(title: t("other__gift__used_up__title"))
+ SheetHeader(title: t("Out of Gifts"))
VStack(spacing: 0) {
- BodyMText(t("other__gift__used_up__text"))
+ BodyMText(tTodo("Sorry, you’re too late! All gifts for this code have already been claimed."))
.frame(maxWidth: .infinity, alignment: .leading)
Spacer()
diff --git a/Bitkit/Views/Onboarding/OnboardingSlider.swift b/Bitkit/Views/Onboarding/OnboardingSlider.swift
index a13b7323..6af0bfe0 100644
--- a/Bitkit/Views/Onboarding/OnboardingSlider.swift
+++ b/Bitkit/Views/Onboarding/OnboardingSlider.swift
@@ -67,7 +67,7 @@ struct OnboardingSlider: View {
OnboardingTab(
imageName: "keyring",
title: t("onboarding__slide0_header"),
- text: t("onboarding__slide0_text"),
+ text: tTodo("Bitkit hands you the keys to control your money, profile, and contacts. Take charge and become borderless."),
accentColor: .blueAccent
)
.tag(0)
@@ -76,7 +76,7 @@ struct OnboardingSlider: View {
OnboardingTab(
imageName: "lightning",
title: t("onboarding__slide1_header"),
- text: t("onboarding__slide1_text"),
+ text: tTodo("Enjoy instant and cheap payments with friends, family, and merchants on the Lightning Network."),
disclaimerText: GeoService.shared.isGeoBlocked ? t("onboarding__slide1_note") : nil,
accentColor: .purpleAccent
)
@@ -86,7 +86,9 @@ struct OnboardingSlider: View {
OnboardingTab(
imageName: "shield-figure",
title: t("onboarding__slide3_header"),
- text: t("onboarding__slide3_text"),
+ text: tTodo(
+ "Your money, your privacy. Swipe to hide your balance and spend more privately, with no data tracking and zero KYC."
+ ),
accentColor: .greenAccent
)
.tag(2)
diff --git a/Bitkit/Views/Onboarding/TermsView.swift b/Bitkit/Views/Onboarding/TermsView.swift
index def3f5f8..06b923f3 100644
--- a/Bitkit/Views/Onboarding/TermsView.swift
+++ b/Bitkit/Views/Onboarding/TermsView.swift
@@ -25,8 +25,8 @@ private struct TermsFooter: View {
VStack(spacing: 25) {
VStack(alignment: .leading, spacing: 12) {
FooterItem(
- title: t("onboarding__tos_checkbox"),
- subtitle: t("onboarding__tos_checkbox_value"),
+ title: tTodo("Terms of Use"),
+ subtitle: tTodo("By continuing you declare that you have read and accept the terms of use."),
subtitleUrl: nil
)
@@ -34,7 +34,7 @@ private struct TermsFooter: View {
FooterItem(
title: t("onboarding__pp_checkbox"),
- subtitle: t("onboarding__pp_checkbox_value"),
+ subtitle: tTodo("By continuing you declare that you have read and accept the privacy policy."),
subtitleUrl: URL(string: Env.privacyPolicyUrl)
)
diff --git a/Bitkit/Views/Recovery/RecoveryMnemonicScreen.swift b/Bitkit/Views/Recovery/RecoveryMnemonicScreen.swift
index 16c3bbf1..c9ba8a27 100644
--- a/Bitkit/Views/Recovery/RecoveryMnemonicScreen.swift
+++ b/Bitkit/Views/Recovery/RecoveryMnemonicScreen.swift
@@ -97,8 +97,8 @@ struct RecoveryMnemonicScreen: View {
} else {
app.toast(
type: .error,
- title: t("security__recovery_mnemonic_error_title"),
- description: t("security__recovery_mnemonic_error_text")
+ title: "Mnemonic Error",
+ description: "Unable to load mnemonic phrase"
)
}
@@ -106,8 +106,8 @@ struct RecoveryMnemonicScreen: View {
} catch {
app.toast(
type: .error,
- title: t("security__recovery_mnemonic_error_title"),
- description: t("security__recovery_mnemonic_error_text")
+ title: "Mnemonic Error",
+ description: "Unable to load mnemonic phrase"
)
}
diff --git a/Bitkit/Views/Recovery/RecoveryScreen.swift b/Bitkit/Views/Recovery/RecoveryScreen.swift
index 392e9b8b..dffc613e 100644
--- a/Bitkit/Views/Recovery/RecoveryScreen.swift
+++ b/Bitkit/Views/Recovery/RecoveryScreen.swift
@@ -105,7 +105,7 @@ struct RecoveryScreen: View {
private func onExportLogs() {
Task {
guard let zipURL = LogService.shared.zipLogs() else {
- app.toast(type: .error, title: t("common__error"), description: t("settings__logs__zip_failed"))
+ app.toast(type: .error, title: "Error", description: "Failed to create log zip file")
return
}
@@ -215,8 +215,8 @@ struct RecoveryScreen: View {
} catch {
app.toast(
type: .error,
- title: t("security__wipe_failed_title"),
- description: t("security__wipe_failed_description")
+ title: "Wipe Failed",
+ description: "Bitkit was unable to reset your wallet data. Please try again."
)
}
}
diff --git a/Bitkit/Views/Scanner/ManualScanPrompt.swift b/Bitkit/Views/Scanner/ManualScanPrompt.swift
index 3c36629c..d7d06885 100644
--- a/Bitkit/Views/Scanner/ManualScanPrompt.swift
+++ b/Bitkit/Views/Scanner/ManualScanPrompt.swift
@@ -17,7 +17,7 @@ struct ScannerManualEntryPrompt: View {
.accessibilityIdentifier("DialogCancel")
}
- BodyMSBText(t("other__scan__manual_prompt"))
+ BodyMSBText("Enter QR Code String")
SwiftUI.TextField("", text: $text)
.textInputAutocapitalization(.never)
diff --git a/Bitkit/Views/Scanner/ScannerScreen.swift b/Bitkit/Views/Scanner/ScannerScreen.swift
index 4d54f50c..1a660905 100644
--- a/Bitkit/Views/Scanner/ScannerScreen.swift
+++ b/Bitkit/Views/Scanner/ScannerScreen.swift
@@ -45,7 +45,7 @@ struct ScannerScreen: View {
if Env.isE2E {
CustomButton(
- title: t("other__scan__manual_prompt"),
+ title: "Enter QR Code String",
variant: .secondary,
shouldExpand: true
) {
diff --git a/Bitkit/Views/Scanner/ScannerSheet.swift b/Bitkit/Views/Scanner/ScannerSheet.swift
index e98a7873..511287b8 100644
--- a/Bitkit/Views/Scanner/ScannerSheet.swift
+++ b/Bitkit/Views/Scanner/ScannerSheet.swift
@@ -45,7 +45,7 @@ struct ScannerSheet: View {
if Env.isE2E {
CustomButton(
- title: t("other__scan__manual_prompt"),
+ title: "Enter QRCode String",
variant: .secondary,
shouldExpand: true
) {
diff --git a/Bitkit/Views/Settings/Advanced/AddressViewer.swift b/Bitkit/Views/Settings/Advanced/AddressViewer.swift
index 7f4e95bc..b2c4d4aa 100644
--- a/Bitkit/Views/Settings/Advanced/AddressViewer.swift
+++ b/Bitkit/Views/Settings/Advanced/AddressViewer.swift
@@ -223,7 +223,7 @@ struct AddressViewer: View {
// Load More Button
if !addresses.isEmpty {
CustomButton(
- title: t("settings__addr__gen_20"),
+ title: "Generate 20 More",
variant: .secondary,
size: .small,
isLoading: isLoading,
@@ -282,7 +282,7 @@ struct AddressViewer: View {
} catch {
await MainActor.run {
- app.toast(type: .error, title: t("settings__addr__error_loading_title"), description: error.localizedDescription)
+ app.toast(type: .error, title: "Error Loading Addresses", description: error.localizedDescription)
isLoading = false
}
}
@@ -313,7 +313,7 @@ struct AddressViewer: View {
} catch {
await MainActor.run {
- app.toast(type: .error, title: t("settings__addr__error_loading_more_title"), description: error.localizedDescription)
+ app.toast(type: .error, title: "Error Loading More Addresses", description: error.localizedDescription)
isLoading = false
}
}
@@ -331,11 +331,11 @@ struct AddressViewer: View {
await MainActor.run {
addressBalances = balances
isLoadingBalances = false
- app.toast(type: .success, title: t("settings__addr__balances_updated_title"), description: t("settings__addr__balances_updated_description"))
+ app.toast(type: .success, title: "Balances Updated", description: "Address balances have been refreshed")
}
} catch {
await MainActor.run {
- app.toast(type: .error, title: t("settings__addr__error_checking_balances_title"), description: error.localizedDescription)
+ app.toast(type: .error, title: "Error Checking Balances", description: error.localizedDescription)
isLoadingBalances = false
}
}
diff --git a/Bitkit/Views/Settings/Advanced/LightningConnectionsView.swift b/Bitkit/Views/Settings/Advanced/LightningConnectionsView.swift
index c033dd87..d10a8e53 100644
--- a/Bitkit/Views/Settings/Advanced/LightningConnectionsView.swift
+++ b/Bitkit/Views/Settings/Advanced/LightningConnectionsView.swift
@@ -316,7 +316,7 @@ struct LightningConnectionsView: View {
private func onExportLogs() {
Task {
guard let zipURL = LogService.shared.zipLogs() else {
- app.toast(type: .error, title: t("common__error"), description: t("settings__logs__zip_failed"))
+ app.toast(type: .error, title: "Error", description: "Failed to create log zip file")
return
}
diff --git a/Bitkit/Views/Settings/Advanced/RgsSettingsScreen.swift b/Bitkit/Views/Settings/Advanced/RgsSettingsScreen.swift
index e2734957..4e5df643 100644
--- a/Bitkit/Views/Settings/Advanced/RgsSettingsScreen.swift
+++ b/Bitkit/Views/Settings/Advanced/RgsSettingsScreen.swift
@@ -97,8 +97,8 @@ struct RgsSettingsScreen: View {
} else {
app.toast(
type: .warning,
- title: t("settings__rgs__error_peer"),
- description: errorMessage ?? t("settings__rgs__server_error_description"),
+ title: tTodo("settings__rgs__error_peer"),
+ description: errorMessage ?? tTodo("settings__rgs__server_error_description"),
accessibilityIdentifier: "RgsErrorToast"
)
}
diff --git a/Bitkit/Views/Settings/Backup/ResetAndRestore.swift b/Bitkit/Views/Settings/Backup/ResetAndRestore.swift
index 286906df..97bcd23a 100644
--- a/Bitkit/Views/Settings/Backup/ResetAndRestore.swift
+++ b/Bitkit/Views/Settings/Backup/ResetAndRestore.swift
@@ -69,8 +69,8 @@ struct ResetAndRestore: View {
} catch {
app.toast(
type: .error,
- title: t("security__wipe_failed_title"),
- description: t("security__wipe_failed_description")
+ title: "Wipe Failed",
+ description: "Bitkit was unable to reset your wallet data. Please try again."
)
}
}
diff --git a/Bitkit/Views/Settings/General/LanguageSettingsScreen.swift b/Bitkit/Views/Settings/General/LanguageSettingsScreen.swift
index 959d6f88..d6c0a495 100644
--- a/Bitkit/Views/Settings/General/LanguageSettingsScreen.swift
+++ b/Bitkit/Views/Settings/General/LanguageSettingsScreen.swift
@@ -42,10 +42,10 @@ struct LanguageSettingsScreen: View {
.navigationBarHidden(true)
.padding(.horizontal, 16)
.bottomSafeAreaPadding()
- .alert(t("settings__general__language_changed_title"), isPresented: $showAlert) {
- Button(t("common__ok"), role: .cancel) {}
+ .alert("Language Changed", isPresented: $showAlert) {
+ Button("OK", role: .cancel) {}
} message: {
- Text(t("settings__general__language_changed_message"))
+ Text("The app needs to be restarted for the language change to take full effect.")
}
}
}
diff --git a/Bitkit/Views/Settings/GeneralSettingsView.swift b/Bitkit/Views/Settings/GeneralSettingsView.swift
index 200be288..7aedc6d1 100644
--- a/Bitkit/Views/Settings/GeneralSettingsView.swift
+++ b/Bitkit/Views/Settings/GeneralSettingsView.swift
@@ -58,7 +58,7 @@ struct GeneralSettingsView: View {
NavigationLink(value: Route.widgetsSettings) {
SettingsListLabel(
title: t("settings__widgets__nav_title"),
- rightText: settings.showWidgets ? t("common__on") : t("common__off")
+ rightText: settings.showWidgets ? tTodo("On") : tTodo("Off")
)
}
.accessibilityIdentifier("WidgetsSettings")
@@ -66,7 +66,7 @@ struct GeneralSettingsView: View {
NavigationLink(value: app.hasSeenQuickpayIntro ? Route.quickpay : Route.quickpayIntro) {
SettingsListLabel(
title: t("settings__quickpay__nav_title"),
- rightText: settings.enableQuickpay ? t("common__on") : t("common__off")
+ rightText: settings.enableQuickpay ? tTodo("On") : tTodo("Off")
)
}
.accessibilityIdentifier("QuickpaySettings")
@@ -74,7 +74,7 @@ struct GeneralSettingsView: View {
NavigationLink(value: app.hasSeenNotificationsIntro ? Route.notifications : Route.notificationsIntro) {
SettingsListLabel(
title: t("settings__notifications__nav_title"),
- rightText: settings.enableNotifications ? t("common__on") : t("common__off")
+ rightText: settings.enableNotifications ? tTodo("On") : tTodo("Off")
)
}
.accessibilityIdentifier("NotificationsSettings")
diff --git a/Bitkit/Views/Settings/LogView.swift b/Bitkit/Views/Settings/LogView.swift
index 974f3be6..e1e99be4 100644
--- a/Bitkit/Views/Settings/LogView.swift
+++ b/Bitkit/Views/Settings/LogView.swift
@@ -32,12 +32,12 @@ struct LogView: View {
.disabled(logFiles.isEmpty)
)
.alert("Delete All Logs", isPresented: $showingDeleteConfirmation) {
- Button(t("common__cancel"), role: .cancel) {}
- Button(t("common__delete"), role: .destructive) {
+ Button("Cancel", role: .cancel) {}
+ Button("Delete", role: .destructive) {
deleteAllLogs()
}
} message: {
- Text(t("settings__logs__delete_confirm"))
+ Text("Are you sure you want to delete all log files? This action cannot be undone.")
}
.task {
loadLogFiles()
diff --git a/Bitkit/Views/Shop/ShopDiscover.swift b/Bitkit/Views/Shop/ShopDiscover.swift
index 385fc106..3c36fe25 100644
--- a/Bitkit/Views/Shop/ShopDiscover.swift
+++ b/Bitkit/Views/Shop/ShopDiscover.swift
@@ -38,28 +38,28 @@ struct ShopDiscover: View {
// Categories data
private let categories: [ShopCategory] = [
- ShopCategory(title: t("other__shop__category_apparel"), route: "buy/apparel", iconName: "pedestrian"),
- ShopCategory(title: t("other__shop__category_automobiles"), route: "buy/automobiles", iconName: "car"),
- ShopCategory(title: t("other__shop__category_cruises"), route: "buy/cruises", iconName: "train"),
- ShopCategory(title: t("other__shop__category_ecommerce"), route: "buy/ecommerce", iconName: "shopping-cart"),
- ShopCategory(title: t("other__shop__category_electronics"), route: "buy/electronics", iconName: "printer"),
- ShopCategory(title: t("other__shop__category_entertainment"), route: "buy/entertainment", iconName: "headphones"),
- ShopCategory(title: t("other__shop__category_experiences"), route: "buy/experiences", iconName: "globe"),
- ShopCategory(title: t("other__shop__category_flights"), route: "buy/flights", iconName: "airplane"),
- ShopCategory(title: t("other__shop__category_food"), route: "buy/food", iconName: "storefront"),
- ShopCategory(title: t("other__shop__category_food_delivery"), route: "buy/food-delivery", iconName: "bicycle"),
- ShopCategory(title: t("other__shop__category_games"), route: "buy/games", iconName: "game-controller"),
- ShopCategory(title: t("other__shop__category_gifts"), route: "buy/gifts", iconName: "gift"),
- ShopCategory(title: t("other__shop__category_groceries"), route: "buy/groceries", iconName: "shopping-bag"),
- ShopCategory(title: t("other__shop__category_health_beauty"), route: "buy/health-beauty", iconName: "heartbeat"),
- ShopCategory(title: t("other__shop__category_home"), route: "buy/home", iconName: "house"),
- ShopCategory(title: t("other__shop__category_multi_brand"), route: "buy/multi-brand", iconName: "stack"),
- ShopCategory(title: t("other__shop__category_pets"), route: "buy/pets", iconName: "horse"),
- ShopCategory(title: t("other__shop__category_restaurants"), route: "buy/restaurants", iconName: "fork-knife"),
- ShopCategory(title: t("other__shop__category_retail"), route: "buy/retail", iconName: "storefront"),
- ShopCategory(title: t("other__shop__category_streaming"), route: "buy/streaming", iconName: "video-camera"),
- ShopCategory(title: t("other__shop__category_travel"), route: "buy/travel", iconName: "airplane"),
- ShopCategory(title: t("other__shop__category_voip"), route: "buy/voip", iconName: "phone-call"),
+ ShopCategory(title: "Apparel", route: "buy/apparel", iconName: "pedestrian"),
+ ShopCategory(title: "Automobiles", route: "buy/automobiles", iconName: "car"),
+ ShopCategory(title: "Cruises", route: "buy/cruises", iconName: "train"),
+ ShopCategory(title: "Ecommerce", route: "buy/ecommerce", iconName: "shopping-cart"),
+ ShopCategory(title: "Electronics", route: "buy/electronics", iconName: "printer"),
+ ShopCategory(title: "Entertainment", route: "buy/entertainment", iconName: "headphones"),
+ ShopCategory(title: "Experiences", route: "buy/experiences", iconName: "globe"),
+ ShopCategory(title: "Flights", route: "buy/flights", iconName: "airplane"),
+ ShopCategory(title: "Food", route: "buy/food", iconName: "storefront"),
+ ShopCategory(title: "Food Delivery", route: "buy/food-delivery", iconName: "bicycle"),
+ ShopCategory(title: "Games", route: "buy/games", iconName: "game-controller"),
+ ShopCategory(title: "Gifts", route: "buy/gifts", iconName: "gift"),
+ ShopCategory(title: "Groceries", route: "buy/groceries", iconName: "shopping-bag"),
+ ShopCategory(title: "Health & Beauty", route: "buy/health-beauty", iconName: "heartbeat"),
+ ShopCategory(title: "Home", route: "buy/home", iconName: "house"),
+ ShopCategory(title: "Multi-Brand", route: "buy/multi-brand", iconName: "stack"),
+ ShopCategory(title: "Pets", route: "buy/pets", iconName: "horse"),
+ ShopCategory(title: "Restaurants", route: "buy/restaurants", iconName: "fork-knife"),
+ ShopCategory(title: "Retail", route: "buy/retail", iconName: "storefront"),
+ ShopCategory(title: "Streaming", route: "buy/streaming", iconName: "video-camera"),
+ ShopCategory(title: "Travel", route: "buy/travel", iconName: "airplane"),
+ ShopCategory(title: "VoIP", route: "buy/voip", iconName: "phone-call"),
]
// Featured cards data
diff --git a/Bitkit/Views/Transfer/FundReceiveView.swift b/Bitkit/Views/Transfer/FundReceiveView.swift
index 9581f83f..bd3b0382 100644
--- a/Bitkit/Views/Transfer/FundReceiveView.swift
+++ b/Bitkit/Views/Transfer/FundReceiveView.swift
@@ -5,7 +5,7 @@ struct FundReceiveView: View {
@EnvironmentObject var app: AppViewModel
var body: some View {
- Text(t("wallet__fund_receive_title"))
+ Text("FundReceiveView")
.navigationBarTitleDisplayMode(.inline)
}
}
diff --git a/Bitkit/Views/Transfer/LnurlChannel.swift b/Bitkit/Views/Transfer/LnurlChannel.swift
index d1a3bd37..81135cf9 100644
--- a/Bitkit/Views/Transfer/LnurlChannel.swift
+++ b/Bitkit/Views/Transfer/LnurlChannel.swift
@@ -46,7 +46,7 @@ struct LnurlChannel: View {
VStack(spacing: 16) {
ProgressView()
.scaleEffect(1.2)
- BodyMText(t("other__lnurl_channel_loading"), textColor: .textSecondary)
+ BodyMText("Loading channel information...", textColor: .textSecondary)
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
} else if channelInfo != nil {
@@ -95,7 +95,7 @@ struct LnurlChannel: View {
Image(systemName: "exclamationmark.triangle")
.font(.largeTitle)
.foregroundColor(.orange)
- BodyMText(t("other__lnurl_channel_load_failed"), textColor: .textSecondary)
+ BodyMText("Failed to load channel information", textColor: .textSecondary)
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
@@ -136,8 +136,8 @@ struct LnurlChannel: View {
guard let nodeId = wallet.nodeId else {
app.toast(
type: .error,
- title: t("common__error"),
- description: t("other__lnurl_channel_node_id_missing")
+ title: "Error",
+ description: "Node ID is missing"
)
return
}
diff --git a/Bitkit/Views/Transfer/SpendingConfirm.swift b/Bitkit/Views/Transfer/SpendingConfirm.swift
index 93a7a7e5..99fa783a 100644
--- a/Bitkit/Views/Transfer/SpendingConfirm.swift
+++ b/Bitkit/Views/Transfer/SpendingConfirm.swift
@@ -72,7 +72,7 @@ struct SpendingConfirm: View {
}
HStack(alignment: .center, spacing: 0) {
- BodyMText(t("lightning__spending_confirm__background_setup"), textColor: .textPrimary)
+ BodyMText(tTodo("Set up in background"), textColor: .textPrimary)
Spacer()
diff --git a/Bitkit/Views/Wallets/Activity/ActivityLatest.swift b/Bitkit/Views/Wallets/Activity/ActivityLatest.swift
index 74eb8123..aad4ead9 100644
--- a/Bitkit/Views/Wallets/Activity/ActivityLatest.swift
+++ b/Bitkit/Views/Wallets/Activity/ActivityLatest.swift
@@ -50,7 +50,7 @@ struct ActivityLatest: View {
}
)
} else {
- CustomButton(title: t("common__show_all"), variant: .tertiary) {
+ CustomButton(title: tTodo("Show All"), variant: .tertiary) {
navigation.navigate(.activityList)
}
.accessibilityIdentifier("ActivityShowAll")
diff --git a/Bitkit/Views/Wallets/LnurlWithdraw/LnurlWithdrawFailure.swift b/Bitkit/Views/Wallets/LnurlWithdraw/LnurlWithdrawFailure.swift
index 0d053037..c880d521 100644
--- a/Bitkit/Views/Wallets/LnurlWithdraw/LnurlWithdrawFailure.swift
+++ b/Bitkit/Views/Wallets/LnurlWithdraw/LnurlWithdrawFailure.swift
@@ -6,15 +6,17 @@ struct LnurlWithdrawFailure: View {
@EnvironmentObject var sheets: SheetViewModel
let amount: UInt64
+ // TODO: add localized strings
+
var body: some View {
VStack(spacing: 0) {
- SheetHeader(title: t("other__lnurl_withdr_failure_title"), showBackButton: true)
+ SheetHeader(title: "Withdrawal Failed", showBackButton: true)
MoneyStack(sats: Int(amount), showSymbol: true)
.padding(.top, 16)
.padding(.bottom, 42)
- BodyMText(t("other__lnurl_withdr_failure_text"))
+ BodyMText("Your withdrawal was unsuccessful. Please scan the QR code again or contact support.")
.frame(maxWidth: .infinity, alignment: .leading)
Spacer()
@@ -28,11 +30,11 @@ struct LnurlWithdrawFailure: View {
Spacer()
HStack(alignment: .center, spacing: 16) {
- CustomButton(title: t("lightning__support"), variant: .secondary) {
+ CustomButton(title: "Support", variant: .secondary) {
onSupport()
}
- CustomButton(title: t("wallet__recipient_scan")) {
+ CustomButton(title: "Scan QR") {
onScan()
}
}
diff --git a/Bitkit/Views/Wallets/Receive/ReceiveCjitAmount.swift b/Bitkit/Views/Wallets/Receive/ReceiveCjitAmount.swift
index 590dd027..f8350d99 100644
--- a/Bitkit/Views/Wallets/Receive/ReceiveCjitAmount.swift
+++ b/Bitkit/Views/Wallets/Receive/ReceiveCjitAmount.swift
@@ -91,11 +91,7 @@ struct ReceiveCjitAmount: View {
}
} else {
// Show error if node is not running or timed out
- app.toast(
- type: .warning,
- title: t("wallet__receive_lightning_not_ready_title"),
- description: t("wallet__receive_lightning_not_ready_description")
- )
+ app.toast(type: .warning, title: "Lightning not ready", description: "Lightning node must be running to create an invoice")
}
}
}
diff --git a/Bitkit/Views/Wallets/Receive/ReceiveCjitConfirmation.swift b/Bitkit/Views/Wallets/Receive/ReceiveCjitConfirmation.swift
index ca669d9b..db06ad85 100644
--- a/Bitkit/Views/Wallets/Receive/ReceiveCjitConfirmation.swift
+++ b/Bitkit/Views/Wallets/Receive/ReceiveCjitConfirmation.swift
@@ -58,7 +58,7 @@ struct ReceiveCjitConfirmation: View {
Spacer()
HStack(alignment: .center, spacing: 0) {
- BodyMText(t("wallet__receive_background_setup"), textColor: .textPrimary)
+ BodyMText(tTodo("Enable background setup"), textColor: .textPrimary)
Spacer()
diff --git a/Bitkit/Views/Wallets/Receive/ReceiveCjitGeoBlocked.swift b/Bitkit/Views/Wallets/Receive/ReceiveCjitGeoBlocked.swift
index 754b441c..cb1bf6b5 100644
--- a/Bitkit/Views/Wallets/Receive/ReceiveCjitGeoBlocked.swift
+++ b/Bitkit/Views/Wallets/Receive/ReceiveCjitGeoBlocked.swift
@@ -21,7 +21,7 @@ struct ReceiveCjitGeoBlocked: View {
Spacer()
- CustomButton(title: t("onboarding__advanced_setup")) {
+ CustomButton(title: tTodo("Advanced Setup")) {
sheets.hideSheet()
navigation.navigate(.fundingAdvanced)
}
diff --git a/Bitkit/Views/Wallets/Receive/ReceiveCjitLearnMore.swift b/Bitkit/Views/Wallets/Receive/ReceiveCjitLearnMore.swift
index 4496338d..752deb13 100644
--- a/Bitkit/Views/Wallets/Receive/ReceiveCjitLearnMore.swift
+++ b/Bitkit/Views/Wallets/Receive/ReceiveCjitLearnMore.swift
@@ -41,11 +41,11 @@ struct ReceiveCjitLearnMore: View {
Spacer()
- BodyMText(t("wallet__receive_background_setup_text"))
+ BodyMText(tTodo("Enable background setup to safely exit Bitkit while your balance is being configured."))
.padding(.bottom, 16)
HStack(alignment: .center, spacing: 0) {
- BodyMText(t("wallet__receive_background_setup"), textColor: .textPrimary)
+ BodyMText(tTodo("Enable background setup"), textColor: .textPrimary)
Spacer()
diff --git a/Bitkit/Views/Wallets/Receive/ReceiveEdit.swift b/Bitkit/Views/Wallets/Receive/ReceiveEdit.swift
index d325ee7c..eca166e0 100644
--- a/Bitkit/Views/Wallets/Receive/ReceiveEdit.swift
+++ b/Bitkit/Views/Wallets/Receive/ReceiveEdit.swift
@@ -149,8 +149,8 @@ struct ReceiveEdit: View {
// Show error if node is not running or timed out
app.toast(
type: .warning,
- title: t("wallet__receive_lightning_not_ready_title"),
- description: t("wallet__receive_lightning_not_ready_description")
+ title: "Lightning not ready",
+ description: "Lightning node must be running to create an invoice"
)
}
}
@@ -167,7 +167,7 @@ struct ReceiveEdit: View {
tagManager.removeTagFromSelection(tag)
}
} catch {
- app.toast(type: .error, title: t("wallet__tags_delete_error_header"), description: error.localizedDescription)
+ app.toast(type: .error, title: "Failed to delete tag", description: error.localizedDescription)
}
}
diff --git a/Bitkit/Views/Wallets/Receive/ReceiveQr.swift b/Bitkit/Views/Wallets/Receive/ReceiveQr.swift
index cf7bd318..c1e415e2 100644
--- a/Bitkit/Views/Wallets/Receive/ReceiveQr.swift
+++ b/Bitkit/Views/Wallets/Receive/ReceiveQr.swift
@@ -116,7 +116,7 @@ struct ReceiveQr: View {
}
}
} else {
- CustomButton(title: showDetails ? t("common__qr_code") : t("common__show_details")) {
+ CustomButton(title: showDetails ? tTodo("QR Code") : tTodo("Show Details")) {
showDetails.toggle()
}
.accessibilityIdentifier(showDetails ? "QRCode" : "ShowDetails")
@@ -210,10 +210,10 @@ struct ReceiveQr: View {
var cjitOnboarding: some View {
VStack(alignment: .leading, spacing: 0) {
- DisplayText(t("wallet__receive_spending_title"), accentColor: .purpleAccent)
+ DisplayText(tTodo("Receive on spending balance"), accentColor: .purpleAccent)
.padding(.bottom, 12)
- BodyMText(t("wallet__receive_spending_description"))
+ BodyMText(tTodo("Enjoy instant and cheap\ntransactions with friends, family,\nand merchants."))
Spacer()
diff --git a/Bitkit/Views/Wallets/Receive/ReceiveTag.swift b/Bitkit/Views/Wallets/Receive/ReceiveTag.swift
index a6b6f3b2..febc620d 100644
--- a/Bitkit/Views/Wallets/Receive/ReceiveTag.swift
+++ b/Bitkit/Views/Wallets/Receive/ReceiveTag.swift
@@ -41,7 +41,7 @@ struct ReceiveTag: View {
do {
guard let paymentId = await wallet.paymentId(), !paymentId.isEmpty else {
- app.toast(type: .error, title: t("wallet__tags_add_error_header"), description: t("wallet__tags_add_error_no_payment_id"))
+ app.toast(type: .error, title: "Failed to add tag", description: "Payment ID not available")
return
}
@@ -57,7 +57,7 @@ struct ReceiveTag: View {
navigationPath.removeLast()
}
} catch {
- app.toast(type: .error, title: t("wallet__tags_add_error_header"), description: error.localizedDescription)
+ app.toast(type: .error, title: "Failed to add tag", description: error.localizedDescription)
}
}
}
diff --git a/Bitkit/Views/Wallets/SavingsWalletView.swift b/Bitkit/Views/Wallets/SavingsWalletView.swift
index e299b5d3..a4fc5f03 100644
--- a/Bitkit/Views/Wallets/SavingsWalletView.swift
+++ b/Bitkit/Views/Wallets/SavingsWalletView.swift
@@ -35,7 +35,7 @@ struct SavingsWalletView: View {
ScrollView(showsIndicators: false) {
ActivityList(viewType: .onchain)
- CustomButton(title: t("common__show_all"), variant: .tertiary) {
+ CustomButton(title: tTodo("Show All"), variant: .tertiary) {
navigation.navigate(.activityList)
}
/// Leave some space for TabBar
@@ -75,7 +75,7 @@ struct SavingsWalletView: View {
var transferButton: some View {
CustomButton(
- title: t("wallet__transfer_to_spending"),
+ title: tTodo("Transfer To Spending"),
variant: .secondary,
icon: Image("arrow-up-down")
.resizable()
diff --git a/Bitkit/Views/Wallets/Send/LnurlPayConfirm.swift b/Bitkit/Views/Wallets/Send/LnurlPayConfirm.swift
index b9571bd6..cd39e4d1 100644
--- a/Bitkit/Views/Wallets/Send/LnurlPayConfirm.swift
+++ b/Bitkit/Views/Wallets/Send/LnurlPayConfirm.swift
@@ -74,7 +74,7 @@ struct LnurlPayConfirm: View {
.padding(.trailing, 6)
// TODO: get actual fee
- BodySSBText(t("wallet__lnurl_pay_confirm__fee_instant"))
+ BodySSBText("Instant (±$0.02)")
}
}
.padding(.vertical)
diff --git a/Bitkit/Views/Wallets/Send/SendAmountView.swift b/Bitkit/Views/Wallets/Send/SendAmountView.swift
index ab3d1a40..33b55542 100644
--- a/Bitkit/Views/Wallets/Send/SendAmountView.swift
+++ b/Bitkit/Views/Wallets/Send/SendAmountView.swift
@@ -186,8 +186,8 @@ struct SendAmountView: View {
if UInt64(wallet.maxSendLightningSats) < amountSats {
app.toast(
type: .error,
- title: t("wallet__send_insufficient_funds_title"),
- description: t("wallet__send_insufficient_funds_description")
+ title: "Insufficient Funds",
+ description: "You do not have enough funds in the selected wallet."
)
return
}
@@ -203,8 +203,8 @@ struct SendAmountView: View {
if wallet.availableUtxos.isEmpty {
app.toast(
type: .error,
- title: t("wallet__send_no_utxos_title"),
- description: t("wallet__send_no_utxos_description")
+ title: "No UTXOs",
+ description: "You do not have any UTXOs to spend."
)
return
}
@@ -212,8 +212,8 @@ struct SendAmountView: View {
if wallet.availableUtxos.reduce(0, { $0 + $1.valueSats }) < amountSats {
app.toast(
type: .error,
- title: t("wallet__send_insufficient_funds_title"),
- description: t("wallet__send_insufficient_funds_description")
+ title: "Insufficient Funds",
+ description: "You do not have enough funds in the selected wallet."
)
return
}
@@ -226,8 +226,8 @@ struct SendAmountView: View {
if totalSelectedSats < amountSats {
app.toast(
type: .error,
- title: t("wallet__send_insufficient_funds_title"),
- description: t("wallet__send_insufficient_funds_description")
+ title: "Insufficient Funds",
+ description: "You do not have enough funds in the selected wallet."
)
return
}
@@ -236,7 +236,7 @@ struct SendAmountView: View {
}
} catch {
Logger.error(error, context: "Failed to set fee rate or send amount")
- app.toast(type: .error, title: t("wallet__send_error"), description: error.localizedDescription)
+ app.toast(type: .error, title: "Send Error", description: error.localizedDescription)
}
}
diff --git a/Bitkit/Views/Wallets/Send/SendEnterManuallyView.swift b/Bitkit/Views/Wallets/Send/SendEnterManuallyView.swift
index eeba1363..58d845ee 100644
--- a/Bitkit/Views/Wallets/Send/SendEnterManuallyView.swift
+++ b/Bitkit/Views/Wallets/Send/SendEnterManuallyView.swift
@@ -49,7 +49,7 @@ struct SendEnterManuallyView: View {
Spacer(minLength: 16)
- CustomButton(title: t("common__continue"), isDisabled: !app.isManualEntryInputValid) {
+ CustomButton(title: "Continue", isDisabled: !app.isManualEntryInputValid) {
await handleContinue()
}
.buttonBottomPadding(isFocused: isTextEditorFocused)
diff --git a/Bitkit/Views/Wallets/Send/SendUtxoSelectionView.swift b/Bitkit/Views/Wallets/Send/SendUtxoSelectionView.swift
index 24a32973..ab3f7ef8 100644
--- a/Bitkit/Views/Wallets/Send/SendUtxoSelectionView.swift
+++ b/Bitkit/Views/Wallets/Send/SendUtxoSelectionView.swift
@@ -73,7 +73,7 @@ struct SendUtxoSelectionView: View {
navigationPath.append(.confirm)
} catch {
Logger.error(error, context: "Failed to set fee rate")
- app.toast(type: .error, title: t("wallet__send_error"), description: error.localizedDescription)
+ app.toast(type: .error, title: "Send Error", description: error.localizedDescription)
}
}
.padding(.bottom, 16)
diff --git a/Bitkit/Views/Wallets/Sheets/AddTagSheet.swift b/Bitkit/Views/Wallets/Sheets/AddTagSheet.swift
index e87b0736..d8df73a7 100644
--- a/Bitkit/Views/Wallets/Sheets/AddTagSheet.swift
+++ b/Bitkit/Views/Wallets/Sheets/AddTagSheet.swift
@@ -63,7 +63,7 @@ struct AddTagSheet: View {
try await activityListViewModel.appendTags(toActivity: config.activityId, tags: [tag])
sheets.hideSheet()
} catch {
- app.toast(type: .error, title: t("wallet__tags_add_error_header"), description: error.localizedDescription)
+ app.toast(type: .error, title: "Failed to add tag", description: error.localizedDescription)
}
}
}
diff --git a/Bitkit/Views/Wallets/Sheets/BoostSheet.swift b/Bitkit/Views/Wallets/Sheets/BoostSheet.swift
index 92295629..9ee5af76 100644
--- a/Bitkit/Views/Wallets/Sheets/BoostSheet.swift
+++ b/Bitkit/Views/Wallets/Sheets/BoostSheet.swift
@@ -146,7 +146,7 @@ struct BoostSheet: View {
.accessibilityIdentifier("Plus")
}
- CustomButton(title: t("wallet__send_fee_use_suggested"), size: .small) {
+ CustomButton(title: "Use Suggested Fee", size: .small) {
isEditingFee = false
editedFeeRate = nil
}
diff --git a/Bitkit/Views/Wallets/SpendingWalletView.swift b/Bitkit/Views/Wallets/SpendingWalletView.swift
index c3c6984b..339eb9e6 100644
--- a/Bitkit/Views/Wallets/SpendingWalletView.swift
+++ b/Bitkit/Views/Wallets/SpendingWalletView.swift
@@ -35,7 +35,7 @@ struct SpendingWalletView: View {
ScrollView(showsIndicators: false) {
ActivityList(viewType: .lightning)
- CustomButton(title: t("common__show_all"), variant: .tertiary) {
+ CustomButton(title: tTodo("Show All"), variant: .tertiary) {
navigation.navigate(.activityList)
}
/// Leave some space for TabBar
@@ -75,7 +75,7 @@ struct SpendingWalletView: View {
var transferButton: some View {
CustomButton(
- title: t("wallet__transfer_to_savings"),
+ title: tTodo("Transfer To Savings"),
variant: .secondary,
icon: Image("arrow-up-down")
.resizable()
diff --git a/Bitkit/Views/Widgets/WidgetsIntroView.swift b/Bitkit/Views/Widgets/WidgetsIntroView.swift
index 4e03c2d1..eb71d827 100644
--- a/Bitkit/Views/Widgets/WidgetsIntroView.swift
+++ b/Bitkit/Views/Widgets/WidgetsIntroView.swift
@@ -6,7 +6,7 @@ struct WidgetsIntroView: View {
var body: some View {
OnboardingView(
- navTitle: t("widgets__widgets"),
+ navTitle: tTodo("Widgets"),
title: t("widgets__onboarding__title"),
description: t("widgets__onboarding__description"),
imageName: "puzzle",