Repository: OneKeyHQ/app-monorepo
Pull request #7442: fix: resolve issues with investment details and modal. (OK-38555)
Author: login: huhuanming
Created: 2025-05-29T06:40:48Z | Merged: 2025-05-29T06:58:57Z



<!-- This is an auto-generated comment: release notes by coderabbit.ai -->

## Summary by CodeRabbit

- **New Features**
  - Added support for a new dialog property to control overlay mounting behavior, improving dialog rendering across platforms.
  - Expanded translation keys to include new terms related to bulk revocation, cloud features, subscription pricing, and stablecoin fees.
  - Enhanced localization structure for referral and rewards content, enabling more flexible and direct use of localized strings.

- **Improvements**
  - Updated referral and rewards dialogs to use a new localization approach for titles and descriptions.
  - Refined the display conditions for update reminders, now only showing on native or desktop environments outside of development.
  - Standardized the reward distribution history page header to a static title.

- **Bug Fixes**
  - Improved referral code handling to ensure summary information is only fetched when the user is logged in.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/packages/components/src/composite/Dialog/index.tsx b/packages/components/src/composite/Dialog/index.tsx
index 64ab2e86ff7b..2400e8fff030 100644
--- a/packages/components/src/composite/Dialog/index.tsx
+++ b/packages/components/src/composite/Dialog/index.tsx
@@ -113,6 +113,7 @@ function DialogFrame({
   testID,
   isAsync,
   trackID,
+  forceMount,
 }: IDialogProps) {
   const intl = useIntl();
   const { footerRef } = useContext(DialogContext);
@@ -281,6 +282,7 @@ function DialogFrame({
               backgroundColor="$bgBackdrop"
               animateOnly={['opacity']}
               animation="quick"
+              forceMount={forceMount || undefined}
               enterStyle={{
                 opacity: 0,
               }}
@@ -685,6 +687,7 @@ const useInPageDialog = (type: EInPageDialogType) => {
     () => ({
       testID: portalId,
       modal: false,
+      forceMount: platformEnv.isNative ? undefined : true,
       portalContainer: portalId,
     }),
     [portalId],
diff --git a/packages/components/src/composite/Dialog/type.ts b/packages/components/src/composite/Dialog/type.ts
index 78188c83a9da..53ad0e1856bd 100644
--- a/packages/components/src/composite/Dialog/type.ts
+++ b/packages/components/src/composite/Dialog/type.ts
@@ -93,6 +93,11 @@ interface IBasicDialogProps extends TMDialogProps {
   testID?: string;
   onConfirm?: IOnDialogConfirm;
   onCancel?: (close: () => Promise<void>) => void;
+  /**
+   * When dialog's modal is not true and it's not a sheet, overlay won't show by default.
+   * forceMount controls whether to force show the overlay in this case.
+   */
+  forceMount?: boolean;
 }
 
 export type IDialogProps = IBasicDialogProps &
diff --git a/packages/kit-bg/src/services/ServiceReferralCode.ts b/packages/kit-bg/src/services/ServiceReferralCode.ts
index 379b4fbf9bad..90ec3483774b 100644
--- a/packages/kit-bg/src/services/ServiceReferralCode.ts
+++ b/packages/kit-bg/src/services/ServiceReferralCode.ts
@@ -163,8 +163,11 @@ class ServiceReferralCode extends ServiceBase {
   async getMyReferralCode() {
     const myReferralCode =
       await this.backgroundApi.simpleDb.referralCode.getMyReferralCode();
-    setTimeout(() => {
-      void this.getSummaryInfo();
+    setTimeout(async () => {
+      const isLogin = await this.backgroundApi.servicePrime.isLoggedIn();
+      if (isLogin) {
+        void this.getSummaryInfo();
+      }
     });
     return myReferralCode;
   }
diff --git a/packages/kit/src/components/UpdateReminder/hooks.tsx b/packages/kit/src/components/UpdateReminder/hooks.tsx
index bea79ac2b1b9..75eaa2ef2d46 100644
--- a/packages/kit/src/components/UpdateReminder/hooks.tsx
+++ b/packages/kit/src/components/UpdateReminder/hooks.tsx
@@ -367,6 +367,7 @@ export const useAppUpdateInfo = (isFullModal = false, autoCheck = true) => {
               toUpdatePreviewPage(true, response);
             } else if (
               !platformEnv.isDev &&
+              (platformEnv.isNative || platformEnv.isDesktop) &&
               response?.isShowUpdateDialog &&
               isFirstLaunch
             ) {
diff --git a/packages/kit/src/hooks/useReferFriends.tsx b/packages/kit/src/hooks/useReferFriends.tsx
index cc2678a8af06..fc54c90799e6 100644
--- a/packages/kit/src/hooks/useReferFriends.tsx
+++ b/packages/kit/src/hooks/useReferFriends.tsx
@@ -13,7 +13,7 @@ import {
   useClipboard,
 } from '@onekeyhq/components';
 import backgroundApiProxy from '@onekeyhq/kit/src/background/instance/backgroundApiProxy';
-import { HyperlinkText } from '@onekeyhq/kit/src/components/HyperlinkText';
+import { FormatHyperlinkText } from '@onekeyhq/kit/src/components/HyperlinkText';
 import { ONEKEY_URL } from '@onekeyhq/shared/src/config/appConfig';
 import { ETranslations } from '@onekeyhq/shared/src/locale';
 import { defaultLogger } from '@onekeyhq/shared/src/logger/logger';
@@ -111,16 +111,17 @@ export const useReferFriends = () => {
       };
       const dialog = Dialog.show({
         icon: 'GiftOutline',
-        title: intl.formatMessage({ id: ETranslations.earn_referral_title }),
+        title: postConfig.locales.Earn.title,
         description: (
-          <HyperlinkText
+          <FormatHyperlinkText
             size="$bodyMd"
-            translationId={ETranslations.earn_referral_subtitle}
             underlineTextProps={{ color: '$textInfo' }}
             onAction={() => {
               void dialog.close();
             }}
-          />
+          >
+            {postConfig.locales.Earn.subtitle}
+          </FormatHyperlinkText>
         ),
         renderContent: isLogin ? (
           <YStack gap="$5">
@@ -152,25 +153,10 @@ export const useReferFriends = () => {
               </XStack>
               <YStack flexShrink={1}>
                 <SizableText size="$headingMd">
-                  {intl.formatMessage({
-                    id: ETranslations.referral_intro_for_you,
-                  })}
+                  {postConfig.locales.Earn.for_tou.title}
                 </SizableText>
                 <SizableText mt="$1" size="$bodyMd" color="$textSubdued">
-                  {intl.formatMessage(
-                    {
-                      id: ETranslations.earn_referral_for_you_reward,
-                    },
-                    {
-                      RebateRate: (
-                        <SizableText size="$bodyMd" color="$textSuccess">
-                          {`${postConfig?.commissionRate.amount || ''}${
-                            postConfig?.commissionRate.unit || ''
-                          }`}
-                        </SizableText>
-                      ),
-                    },
-                  )}
+                  {postConfig.locales.Earn.for_tou.subtitle}
                 </SizableText>
               </YStack>
             </XStack>
@@ -180,21 +166,10 @@ export const useReferFriends = () => {
               </XStack>
               <YStack flexShrink={1}>
                 <SizableText size="$headingMd">
-                  {intl.formatMessage({
-                    id: ETranslations.referral_intro_for_your_friend,
-                  })}
+                  {postConfig.locales.Earn.for_your_friend.title}
                 </SizableText>
                 <SizableText mt="$1" size="$bodyMd" color="$textSubdued">
-                  {intl.formatMessage(
-                    {
-                      id: ETranslations.earn_referral_for_your_friend_reward,
-                    },
-                    {
-                      number: `${postConfig?.friendDiscount.unit || ''}${
-                        postConfig?.friendDiscount.amount || ''
-                      }`,
-                    },
-                  )}
+                  {postConfig.locales.Earn.for_your_friend.subtitle}
                 </SizableText>
               </YStack>
             </XStack>
diff --git a/packages/kit/src/views/ReferFriends/pages/RewardDistributionHistory/index.tsx b/packages/kit/src/views/ReferFriends/pages/RewardDistributionHistory/index.tsx
index dd3eb986a099..e957ce99b6c2 100644
--- a/packages/kit/src/views/ReferFriends/pages/RewardDistributionHistory/index.tsx
+++ b/packages/kit/src/views/ReferFriends/pages/RewardDistributionHistory/index.tsx
@@ -156,9 +156,7 @@ export default function RewardDistributionHistory() {
   return (
     <Page>
       <Page.Header
-        title={intl.formatMessage({
-          id: ETranslations.referral_referred_type_3,
-        })}
+        title="Reward Distribution History"
       />
       <Page.Body>
         {sections === undefined ? (
diff --git a/packages/shared/src/locale/enum/translations.ts b/packages/shared/src/locale/enum/translations.ts
index fa60141b6aff..c2670f83c691 100644
--- a/packages/shared/src/locale/enum/translations.ts
+++ b/packages/shared/src/locale/enum/translations.ts
@@ -1050,6 +1050,8 @@
   global_bulk_copy_addresses_export_csv = 'global.bulk_copy_addresses_export_csv',
   global_bulk_copy_addresses_tabs_my_accounts = 'global.bulk_copy_addresses_tabs_my_accounts',
   global_bulk_copy_addresses_tabs_set_range = 'global.bulk_copy_addresses_tabs_set_range',
+  global_bulk_revoke = 'global.bulk_revoke',
+  global_bulk_revoke_desc = 'global.bulk_revoke_desc',
   global_buy = 'global.buy',
   global_buy_one = 'global.buy_one',
   global_cancel = 'global.cancel',
@@ -1304,6 +1306,7 @@
   global_official_website = 'global.official_website',
   global_ok = 'global.ok',
   global_on = 'global.on',
+  global_onekey_cloud = 'global.onekey_cloud',
   global_onekey_keytag = 'global.onekey_keytag',
   global_onekey_lite = 'global.onekey_lite',
   global_onekey_prompt_dont_have_yet = 'global.onekey_prompt_dont_have_yet',
@@ -1882,6 +1885,7 @@
   prime_agree_to_terms_privacy = 'prime.agree_to_terms_privacy',
   prime_app_data = 'prime.app_data',
   prime_auto_lock_description = 'prime.auto_lock_description',
+  prime_bulk_copy_addresses_desc = 'prime.bulk_copy_addresses_desc',
   prime_change_backup_password = 'prime.change_backup_password',
   prime_change_email = 'prime.change_email',
   prime_change_password = 'prime.change_password',
@@ -1935,6 +1939,7 @@
   prime_not_logged_in_title = 'prime.not_logged_in_title',
   prime_not_subscribed_description = 'prime.not_subscribed_description',
   prime_not_subscribed_title = 'prime.not_subscribed_title',
+  prime_onekey_cloud_desc = 'prime.onekey_cloud_desc',
   prime_onekeyid_been_log_out = 'prime.onekeyid_been_log_out',
   prime_onekeyid_been_log_out_desc = 'prime.onekeyid_been_log_out_desc',
   prime_onekeyid_continue = 'prime.onekeyid_continue',
@@ -1957,6 +1962,8 @@
   prime_payment_successful = 'prime.payment_successful',
   prime_payment_successful_description = 'prime.payment_successful_description',
   prime_per_month = 'prime.per_month',
+  prime_prime_price_per_month = 'prime.prime_price_per_month',
+  prime_prime_price_per_year = 'prime.prime_price_per_year',
   prime_reset = 'prime.reset',
   prime_reset_backup_password_checkbox_label = 'prime.reset_backup_password_checkbox_label',
   prime_reset_backup_password_description = 'prime.reset_backup_password_description',
@@ -1974,7 +1981,8 @@
   prime_strong_password = 'prime.strong_password',
   prime_strong_password_desc = 'prime.strong_password_desc',
   prime_subscribe = 'prime.subscribe',
-  prime_subscription_auto_renew_price = 'prime.subscription_auto_renew_price',
+  prime_subscription_auto_renew_price_month = 'prime.subscription_auto_renew_price_month',
+  prime_subscription_auto_renew_price_year = 'prime.subscription_auto_renew_price_year',
   prime_subscription_manage_app_store = 'prime.subscription_manage_app_store',
   prime_sync_password_invalid_description = 'prime.sync_password_invalid_description',
   prime_sync_password_invalid_title = 'prime.sync_password_invalid_title',
@@ -2418,6 +2426,7 @@
   swap_network_cost_dialog_description = 'swap.network_cost_dialog_description',
   swap_network_cost_dialog_title = 'swap.network_cost_dialog_title',
   swap_provider_manage_unavailable = 'swap.provider_manage_unavailable',
+  swap_stablecoin_0_fee = 'swap.stablecoin_0_fee',
   swap_step_1 = 'swap.step_1',
   swap_toast_go_to_swap = 'swap.toast_go_to_swap',
   swap_toast_go_to_swap_desc = 'swap.toast_go_to_swap_desc',
diff --git a/packages/shared/src/locale/json/bn.json b/packages/shared/src/locale/json/bn.json
index 89fc6751209f..f7b712f18a4f 100644
--- a/packages/shared/src/locale/json/bn.json
+++ b/packages/shared/src/locale/json/bn.json
@@ -1045,6 +1045,8 @@
   "global.bulk_copy_addresses_export_csv": "CSV রপ্তানি করুন",
   "global.bulk_copy_addresses_tabs_my_accounts": "আমার অ্যাকাউন্ট",
   "global.bulk_copy_addresses_tabs_set_range": "রেঞ্জ সেট করুন",
+  "global.bulk_revoke": "একসাথে বাতিল",
+  "global.bulk_revoke_desc": "একসাথে অনেক dApp অনুমোদন বাতিল করে আপনার সম্পদ নিরাপদ রাখুন।",
   "global.buy": "কিনুন",
   "global.buy_one": "একটি কিনুন",
   "global.cancel": "বাতিল করুন",
@@ -1299,6 +1301,7 @@
   "global.official_website": "অফিসিয়াল ওয়েবসাইট",
   "global.ok": "ঠিক আছে",
   "global.on": "চালু",
+  "global.onekey_cloud": "OneKey Cloud",
   "global.onekey_keytag": "OneKey KeyTag",
   "global.onekey_lite": "OneKey Lite",
   "global.onekey_prompt_dont_have_yet": "আপনার এখনো OneKey নেই?",
@@ -1877,6 +1880,7 @@
   "prime.agree_to_terms_privacy": "OneKey Prime-এ সাবস্ক্রাইব করার মাধ্যমে আপনি <termsTag>OneKey Prime শর্তাবলী</termsTag> এবং <privacyTag>গোপনীয়তা নীতি</privacyTag> মেনে নিচ্ছেন।",
   "prime.app_data": "অ্যাপ ডেটা",
   "prime.auto_lock_description": "OneKey Cloud সক্রিয় করার সময়, অটো-লক সেটিংসে \"কখনই না\" এবং \"যদি ৪ ঘন্টা বাইরে থাকেন\" বিকল্পগুলি ব্যবহার করা যাবে না।",
+  "prime.bulk_copy_addresses_desc": "সহজে বাল্ক কপি করার জন্য ঠিকানা নির্বাচন বা তৈরি করুন।",
   "prime.change_backup_password": "OneKey ID পাসওয়ার্ড পরিবর্তন করুন",
   "prime.change_email": "ইমেইল পরিবর্তন করুন",
   "prime.change_password": "পাসওয়ার্ড পরিবর্তন করুন",
@@ -1930,6 +1934,7 @@
   "prime.not_logged_in_title": "লগ ইন করা হয়নি",
   "prime.not_subscribed_description": "এই বৈশিষ্ট্য ব্যবহার করতে অনুগ্রহ করে OneKey Prime সাবস্ক্রাইব করুন",
   "prime.not_subscribed_title": "সাবস্ক্রাইব করা হয়নি",
+  "prime.onekey_cloud_desc": "আপনার সমস্ত ডিভাইসে অ্যাপের ডেটা স্বয়ংক্রিয়ভাবে ব্যাকআপ এবং সিঙ্ক করুন।",
   "prime.onekeyid_been_log_out": "OneKey আইডি লগ আউট",
   "prime.onekeyid_been_log_out_desc": "এই ডিভাইসটি অন্য একটি ডিভাইস থেকে নিষ্ক্রিয় করা হয়েছে। যদি এটি আপনি না হয়ে থাকেন, তাহলে অনুগ্রহ করে আপনার ইমেইল নিরাপত্তা পরীক্ষা করুন।",
   "prime.onekeyid_continue": "OneKey আইডি দিয়ে চালিয়ে যান",
@@ -1952,6 +1957,8 @@
   "prime.payment_successful": "পেমেন্ট সফল হয়েছে",
   "prime.payment_successful_description": "আপনার কেনাকাটার জন্য ধন্যবাদ, আশা করি OneKey Prime আপনাকে একটি নিরাপদ এবং আরও প্রিমিয়াম অভিজ্ঞতা অর্জনে সহায়তা করবে।",
   "prime.per_month": "প্রতি মাসে",
+  "prime.prime_price_per_month": "{price} / মাসে",
+  "prime.prime_price_per_year": "প্রতি বছর {price}",
   "prime.reset": "রিসেট",
   "prime.reset_backup_password_checkbox_label": "আমি বুঝতে পেরেছি যে এটি আমার ক্লাউড ব্যাকআপ ডেটা স্থায়ীভাবে মুছে ফেলবে",
   "prime.reset_backup_password_description": "OneKey ID পাসওয়ার্ড রিসেট করলে ক্লাউডে সংরক্ষিত বর্তমান ব্যাকআপ ডেটা মুছে যাবে এবং এই ডিভাইস থেকে একটি নতুন ব্যাকআপ তৈরি হবে।",
@@ -1969,7 +1976,8 @@
   "prime.strong_password": "একটি শক্তিশালী পাসওয়ার্ড তৈরি করুন",
   "prime.strong_password_desc": "১২ অক্ষরের ন্যূনতম।",
   "prime.subscribe": "সাবস্ক্রাইব করুন",
-  "prime.subscription_auto_renew_price": "{price}/{billing_period} হারে স্বয়ংক্রিয় নবায়ন, বাতিল না করা পর্যন্ত",
+  "prime.subscription_auto_renew_price_month": "বাতিল না করা পর্যন্ত প্রতি মাসে {price} হারে স্বয়ংক্রিয়ভাবে নবায়ন হবে",
+  "prime.subscription_auto_renew_price_year": "বাতিল না করা পর্যন্ত প্রতি বছর {price} হারে স্বয়ংক্রিয়ভাবে নবায়ন হবে",
   "prime.subscription_manage_app_store": "আপনার App Store অ্যাকাউন্ট সেটিংসে গিয়ে সাবস্ক্রিপশন পরিচালনা বা বাতিল করতে পারবেন।",
   "prime.sync_password_invalid_description": "আপনার OneKey ID পাসওয়ার্ড অন্য একটি ডিভাইস থেকে পরিবর্তিত বা রিসেট করা হয়েছে। অনুগ্রহ করে OneKey Cloud আবার চালু করুন এবং আপনার OneKey ID পাসওয়ার্ড যাচাই করুন।",
   "prime.sync_password_invalid_title": "অবৈধ OneKey ID পাসওয়ার্ড",
@@ -2413,6 +2421,7 @@
   "swap.network_cost_dialog_description": "নেটওয়ার্ক খরচ অর্ডার পরিমাণের {number} এর বেশি।",
   "swap.network_cost_dialog_title": "অর্ডারের পরিমাণ খুবই কম",
   "swap.provider_manage_unavailable": "*The provider is temporarily unavailable.",
+  "swap.stablecoin_0_fee": "০ ফি",
   "swap.step_1": "1. ",
   "swap.toast_go_to_swap": "স্বাপে যান",
   "swap.toast_go_to_swap_desc": "অনুমোদন করুন {num} {token} {provider} এর জন্য",
diff --git a/packages/shared/src/locale/json/de.json b/packages/shared/src/locale/json/de.json
index dcebb196a276..36f9f237bcbe 100644
--- a/packages/shared/src/locale/json/de.json
+++ b/packages/shared/src/locale/json/de.json
@@ -1045,6 +1045,8 @@
   "global.bulk_copy_addresses_export_csv": "Als CSV exportieren",
   "global.bulk_copy_addresses_tabs_my_accounts": "Meine Konten",
   "global.bulk_copy_addresses_tabs_set_range": "Bereich festlegen",
+  "global.bulk_revoke": "Mehrfach widerrufen",
+  "global.bulk_revoke_desc": "Mehrere dApp-Berechtigungen einfach widerrufen und Ihre Assets schützen.",
   "global.buy": "Kaufen",
   "global.buy_one": "Kaufen Sie eins",
   "global.cancel": "Abbrechen",
@@ -1299,6 +1301,7 @@
   "global.official_website": "Offizielle Webseite",
   "global.ok": "OK",
   "global.on": "Auf",
+  "global.onekey_cloud": "OneKey Cloud",
   "global.onekey_keytag": "OneKey KeyTag",
   "global.onekey_lite": "OneKey Lite",
   "global.onekey_prompt_dont_have_yet": "Haben Sie noch kein OneKey?",
@@ -1877,6 +1880,7 @@
   "prime.agree_to_terms_privacy": "Mit Ihrem OneKey Prime-Abonnement akzeptieren Sie die <termsTag>OneKey Prime Nutzungsbedingungen</termsTag> und die <privacyTag>Datenschutzerklärung</privacyTag>.",
   "prime.app_data": "App-Daten",
   "prime.auto_lock_description": "Bei aktiviertem OneKey Cloud stehen die Optionen \"Niemals\" und \"Wenn 4 Stunden weg\" in den Auto-Sperr-Einstellungen nicht zur Verfügung.",
+  "prime.bulk_copy_addresses_desc": "Adressen einfach auswählen oder generieren für das Massenkopieren.",
   "prime.change_backup_password": "OneKey ID-Passwort ändern",
   "prime.change_email": "E-Mail ändern",
   "prime.change_password": "Passwort ändern",
@@ -1930,6 +1934,7 @@
   "prime.not_logged_in_title": "Nicht angemeldet",
   "prime.not_subscribed_description": "Abonnieren Sie OneKey Prime für Zugriff auf diese Funktion",
   "prime.not_subscribed_title": "Nicht abonniert",
+  "prime.onekey_cloud_desc": "Automatische Datensicherung und nahtlose Synchronisation auf allen Ihren Geräten.",
   "prime.onekeyid_been_log_out": "OneKey ID abmelden",
   "prime.onekeyid_been_log_out_desc": "Dieses Gerät wurde von einem anderen Gerät deaktiviert. Wenn Sie das nicht waren, überprüfen Sie bitte die Sicherheit Ihrer E-Mail.",
   "prime.onekeyid_continue": "Fortfahren mit OneKey ID",
@@ -1952,6 +1957,8 @@
   "prime.payment_successful": "Zahlung erfolgreich",
   "prime.payment_successful_description": "Vielen Dank für Ihren Kauf. Möge OneKey Prime Ihnen helfen, ein sichereres und hochwertigeres Erlebnis zu erreichen.",
   "prime.per_month": "Pro Monat",
+  "prime.prime_price_per_month": "{price} / Mon.",
+  "prime.prime_price_per_year": "{price} pro Jahr",
   "prime.reset": "Zurücksetzen",
   "prime.reset_backup_password_checkbox_label": "Ich verstehe, dass meine Cloud-Backup-Daten dauerhaft gelöscht werden",
   "prime.reset_backup_password_description": "Bei Zurücksetzen des OneKey ID-Passworts werden vorhandene Backup-Daten in der Cloud gelöscht und ein neues Backup von diesem Gerät erstellt.",
@@ -1969,7 +1976,8 @@
   "prime.strong_password": "Erstellen Sie ein starkes Passwort",
   "prime.strong_password_desc": "Mindestens 12 Zeichen.",
   "prime.subscribe": "Abonnieren",
-  "prime.subscription_auto_renew_price": "Verlängert sich automatisch um {price}/{billing_period} bis zur Kündigung",
+  "prime.subscription_auto_renew_price_month": "Automatische Verlängerung für {price}/Monat bis zur Kündigung",
+  "prime.subscription_auto_renew_price_year": "Automatische Verlängerung für {price}/Jahr bis zur Kündigung",
   "prime.subscription_manage_app_store": "Sie können Ihr Abonnement in den App Store-Kontoeinstellungen verwalten oder kündigen.",
   "prime.sync_password_invalid_description": "Ihr OneKey ID-Passwort wurde von einem anderen Gerät geändert oder zurückgesetzt. Bitte aktivieren Sie OneKey Cloud erneut und überprüfen Sie Ihr OneKey ID-Passwort.",
   "prime.sync_password_invalid_title": "Ungültiges OneKey ID-Passwort",
@@ -2413,6 +2421,7 @@
   "swap.network_cost_dialog_description": "Netzwerkkosten übersteigen {number} des Bestellbetrags",
   "swap.network_cost_dialog_title": "Bestellmenge ist zu klein",
   "swap.provider_manage_unavailable": "*The provider is temporarily unavailable.",
+  "swap.stablecoin_0_fee": "0 Gebühr",
   "swap.step_1": "1. ",
   "swap.toast_go_to_swap": "Zum Tausch gehen",
   "swap.toast_go_to_swap_desc": "Genehmige {num} {token} für {provider}",
diff --git a/packages/shared/src/locale/json/en_US.json b/packages/shared/src/locale/json/en_US.json
index b3ef5f9b908c..89a9d25006e2 100644
--- a/packages/shared/src/locale/json/en_US.json
+++ b/packages/shared/src/locale/json/en_US.json
@@ -1045,6 +1045,8 @@
   "global.bulk_copy_addresses_export_csv": "Export CSV",
   "global.bulk_copy_addresses_tabs_my_accounts": "My accounts",
   "global.bulk_copy_addresses_tabs_set_range": "Set range",
+  "global.bulk_revoke": "Bulk revoke",
+  "global.bulk_revoke_desc": "Easily revoke multiple dApp approvals to safeguard your assets.",
   "global.buy": "Buy",
   "global.buy_one": "Buy one",
   "global.cancel": "Cancel",
@@ -1299,6 +1301,7 @@
   "global.official_website": "Official website",
   "global.ok": "OK",
   "global.on": "On",
+  "global.onekey_cloud": "OneKey Cloud",
   "global.onekey_keytag": "OneKey KeyTag",
   "global.onekey_lite": "OneKey Lite",
   "global.onekey_prompt_dont_have_yet": "Don't have OneKey yet?",
@@ -1877,6 +1880,7 @@
   "prime.agree_to_terms_privacy": "By subscribing to OneKey Prime you agree to the <termsTag>OneKey Prime Terms</termsTag> and <privacyTag>Privacy Policy</privacyTag>.",
   "prime.app_data": "App data",
   "prime.auto_lock_description": "Enable OneKey Cloud, the auto-lock settings cannot use the \"Never\" and \"if away for 4 hrs\" option.",
+  "prime.bulk_copy_addresses_desc": "Easily select or generate addresses for bulk copying.",
   "prime.change_backup_password": "Change OneKey ID password",
   "prime.change_email": "Change email",
   "prime.change_password": "Change password",
@@ -1930,6 +1934,7 @@
   "prime.not_logged_in_title": "Not logged in",
   "prime.not_subscribed_description": "Please subscribe to OneKey Prime to use this feature",
   "prime.not_subscribed_title": "Not Subscribed",
+  "prime.onekey_cloud_desc": "Automatically back up app usage data and synchronize seamlessly across devices.",
   "prime.onekeyid_been_log_out": "OneKey ID log out",
   "prime.onekeyid_been_log_out_desc": "This device been deactivated from another device. If this wasn't you, please check your email security.",
   "prime.onekeyid_continue": "Continue with OneKey ID",
@@ -1952,6 +1957,8 @@
   "prime.payment_successful": "Payment successful",
   "prime.payment_successful_description": "Thank you for your purchase, May OneKey Prime helps you achieve a safer and more premium experience.",
   "prime.per_month": "Month",
+  "prime.prime_price_per_month": "{price} / mo",
+  "prime.prime_price_per_year": "{price} per year",
   "prime.reset": "Reset",
   "prime.reset_backup_password_checkbox_label": "I understand this will permanently delete my cloud backup data",
   "prime.reset_backup_password_description": "Resetting the OneKey ID password will delete existing backup data in the cloud and build a new backup from this device.",
@@ -1969,7 +1976,8 @@
   "prime.strong_password": "Create a strong password",
   "prime.strong_password_desc": "12 character minimum.",
   "prime.subscribe": "Subscribe",
-  "prime.subscription_auto_renew_price": "Auto-renews for {price}/{billing_period} until canceled",
+  "prime.subscription_auto_renew_price_month": "Auto-renews for {price}/month until canceled",
+  "prime.subscription_auto_renew_price_year": "Auto-renews for {price}/year until canceled",
   "prime.subscription_manage_app_store": "You can manage or cancel your subscription in your App Store account settings.",
   "prime.sync_password_invalid_description": "Your OneKey ID password has been modified or reset by another device. Please re-enable OneKey Cloud and verify your OneKey ID password.",
   "prime.sync_password_invalid_title": "Invalid OneKey ID password",
@@ -2413,6 +2421,7 @@
   "swap.network_cost_dialog_description": "Network costs exceed {number} of the order amount",
   "swap.network_cost_dialog_title": "Order amount is too small",
   "swap.provider_manage_unavailable": "*The provider is temporarily unavailable.",
+  "swap.stablecoin_0_fee": "0 Fee",
   "swap.step_1": "1. ",
   "swap.toast_go_to_swap": "Go to swap",
   "swap.toast_go_to_swap_desc": "Approve {num} {token} for {provider}",
diff --git a/packages/shared/src/locale/json/es.json b/packages/shared/src/locale/json/es.json
index 5e0d1b52d262..b8afbbbaa46d 100644
--- a/packages/shared/src/locale/json/es.json
+++ b/packages/shared/src/locale/json/es.json
@@ -1045,6 +1045,8 @@
   "global.bulk_copy_addresses_export_csv": "Exportar a CSV",
   "global.bulk_copy_addresses_tabs_my_accounts": "Mis cuentas",
   "global.bulk_copy_addresses_tabs_set_range": "Establecer rango",
+  "global.bulk_revoke": "Revocar en lote",
+  "global.bulk_revoke_desc": "Revoca varias autorizaciones dApp fácilmente y protege tus activos.",
   "global.buy": "Comprar",
   "global.buy_one": "Compra uno",
   "global.cancel": "Cancelar",
@@ -1299,6 +1301,7 @@
   "global.official_website": "Sitio web oficial",
   "global.ok": "DE ACUERDO",
   "global.on": "En",
+  "global.onekey_cloud": "OneKey Cloud",
   "global.onekey_keytag": "OneKey KeyTag",
   "global.onekey_lite": "OneKey Lite",
   "global.onekey_prompt_dont_have_yet": "¿Aún no tienes OneKey?",
@@ -1877,6 +1880,7 @@
   "prime.agree_to_terms_privacy": "Al suscribirte a OneKey Prime, aceptas los <termsTag>Términos de Servicio de OneKey Prime</termsTag> y la <privacyTag>Política de Privacidad</privacyTag>.",
   "prime.app_data": "Datos de la App",
   "prime.auto_lock_description": "Con OneKey Cloud habilitado, las opciones \"Nunca\" y \"Si está fuera por 4 hrs\" no están disponibles en la configuración de bloqueo automático.",
+  "prime.bulk_copy_addresses_desc": "Selecciona o genera fácilmente direcciones para copiar en masa.",
   "prime.change_backup_password": "Cambiar contraseña de OneKey ID",
   "prime.change_email": "Cambiar correo electrónico",
   "prime.change_password": "Cambiar contraseña",
@@ -1930,6 +1934,7 @@
   "prime.not_logged_in_title": "Sin sesión iniciada",
   "prime.not_subscribed_description": "Suscríbete a OneKey Prime para utilizar esta función",
   "prime.not_subscribed_title": "Sin suscripción",
+  "prime.onekey_cloud_desc": "Copia de seguridad automática y sincronización de datos en todos tus dispositivos.",
   "prime.onekeyid_been_log_out": "Cerrar sesión de OneKey ID",
   "prime.onekeyid_been_log_out_desc": "Este dispositivo ha sido desactivado desde otro dispositivo. Si no fuiste tú, por favor revisa la seguridad de tu correo electrónico.",
   "prime.onekeyid_continue": "Continuar con OneKey ID",
@@ -1952,6 +1957,8 @@
   "prime.payment_successful": "Pago exitoso",
   "prime.payment_successful_description": "Gracias por su compra, que OneKey Prime le ayude a lograr una experiencia más segura y premium.",
   "prime.per_month": "Por mes",
+  "prime.prime_price_per_month": "{price}/mes",
+  "prime.prime_price_per_year": "{price} al año",
   "prime.reset": "Restablecer",
   "prime.reset_backup_password_checkbox_label": "Entiendo que esto eliminará permanentemente mis datos de copia de seguridad en la nube",
   "prime.reset_backup_password_description": "Al restablecer la contraseña de OneKey ID, se eliminarán los datos de respaldo existentes en la nube y se creará una nueva copia de seguridad desde este dispositivo.",
@@ -1969,7 +1976,8 @@
   "prime.strong_password": "Crea una contraseña fuerte",
   "prime.strong_password_desc": "Mínimo de 12 caracteres.",
   "prime.subscribe": "Suscribirse",
-  "prime.subscription_auto_renew_price": "Renovación automática: {price}/{billing_period} hasta su cancelación",
+  "prime.subscription_auto_renew_price_month": "Renovación automática por {price}/mes hasta su cancelación",
+  "prime.subscription_auto_renew_price_year": "Renovación automática por {price}/año hasta su cancelación",
   "prime.subscription_manage_app_store": "Puedes administrar o cancelar tu suscripción en los ajustes de tu cuenta de App Store.",
   "prime.sync_password_invalid_description": "Su contraseña de OneKey ID ha sido modificada o restablecida desde otro dispositivo. Por favor, vuelva a activar OneKey Cloud y verifique su contraseña de OneKey ID.",
   "prime.sync_password_invalid_title": "Contraseña de OneKey ID incorrecta",
@@ -2413,6 +2421,7 @@
   "swap.network_cost_dialog_description": "Los costos de la red superan {number} del monto del pedido",
   "swap.network_cost_dialog_title": "El monto del pedido es demasiado pequeño",
   "swap.provider_manage_unavailable": "*The provider is temporarily unavailable.",
+  "swap.stablecoin_0_fee": "0 Tarifa",
   "swap.step_1": "1. ",
   "swap.toast_go_to_swap": "Ir a intercambiar",
   "swap.toast_go_to_swap_desc": "Aprobar {num} {token} para {provider}",
diff --git a/packages/shared/src/locale/json/fr_FR.json b/packages/shared/src/locale/json/fr_FR.json
index 516a8328f245..eca28882837c 100644
--- a/packages/shared/src/locale/json/fr_FR.json
+++ b/packages/shared/src/locale/json/fr_FR.json
@@ -1045,6 +1045,8 @@
   "global.bulk_copy_addresses_export_csv": "Exporter au format CSV",
   "global.bulk_copy_addresses_tabs_my_accounts": "Mes comptes",
   "global.bulk_copy_addresses_tabs_set_range": "Définir la plage",
+  "global.bulk_revoke": "Révoquer en masse",
+  "global.bulk_revoke_desc": "Révoquez facilement plusieurs autorisations dApp pour sécuriser vos actifs.",
   "global.buy": "Acheter",
   "global.buy_one": "Achetez-en un",
   "global.cancel": "Annuler",
@@ -1299,6 +1301,7 @@
   "global.official_website": "Site officiel",
   "global.ok": "D'ACCORD",
   "global.on": "Sur",
+  "global.onekey_cloud": "OneKey Cloud",
   "global.onekey_keytag": "OneKey KeyTag",
   "global.onekey_lite": "OneKey Lite",
   "global.onekey_prompt_dont_have_yet": "Vous n'avez pas encore OneKey ?",
@@ -1877,6 +1880,7 @@
   "prime.agree_to_terms_privacy": "En souscrivant à OneKey Prime, vous acceptez les <termsTag>Conditions d'utilisation OneKey Prime</termsTag> et la <privacyTag>Politique de confidentialité</privacyTag>.",
   "prime.app_data": "Données de l'App",
   "prime.auto_lock_description": "Avec OneKey Cloud activé, les options \"Jamais\" et \"Si absent pendant 4 heures\" ne sont pas disponibles dans les paramètres de verrouillage automatique.",
+  "prime.bulk_copy_addresses_desc": "Sélectionnez ou générez facilement des adresses pour une copie en masse.",
   "prime.change_backup_password": "Modifier le mot de passe OneKey ID",
   "prime.change_email": "Changer d'email",
   "prime.change_password": "Changer le mot de passe",
@@ -1930,6 +1934,7 @@
   "prime.not_logged_in_title": "Non connecté",
   "prime.not_subscribed_description": "Abonnez-vous à OneKey Prime pour accéder à cette fonctionnalité",
   "prime.not_subscribed_title": "Non abonné",
+  "prime.onekey_cloud_desc": "Sauvegarde automatique et synchronisation fluide de vos données sur tous vos appareils.",
   "prime.onekeyid_been_log_out": "Déconnexion de l'ID OneKey",
   "prime.onekeyid_been_log_out_desc": "Cet appareil a été désactivé depuis un autre appareil. Si ce n'était pas vous, veuillez vérifier la sécurité de votre e-mail.",
   "prime.onekeyid_continue": "Continuer avec OneKey ID",
@@ -1952,6 +1957,8 @@
   "prime.payment_successful": "Paiement réussi",
   "prime.payment_successful_description": "Merci pour votre achat, que OneKey Prime vous aide à atteindre une expérience plus sûre et plus haut de gamme.",
   "prime.per_month": "Par mois",
+  "prime.prime_price_per_month": "{price} / mois",
+  "prime.prime_price_per_year": "{price} par an",
   "prime.reset": "Réinitialiser",
   "prime.reset_backup_password_checkbox_label": "Je comprends que cela supprimera définitivement mes données de sauvegarde cloud",
   "prime.reset_backup_password_description": "La réinitialisation du mot de passe OneKey ID supprimera vos données de sauvegarde actuelles dans le cloud et créera une nouvelle sauvegarde à partir de cet appareil.",
@@ -1969,7 +1976,8 @@
   "prime.strong_password": "Créez un mot de passe fort",
   "prime.strong_password_desc": "Minimum de 12 caractères.",
   "prime.subscribe": "S'abonner",
-  "prime.subscription_auto_renew_price": "Renouvellement automatique : {price}/{billing_period} jusqu'à résiliation",
+  "prime.subscription_auto_renew_price_month": "Renouvellement automatique à {price}/mois jusqu'à résiliation",
+  "prime.subscription_auto_renew_price_year": "Renouvellement automatique à {price}/an jusqu'à résiliation",
   "prime.subscription_manage_app_store": "Vous pouvez gérer ou résilier votre abonnement dans les réglages de votre compte App Store.",
   "prime.sync_password_invalid_description": "Votre mot de passe OneKey ID a été modifié ou réinitialisé depuis un autre appareil. Veuillez réactiver OneKey Cloud et vérifier votre mot de passe OneKey ID.",
   "prime.sync_password_invalid_title": "Mot de passe OneKey ID incorrect",
@@ -2413,6 +2421,7 @@
   "swap.network_cost_dialog_description": "Les coûts de réseau dépassent {number} du montant de la commande",
   "swap.network_cost_dialog_title": "Le montant de la commande est trop petit",
   "swap.provider_manage_unavailable": "*The provider is temporarily unavailable.",
+  "swap.stablecoin_0_fee": "0 frais",
   "swap.step_1": "1. ",
   "swap.toast_go_to_swap": "Aller à l'échange",
   "swap.toast_go_to_swap_desc": "Approuver {num} {token} pour {provider}",
diff --git a/packages/shared/src/locale/json/hi_IN.json b/packages/shared/src/locale/json/hi_IN.json
index 29e2af8b2303..2471e2f25e04 100644
--- a/packages/shared/src/locale/json/hi_IN.json
+++ b/packages/shared/src/locale/json/hi_IN.json
@@ -1045,6 +1045,8 @@
   "global.bulk_copy_addresses_export_csv": "CSV निर्यात करें",
   "global.bulk_copy_addresses_tabs_my_accounts": "मेरे खाते",
   "global.bulk_copy_addresses_tabs_set_range": "रेंज सेट करें",
+  "global.bulk_revoke": "एकसाथ रद्द करें",
+  "global.bulk_revoke_desc": "कई dApp अनुमतियों को एक साथ रद्द कर अपनी संपत्ति सुरक्षित करें।",
   "global.buy": "खरीदें",
   "global.buy_one": "एक खरीदें",
   "global.cancel": "रद्द करें",
@@ -1299,6 +1301,7 @@
   "global.official_website": "आधिकारिक वेबसाइट",
   "global.ok": "ठीक है",
   "global.on": "पर",
+  "global.onekey_cloud": "OneKey Cloud",
   "global.onekey_keytag": "OneKey KeyTag",
   "global.onekey_lite": "OneKey Lite",
   "global.onekey_prompt_dont_have_yet": "अभी तक OneKey नहीं है?",
@@ -1877,6 +1880,7 @@
   "prime.agree_to_terms_privacy": "OneKey Prime की सदस्यता लेने से आप <termsTag>OneKey Prime की शर्तों</termsTag> और <privacyTag>गोपनीयता नीति</privacyTag> से सहमति देते हैं।",
   "prime.app_data": "App डेटा",
   "prime.auto_lock_description": "OneKey Cloud सक्षम करने पर, ऑटो-लॉक सेटिंग्स में \"कभी नहीँ\" और \"अगर 4 घंटे के लिए दूर\" विकल्प उपलब्ध नहीं होंगे।",
+  "prime.bulk_copy_addresses_desc": "बल्क कॉपी के लिए आसानी से पते चुनें या जेनरेट करें।",
   "prime.change_backup_password": "OneKey ID पासवर्ड बदलें",
   "prime.change_email": "ईमेल बदलें",
   "prime.change_password": "पासवर्ड बदलें",
@@ -1930,6 +1934,7 @@
   "prime.not_logged_in_title": "लॉग इन नहीं है",
   "prime.not_subscribed_description": "इस सुविधा का उपयोग करने के लिए कृपया OneKey Prime सब्सक्राइब करें",
   "prime.not_subscribed_title": "सब्सक्राइब नहीं किया गया",
+  "prime.onekey_cloud_desc": "आपके सभी डिवाइस पर ऐप डेटा का स्वचालित बैकअप और सिंक।",
   "prime.onekeyid_been_log_out": "OneKey ID लॉग आउट",
   "prime.onekeyid_been_log_out_desc": "यह डिवाइस किसी अन्य डिवाइस से निष्क्रिय कर दिया गया है। यदि यह आपने नहीं किया है, तो कृपया अपने ईमेल सुरक्षा की जाँच करें।",
   "prime.onekeyid_continue": "OneKey आईडी के साथ जारी रखें",
@@ -1952,6 +1957,8 @@
   "prime.payment_successful": "भुगतान सफल हुआ",
   "prime.payment_successful_description": "आपकी खरीदारी के लिए धन्यवाद, OneKey Prime आपको एक सुरक्षित और अधिक प्रीमियम अनुभव प्राप्त करने में मदद करे।",
   "prime.per_month": "प्रति माह",
+  "prime.prime_price_per_month": "{price} / माह",
+  "prime.prime_price_per_year": "प्रति वर्ष {price}",
   "prime.reset": "रीसेट",
   "prime.reset_backup_password_checkbox_label": "मैं समझता/समझती हूँ कि यह मेरे क्लाउड बैकअप डेटा को स्थायी रूप से हटा देगा",
   "prime.reset_backup_password_description": "OneKey ID पासवर्ड रीसेट करने पर क्लाउड में मौजूद बैकअप डेटा हट जाएगा और इस डिवाइस से नया बैकअप बनाया जाएगा।",
@@ -1969,7 +1976,8 @@
   "prime.strong_password": "एक मजबूत पासवर्ड बनाएं",
   "prime.strong_password_desc": "कम से कम 12 अक्षर।",
   "prime.subscribe": "सदस्यता लें",
-  "prime.subscription_auto_renew_price": "{price}/{billing_period} पर ऑटो-रिन्यू, रद्द करने तक",
+  "prime.subscription_auto_renew_price_month": "रद्द करने तक प्रति माह {price} पर स्वतः नवीनीकृत होता है",
+  "prime.subscription_auto_renew_price_year": "रद्द करने तक प्रति वर्ष {price} पर स्वतः नवीनीकृत होता है",
   "prime.subscription_manage_app_store": "आप अपने App Store खाते की सेटिंग्स में जाकर सदस्यता को प्रबंधित या रद्द कर सकते हैं।",
   "prime.sync_password_invalid_description": "आपका OneKey ID पासवर्ड किसी दूसरे डिवाइस से बदला या रीसेट किया गया है। कृपया OneKey Cloud को दोबारा चालू करें और अपने OneKey ID पासवर्ड की पुष्टि करें।",
   "prime.sync_password_invalid_title": "गलत OneKey ID पासवर्ड",
@@ -2413,6 +2421,7 @@
   "swap.network_cost_dialog_description": "नेटवर्क लागत आदेश राशि के {number} से अधिक है",
   "swap.network_cost_dialog_title": "आदेश की राशि बहुत कम है",
   "swap.provider_manage_unavailable": "*The provider is temporarily unavailable.",
+  "swap.stablecoin_0_fee": "0 शुल्क",
   "swap.step_1": "1. ",
   "swap.toast_go_to_swap": "स्वैप पर जाएं",
   "swap.toast_go_to_swap_desc": "{num} {token} को {provider} के लिए स्वीकृत करें",
diff --git a/packages/shared/src/locale/json/id.json b/packages/shared/src/locale/json/id.json
index dcecdce8cd2c..8ec7d58f91cc 100644
--- a/packages/shared/src/locale/json/id.json
+++ b/packages/shared/src/locale/json/id.json
@@ -1045,6 +1045,8 @@
   "global.bulk_copy_addresses_export_csv": "Ekspor CSV",
   "global.bulk_copy_addresses_tabs_my_accounts": "Akun Saya",
   "global.bulk_copy_addresses_tabs_set_range": "Atur Rentang",
+  "global.bulk_revoke": "Cabut massal",
+  "global.bulk_revoke_desc": "Cabut banyak persetujuan dApp sekaligus untuk amankan aset Anda.",
   "global.buy": "Beli",
   "global.buy_one": "Beli satu",
   "global.cancel": "Batalkan",
@@ -1299,6 +1301,7 @@
   "global.official_website": "Situs web resmi",
   "global.ok": "OKE",
   "global.on": "Pada",
+  "global.onekey_cloud": "OneKey Cloud",
   "global.onekey_keytag": "OneKey KeyTag",
   "global.onekey_lite": "OneKey Lite",
   "global.onekey_prompt_dont_have_yet": "Belum memiliki OneKey?",
@@ -1877,6 +1880,7 @@
   "prime.agree_to_terms_privacy": "Dengan berlangganan OneKey Prime, Anda menyetujui <termsTag>Syarat dan Ketentuan OneKey Prime</termsTag> serta <privacyTag>Kebijakan Privasi</privacyTag>.",
   "prime.app_data": "Data App",
   "prime.auto_lock_description": "Saat OneKey Cloud diaktifkan, opsi \"Tidak pernah\" dan \"Jika pergi selama 4 jam\" tidak tersedia dalam pengaturan kunci otomatis.",
+  "prime.bulk_copy_addresses_desc": "Mudah memilih atau menghasilkan alamat untuk penyalinan massal.",
   "prime.change_backup_password": "Ubah kata sandi OneKey ID",
   "prime.change_email": "Ubah email",
   "prime.change_password": "Ubah kata sandi",
@@ -1930,6 +1934,7 @@
   "prime.not_logged_in_title": "Belum masuk",
   "prime.not_subscribed_description": "Harap berlangganan OneKey Prime untuk menggunakan fitur ini",
   "prime.not_subscribed_title": "Belum Berlangganan",
+  "prime.onekey_cloud_desc": "Pencadangan otomatis dan sinkronisasi data aplikasi di semua perangkat Anda.",
   "prime.onekeyid_been_log_out": "Keluar dari OneKey ID",
   "prime.onekeyid_been_log_out_desc": "Perangkat ini telah dinonaktifkan dari perangkat lain. Jika ini bukan Anda, silakan periksa keamanan email Anda.",
   "prime.onekeyid_continue": "Lanjutkan dengan OneKey ID",
@@ -1952,6 +1957,8 @@
   "prime.payment_successful": "Pembayaran berhasil",
   "prime.payment_successful_description": "Terima kasih atas pembelian Anda, semoga OneKey Prime membantu Anda mencapai pengalaman yang lebih aman dan premium.",
   "prime.per_month": "Per Bulan",
+  "prime.prime_price_per_month": "{price} / bln",
+  "prime.prime_price_per_year": "{price} per tahun",
   "prime.reset": "Atur Ulang",
   "prime.reset_backup_password_checkbox_label": "Saya mengerti bahwa ini akan menghapus data cadangan cloud saya secara permanen",
   "prime.reset_backup_password_description": "Mengatur ulang kata sandi OneKey ID akan menghapus data cadangan yang tersimpan di cloud dan membuat cadangan baru dari perangkat ini.",
@@ -1969,7 +1976,8 @@
   "prime.strong_password": "Buat kata sandi yang kuat",
   "prime.strong_password_desc": "Minimal 12 karakter.",
   "prime.subscribe": "Berlangganan",
-  "prime.subscription_auto_renew_price": "Perpanjang otomatis {price}/{billing_period} sampai dibatalkan",
+  "prime.subscription_auto_renew_price_month": "Diperpanjang otomatis seharga {price}/bulan hingga dibatalkan",
+  "prime.subscription_auto_renew_price_year": "Diperpanjang otomatis seharga {price}/tahun hingga dibatalkan",
   "prime.subscription_manage_app_store": "Anda dapat mengelola atau membatalkan langganan melalui pengaturan akun App Store.",
   "prime.sync_password_invalid_description": "Kata sandi OneKey ID Anda telah diubah atau direset oleh perangkat lain. Silakan aktifkan kembali OneKey Cloud dan verifikasi kata sandi OneKey ID Anda.",
   "prime.sync_password_invalid_title": "Kata sandi OneKey ID tidak valid",
@@ -2413,6 +2421,7 @@
   "swap.network_cost_dialog_description": "Biaya jaringan melebihi {number} dari jumlah pesanan",
   "swap.network_cost_dialog_title": "Jumlah pesanan terlalu kecil",
   "swap.provider_manage_unavailable": "*The provider is temporarily unavailable.",
+  "swap.stablecoin_0_fee": "0 Biaya",
   "swap.step_1": "1. ",
   "swap.toast_go_to_swap": "Pergi ke swap",
   "swap.toast_go_to_swap_desc": "Setujui {num} {token} untuk {provider}",
diff --git a/packages/shared/src/locale/json/it_IT.json b/packages/shared/src/locale/json/it_IT.json
index 9a16a1cc8071..0b3730714bea 100644
--- a/packages/shared/src/locale/json/it_IT.json
+++ b/packages/shared/src/locale/json/it_IT.json
@@ -1045,6 +1045,8 @@
   "global.bulk_copy_addresses_export_csv": "Esporta in CSV",
   "global.bulk_copy_addresses_tabs_my_accounts": "I miei account",
   "global.bulk_copy_addresses_tabs_set_range": "Imposta intervallo",
+  "global.bulk_revoke": "Revoca multipla",
+  "global.bulk_revoke_desc": "Revoca facilmente più autorizzazioni dApp per proteggere i tuoi asset.",
   "global.buy": "Acquista",
   "global.buy_one": "Compra uno",
   "global.cancel": "Annulla",
@@ -1299,6 +1301,7 @@
   "global.official_website": "Sito ufficiale",
   "global.ok": "OK",
   "global.on": "Su",
+  "global.onekey_cloud": "OneKey Cloud",
   "global.onekey_keytag": "OneKey KeyTag",
   "global.onekey_lite": "OneKey Lite",
   "global.onekey_prompt_dont_have_yet": "Non hai ancora OneKey?",
@@ -1877,6 +1880,7 @@
   "prime.agree_to_terms_privacy": "Sottoscrivendo OneKey Prime accetti i <termsTag>Termini e Condizioni di OneKey Prime</termsTag> e l'<privacyTag>Informativa sulla privacy</privacyTag>.",
   "prime.app_data": "Dati dell'App",
   "prime.auto_lock_description": "Con OneKey Cloud attivo, le opzioni \"Mai\" e \"Se assente per 4 ore\" non sono disponibili nelle impostazioni di blocco automatico.",
+  "prime.bulk_copy_addresses_desc": "Seleziona o genera facilmente indirizzi per la copia in blocco.",
   "prime.change_backup_password": "Modifica password OneKey ID",
   "prime.change_email": "Cambia email",
   "prime.change_password": "Cambia password",
@@ -1930,6 +1934,7 @@
   "prime.not_logged_in_title": "Non accesso",
   "prime.not_subscribed_description": "Abbonati a OneKey Prime per utilizzare questa funzione",
   "prime.not_subscribed_title": "Non abbonato",
+  "prime.onekey_cloud_desc": "Backup automatico e sincronizzazione dei dati su tutti i tuoi dispositivi.",
   "prime.onekeyid_been_log_out": "Disconnetti ID OneKey",
   "prime.onekeyid_been_log_out_desc": "Questo dispositivo è stato disattivato da un altro dispositivo. Se non sei stato tu, controlla la sicurezza della tua email.",
   "prime.onekeyid_continue": "Continua con OneKey ID",
@@ -1952,6 +1957,8 @@
   "prime.payment_successful": "Pagamento effettuato con successo",
   "prime.payment_successful_description": "Grazie per il tuo acquisto, che OneKey Prime ti aiuti a ottenere un'esperienza più sicura e di alta qualità.",
   "prime.per_month": "Al mese",
+  "prime.prime_price_per_month": "{price}/mese",
+  "prime.prime_price_per_year": "{price} all'anno",
   "prime.reset": "Reimposta",
   "prime.reset_backup_password_checkbox_label": "Comprendo che questo eliminerà definitivamente i miei dati di backup nel cloud",
   "prime.reset_backup_password_description": "Il reset della password OneKey ID eliminerà i dati di backup esistenti nel cloud e creerà un nuovo backup da questo dispositivo.",
@@ -1969,7 +1976,8 @@
   "prime.strong_password": "Crea una password forte",
   "prime.strong_password_desc": "Minimo 12 caratteri.",
   "prime.subscribe": "Iscriviti",
-  "prime.subscription_auto_renew_price": "Si rinnova automaticamente a {price}/{billing_period} fino alla disdetta",
+  "prime.subscription_auto_renew_price_month": "Rinnovo automatico a {price}/mese fino alla disdetta",
+  "prime.subscription_auto_renew_price_year": "Rinnovo automatico a {price}/anno fino alla disdetta",
   "prime.subscription_manage_app_store": "Puoi gestire o disdire l'abbonamento nelle impostazioni del tuo account App Store.",
   "prime.sync_password_invalid_description": "La password del tuo OneKey ID è stata modificata o reimpostata da un altro dispositivo. Riattiva OneKey Cloud e verifica la tua password OneKey ID.",
   "prime.sync_password_invalid_title": "Password OneKey ID non valida",
@@ -2413,6 +2421,7 @@
   "swap.network_cost_dialog_description": "I costi di rete superano {number} dell'importo dell'ordine",
   "swap.network_cost_dialog_title": "L'importo dell'ordine è troppo piccolo",
   "swap.provider_manage_unavailable": "*The provider is temporarily unavailable.",
+  "swap.stablecoin_0_fee": "0 Tariffa",
   "swap.step_1": "1. ",
   "swap.toast_go_to_swap": "Vai a scambiare",
   "swap.toast_go_to_swap_desc": "Approva {num} {token} per {provider}",
diff --git a/packages/shared/src/locale/json/ja_JP.json b/packages/shared/src/locale/json/ja_JP.json
index b444da0e674f..6ec80a09fc28 100644
--- a/packages/shared/src/locale/json/ja_JP.json
+++ b/packages/shared/src/locale/json/ja_JP.json
@@ -1045,6 +1045,8 @@
   "global.bulk_copy_addresses_export_csv": "CSVでエクスポート",
   "global.bulk_copy_addresses_tabs_my_accounts": "マイアカウント",
   "global.bulk_copy_addresses_tabs_set_range": "範囲を設定",
+  "global.bulk_revoke": "一括取り消し",
+  "global.bulk_revoke_desc": "複数の dApp 承認をまとめて取り消し、資産を安全に保護。",
   "global.buy": "購入",
   "global.buy_one": "1つ購入する",
   "global.cancel": "キャンセル",
@@ -1299,6 +1301,7 @@
   "global.official_website": "公式ウェブサイト",
   "global.ok": "わかりました",
   "global.on": "オン",
+  "global.onekey_cloud": "OneKey Cloud",
   "global.onekey_keytag": "OneKey KeyTag",
   "global.onekey_lite": "OneKey Lite",
   "global.onekey_prompt_dont_have_yet": "まだOneKeyをお持ちでないですか？",
@@ -1877,6 +1880,7 @@
   "prime.agree_to_terms_privacy": "OneKey Primeをご購読いただくことで、<termsTag>OneKey Prime利用規約</termsTag>および<privacyTag>プライバシーポリシー</privacyTag>に同意したものとみなされます。",
   "prime.app_data": "Appデータ",
   "prime.auto_lock_description": "OneKey Cloud を有効にすると、自動ロック設定では「一度もない」と「4時間離れている場合」のオプションが利用できなくなります。",
+  "prime.bulk_copy_addresses_desc": "一括コピー用のアドレスを簡単に選択または生成します。",
   "prime.change_backup_password": "OneKey ID パスワードを変更する",
   "prime.change_email": "メールアドレスを変更",
   "prime.change_password": "パスワードを変更する",
@@ -1930,6 +1934,7 @@
   "prime.not_logged_in_title": "ログインしていません",
   "prime.not_subscribed_description": "この機能を利用するには OneKey Prime へのサブスクリプションが必要です",
   "prime.not_subscribed_title": "未登録",
+  "prime.onekey_cloud_desc": "すべてのデバイスでアプリデータを自動バックアップ・同期",
   "prime.onekeyid_been_log_out": "OneKey ID ログアウト",
   "prime.onekeyid_been_log_out_desc": "このデバイスは別のデバイスから無効化されました。もしこれがあなたでない場合は、メールのセキュリティを確認してください。",
   "prime.onekeyid_continue": "OneKey ID で続行",
@@ -1952,6 +1957,8 @@
   "prime.payment_successful": "支払いが完了しました",
   "prime.payment_successful_description": "ご購入ありがとうございます。OneKey Prime がより安全でプレミアムな体験を実現するお手伝いをしますように。",
   "prime.per_month": "月ごと",
+  "prime.prime_price_per_month": "{price}/月",
+  "prime.prime_price_per_year": "年間 {price}",
   "prime.reset": "リセット",
   "prime.reset_backup_password_checkbox_label": "クラウドバックアップデータが完全に削除されることを理解しています",
   "prime.reset_backup_password_description": "OneKey IDパスワードをリセットすると、クラウド上の既存のバックアップデータが削除され、この端末から新しいバックアップが作成されます。",
@@ -1969,7 +1976,8 @@
   "prime.strong_password": "強力なパスワードを作成する",
   "prime.strong_password_desc": "12文字以上。",
   "prime.subscribe": "購読",
-  "prime.subscription_auto_renew_price": "{price}/{billing_period}で自動更新（解約まで継続）",
+  "prime.subscription_auto_renew_price_month": "キャンセルするまで月額{price}で自動更新されます",
+  "prime.subscription_auto_renew_price_year": "キャンセルするまで年額{price}で自動更新されます",
   "prime.subscription_manage_app_store": "App Storeのアカウント設定から、サブスクリプションの管理や解約が可能です。",
   "prime.sync_password_invalid_description": "別のデバイスからOneKey IDパスワードが変更またはリセットされました。OneKey Cloudを再度有効にして、OneKey IDパスワードを確認してください。",
   "prime.sync_password_invalid_title": "OneKey ID パスワードが正しくありません",
@@ -2413,6 +2421,7 @@
   "swap.network_cost_dialog_description": "ネットワークコストが注文金額の{number}を超えています",
   "swap.network_cost_dialog_title": "注文金額が小さすぎます",
   "swap.provider_manage_unavailable": "*The provider is temporarily unavailable.",
+  "swap.stablecoin_0_fee": "0 手数料",
   "swap.step_1": "1. ",
   "swap.toast_go_to_swap": "スワップに行く",
   "swap.toast_go_to_swap_desc": "{provider}に{num} {token}を承認する",
diff --git a/packages/shared/src/locale/json/ko_KR.json b/packages/shared/src/locale/json/ko_KR.json
index c1ffcbe3a80a..839b1d6cf44e 100644
--- a/packages/shared/src/locale/json/ko_KR.json
+++ b/packages/shared/src/locale/json/ko_KR.json
@@ -1045,6 +1045,8 @@
   "global.bulk_copy_addresses_export_csv": "CSV 내보내기",
   "global.bulk_copy_addresses_tabs_my_accounts": "내 계정",
   "global.bulk_copy_addresses_tabs_set_range": "범위 설정",
+  "global.bulk_revoke": "일괄 취소",
+  "global.bulk_revoke_desc": "여러 dApp 승인을 한 번에 취소하고 자산을 안전하게 보호하세요.",
   "global.buy": "구매",
   "global.buy_one": "하나 사세요",
   "global.cancel": "취소",
@@ -1299,6 +1301,7 @@
   "global.official_website": "공식 웹사이트",
   "global.ok": "좋아요",
   "global.on": "에서",
+  "global.onekey_cloud": "OneKey Cloud",
   "global.onekey_keytag": "OneKey KeyTag",
   "global.onekey_lite": "OneKey Lite",
   "global.onekey_prompt_dont_have_yet": "아직 OneKey를 가지고 있지 않으신가요?",
@@ -1877,6 +1880,7 @@
   "prime.agree_to_terms_privacy": "OneKey Prime 구독 시 <termsTag>OneKey Prime 이용약관</termsTag> 및 <privacyTag>개인정보 처리방침</privacyTag>에 동의하게 됩니다.",
   "prime.app_data": "App 데이터",
   "prime.auto_lock_description": "OneKey Cloud가 활성화되면 자동 잠금 설정에서 \"절대\" 및 \"4시간 동안 떠나면\" 옵션을 사용할 수 없습니다.",
+  "prime.bulk_copy_addresses_desc": "대량 복사를 위해 주소를 쉽게 선택하거나 생성합니다.",
   "prime.change_backup_password": "OneKey ID 비밀번호 변경하기",
   "prime.change_email": "이메일 변경",
   "prime.change_password": "비밀번호 변경",
@@ -1930,6 +1934,7 @@
   "prime.not_logged_in_title": "로그인되지 않음",
   "prime.not_subscribed_description": "이 기능을 사용하려면 OneKey Prime에 구독해 주세요",
   "prime.not_subscribed_title": "구독하지 않음",
+  "prime.onekey_cloud_desc": "모든 기기에서 앱 데이터 자동 백업 및 동기화",
   "prime.onekeyid_been_log_out": "OneKey ID 로그아웃",
   "prime.onekeyid_been_log_out_desc": "이 기기는 다른 기기에서 비활성화되었습니다. 본인이 아닌 경우 이메일 보안을 확인해 주세요.",
   "prime.onekeyid_continue": "OneKey ID로 계속하기",
@@ -1952,6 +1957,8 @@
   "prime.payment_successful": "결제가 완료되었습니다",
   "prime.payment_successful_description": "구매해 주셔서 감사합니다. OneKey Prime 이 더 안전하고 고급스러운 경험을 제공하는 데 도움이 되길 바랍니다.",
   "prime.per_month": "월별",
+  "prime.prime_price_per_month": "{price}/월",
+  "prime.prime_price_per_year": "연간 {price}",
   "prime.reset": "재설정",
   "prime.reset_backup_password_checkbox_label": "이로 인해 내 클라우드 백업 데이터가 영구적으로 삭제된다는 것을 이해합니다",
   "prime.reset_backup_password_description": "OneKey ID 비밀번호를 재설정하면 클라우드에 저장된 기존 백업 데이터가 삭제되고 이 기기에서 새로운 백업이 생성됩니다.",
@@ -1969,7 +1976,8 @@
   "prime.strong_password": "강력한 비밀번호를 생성하세요",
   "prime.strong_password_desc": "최소 12자 이상.",
   "prime.subscribe": "구독",
-  "prime.subscription_auto_renew_price": "{price}/{billing_period} 자동 갱신 (취소 전까지)",
+  "prime.subscription_auto_renew_price_month": "취소 전까지 월 {price}로 자동 갱신됩니다",
+  "prime.subscription_auto_renew_price_year": "취소 전까지 연 {price}로 자동 갱신됩니다",
   "prime.subscription_manage_app_store": "App Store 계정 설정에서 구독을 관리하거나 취소하실 수 있습니다.",
   "prime.sync_password_invalid_description": "다른 기기에서 OneKey ID 비밀번호가 변경되거나 재설정되었습니다. OneKey Cloud를 다시 활성화하고 OneKey ID 비밀번호를 확인해 주세요.",
   "prime.sync_password_invalid_title": "OneKey ID 비밀번호가 올바르지 않습니다",
@@ -2413,6 +2421,7 @@
   "swap.network_cost_dialog_description": "네트워크 비용이 주문 금액의 {number}을 초과합니다",
   "swap.network_cost_dialog_title": "주문 금액이 너무 적습니다",
   "swap.provider_manage_unavailable": "*The provider is temporarily unavailable.",
+  "swap.stablecoin_0_fee": "0 수수료",
   "swap.step_1": "1. ",
   "swap.toast_go_to_swap": "스왑으로 이동",
   "swap.toast_go_to_swap_desc": "{provider}에 대해 {num} {token} 승인",
diff --git a/packages/shared/src/locale/json/pt.json b/packages/shared/src/locale/json/pt.json
index cdb08a77f731..753c76e030ee 100644
--- a/packages/shared/src/locale/json/pt.json
+++ b/packages/shared/src/locale/json/pt.json
@@ -1045,6 +1045,8 @@
   "global.bulk_copy_addresses_export_csv": "Exportar CSV",
   "global.bulk_copy_addresses_tabs_my_accounts": "Minhas contas",
   "global.bulk_copy_addresses_tabs_set_range": "Definir intervalo",
+  "global.bulk_revoke": "Revogar em lote",
+  "global.bulk_revoke_desc": "Revogue várias autorizações dApp facilmente e proteja seus ativos.",
   "global.buy": "Comprar",
   "global.buy_one": "Compre um",
   "global.cancel": "Cancelar",
@@ -1299,6 +1301,7 @@
   "global.official_website": "Site oficial",
   "global.ok": "OK",
   "global.on": "Em",
+  "global.onekey_cloud": "OneKey Cloud",
   "global.onekey_keytag": "OneKey KeyTag",
   "global.onekey_lite": "OneKey Lite",
   "global.onekey_prompt_dont_have_yet": "Ainda não tem OneKey?",
@@ -1877,6 +1880,7 @@
   "prime.agree_to_terms_privacy": "Ao subscrever o OneKey Prime, está a concordar com os <termsTag>Termos de Serviço do OneKey Prime</termsTag> e a <privacyTag>Política de Privacidade</privacyTag>.",
   "prime.app_data": "Dados do App",
   "prime.auto_lock_description": "Com o OneKey Cloud ativado, as opções \"Nunca\" e \"Se ausente por 4 horas\" não estão disponíveis nas configurações de bloqueio automático.",
+  "prime.bulk_copy_addresses_desc": "Selecione ou gere facilmente endereços para cópia em massa.",
   "prime.change_backup_password": "Alterar palavra-passe do OneKey ID",
   "prime.change_email": "Alterar email",
   "prime.change_password": "Alterar senha",
@@ -1930,6 +1934,7 @@
   "prime.not_logged_in_title": "Não iniciou sessão",
   "prime.not_subscribed_description": "Subscreva OneKey Prime para utilizar esta funcionalidade",
   "prime.not_subscribed_title": "Não Subscrito",
+  "prime.onekey_cloud_desc": "Backup automático e sincronização de dados em todos os seus dispositivos.",
   "prime.onekeyid_been_log_out": "Sair do OneKey ID",
   "prime.onekeyid_been_log_out_desc": "Este dispositivo foi desativado de outro dispositivo. Se não foi você, por favor, verifique a segurança do seu e-mail.",
   "prime.onekeyid_continue": "Continue com OneKey ID",
@@ -1952,6 +1957,8 @@
   "prime.payment_successful": "Pagamento realizado com sucesso",
   "prime.payment_successful_description": "Obrigado pela sua compra. Que o OneKey Prime ajude você a alcançar uma experiência mais segura e premium.",
   "prime.per_month": "Por mês",
+  "prime.prime_price_per_month": "{price}/mês",
+  "prime.prime_price_per_year": "{price} por ano",
   "prime.reset": "Redefinir",
   "prime.reset_backup_password_checkbox_label": "Compreendo que isto eliminará permanentemente os meus dados de backup na nuvem",
   "prime.reset_backup_password_description": "Ao redefinir a senha do OneKey ID, os dados de backup existentes na nuvem serão excluídos e um novo backup será criado a partir deste dispositivo.",
@@ -1969,7 +1976,8 @@
   "prime.strong_password": "Crie uma senha forte",
   "prime.strong_password_desc": "Mínimo de 12 caracteres.",
   "prime.subscribe": "Assinar",
-  "prime.subscription_auto_renew_price": "Renova automaticamente por {price}/{billing_period} até ao cancelamento",
+  "prime.subscription_auto_renew_price_month": "Renovação automática por {price}/mês até cancelamento",
+  "prime.subscription_auto_renew_price_year": "Renovação automática por {price}/ano até cancelamento",
   "prime.subscription_manage_app_store": "Pode gerir ou cancelar a sua subscrição nas definições da conta da App Store.",
   "prime.sync_password_invalid_description": "A sua palavra-passe do OneKey ID foi modificada ou reposta por outro dispositivo. Por favor, reative o OneKey Cloud e verifique a sua palavra-passe do OneKey ID.",
   "prime.sync_password_invalid_title": "Palavra-passe de OneKey ID inválida",
@@ -2413,6 +2421,7 @@
   "swap.network_cost_dialog_description": "Os custos de rede excedem {number} do valor do pedido",
   "swap.network_cost_dialog_title": "O valor do pedido é muito pequeno",
   "swap.provider_manage_unavailable": "*The provider is temporarily unavailable.",
+  "swap.stablecoin_0_fee": "0 Taxa",
   "swap.step_1": "1. ",
   "swap.toast_go_to_swap": "Ir para swap",
   "swap.toast_go_to_swap_desc": "Aprovar {num} {token} para {provider}",
diff --git a/packages/shared/src/locale/json/pt_BR.json b/packages/shared/src/locale/json/pt_BR.json
index 03c48820c7a0..22b9a056ede3 100644
--- a/packages/shared/src/locale/json/pt_BR.json
+++ b/packages/shared/src/locale/json/pt_BR.json
@@ -1045,6 +1045,8 @@
   "global.bulk_copy_addresses_export_csv": "Exportar CSV",
   "global.bulk_copy_addresses_tabs_my_accounts": "Minhas contas",
   "global.bulk_copy_addresses_tabs_set_range": "Definir intervalo",
+  "global.bulk_revoke": "Revogar em lote",
+  "global.bulk_revoke_desc": "Revogue várias autorizações dApp facilmente e proteja seus ativos.",
   "global.buy": "Comprar",
   "global.buy_one": "Compre um",
   "global.cancel": "Cancelar",
@@ -1299,6 +1301,7 @@
   "global.official_website": "Site oficial",
   "global.ok": "OK",
   "global.on": "Em",
+  "global.onekey_cloud": "OneKey Cloud",
   "global.onekey_keytag": "OneKey KeyTag",
   "global.onekey_lite": "OneKey Lite",
   "global.onekey_prompt_dont_have_yet": "Ainda não tem OneKey?",
@@ -1877,6 +1880,7 @@
   "prime.agree_to_terms_privacy": "Ao assinar o OneKey Prime, você está concordando com os <termsTag>Termos de Serviço do OneKey Prime</termsTag> e com a <privacyTag>Política de Privacidade</privacyTag>.",
   "prime.app_data": "Dados do App",
   "prime.auto_lock_description": "Com o OneKey Cloud ativado, as opções \"Nunca\" e \"Se ausente por 4 horas\" não estão disponíveis nas configurações de bloqueio automático.",
+  "prime.bulk_copy_addresses_desc": "Selecione ou gere facilmente endereços para cópia em massa.",
   "prime.change_backup_password": "Alterar senha do OneKey ID",
   "prime.change_email": "Alterar e-mail",
   "prime.change_password": "Alterar senha",
@@ -1930,6 +1934,7 @@
   "prime.not_logged_in_title": "Não conectado",
   "prime.not_subscribed_description": "Assine o OneKey Prime para usar este recurso",
   "prime.not_subscribed_title": "Não Inscrito",
+  "prime.onekey_cloud_desc": "Backup automático e sincronização de dados em todos os seus dispositivos.",
   "prime.onekeyid_been_log_out": "Sair do OneKey ID",
   "prime.onekeyid_been_log_out_desc": "Este dispositivo foi desativado de outro dispositivo. Se não foi você, por favor, verifique a segurança do seu e-mail.",
   "prime.onekeyid_continue": "Continue com OneKey ID",
@@ -1952,6 +1957,8 @@
   "prime.payment_successful": "Pagamento realizado com sucesso",
   "prime.payment_successful_description": "Obrigado pela sua compra. Que o OneKey Prime ajude você a alcançar uma experiência mais segura e premium.",
   "prime.per_month": "Por Mês",
+  "prime.prime_price_per_month": "{price}/mês",
+  "prime.prime_price_per_year": "{price} por ano",
   "prime.reset": "Redefinir",
   "prime.reset_backup_password_checkbox_label": "Eu entendo que isso excluirá permanentemente meus dados de backup na nuvem",
   "prime.reset_backup_password_description": "Ao redefinir a senha do OneKey ID, os dados de backup existentes na nuvem serão excluídos e um novo backup será criado a partir deste dispositivo.",
@@ -1969,7 +1976,8 @@
   "prime.strong_password": "Crie uma senha forte",
   "prime.strong_password_desc": "Mínimo de 12 caracteres.",
   "prime.subscribe": "Inscrever-se",
-  "prime.subscription_auto_renew_price": "Renova automaticamente por {price}/{billing_period} até você cancelar",
+  "prime.subscription_auto_renew_price_month": "Renovação automática por {price}/mês até o cancelamento",
+  "prime.subscription_auto_renew_price_year": "Renovação automática por {price}/ano até o cancelamento",
   "prime.subscription_manage_app_store": "Você pode gerenciar ou cancelar sua assinatura nas configurações da sua conta na App Store.",
   "prime.sync_password_invalid_description": "Sua senha do OneKey ID foi modificada ou redefinida por outro dispositivo. Por favor, reative o OneKey Cloud e verifique sua senha do OneKey ID.",
   "prime.sync_password_invalid_title": "Senha de OneKey ID inválida",
@@ -2413,6 +2421,7 @@
   "swap.network_cost_dialog_description": "Os custos de rede excedem {number} do valor do pedido",
   "swap.network_cost_dialog_title": "O valor do pedido é muito pequeno",
   "swap.provider_manage_unavailable": "*The provider is temporarily unavailable.",
+  "swap.stablecoin_0_fee": "0 Taxa",
   "swap.step_1": "1. ",
   "swap.toast_go_to_swap": "Ir para swap",
   "swap.toast_go_to_swap_desc": "Aprovar {num} {token} para {provider}",
diff --git a/packages/shared/src/locale/json/ru.json b/packages/shared/src/locale/json/ru.json
index 327ab9eb8eb2..8ee0684b0bfb 100644
--- a/packages/shared/src/locale/json/ru.json
+++ b/packages/shared/src/locale/json/ru.json
@@ -1045,6 +1045,8 @@
   "global.bulk_copy_addresses_export_csv": "Экспорт в CSV",
   "global.bulk_copy_addresses_tabs_my_accounts": "Мои счета",
   "global.bulk_copy_addresses_tabs_set_range": "Установить диапазон",
+  "global.bulk_revoke": "Отменить все",
+  "global.bulk_revoke_desc": "Отменяйте сразу несколько разрешений dApp и защитите свои активы.",
   "global.buy": "Купить",
   "global.buy_one": "Купи один",
   "global.cancel": "Отмена",
@@ -1299,6 +1301,7 @@
   "global.official_website": "Официальный сайт",
   "global.ok": "ХОРОШО",
   "global.on": "На",
+  "global.onekey_cloud": "OneKey Cloud",
   "global.onekey_keytag": "OneKey KeyTag",
   "global.onekey_lite": "OneKey Lite",
   "global.onekey_prompt_dont_have_yet": "У вас ещё нет OneKey?",
@@ -1877,6 +1880,7 @@
   "prime.agree_to_terms_privacy": "Оформляя подписку на OneKey Prime, вы принимаете <termsTag>Условия использования OneKey Prime</termsTag> и <privacyTag>Политику конфиденциальности</privacyTag>.",
   "prime.app_data": "Данные App",
   "prime.auto_lock_description": "При активированном OneKey Cloud опции \"Никогда\" и \"Если отсутствует 4 часа\" недоступны в настройках автоблокировки.",
+  "prime.bulk_copy_addresses_desc": "Легко выбирайте или генерируйте адреса для массового копирования.",
   "prime.change_backup_password": "Изменить пароль OneKey ID",
   "prime.change_email": "Изменить электронную почту",
   "prime.change_password": "Изменить пароль",
@@ -1930,6 +1934,7 @@
   "prime.not_logged_in_title": "Вход не выполнен",
   "prime.not_subscribed_description": "Оформите подписку на OneKey Prime для использования этой функции",
   "prime.not_subscribed_title": "Нет подписки",
+  "prime.onekey_cloud_desc": "Автоматическое резервное копирование и синхронизация данных на всех ваших устройствах.",
   "prime.onekeyid_been_log_out": "Выход из OneKey ID",
   "prime.onekeyid_been_log_out_desc": "Это устройство было деактивировано с другого устройства. Если это были не вы, пожалуйста, проверьте безопасность вашей электронной почты.",
   "prime.onekeyid_continue": "Продолжить с OneKey ID",
@@ -1952,6 +1957,8 @@
   "prime.payment_successful": "Оплата прошла успешно",
   "prime.payment_successful_description": "Спасибо за вашу покупку, пусть OneKey Prime поможет вам достичь более безопасного и премиального опыта.",
   "prime.per_month": "В месяц",
+  "prime.prime_price_per_month": "{price}/мес.",
+  "prime.prime_price_per_year": "{price} в год",
   "prime.reset": "Сброс",
   "prime.reset_backup_password_checkbox_label": "Я понимаю, что это навсегда удалит мои облачные резервные данные",
   "prime.reset_backup_password_description": "При сбросе пароля OneKey ID существующие данные резервного копирования в облаке будут удалены, и с этого устройства будет создана новая резервная копия.",
@@ -1969,7 +1976,8 @@
   "prime.strong_password": "Создайте надежный пароль",
   "prime.strong_password_desc": "Минимум 12 символов.",
   "prime.subscribe": "Подписаться",
-  "prime.subscription_auto_renew_price": "Автопродление: {price}/{billing_period} до отмены подписки",
+  "prime.subscription_auto_renew_price_month": "Автопродление {price}/месяц до отмены подписки",
+  "prime.subscription_auto_renew_price_year": "Автопродление {price}/год до отмены подписки",
   "prime.subscription_manage_app_store": "Управлять подпиской или отменить её можно в настройках учётной записи App Store.",
   "prime.sync_password_invalid_description": "Ваш пароль OneKey ID был изменен или сброшен с другого устройства. Пожалуйста, повторно активируйте OneKey Cloud и проверьте ваш пароль OneKey ID.",
   "prime.sync_password_invalid_title": "Неверный пароль OneKey ID",
@@ -2413,6 +2421,7 @@
   "swap.network_cost_dialog_description": "Сетевые расходы превышают {number} от суммы заказа",
   "swap.network_cost_dialog_title": "Сумма заказа слишком мала",
   "swap.provider_manage_unavailable": "*The provider is temporarily unavailable.",
+  "swap.stablecoin_0_fee": "0 Плата",
   "swap.step_1": "1. ",
   "swap.toast_go_to_swap": "Перейти к обмену",
   "swap.toast_go_to_swap_desc": "Одобрить {num} {token} для {provider}",
diff --git a/packages/shared/src/locale/json/th_TH.json b/packages/shared/src/locale/json/th_TH.json
index 713aad8025af..c705d4d158e7 100644
--- a/packages/shared/src/locale/json/th_TH.json
+++ b/packages/shared/src/locale/json/th_TH.json
@@ -1045,6 +1045,8 @@
   "global.bulk_copy_addresses_export_csv": "ส่งออกเป็น CSV",
   "global.bulk_copy_addresses_tabs_my_accounts": "บัญชีของฉัน",
   "global.bulk_copy_addresses_tabs_set_range": "ตั้งค่าช่วง",
+  "global.bulk_revoke": "ยกเลิกทั้งหมด",
+  "global.bulk_revoke_desc": "ยกเลิกการอนุมัติ dApp หลายรายการพร้อมกัน ปกป้องสินทรัพย์ของคุณ",
   "global.buy": "ซื้อ",
   "global.buy_one": "ซื้อหนึ่ง",
   "global.cancel": "ยกเลิก",
@@ -1299,6 +1301,7 @@
   "global.official_website": "เว็บไซต์อย่างเป็นทางการ",
   "global.ok": "ตกลง",
   "global.on": "บน",
+  "global.onekey_cloud": "OneKey Cloud",
   "global.onekey_keytag": "OneKey KeyTag",
   "global.onekey_lite": "OneKey Lite",
   "global.onekey_prompt_dont_have_yet": "ยังไม่มี OneKey หรือ?",
@@ -1877,6 +1880,7 @@
   "prime.agree_to_terms_privacy": "การสมัครสมาชิก OneKey Prime หมายความว่าคุณยอมรับ<termsTag>ข้อกำหนดการใช้งาน OneKey Prime</termsTag> และ<privacyTag>นโยบายความเป็นส่วนตัว</privacyTag>",
   "prime.app_data": "ข้อมูล App",
   "prime.auto_lock_description": "เมื่อเปิดใช้งาน OneKey Cloud ตัวเลือก \"ไม่เคย\" และ \"ถ้าหายไป 4 ชั่วโมง\" จะไม่สามารถใช้ได้ในการตั้งค่าล็อคอัตโนมัติ",
+  "prime.bulk_copy_addresses_desc": "เลือกหรือสร้างที่อยู่ได้อย่างง่ายดายสำหรับการคัดลอกจำนวนมาก",
   "prime.change_backup_password": "เปลี่ยนรหัสผ่าน OneKey ID",
   "prime.change_email": "เปลี่ยนอีเมล",
   "prime.change_password": "เปลี่ยนรหัสผ่าน",
@@ -1930,6 +1934,7 @@
   "prime.not_logged_in_title": "ยังไม่ได้เข้าสู่ระบบ",
   "prime.not_subscribed_description": "โปรดสมัครสมาชิก OneKey Prime เพื่อใช้งานฟีเจอร์นี้",
   "prime.not_subscribed_title": "ไม่ได้สมัครสมาชิก",
+  "prime.onekey_cloud_desc": "สำรองและซิงค์ข้อมูลแอปอัตโนมัติในทุกอุปกรณ์ของคุณ",
   "prime.onekeyid_been_log_out": "ออกจากระบบ OneKey ID",
   "prime.onekeyid_been_log_out_desc": "อุปกรณ์นี้ถูกปิดใช้งานจากอุปกรณ์อื่น หากไม่ใช่คุณ โปรดตรวจสอบความปลอดภัยของอีเมลของคุณ",
   "prime.onekeyid_continue": "ดำเนินการต่อด้วย OneKey ID",
@@ -1952,6 +1957,8 @@
   "prime.payment_successful": "การชำระเงินสำเร็จ",
   "prime.payment_successful_description": "ขอบคุณสำหรับการซื้อของคุณ ขอให้ OneKey Prime ช่วยให้คุณได้รับประสบการณ์ที่ปลอดภัยและพรีเมียมมากขึ้น",
   "prime.per_month": "ต่อเดือน",
+  "prime.prime_price_per_month": "{price}/เดือน",
+  "prime.prime_price_per_year": "{price} ต่อปี",
   "prime.reset": "รีเซ็ต",
   "prime.reset_backup_password_checkbox_label": "ฉันเข้าใจว่าการกระทำนี้จะลบข้อมูลสำรองบนคลาวด์ของฉันอย่างถาวร",
   "prime.reset_backup_password_description": "การรีเซ็ตรหัสผ่าน OneKey ID จะลบข้อมูลสำรองที่มีอยู่ในคลาวด์และสร้างข้อมูลสำรองใหม่จากอุปกรณ์เครื่องนี้",
@@ -1969,7 +1976,8 @@
   "prime.strong_password": "สร้างรหัสผ่านที่แข็งแกร่ง",
   "prime.strong_password_desc": "ขั้นต่ำ 12 ตัวอักษร",
   "prime.subscribe": "สมัครสมาชิก",
-  "prime.subscription_auto_renew_price": "ต่ออายุอัตโนมัติในราคา {price}/{billing_period} จนกว่าจะยกเลิก",
+  "prime.subscription_auto_renew_price_month": "ต่ออายุอัตโนมัติในราคา {price}/เดือน จนกว่าจะยกเลิก",
+  "prime.subscription_auto_renew_price_year": "ต่ออายุอัตโนมัติในราคา {price}/ปี จนกว่าจะยกเลิก",
   "prime.subscription_manage_app_store": "คุณสามารถจัดการหรือยกเลิกการสมัครสมาชิกได้ที่การตั้งค่าบัญชี App Store",
   "prime.sync_password_invalid_description": "รหัสผ่าน OneKey ID ของคุณถูกแก้ไขหรือรีเซ็ตจากอุปกรณ์อื่น โปรดเปิดใช้งาน OneKey Cloud อีกครั้งและตรวจสอบรหัสผ่าน OneKey ID ของคุณ",
   "prime.sync_password_invalid_title": "รหัสผ่าน OneKey ID ไม่ถูกต้อง",
@@ -2413,6 +2421,7 @@
   "swap.network_cost_dialog_description": "ค่าใช้จ่ายเครือข่ายเกิน {number} ของจำนวนเงินคำสั่งซื้อ",
   "swap.network_cost_dialog_title": "จำนวนการสั่งซื้อน้อยเกินไป",
   "swap.provider_manage_unavailable": "*The provider is temporarily unavailable.",
+  "swap.stablecoin_0_fee": "0 ค่าธรรมเนียม",
   "swap.step_1": "1. ",
   "swap.toast_go_to_swap": "ไปที่การแลกเปลี่ยน",
   "swap.toast_go_to_swap_desc": "อนุมัติ {num} {token} สำหรับ {provider}",
diff --git a/packages/shared/src/locale/json/uk_UA.json b/packages/shared/src/locale/json/uk_UA.json
index 8665302423e3..e30a55afe6d1 100644
--- a/packages/shared/src/locale/json/uk_UA.json
+++ b/packages/shared/src/locale/json/uk_UA.json
@@ -1045,6 +1045,8 @@
   "global.bulk_copy_addresses_export_csv": "Експорт у CSV",
   "global.bulk_copy_addresses_tabs_my_accounts": "Мої акаунти",
   "global.bulk_copy_addresses_tabs_set_range": "Встановити діапазон",
+  "global.bulk_revoke": "Скасувати всі",
+  "global.bulk_revoke_desc": "Скасуйте кілька дозволів dApp одразу та захистіть свої активи.",
   "global.buy": "Купити",
   "global.buy_one": "Купіть один",
   "global.cancel": "Скасувати",
@@ -1299,6 +1301,7 @@
   "global.official_website": "Офіційний веб-сайт",
   "global.ok": "добре",
   "global.on": "На",
+  "global.onekey_cloud": "OneKey Cloud",
   "global.onekey_keytag": "OneKey KeyTag",
   "global.onekey_lite": "OneKey Lite",
   "global.onekey_prompt_dont_have_yet": "Ще не маєте OneKey?",
@@ -1877,6 +1880,7 @@
   "prime.agree_to_terms_privacy": "Оформлюючи підписку на OneKey Prime, ви приймаєте <termsTag>Умови використання OneKey Prime</termsTag> та <privacyTag>Політику конфіденційності</privacyTag>.",
   "prime.app_data": "Дані App",
   "prime.auto_lock_description": "З увімкненим OneKey Cloud опції \"Ніколи\" та \"Якщо відсутній 4 години\" недоступні в налаштуваннях автоматичного блокування.",
+  "prime.bulk_copy_addresses_desc": "Легко вибирайте або генеруйте адреси для масового копіювання.",
   "prime.change_backup_password": "Змінити пароль OneKey ID",
   "prime.change_email": "Змінити електронну пошту",
   "prime.change_password": "Змінити пароль",
@@ -1930,6 +1934,7 @@
   "prime.not_logged_in_title": "Не авторизовано",
   "prime.not_subscribed_description": "Оформіть підписку на OneKey Prime для використання цієї функції",
   "prime.not_subscribed_title": "Не підписано",
+  "prime.onekey_cloud_desc": "Автоматичне резервне копіювання та синхронізація даних на всіх ваших пристроях.",
   "prime.onekeyid_been_log_out": "Вийти з OneKey ID",
   "prime.onekeyid_been_log_out_desc": "Цей пристрій було деактивовано з іншого пристрою. Якщо це були не ви, будь ласка, перевірте безпеку вашої електронної пошти.",
   "prime.onekeyid_continue": "Продовжити з OneKey ID",
@@ -1952,6 +1957,8 @@
   "prime.payment_successful": "Оплата успішна",
   "prime.payment_successful_description": "Дякуємо за вашу покупку, нехай OneKey Prime допоможе вам досягти більш безпечного та преміального досвіду.",
   "prime.per_month": "На місяць",
+  "prime.prime_price_per_month": "{price}/міс.",
+  "prime.prime_price_per_year": "{price} на рік",
   "prime.reset": "Скидання",
   "prime.reset_backup_password_checkbox_label": "Я розумію, що це назавжди видалить мої дані резервної копії у хмарі",
   "prime.reset_backup_password_description": "Скидання пароля OneKey ID призведе до видалення наявних даних резервної копії у хмарі та створення нової резервної копії з цього пристрою.",
@@ -1969,7 +1976,8 @@
   "prime.strong_password": "Створіть надійний пароль",
   "prime.strong_password_desc": "Мінімум 12 символів.",
   "prime.subscribe": "Підписатися",
-  "prime.subscription_auto_renew_price": "Автопродовження: {price}/{billing_period} до скасування",
+  "prime.subscription_auto_renew_price_month": "Автопродовження {price}/місяць до скасування підписки",
+  "prime.subscription_auto_renew_price_year": "Автопродовження {price}/рік до скасування підписки",
   "prime.subscription_manage_app_store": "Керувати підпискою або скасувати її можна в налаштуваннях облікового запису App Store.",
   "prime.sync_password_invalid_description": "Ваш пароль OneKey ID було змінено або скинуто з іншого пристрою. Будь ласка, повторно активуйте OneKey Cloud та перевірте ваш пароль OneKey ID.",
   "prime.sync_password_invalid_title": "Неправильний пароль OneKey ID",
@@ -2413,6 +2421,7 @@
   "swap.network_cost_dialog_description": "Витрати на мережу перевищують {number} від суми замовлення",
   "swap.network_cost_dialog_title": "Сума замовлення занадто мала",
   "swap.provider_manage_unavailable": "*The provider is temporarily unavailable.",
+  "swap.stablecoin_0_fee": "0 комісій",
   "swap.step_1": "1. ",
   "swap.toast_go_to_swap": "Перейти до обміну",
   "swap.toast_go_to_swap_desc": "Схвалити {num} {token} для {provider}",
diff --git a/packages/shared/src/locale/json/vi.json b/packages/shared/src/locale/json/vi.json
index e6994e94db2d..2847bdce56a2 100644
--- a/packages/shared/src/locale/json/vi.json
+++ b/packages/shared/src/locale/json/vi.json
@@ -1045,6 +1045,8 @@
   "global.bulk_copy_addresses_export_csv": "Xuất CSV",
   "global.bulk_copy_addresses_tabs_my_accounts": "Tài khoản của tôi",
   "global.bulk_copy_addresses_tabs_set_range": "Đặt phạm vi",
+  "global.bulk_revoke": "Thu hồi hàng loạt",
+  "global.bulk_revoke_desc": "Thu hồi nhiều quyền dApp cùng lúc, bảo vệ tài sản an toàn.",
   "global.buy": "Mua",
   "global.buy_one": "Mua một cái",
   "global.cancel": "Hủy",
@@ -1299,6 +1301,7 @@
   "global.official_website": "Trang web chính thức",
   "global.ok": "ĐƯỢC RỒI",
   "global.on": "Trên",
+  "global.onekey_cloud": "OneKey Cloud",
   "global.onekey_keytag": "OneKey KeyTag",
   "global.onekey_lite": "OneKey Lite",
   "global.onekey_prompt_dont_have_yet": "Chưa có OneKey?",
@@ -1877,6 +1880,7 @@
   "prime.agree_to_terms_privacy": "Khi đăng ký OneKey Prime, bạn đồng ý với <termsTag>Điều khoản Dịch vụ OneKey Prime</termsTag> và <privacyTag>Chính sách Bảo mật</privacyTag>.",
   "prime.app_data": "Dữ liệu App",
   "prime.auto_lock_description": "Khi OneKey Cloud được bật, các tùy chọn \"Không bao giờ\" và \"Nếu đi vắng 4 giờ\" không khả dụng trong cài đặt khóa tự động.",
+  "prime.bulk_copy_addresses_desc": "Dễ dàng chọn hoặc tạo địa chỉ để sao chép hàng loạt.",
   "prime.change_backup_password": "Thay đổi mật khẩu OneKey ID",
   "prime.change_email": "Thay đổi email",
   "prime.change_password": "Thay đổi mật khẩu",
@@ -1930,6 +1934,7 @@
   "prime.not_logged_in_title": "Chưa đăng nhập",
   "prime.not_subscribed_description": "Vui lòng đăng ký OneKey Prime để sử dụng tính năng này",
   "prime.not_subscribed_title": "Chưa đăng ký",
+  "prime.onekey_cloud_desc": "Sao lưu và đồng bộ dữ liệu tự động trên tất cả thiết bị của bạn.",
   "prime.onekeyid_been_log_out": "Đăng xuất OneKey ID",
   "prime.onekeyid_been_log_out_desc": "Thiết bị này đã bị vô hiệu hóa từ một thiết bị khác. Nếu điều này không phải do bạn thực hiện, vui lòng kiểm tra bảo mật email của bạn.",
   "prime.onekeyid_continue": "Tiếp tục với OneKey ID",
@@ -1952,6 +1957,8 @@
   "prime.payment_successful": "Thanh toán thành công",
   "prime.payment_successful_description": "Cảm ơn bạn đã mua hàng, hy vọng OneKey Prime sẽ giúp bạn có trải nghiệm an toàn và cao cấp hơn.",
   "prime.per_month": "Mỗi tháng",
+  "prime.prime_price_per_month": "{price}/tháng",
+  "prime.prime_price_per_year": "{price} mỗi năm",
   "prime.reset": "Đặt lại",
   "prime.reset_backup_password_checkbox_label": "Tôi hiểu rằng việc này sẽ xóa vĩnh viễn dữ liệu sao lưu đám mây của tôi",
   "prime.reset_backup_password_description": "Việc đặt lại mật khẩu OneKey ID sẽ xóa dữ liệu sao lưu hiện có trên đám mây và tạo bản sao lưu mới từ thiết bị này.",
@@ -1969,7 +1976,8 @@
   "prime.strong_password": "Tạo một mật khẩu mạnh",
   "prime.strong_password_desc": "Tối thiểu 12 ký tự.",
   "prime.subscribe": "Đăng ký",
-  "prime.subscription_auto_renew_price": "Tự động gia hạn với giá {price}/{billing_period} cho đến khi hủy",
+  "prime.subscription_auto_renew_price_month": "Tự động gia hạn {price}/tháng cho đến khi bạn hủy",
+  "prime.subscription_auto_renew_price_year": "Tự động gia hạn {price}/năm cho đến khi bạn hủy",
   "prime.subscription_manage_app_store": "Bạn có thể quản lý hoặc hủy gói đăng ký trong phần cài đặt tài khoản App Store.",
   "prime.sync_password_invalid_description": "Mật khẩu OneKey ID của bạn đã bị thay đổi hoặc đặt lại từ một thiết bị khác. Vui lòng kích hoạt lại OneKey Cloud và xác minh mật khẩu OneKey ID của bạn.",
   "prime.sync_password_invalid_title": "Mật khẩu OneKey ID không chính xác",
@@ -2413,6 +2421,7 @@
   "swap.network_cost_dialog_description": "Chi phí mạng vượt quá {number} của số tiền đơn hàng",
   "swap.network_cost_dialog_title": "Số tiền đặt hàng quá nhỏ",
   "swap.provider_manage_unavailable": "*The provider is temporarily unavailable.",
+  "swap.stablecoin_0_fee": "0 Phí",
   "swap.step_1": "1. ",
   "swap.toast_go_to_swap": "Đi đến hoán đổi",
   "swap.toast_go_to_swap_desc": "Phê duyệt {num} {token} cho {provider}",
diff --git a/packages/shared/src/locale/json/zh_CN.json b/packages/shared/src/locale/json/zh_CN.json
index c2fe3272680a..eb7bbcf6bb8f 100644
--- a/packages/shared/src/locale/json/zh_CN.json
+++ b/packages/shared/src/locale/json/zh_CN.json
@@ -1045,6 +1045,8 @@
   "global.bulk_copy_addresses_export_csv": "导出 CSV",
   "global.bulk_copy_addresses_tabs_my_accounts": "我的账户",
   "global.bulk_copy_addresses_tabs_set_range": "设置范围",
+  "global.bulk_revoke": "批量撤销",
+  "global.bulk_revoke_desc": "一键撤销多个 dApp 授权，保护您的资产安全。",
   "global.buy": "购买",
   "global.buy_one": "购买",
   "global.cancel": "取消",
@@ -1299,6 +1301,7 @@
   "global.official_website": "官方网站",
   "global.ok": "好的",
   "global.on": "开启",
+  "global.onekey_cloud": "OneKey Cloud",
   "global.onekey_keytag": "OneKey KeyTag",
   "global.onekey_lite": "OneKey Lite",
   "global.onekey_prompt_dont_have_yet": "还没有 OneKey？",
@@ -1877,6 +1880,7 @@
   "prime.agree_to_terms_privacy": "订阅 OneKey Prime 即表示您同意 <termsTag>OneKey Prime 服务条款</termsTag>和<privacyTag>隐私政策</privacyTag>。",
   "prime.app_data": "App 数据",
   "prime.auto_lock_description": "启用 OneKey Cloud 后，自动锁定设置无法使用\"永不\"和\"离开 4 小时\"选项。",
+  "prime.bulk_copy_addresses_desc": "轻松选择或生成地址以进行批量复制。",
   "prime.change_backup_password": "更改 OneKey ID 密码",
   "prime.change_email": "更改登录邮箱",
   "prime.change_password": "修改密码",
@@ -1930,6 +1934,7 @@
   "prime.not_logged_in_title": "未登录",
   "prime.not_subscribed_description": "请订阅 OneKey Prime 以使用该功能",
   "prime.not_subscribed_title": "未订阅",
+  "prime.onekey_cloud_desc": "自动备份应用数据，轻松同步至所有设备。",
   "prime.onekeyid_been_log_out": "OneKey ID 被登出",
   "prime.onekeyid_been_log_out_desc": "此设备已从另一设备停用。如果这不是您本人操作，请检查您的电子邮件安全性。",
   "prime.onekeyid_continue": "继续使用 OneKey ID",
@@ -1952,6 +1957,8 @@
   "prime.payment_successful": "支付成功",
   "prime.payment_successful_description": "感谢您的购买，愿 OneKey Prime 帮助您有更安全、更高端的体验。",
   "prime.per_month": "每月",
+  "prime.prime_price_per_month": "{price}/月",
+  "prime.prime_price_per_year": "每年 {price}",
   "prime.reset": "重置",
   "prime.reset_backup_password_checkbox_label": "我明白这将永久删除我的云备份数据",
   "prime.reset_backup_password_description": "重置 OneKey ID 密码将删除云端已有的备份数据，并从当前设备创建新备份。",
@@ -1969,7 +1976,8 @@
   "prime.strong_password": "创建一个强密码",
   "prime.strong_password_desc": "至少 12 个字符。",
   "prime.subscribe": "订阅",
-  "prime.subscription_auto_renew_price": "{price}/{billing_period} 自动续费，可随时取消",
+  "prime.subscription_auto_renew_price_month": "每月自动续费 {price}，可随时取消",
+  "prime.subscription_auto_renew_price_year": "每年自动续费 {price}，可随时取消",
   "prime.subscription_manage_app_store": "您可以在 App Store 账户设置中管理或取消订阅。",
   "prime.sync_password_invalid_description": "您的 OneKey ID 密码已被其他设备修改或重置。请重新启用 OneKey Cloud 并验证您的 OneKey ID 密码。",
   "prime.sync_password_invalid_title": "OneKey ID 密码无效",
@@ -2413,6 +2421,7 @@
   "swap.network_cost_dialog_description": "网络费用超过订单金额的{number}",
   "swap.network_cost_dialog_title": "订单金额太小",
   "swap.provider_manage_unavailable": "*The provider is temporarily unavailable.",
+  "swap.stablecoin_0_fee": "0 手续费",
   "swap.step_1": "1. ",
   "swap.toast_go_to_swap": "前往兑换",
   "swap.toast_go_to_swap_desc": "授权 {num} {token} 给 {provider}",
diff --git a/packages/shared/src/locale/json/zh_HK.json b/packages/shared/src/locale/json/zh_HK.json
index 0d01c866ad59..0a18eeeb0b7e 100644
--- a/packages/shared/src/locale/json/zh_HK.json
+++ b/packages/shared/src/locale/json/zh_HK.json
@@ -1045,6 +1045,8 @@
   "global.bulk_copy_addresses_export_csv": "導出 CSV",
   "global.bulk_copy_addresses_tabs_my_accounts": "我的帳戶",
   "global.bulk_copy_addresses_tabs_set_range": "設定範圍",
+  "global.bulk_revoke": "批量撤銷",
+  "global.bulk_revoke_desc": "一鍵撤銷多個 dApp 授權，保護您的資產安全。",
   "global.buy": "購買",
   "global.buy_one": "購買",
   "global.cancel": "取消",
@@ -1299,6 +1301,7 @@
   "global.official_website": "官方網站",
   "global.ok": "好的",
   "global.on": "啟動",
+  "global.onekey_cloud": "OneKey Cloud",
   "global.onekey_keytag": "OneKey KeyTag",
   "global.onekey_lite": "OneKey Lite",
   "global.onekey_prompt_dont_have_yet": "還沒有 OneKey？",
@@ -1877,6 +1880,7 @@
   "prime.agree_to_terms_privacy": "訂閱 OneKey Prime 即表示您同意 <termsTag>OneKey Prime 服務條款</termsTag>及<privacyTag>私隱政策</privacyTag>。",
   "prime.app_data": "App 數據",
   "prime.auto_lock_description": "啟用 OneKey Cloud 後，自動鎖定設定無法使用「永不」和「離開 4 小時」選項。",
+  "prime.bulk_copy_addresses_desc": "輕鬆選擇或生成地址以進行批量複製。",
   "prime.change_backup_password": "更改 OneKey ID 密碼",
   "prime.change_email": "更改電郵",
   "prime.change_password": "更改密碼",
@@ -1930,6 +1934,7 @@
   "prime.not_logged_in_title": "未登入",
   "prime.not_subscribed_description": "請訂閱 OneKey Prime 以使用此功能",
   "prime.not_subscribed_title": "未訂閱",
+  "prime.onekey_cloud_desc": "自動備份應用程式資料，輕鬆同步至所有裝置。",
   "prime.onekeyid_been_log_out": "OneKey ID 被登出",
   "prime.onekeyid_been_log_out_desc": "此裝置已從另一裝置停用。如果這不是您本人操作，請檢查您的電郵安全。",
   "prime.onekeyid_continue": "繼續使用 OneKey ID",
@@ -1952,6 +1957,8 @@
   "prime.payment_successful": "付款成功",
   "prime.payment_successful_description": "感謝您的購買 ，希望 OneKey Prime 能幫助您獲得更安全和更高端的體驗 。",
   "prime.per_month": "每月",
+  "prime.prime_price_per_month": "{price}/月",
+  "prime.prime_price_per_year": "每年 {price}",
   "prime.reset": "重設",
   "prime.reset_backup_password_checkbox_label": "我明白這將永久刪除我的雲端備份資料",
   "prime.reset_backup_password_description": "重設 OneKey ID 密碼將會刪除雲端現存的備份資料，並從此裝置建立全新備份。",
@@ -1969,7 +1976,8 @@
   "prime.strong_password": "建立一個強密碼",
   "prime.strong_password_desc": "最少 12 個字符。",
   "prime.subscribe": "訂閱",
-  "prime.subscription_auto_renew_price": "每{billing_period} {price}自動續期，直至取消",
+  "prime.subscription_auto_renew_price_month": "每月自動續費 {price}，可隨時取消",
+  "prime.subscription_auto_renew_price_year": "每年自動續費 {price}，可隨時取消",
   "prime.subscription_manage_app_store": "您可以在 App Store 帳戶設定中管理或取消訂閱。",
   "prime.sync_password_invalid_description": "您的 OneKey ID 密碼已被其他裝置修改或重設。請重新啟用 OneKey Cloud 並驗證您的 OneKey ID 密碼。",
   "prime.sync_password_invalid_title": "OneKey ID 密碼無效",
@@ -2413,6 +2421,7 @@
   "swap.network_cost_dialog_description": "網絡费用超過訂單金額的{number}",
   "swap.network_cost_dialog_title": "訂單金額太小",
   "swap.provider_manage_unavailable": "*The provider is temporarily unavailable.",
+  "swap.stablecoin_0_fee": "0 手續費",
   "swap.step_1": "1. ",
   "swap.toast_go_to_swap": "前往兌換",
   "swap.toast_go_to_swap_desc": "授權 {num} {token} 給 {provider}",
diff --git a/packages/shared/src/locale/json/zh_TW.json b/packages/shared/src/locale/json/zh_TW.json
index 4e17fef6d24d..464208832c98 100644
--- a/packages/shared/src/locale/json/zh_TW.json
+++ b/packages/shared/src/locale/json/zh_TW.json
@@ -1045,6 +1045,8 @@
   "global.bulk_copy_addresses_export_csv": "導出 CSV",
   "global.bulk_copy_addresses_tabs_my_accounts": "我的帳戶",
   "global.bulk_copy_addresses_tabs_set_range": "設定範圍",
+  "global.bulk_revoke": "批量撤銷",
+  "global.bulk_revoke_desc": "一鍵撤銷多個 dApp 授權，保護您的資產安全。",
   "global.buy": "購買",
   "global.buy_one": "購買",
   "global.cancel": "取消",
@@ -1299,6 +1301,7 @@
   "global.official_website": "官方網站",
   "global.ok": "好的",
   "global.on": "開啟",
+  "global.onekey_cloud": "OneKey Cloud",
   "global.onekey_keytag": "OneKey KeyTag",
   "global.onekey_lite": "OneKey Lite",
   "global.onekey_prompt_dont_have_yet": "還沒有 OneKey？",
@@ -1877,6 +1880,7 @@
   "prime.agree_to_terms_privacy": "訂閱 OneKey Prime 即表示您同意 <termsTag>OneKey Prime 服務條款</termsTag>和<privacyTag>隱私權政策</privacyTag>。",
   "prime.app_data": "App 資料",
   "prime.auto_lock_description": "啟用 OneKey Cloud 後，自動鎖定設定無法使用「永不」和「離開 4 小時」選項。",
+  "prime.bulk_copy_addresses_desc": "輕鬆選擇或生成地址以進行批量複製。",
   "prime.change_backup_password": "更改 OneKey ID 密碼",
   "prime.change_email": "更改電郵",
   "prime.change_password": "更改密碼",
@@ -1930,6 +1934,7 @@
   "prime.not_logged_in_title": "未登入",
   "prime.not_subscribed_description": "請訂閱 OneKey Prime 以使用此功能",
   "prime.not_subscribed_title": "未訂閱",
+  "prime.onekey_cloud_desc": "自動備份應用程式資料，輕鬆同步至所有裝置。",
   "prime.onekeyid_been_log_out": "OneKey ID 被登出",
   "prime.onekeyid_been_log_out_desc": "此裝置已從另一裝置停用。如果這不是您本人操作，請檢查您的電子郵件安全性。",
   "prime.onekeyid_continue": "繼續使用 OneKey ID",
@@ -1952,6 +1957,8 @@
   "prime.payment_successful": "付款成功",
   "prime.payment_successful_description": "感謝您的購買，願 OneKey Prime 幫助您實現更安全和更高級的體驗。",
   "prime.per_month": "每月",
+  "prime.prime_price_per_month": "{price}/月",
+  "prime.prime_price_per_year": "每年 {price}",
   "prime.reset": "重置",
   "prime.reset_backup_password_checkbox_label": "我明白這將永久刪除我的雲端備份資料",
   "prime.reset_backup_password_description": "重置 OneKey ID 密碼將刪除雲端已有的備份資料，並從當前裝置建立新備份。",
@@ -1969,7 +1976,8 @@
   "prime.strong_password": "創建一個強密碼",
   "prime.strong_password_desc": "至少 12 個字元。",
   "prime.subscribe": "訂閱",
-  "prime.subscription_auto_renew_price": "{price}/{billing_period} 自動續約，可隨時取消",
+  "prime.subscription_auto_renew_price_month": "每月自動續費 {price}，可隨時取消",
+  "prime.subscription_auto_renew_price_year": "每年自動續費 {price}，可隨時取消",
   "prime.subscription_manage_app_store": "您可以在 App Store 帳號設定中管理或取消訂閱。",
   "prime.sync_password_invalid_description": "您的 OneKey ID 密碼已被其他裝置修改或重置。請重新啟用 OneKey Cloud 並驗證您的 OneKey ID 密碼。",
   "prime.sync_password_invalid_title": "OneKey ID 密碼無效",
@@ -2413,6 +2421,7 @@
   "swap.network_cost_dialog_description": "網路费用超過訂單金額的 {number}",
   "swap.network_cost_dialog_title": "訂單金額太小",
   "swap.provider_manage_unavailable": "*The provider is temporarily unavailable.",
+  "swap.stablecoin_0_fee": "0 手續費",
   "swap.step_1": "1. ",
   "swap.toast_go_to_swap": "前往兌換",
   "swap.toast_go_to_swap_desc": "授權 {num} {token} 給 {provider}",
diff --git a/packages/shared/src/referralCode/type.ts b/packages/shared/src/referralCode/type.ts
index c87755b809cf..a67dde4ebb41 100644
--- a/packages/shared/src/referralCode/type.ts
+++ b/packages/shared/src/referralCode/type.ts
@@ -200,4 +200,18 @@ export interface IInvitePostConfig {
     amount: number;
     unit: string;
   };
+  locales: {
+    Earn: {
+      title: string;
+      subtitle: string;
+      for_tou: {
+        title: string;
+        subtitle: string;
+      };
+      for_your_friend: {
+        title: string;
+        subtitle: string;
+      };
+    };
+  };
 }


Reviews:
user: login: weatherstar
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-29T06:41:49Z
user: login: sidmorizon
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-29T06:42:02Z
user: login: originalix
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-05-29T06:45:30Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 2**

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: ASSERTIVE**
**Plan: Pro**
**Cache: Disabled due to data retention organization setting**
**Knowledge Base: Disabled due to data retention organization setting**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 8469f99592f0016399105a674aee8fc7fbeca508 and 74e20bb26ab899d0cbde46e8eadb490a47b44f8c.

</details>

<details>
<summary>⛔ Files ignored due to path filters (19)</summary>

* `packages/shared/src/locale/json/bn.json` is excluded by `!packages/shared/src/locale/json/*.json`
* `packages/shared/src/locale/json/de.json` is excluded by `!packages/shared/src/locale/json/*.json`
* `packages/shared/src/locale/json/en_US.json` is excluded by `!packages/shared/src/locale/json/*.json`
* `packages/shared/src/locale/json/es.json` is excluded by `!packages/shared/src/locale/json/*.json`
* `packages/shared/src/locale/json/fr_FR.json` is excluded by `!packages/shared/src/locale/json/*.json`
* `packages/shared/src/locale/json/hi_IN.json` is excluded by `!packages/shared/src/locale/json/*.json`
* `packages/shared/src/locale/json/id.json` is excluded by `!packages/shared/src/locale/json/*.json`
* `packages/shared/src/locale/json/it_IT.json` is excluded by `!packages/shared/src/locale/json/*.json`
* `packages/shared/src/locale/json/ja_JP.json` is excluded by `!packages/shared/src/locale/json/*.json`
* `packages/shared/src/locale/json/ko_KR.json` is excluded by `!packages/shared/src/locale/json/*.json`
* `packages/shared/src/locale/json/pt.json` is excluded by `!packages/shared/src/locale/json/*.json`
* `packages/shared/src/locale/json/pt_BR.json` is excluded by `!packages/shared/src/locale/json/*.json`
* `packages/shared/src/locale/json/ru.json` is excluded by `!packages/shared/src/locale/json/*.json`
* `packages/shared/src/locale/json/th_TH.json` is excluded by `!packages/shared/src/locale/json/*.json`
* `packages/shared/src/locale/json/uk_UA.json` is excluded by `!packages/shared/src/locale/json/*.json`
* `packages/shared/src/locale/json/vi.json` is excluded by `!packages/shared/src/locale/json/*.json`
* `packages/shared/src/locale/json/zh_CN.json` is excluded by `!packages/shared/src/locale/json/*.json`
* `packages/shared/src/locale/json/zh_HK.json` is excluded by `!packages/shared/src/locale/json/*.json`
* `packages/shared/src/locale/json/zh_TW.json` is excluded by `!packages/shared/src/locale/json/*.json`

</details>

<details>
<summary>📒 Files selected for processing (8)</summary>

* `packages/components/src/composite/Dialog/index.tsx` (3 hunks)
* `packages/components/src/composite/Dialog/type.ts` (1 hunks)
* `packages/kit-bg/src/services/ServiceReferralCode.ts` (1 hunks)
* `packages/kit/src/components/UpdateReminder/hooks.tsx` (1 hunks)
* `packages/kit/src/hooks/useReferFriends.tsx` (4 hunks)
* `packages/kit/src/views/ReferFriends/pages/RewardDistributionHistory/index.tsx` (1 hunks)
* `packages/shared/src/locale/enum/translations.ts` (7 hunks)
* `packages/shared/src/referralCode/type.ts` (1 hunks)

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🧬 Code Graph Analysis (2)</summary>

<details>
<summary>packages/components/src/composite/Dialog/index.tsx (1)</summary><blockquote>

<details>
<summary>packages/shared/src/polyfills/polyfillsPlatform.js (1)</summary>

* `platformEnv` (6-6)

</details>

</blockquote></details>
<details>
<summary>packages/kit/src/hooks/useReferFriends.tsx (1)</summary><blockquote>

<details>
<summary>packages/kit/src/components/HyperlinkText/index.tsx (1)</summary>

* `FormatHyperlinkText` (205-214)

</details>

</blockquote></details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (3)</summary>

* GitHub Check: lint (20.x)
* GitHub Check: unittest (20.x)
* GitHub Check: Analyze (javascript-typescript)

</details>

<details>
<summary>🔇 Additional comments (18)</summary><blockquote>

<details>
<summary>packages/components/src/composite/Dialog/type.ts (1)</summary>

`96-100`: **Clean addition with clear documentation.**

The new `forceMount` property is well-documented and addresses the overlay visibility issue for non-modal, non-sheet dialogs.

</details>
<details>
<summary>packages/components/src/composite/Dialog/index.tsx (3)</summary>

`116-116`: **Parameter correctly added to function signature.**

The `forceMount` prop is properly integrated into the DialogFrame component signature.

---

`285-285`: **Good fallback handling for forceMount prop.**

Using `forceMount || undefined` ensures we don't explicitly pass `false` to the underlying component when forceMount is falsy.

---

`690-690`: **Smart platform-specific logic for overlay mounting.**

Setting `forceMount: true` for non-native platforms makes sense - web environments need explicit overlay mounting while native platforms handle this differently.

</details>
<details>
<summary>packages/kit/src/components/UpdateReminder/hooks.tsx (1)</summary>

`370-370`: **Platform restriction makes sense for update dialogs.**

Limiting update dialogs to native and desktop platforms prevents inappropriate dialogs on web where app updates work differently.

</details>
<details>
<summary>packages/shared/src/referralCode/type.ts (1)</summary>

`203-216`: **LGTM! Well-structured localization type.**

The new `locales` property provides a clean, organized structure for referral-related text. The nested `Earn` object with consistent naming makes this easy to use and maintain.

</details>
<details>
<summary>packages/kit/src/views/ReferFriends/pages/RewardDistributionHistory/index.tsx (1)</summary>

`159-159`: **Verify if hardcoded title is intentional.**

You've switched from dynamic translation to a hardcoded string. This creates inconsistency since other UI elements still use `intl.formatMessage`. 

Confirm this change aligns with your localization strategy.

</details>
<details>
<summary>packages/kit/src/hooks/useReferFriends.tsx (5)</summary>

`16-16`: **Import update aligns with refactor.**

Good change from `HyperlinkText` to `FormatHyperlinkText`. This supports the new localization approach.

---

`114-114`: **Clean switch to config-based localization.**

Using `postConfig.locales.Earn.title` directly is cleaner than translation IDs. This aligns with the type changes.

---

`116-124`: **FormatHyperlinkText usage looks correct.**

The switch to passing content as `children` instead of `translationId` follows the component's intended interface. Clean implementation.

---

`156-160`: **Consistent localization pattern.**

Good use of the structured `postConfig.locales.Earn.for_tou` properties. Keeps the text organized and maintainable.

---

`169-173`: **Maintains consistency in reward descriptions.**

Using `for_your_friend` properties keeps the same pattern as `for_tou`. Well-structured approach.

</details>
<details>
<summary>packages/shared/src/locale/enum/translations.ts (6)</summary>

`1053-1054`: **Approve new bulk revoke keys**  
The additions `global_bulk_revoke` and `global_bulk_revoke_desc` align well with the existing pattern.

---

`1309-1309`: **Approve global_onekey_cloud key**  
`global_onekey_cloud` fits the naming and matches its string value.

---

`1888-1888`: **Approve prime_bulk_copy_addresses_desc**  
This new prime key follows established conventions.

---

`1942-1942`: **Approve prime_onekey_cloud_desc**  
The descriptor entry is consistent with its global counterpart.

---

`1984-1985`: **Approve subscription auto-renew price keys**  
`prime_subscription_auto_renew_price_month` and `_year` correctly follow the pattern.

---

`2429-2429`: **Approve swap_stablecoin_0_fee key**  
The new swap key is named and formatted correctly.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-29T06:46:18Z

Review comments:
diff_hunk: @@ -163,8 +163,11 @@ class ServiceReferralCode extends ServiceBase {
   async getMyReferralCode() {
     const myReferralCode =
       await this.backgroundApi.simpleDb.referralCode.getMyReferralCode();
-    setTimeout(() => {
-      void this.getSummaryInfo();
+    setTimeout(async () => {
+      const isLogin = await this.backgroundApi.servicePrime.isLoggedIn();
+      if (isLogin) {
+        void this.getSummaryInfo();
+      }
     });
path: packages/kit-bg/src/services/ServiceReferralCode.ts
user: login: coderabbitai[bot]
body: _🧹 Nitpick (assertive)_

**Good optimization with login check.**

Adding the login check prevents unnecessary API calls. The async callback looks correct.

Consider adding cleanup if this service method could be called when components might unmount quickly.

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In packages/kit-bg/src/services/ServiceReferralCode.ts around lines 166 to 171,
the setTimeout callback correctly checks login status before calling
getSummaryInfo, which is good. To improve, add a way to clear the timeout if
this method might be called when components unmount quickly, preventing
potential memory leaks or unwanted calls. Store the timeout ID and provide a
cleanup method to clear it when needed.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-29T06:46:17Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1957,6 +1962,8 @@
   prime_payment_successful = 'prime.payment_successful',
   prime_payment_successful_description = 'prime.payment_successful_description',
   prime_per_month = 'prime.per_month',
+  prime_prime_price_per_month = 'prime.prime_price_per_month',
+  prime_prime_price_per_year = 'prime.prime_price_per_year',
path: packages/shared/src/locale/enum/translations.ts
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Fix duplicated “prime” prefix in price keys**  
The constants `prime_prime_price_per_month` and `prime_prime_price_per_year` duplicate the “prime” prefix. They should read `prime_price_per_month` and `prime_price_per_year`, mapping to `'prime.price_per_month'` and `'prime.price_per_year'`.  

Apply this diff:
```diff
-  prime_prime_price_per_month = 'prime.prime_price_per_month',
-  prime_prime_price_per_year = 'prime.prime_price_per_year',
+  prime_price_per_month = 'prime.price_per_month',
+  prime_price_per_year = 'prime.price_per_year',
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
  prime_price_per_month = 'prime.price_per_month',
  prime_price_per_year = 'prime.price_per_year',
```

</details>

<!-- suggestion_end -->

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In packages/shared/src/locale/enum/translations.ts at lines 1965-1966, the
constants have a duplicated "prime" prefix in their names and values. Rename the
constants from prime_prime_price_per_month and prime_prime_price_per_year to
prime_price_per_month and prime_price_per_year, and update their string values
to 'prime.price_per_month' and 'prime.price_per_year' respectively to fix the
duplication.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-29T06:46:17Z
author_association: CONTRIBUTOR

PR comments:
user: login: codesandbox[bot]
created_at: 2025-05-29T06:40:50Z
body: #### Review or Edit in CodeSandbox

Open the branch in <a href="https://codesandbox.io/p/github/OneKeyHQ/app-monorepo/x-earn-issues?mode=review&utm_source=gh_app">Web Editor</a> &bull; <a href="https://codesandbox.io/p/vscode?owner=OneKeyHQ&repo=app-monorepo&branch=x-earn-issues&utm_source=gh_app">VS Code</a> &bull; <a href="https://codesandbox.io/p/vscode?owner=OneKeyHQ&repo=app-monorepo&branch=x-earn-issues&insiders=true&utm_source=gh_app">Insiders</a><br>
Open <a href="https://codesandbox.io/p/devtool/preview/OneKeyHQ/app-monorepo/x-earn-issues?task=preview&port=51423&redirect=true&utm_source=gh_app">Preview</a>

<!-- open-in-codesandbox:complete -->

author_association: NONE
user: login: coderabbitai[bot]
created_at: 2025-05-29T06:40:54Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough

The changes add a `forceMount` prop to dialog components, ensuring overlays can be forcibly shown, especially in non-native environments. Several localization structures and translation keys are updated or added. Some UI text is switched from dynamic translation to static or config-based strings. Internal logic in referral code and update reminder flows is slightly refined.

## Changes

| Files/Paths                                                                                      | Change Summary                                                                                                   |
|--------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------|
| .../Dialog/index.tsx, .../Dialog/type.ts                                                         | Added `forceMount` prop to dialog components and types. Updated hook to set `forceMount` based on platform.     |
| .../ServiceReferralCode.ts                                                                       | Changed delayed summary info fetch to check login status before calling.                                         |
| .../UpdateReminder/hooks.tsx                                                                     | Update dialog now only appears on native/desktop and not in dev environments.                                    |
| .../useReferFriends.tsx, .../referralCode/type.ts                                                | Switched from translation IDs to config-based localized strings for dialog texts. Updated type for locales.      |
| .../RewardDistributionHistory/index.tsx                                                          | Replaced dynamic translation with static string for page header.                                                 |
| .../translations.ts                                                                              | Added new translation keys for bulk revoke, cloud, prime pricing, and swap fee.                                 |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant App
    participant DialogFrame
    participant TMDialogOverlay

    App->>DialogFrame: Render with props (including forceMount)
    DialogFrame->>TMDialogOverlay: Render Overlay (forceMount passed)
    TMDialogOverlay-->>DialogFrame: Overlay mounts based on forceMount
    DialogFrame-->>App: Dialog rendered with/without overlay
```

## Assessment against linked issues

| Objective                                                                 | Addressed | Explanation                                      |
|---------------------------------------------------------------------------|-----------|--------------------------------------------------|
| Ensure update reminder dialog displays overlay (OK-38555)                  | ✅        |                                                  |

<!-- walkthrough_end -->
<!-- internal state start -->


<!-- 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= -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---



<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=OneKeyHQ/app-monorepo&utm_content=7442):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` or `Summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: CONTRIBUTOR