Przeglądaj źródła

feat: 第四版翻译

lilu 3 miesięcy temu
rodzic
commit
a999a6b720
25 zmienionych plików z 1283 dodań i 104 usunięć
  1. 1 1
      lib/app/controllers/core_controller.dart
  2. 29 28
      lib/app/dialog/feedback_bottom_sheet.dart
  3. 21 12
      lib/app/modules/account/views/account_view.dart
  4. 3 2
      lib/app/modules/deviceauth/widgets/device_card.dart
  5. 6 6
      lib/app/modules/feedback/views/feedback_view.dart
  6. 12 11
      lib/app/modules/login/views/login_view.dart
  7. 1 1
      lib/app/modules/node/views/node_view.dart
  8. 8 8
      lib/app/modules/precode/views/precode_view.dart
  9. 5 4
      lib/app/modules/precode/widgets/precode_save_dialog.dart
  10. 12 11
      lib/app/modules/signup/views/signup_view.dart
  11. 5 4
      lib/app/modules/splash/views/splash_view.dart
  12. 7 6
      lib/app/modules/splittunneling/selectapp/views/splittunneling_selectapp_view.dart
  13. 4 6
      lib/app/modules/splittunneling/views/splittunneling_view.dart
  14. 13 4
      lib/app/modules/subscription/views/subscription_view.dart
  15. 103 0
      lib/config/translations/ar_AR/ar_ar_translation.dart
  16. 105 0
      lib/config/translations/de_DE/de_de_translation.dart
  17. 104 0
      lib/config/translations/en_US/en_us_translation.dart
  18. 106 0
      lib/config/translations/es_ES/es_es_translation.dart
  19. 107 0
      lib/config/translations/fa_IR/fa_ir_translation.dart
  20. 106 0
      lib/config/translations/fr_FR/fr_fr_translation.dart
  21. 100 0
      lib/config/translations/ja_JP/ja_jp_translation.dart
  22. 99 0
      lib/config/translations/ko_KR/ko_kr_translation.dart
  23. 108 0
      lib/config/translations/my_MM/my_mm_translation.dart
  24. 108 0
      lib/config/translations/ru_RU/ru_ru_translation.dart
  25. 110 0
      lib/config/translations/strings_enum.dart

+ 1 - 1
lib/app/controllers/core_controller.dart

@@ -242,7 +242,7 @@ class CoreController extends GetxService {
     state = ConnectionState.disconnected;
     timer = "00:00:00";
     HapticFeedbackManager.connectionDisconnected();
-    // FeedbackBottomSheet.show();
+    FeedbackBottomSheet.show();
   }
 
   void _onVpnConnecting() {

+ 29 - 28
lib/app/dialog/feedback_bottom_sheet.dart

@@ -3,6 +3,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
 import 'package:nomo/app/widgets/click_opacity.dart';
 
+import '../../config/translations/strings_enum.dart';
 import '../widgets/submit_btn.dart';
 import 'all_dialog.dart';
 
@@ -37,45 +38,45 @@ class _FeedbackBottomSheetState extends State<FeedbackBottomSheet>
   final List<String> emojis = ['😡', '😥', '🤭', '😏', '🥰'];
 
   // 每个表情对应的问题标签
-  final Map<int, List<String>> emojiIssues = {
+  Map<int, List<String>> get emojiIssues => {
     0: [
       // 差评 😡
-      'VPN connection failed',
-      'Internet too slow',
-      'Keeps disconnecting',
-      'App crashes or freezes',
-      'Other issues',
+      Strings.vpnConnectionFailed.tr,
+      Strings.internetTooSlow.tr,
+      Strings.keepsDisconnecting.tr,
+      Strings.appCrashes.tr,
+      Strings.otherIssues.tr,
     ],
     1: [
       // 一般偏差 😥
-      'Connection unstable',
-      'Speed not as expected',
-      'Hard to use / confusing UI',
-      'Other issues',
+      Strings.connectionUnstable.tr,
+      Strings.speedNotExpected.tr,
+      Strings.hardToUse.tr,
+      Strings.otherIssues.tr,
     ],
     2: [
       // 中等 🤭
-      'Works fine but not fast enough',
-      'Limited free servers',
-      'App could be simpler',
-      'Sometimes disconnects',
-      'Nothing special',
+      Strings.worksFineNotFast.tr,
+      Strings.limitedFreeServers.tr,
+      Strings.appCouldBeSimpler.tr,
+      Strings.sometimesDisconnects.tr,
+      Strings.nothingSpecial.tr,
     ],
     3: [
       // 好 😏
-      'Easy to use',
-      'Fast connection',
-      'Stable performance',
-      'Useful free version',
-      'Satisfied overall',
+      Strings.easyToUse.tr,
+      Strings.fastConnection.tr,
+      Strings.stablePerformance.tr,
+      Strings.usefulFreeVersion.tr,
+      Strings.satisfiedOverall.tr,
     ],
     4: [
       // 很好 🥰
-      'Fast and stable connection',
-      'Great user experience',
-      'Excellent premium features',
-      'Worth recommending',
-      'I love the design',
+      Strings.fastAndStable.tr,
+      Strings.greatUserExperience.tr,
+      Strings.excellentPremiumFeatures.tr,
+      Strings.worthRecommending.tr,
+      Strings.loveTheDesign.tr,
     ],
   };
 
@@ -162,7 +163,7 @@ class _FeedbackBottomSheetState extends State<FeedbackBottomSheet>
   /// 构建标题
   Widget _buildTitle() {
     return Text(
-      "How's your\nexperience so far ?",
+      Strings.howExperience.tr,
       textAlign: TextAlign.center,
       style: TextStyle(
         fontSize: 22.sp,
@@ -176,7 +177,7 @@ class _FeedbackBottomSheetState extends State<FeedbackBottomSheet>
   /// 构建副标题
   Widget _buildSubtitle() {
     return Text(
-      "we'd love to know !",
+      Strings.wedLoveToKnow.tr,
       textAlign: TextAlign.center,
       style: TextStyle(
         fontSize: 16.sp,
@@ -295,7 +296,7 @@ class _FeedbackBottomSheetState extends State<FeedbackBottomSheet>
     return Container(
       margin: EdgeInsets.only(left: 24.w, right: 24.w, top: 24.h, bottom: 10.w),
       child: SubmitButton(
-        text: 'Send',
+        text: Strings.send.tr,
         enabled: canSend,
         onPressed: canSend ? _handleSend : null,
       ),

+ 21 - 12
lib/app/modules/account/views/account_view.dart

@@ -92,7 +92,7 @@ class AccountView extends BaseView<AccountController> {
           // 标题
           Expanded(
             child: Text(
-              'Account',
+              Strings.account.tr,
               style: TextStyle(
                 fontSize: 14.sp,
                 color: Get.reactiveTheme.textTheme.bodyLarge!.color,
@@ -179,7 +179,7 @@ class AccountView extends BaseView<AccountController> {
           // 标题
           Expanded(
             child: Text(
-              'Free Time',
+              Strings.freeTime.tr,
               style: TextStyle(
                 fontSize: 14.sp,
                 color: Get.reactiveTheme.textTheme.bodyLarge!.color,
@@ -222,7 +222,7 @@ class AccountView extends BaseView<AccountController> {
           // 标题
           Expanded(
             child: Text(
-              'Valid Term',
+              Strings.validTerm.tr,
               style: TextStyle(
                 fontSize: 14.sp,
                 color: Get.reactiveTheme.textTheme.bodyLarge!.color,
@@ -249,12 +249,18 @@ class AccountView extends BaseView<AccountController> {
       padding: EdgeInsets.symmetric(horizontal: 14.w),
       child: Column(
         children: [
-          _buildFeatureItem(IconFont.icon60, 'Unlock all free locations'),
-          _buildFeatureItem(IconFont.icon61, 'Unlock smart mode'),
-          _buildFeatureItem(IconFont.icon62, 'Unlock Multi-hop mode'),
-          _buildFeatureItem(IconFont.icon63, 'Premium can share X devices'),
-          _buildFeatureItem(IconFont.icon64, 'Own your own private server'),
-          _buildFeatureItem(IconFont.icon65, 'Close ads'),
+          _buildFeatureItem(IconFont.icon60, Strings.unlockAllFreeLocations.tr),
+          _buildFeatureItem(IconFont.icon61, Strings.unlockSmartMode.tr),
+          _buildFeatureItem(IconFont.icon62, Strings.unlockMultiHopMode.tr),
+          _buildFeatureItem(
+            IconFont.icon63,
+            Strings.premiumCanShareXDevices.tr,
+          ),
+          _buildFeatureItem(
+            IconFont.icon64,
+            Strings.ownYourOwnPrivateServer.tr,
+          ),
+          _buildFeatureItem(IconFont.icon65, Strings.closeAds.tr),
         ],
       ),
     );
@@ -296,7 +302,7 @@ class AccountView extends BaseView<AccountController> {
       return Column(
         children: [
           SubmitButton(
-            text: 'Change Subscription',
+            text: Strings.changeSubscription.tr,
             bgColor: Get.reactiveTheme.highlightColor,
             textColor: DarkThemeColors.subscriptionColor,
             onPressed: () {
@@ -307,7 +313,7 @@ class AccountView extends BaseView<AccountController> {
           // Device Authorization 按钮
           _buildSecondaryButton(
             text:
-                'Device Authorization (${controller.deviceCount}/${controller.maxDeviceCount})',
+                '${Strings.deviceAuthorization.tr} (${controller.deviceCount}/${controller.maxDeviceCount})',
             icon: IconFont.icon11,
             onTap: () {
               // TODO: 设备授权
@@ -316,7 +322,10 @@ class AccountView extends BaseView<AccountController> {
           10.verticalSpaceFromWidth,
           // 提示文字
           Text(
-            'You can authorize other devices as Premium users\n(${controller.deviceCount}/${controller.maxDeviceCount})',
+            Strings.youCanAuthorizeOtherDevices.trParams({
+              'current': controller.deviceCount.toString(),
+              'max': controller.maxDeviceCount.toString(),
+            }),
             textAlign: TextAlign.center,
             style: TextStyle(
               fontSize: 12.sp,

+ 3 - 2
lib/app/modules/deviceauth/widgets/device_card.dart

@@ -4,6 +4,7 @@ import 'package:get/get.dart';
 import 'package:nomo/app/widgets/click_opacity.dart';
 import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 
+import '../../../../config/translations/strings_enum.dart';
 import '../../../constants/iconfont/iconfont.dart';
 import '../../../widgets/infintte_rotate.dart';
 import '../controllers/deviceauth_controller.dart';
@@ -104,7 +105,7 @@ class DeviceCard extends StatelessWidget {
                     Icon(IconFont.icon11, size: 20.w, color: Colors.white),
                     SizedBox(width: 4.w),
                     Text(
-                      'Relieve',
+                      Strings.relieve.tr,
                       style: TextStyle(
                         fontSize: 12.sp,
                         height: 1.7,
@@ -179,7 +180,7 @@ class AwaitingActivationCard extends StatelessWidget {
           // 等待激活文字
           Expanded(
             child: Text(
-              'Awaiting Activation',
+              Strings.awaitingActivation.tr,
               style: TextStyle(
                 fontSize: 13.sp,
                 color: Get.reactiveTheme.hintColor,

+ 6 - 6
lib/app/modules/feedback/views/feedback_view.dart

@@ -7,13 +7,14 @@ import 'package:nomo/app/widgets/click_opacity.dart';
 import 'package:nomo/app/widgets/ix_app_bar.dart';
 import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 
+import '../../../../config/translations/strings_enum.dart';
 import '../controllers/feedback_controller.dart';
 
 class FeedbackView extends BaseView<FeedbackController> {
   const FeedbackView({super.key});
 
   @override
-  PreferredSizeWidget? get appBar => IXAppBar(title: 'Feedback');
+  PreferredSizeWidget? get appBar => IXAppBar(title: Strings.feedback.tr);
 
   @override
   Widget buildContent(BuildContext context) {
@@ -48,8 +49,7 @@ class FeedbackView extends BaseView<FeedbackController> {
                     fontWeight: FontWeight.w400,
                   ),
                   decoration: InputDecoration(
-                    hintText:
-                        'An English version for reference: Describe\nyour issue or suggestion...',
+                    hintText: Strings.feedbackPlaceholder.tr,
                     hintStyle: TextStyle(
                       fontSize: 16.sp,
                       height: 1.4,
@@ -92,7 +92,7 @@ class FeedbackView extends BaseView<FeedbackController> {
                   fontWeight: FontWeight.w400,
                 ),
                 decoration: InputDecoration(
-                  hintText: 'Enter your email',
+                  hintText: Strings.enterYourEmail.tr,
                   hintStyle: TextStyle(
                     fontSize: 16.sp,
                     height: 1.4,
@@ -109,7 +109,7 @@ class FeedbackView extends BaseView<FeedbackController> {
           10.verticalSpaceFromWidth,
 
           Text(
-            '• Your email address (for our reply)',
+            Strings.emailAddressForReply.tr,
             style: TextStyle(
               fontSize: 13.sp,
               height: 1.4,
@@ -149,7 +149,7 @@ class FeedbackView extends BaseView<FeedbackController> {
                                 color: Colors.white,
                               )
                             : Text(
-                                'Send',
+                                Strings.send.tr,
                                 style: TextStyle(
                                   fontSize: 16.sp,
                                   fontWeight: FontWeight.w400,

+ 12 - 11
lib/app/modules/login/views/login_view.dart

@@ -6,6 +6,7 @@ import 'package:get/get.dart';
 import 'package:nomo/app/base/base_view.dart';
 import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 
+import '../../../../config/translations/strings_enum.dart';
 import '../../../routes/app_pages.dart';
 import '../../../widgets/ix_app_bar.dart';
 import '../../../widgets/ix_text_field.dart';
@@ -31,7 +32,7 @@ class LoginView extends BaseView<LoginController> {
 
               // 标题
               Text(
-                'Log in',
+                Strings.login.tr,
                 style: TextStyle(
                   fontSize: 28.sp,
                   height: 1.2,
@@ -43,7 +44,7 @@ class LoginView extends BaseView<LoginController> {
 
               // 描述文字
               Text(
-                'After a successful login, your free trial will be applied, and the remaining membership will be synced to your account for use across all linked devices.',
+                Strings.loginDescription.tr,
                 style: TextStyle(
                   fontSize: 16.sp,
                   color: Get.reactiveTheme.hintColor,
@@ -53,13 +54,13 @@ class LoginView extends BaseView<LoginController> {
 
               20.verticalSpaceFromWidth,
               IXTextField(
-                hintText: 'Username',
+                hintText: Strings.username.tr,
                 prefixIcon: Icons.person_outline,
                 controller: controller.usernameController,
                 focusNode: controller.usernameFocusNode,
                 validator: controller.validatorInputValue,
-                tipText: '6-20 characters (letters or numbers)',
-                errorText: '6-20 characters (letters or numbers)',
+                tipText: Strings.usernamePasswordRule.tr,
+                errorText: Strings.usernamePasswordRule.tr,
                 onChanged: (value) {
                   controller.checkLogin();
                 },
@@ -67,21 +68,21 @@ class LoginView extends BaseView<LoginController> {
 
               16.verticalSpaceFromWidth,
               IXTextField(
-                hintText: 'Password',
+                hintText: Strings.password.tr,
                 prefixIcon: Icons.lock_outline,
                 controller: controller.passwordController,
                 focusNode: controller.passwordFocusNode,
                 validator: controller.validatorInputValue,
                 isPassword: true,
-                tipText: '6-20 characters (letters or numbers)',
-                errorText: '6-20 characters (letters or numbers)',
+                tipText: Strings.usernamePasswordRule.tr,
+                errorText: Strings.usernamePasswordRule.tr,
                 onChanged: (value) {
                   controller.checkLogin();
                 },
               ),
               156.verticalSpaceFromWidth,
               SubmitButton(
-                text: 'Log In',
+                text: Strings.loginButton.tr,
                 enabled: controller.isLogin,
                 onPressed: () {},
               ),
@@ -92,14 +93,14 @@ class LoginView extends BaseView<LoginController> {
                   text: TextSpan(
                     children: [
                       TextSpan(
-                        text: 'No account? ',
+                        text: Strings.noAccount.tr,
                         style: TextStyle(
                           color: Colors.grey[500],
                           fontSize: 14.sp,
                         ),
                       ),
                       TextSpan(
-                        text: ' Register now',
+                        text: Strings.registerNow.tr,
                         recognizer: TapGestureRecognizer()
                           ..onTap = () {
                             Get.toNamed(Routes.SIGNUP);

+ 1 - 1
lib/app/modules/node/views/node_view.dart

@@ -18,7 +18,7 @@ class NodeView extends BaseView<NodeController> {
   Widget buildContent(BuildContext context) {
     final tabCount = controller.tabTextList.length;
     if (tabCount == 0) {
-      return const Center(child: Text('暂无数据'));
+      return Center(child: Text(Strings.noData.tr));
     }
     return DefaultTabController(
       length: tabCount,

+ 8 - 8
lib/app/modules/precode/views/precode_view.dart

@@ -50,7 +50,7 @@ class PrecodeView extends BaseView<PrecodeController> {
 
           // 说明文字
           Text(
-            'Send your Pre Code to your registered email address',
+            Strings.sendPreCodeEmailDesc.tr,
             textAlign: TextAlign.center,
             style: TextStyle(
               fontSize: 13.sp,
@@ -68,7 +68,7 @@ class PrecodeView extends BaseView<PrecodeController> {
 
           // 说明文字
           Text(
-            'Store a copy of your Pre Code on this device',
+            Strings.storeLocalCopyDesc.tr,
             textAlign: TextAlign.center,
             style: TextStyle(
               fontSize: 13.sp,
@@ -102,7 +102,7 @@ class PrecodeView extends BaseView<PrecodeController> {
 
           // 说明文字
           Text(
-            'Pre Code is your premium user credential.\nUse it to activate benefits or sync your account\non other devices.',
+            Strings.preCodeInfoMessage.tr,
             textAlign: TextAlign.center,
             style: TextStyle(
               fontSize: 14.sp,
@@ -115,7 +115,7 @@ class PrecodeView extends BaseView<PrecodeController> {
 
           // 安全提示
           Text(
-            'Please store it securely !',
+            Strings.pleaseStoreSecurely.tr,
             textAlign: TextAlign.center,
             style: TextStyle(
               fontSize: 14.sp,
@@ -156,7 +156,7 @@ class PrecodeView extends BaseView<PrecodeController> {
               mainAxisSize: MainAxisSize.min,
               children: [
                 Text(
-                  controller.isPreviewMode.value ? 'Hide' : 'Preview',
+                  controller.isPreviewMode.value ? Strings.hide.tr : Strings.preview.tr,
                   style: TextStyle(
                     fontSize: 12.sp,
                     height: 1.7,
@@ -193,7 +193,7 @@ class PrecodeView extends BaseView<PrecodeController> {
             mainAxisSize: MainAxisSize.min,
             children: [
               Text(
-                'Copy',
+                Strings.copy.tr,
                 style: TextStyle(
                   fontSize: 12.sp,
                   height: 1.7,
@@ -222,7 +222,7 @@ class PrecodeView extends BaseView<PrecodeController> {
         height: 20.w,
         sourceType: ImageSourceType.asset,
       ),
-      text: 'Send to Email',
+      text: Strings.sendToEmail.tr,
       bgColor: Get.reactiveTheme.highlightColor,
       onPressed: controller.sendToEmail,
     );
@@ -237,7 +237,7 @@ class PrecodeView extends BaseView<PrecodeController> {
         height: 20.w,
         sourceType: ImageSourceType.asset,
       ),
-      text: 'Save Local Copy',
+      text: Strings.saveLocalCopy.tr,
       bgColor: Get.reactiveTheme.highlightColor,
       onPressed: controller.saveLocalCopy,
     );

+ 5 - 4
lib/app/modules/precode/widgets/precode_save_dialog.dart

@@ -6,6 +6,7 @@ import 'package:screenshot/screenshot.dart';
 import 'package:nomo/app/widgets/click_opacity.dart';
 
 import '../../../../config/theme/dark_theme_colors.dart';
+import '../../../../config/translations/strings_enum.dart';
 import '../../../constants/assets.dart';
 import '../../../widgets/ix_image.dart';
 import '../../../widgets/submit_btn.dart';
@@ -141,7 +142,7 @@ class PrecodeSaveDialog extends StatelessWidget {
   /// 说明文字
   Widget _buildDescription() {
     return Text(
-      'Pre Code is your premium user credential.\nUse it to activate benefits or sync your\naccount on other devices.',
+      Strings.preCodeInfoMessage.tr,
       textAlign: TextAlign.center,
       style: TextStyle(
         fontSize: 14.sp,
@@ -154,7 +155,7 @@ class PrecodeSaveDialog extends StatelessWidget {
   /// 安全提示
   Widget _buildSecurityTip() {
     return Text(
-      'Please store it securely !',
+      Strings.pleaseStoreSecurely.tr,
       textAlign: TextAlign.center,
       style: TextStyle(
         fontSize: 14.sp,
@@ -202,7 +203,7 @@ class PrecodeSaveDialog extends StatelessWidget {
         height: 20.w,
         sourceType: ImageSourceType.asset,
       ),
-      text: 'Save',
+      text: Strings.save.tr,
       onPressed: controller.saveToGallery,
     );
   }
@@ -221,7 +222,7 @@ class PrecodeSaveDialog extends StatelessWidget {
         ),
         alignment: Alignment.center,
         child: Text(
-          'Cancel',
+          Strings.cancel.tr,
           style: TextStyle(
             fontSize: 14.sp,
             fontWeight: FontWeight.w600,

+ 12 - 11
lib/app/modules/signup/views/signup_view.dart

@@ -5,6 +5,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
 import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 
+import '../../../../config/translations/strings_enum.dart';
 import '../../../base/base_view.dart';
 import '../../../routes/app_pages.dart';
 import '../../../widgets/ix_app_bar.dart';
@@ -31,7 +32,7 @@ class SignupView extends BaseView<SignupController> {
 
               // 标题
               Text(
-                'Sign up to NOMO',
+                Strings.signup.tr,
                 style: TextStyle(
                   fontSize: 28.sp,
                   height: 1.2,
@@ -43,7 +44,7 @@ class SignupView extends BaseView<SignupController> {
 
               // 描述文字
               Text(
-                'After registration, your free trial will be deducted, and other membership time shifts to your account for multi-device use.',
+                Strings.signupDescription.tr,
                 style: TextStyle(
                   fontSize: 16.sp,
                   color: Get.reactiveTheme.hintColor,
@@ -53,13 +54,13 @@ class SignupView extends BaseView<SignupController> {
 
               20.verticalSpaceFromWidth,
               IXTextField(
-                hintText: 'Username',
+                hintText: Strings.username.tr,
                 prefixIcon: Icons.person_outline,
                 controller: controller.usernameController,
                 focusNode: controller.usernameFocusNode,
                 validator: controller.validatorInputValue,
-                tipText: '6-20 characters (letters or numbers)',
-                errorText: '6-20 characters (letters or numbers)',
+                tipText: Strings.usernamePasswordRule.tr,
+                errorText: Strings.usernamePasswordRule.tr,
                 onChanged: (value) {
                   controller.checkSignup();
                 },
@@ -67,21 +68,21 @@ class SignupView extends BaseView<SignupController> {
 
               16.verticalSpaceFromWidth,
               IXTextField(
-                hintText: 'Password',
+                hintText: Strings.password.tr,
                 prefixIcon: Icons.lock_outline,
                 controller: controller.passwordController,
                 focusNode: controller.passwordFocusNode,
                 validator: controller.validatorInputValue,
                 isPassword: true,
-                tipText: '6-20 characters (letters or numbers)',
-                errorText: '6-20 characters (letters or numbers)',
+                tipText: Strings.usernamePasswordRule.tr,
+                errorText: Strings.usernamePasswordRule.tr,
                 onChanged: (value) {
                   controller.checkSignup();
                 },
               ),
               156.verticalSpaceFromWidth,
               SubmitButton(
-                text: 'Sign Up',
+                text: Strings.signupButton.tr,
                 enabled: controller.isSignup,
                 onPressed: () {},
               ),
@@ -92,14 +93,14 @@ class SignupView extends BaseView<SignupController> {
                   text: TextSpan(
                     children: [
                       TextSpan(
-                        text: 'Already have an account? ',
+                        text: Strings.alreadyHaveAccount.tr,
                         style: TextStyle(
                           color: Colors.grey[500],
                           fontSize: 14.sp,
                         ),
                       ),
                       TextSpan(
-                        text: ' Login now',
+                        text: Strings.loginNow.tr,
                         recognizer: TapGestureRecognizer()
                           ..onTap = () {
                             Get.toNamed(Routes.LOGIN);

+ 5 - 4
lib/app/modules/splash/views/splash_view.dart

@@ -8,6 +8,7 @@ import 'package:nomo/app/base/base_view.dart';
 import 'package:nomo/app/widgets/ix_image.dart';
 import 'package:nomo/app/widgets/submit_btn.dart';
 import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
+import '../../../../config/translations/strings_enum.dart';
 import '../../../constants/assets.dart';
 import '../../../routes/app_pages.dart';
 import '../../../widgets/privacy_agreement.dart';
@@ -92,7 +93,7 @@ class SplashView extends BaseView<SplashController> {
                 child: Container(
                   margin: EdgeInsets.only(top: 240.w),
                   child: Text(
-                    'Secure Your Connection',
+                    Strings.secureYourConnection.tr,
                     style: TextStyle(
                       fontSize: 28.sp,
                       color: Get.reactiveTheme.textTheme.bodyLarge!.color,
@@ -115,7 +116,7 @@ class SplashView extends BaseView<SplashController> {
                   margin: EdgeInsets.only(top: 298.w),
                   padding: EdgeInsets.symmetric(horizontal: 14.w),
                   child: Text(
-                    'You can log in or register an account to share membership across different devices.',
+                    Strings.secureYourConnectionDesc.tr,
                     textAlign: TextAlign.center,
                     style: TextStyle(
                       fontSize: 16.sp,
@@ -143,13 +144,13 @@ class SplashView extends BaseView<SplashController> {
                     children: [
                       // 登录按钮
                       SubmitButton(
-                        text: 'Log In',
+                        text: Strings.loginButton.tr,
                         bgColor: Get.reactiveTheme.highlightColor,
                         onPressed: () => Get.toNamed(Routes.LOGIN),
                       ),
                       20.verticalSpaceFromWidth,
                       SubmitButton(
-                        text: 'Sign Up',
+                        text: Strings.signupButton.tr,
                         onPressed: () => Get.toNamed(Routes.SIGNUP),
                       ),
                     ],

+ 7 - 6
lib/app/modules/splittunneling/selectapp/views/splittunneling_selectapp_view.dart

@@ -7,6 +7,7 @@ import 'package:nomo/app/widgets/ix_app_bar.dart';
 import 'package:nomo/app/widgets/ix_image.dart';
 import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 
+import '../../../../../config/translations/strings_enum.dart';
 import '../../../../../utils/event_bus.dart';
 import '../../../../constants/iconfont/iconfont.dart';
 import '../../../../widgets/state/state_wrapper.dart';
@@ -22,7 +23,7 @@ class SplittunnelingSelectappView
 
   @override
   PreferredSizeWidget? get appBar => IXAppBar(
-    title: 'Split Tunneling',
+    title: Strings.splitTunneling.tr,
     onBackPressed: () {
       eventBus.fire(
         SplitTunnelingPageEvent(mode: controller.currentMode.value),
@@ -63,8 +64,8 @@ class SplittunnelingSelectappView
       final isExcludeMode =
           controller.currentMode.value == SplitTunnelingMode.exclude;
       final message = isExcludeMode
-          ? 'Select apps that will not use the VPN'
-          : 'Select apps that will use the VPN';
+          ? Strings.selectAppsExclude.tr
+          : Strings.selectAppsInclude.tr;
 
       return Container(
         padding: EdgeInsets.symmetric(horizontal: 14.w, vertical: 12.w),
@@ -114,7 +115,7 @@ class SplittunnelingSelectappView
               mainAxisAlignment: MainAxisAlignment.spaceBetween,
               children: [
                 Text(
-                  'Select apps',
+                  Strings.selectApps.tr,
                   style: TextStyle(
                     fontSize: 16.sp,
                     fontWeight: FontWeight.w500,
@@ -124,7 +125,7 @@ class SplittunnelingSelectappView
                 ClickOpacity(
                   onTap: controller.deselectAllApps,
                   child: Text(
-                    'Deselect all',
+                    Strings.deselectAll.tr,
                     style: TextStyle(
                       fontSize: 14.sp,
                       color: Get.reactiveTheme.shadowColor,
@@ -167,7 +168,7 @@ class SplittunnelingSelectappView
       crossAxisAlignment: CrossAxisAlignment.start,
       children: [
         Text(
-          'All apps',
+          Strings.allApps.tr,
           style: TextStyle(
             fontSize: 16.sp,
             fontWeight: FontWeight.w500,

+ 4 - 6
lib/app/modules/splittunneling/views/splittunneling_view.dart

@@ -60,7 +60,7 @@ class SplittunnelingView extends BaseView<SplittunnelingController> {
           SizedBox(width: 12.w),
           Expanded(
             child: Text(
-              'Only one mode can be active at a time.',
+              Strings.onlyOneModeActive.tr,
               style: TextStyle(
                 fontSize: 12.sp,
                 color: Get.reactiveTheme.textTheme.bodyLarge!.color,
@@ -81,8 +81,7 @@ class SplittunnelingView extends BaseView<SplittunnelingController> {
           mode: SplitTunnelingMode.exclude,
           icon: IconFont.icon42,
           title: Strings.excludeSelectedAppsFromVPN.tr,
-          description:
-              'Choose apps that will connect directly without using the VPN.',
+          description: Strings.chooseAppsExcludeDesc.tr,
           onTap: () {
             controller.selectMode(SplitTunnelingMode.exclude);
             // 刷新显示
@@ -96,8 +95,7 @@ class SplittunnelingView extends BaseView<SplittunnelingController> {
           mode: SplitTunnelingMode.include,
           icon: IconFont.icon43,
           title: Strings.useVPNForSelectedAppsOnly.tr,
-          description:
-              'Choose apps that will use the VPN while others connect normally.',
+          description: Strings.chooseAppsIncludeDesc.tr,
           onTap: () {
             controller.selectMode(SplitTunnelingMode.include);
             // 刷新显示
@@ -356,7 +354,7 @@ class SplittunnelingView extends BaseView<SplittunnelingController> {
           ),
           10.verticalSpaceFromWidth,
           Text(
-            'Split tunneling lets you control which apps use the VPN connection and which connect directly. It helps you manage bandwidth and access local or foreign content without turning off the VPN.',
+            Strings.splitTunnelingDesc.tr,
             style: TextStyle(
               fontSize: 12.sp,
               color: Get.reactiveTheme.hintColor,

+ 13 - 4
lib/app/modules/subscription/views/subscription_view.dart

@@ -163,7 +163,7 @@ class SubscriptionView extends GetView<SubscriptionController> {
               ),
               10.verticalSpaceFromWidth,
               Text(
-                'Year Plan \$40.00 per year',
+                Strings.yearPlanPrice.trParams({'price': '\$40.00'}),
                 style: TextStyle(
                   fontSize: 14.sp,
                   height: 1.4,
@@ -358,11 +358,20 @@ class SubscriptionView extends GetView<SubscriptionController> {
           ),
           child: Column(
             children: [
-              _buildFeatureItem(IconFont.icon60, Strings.unlockAllFreeLocations.tr),
+              _buildFeatureItem(
+                IconFont.icon60,
+                Strings.unlockAllFreeLocations.tr,
+              ),
               _buildFeatureItem(IconFont.icon61, Strings.unlockSmartMode.tr),
               _buildFeatureItem(IconFont.icon62, Strings.unlockMultiHopMode.tr),
-              _buildFeatureItem(IconFont.icon63, Strings.premiumCanShareXDevices.tr),
-              _buildFeatureItem(IconFont.icon64, Strings.ownYourOwnPrivateServer.tr),
+              _buildFeatureItem(
+                IconFont.icon63,
+                Strings.premiumCanShareXDevices.tr,
+              ),
+              _buildFeatureItem(
+                IconFont.icon64,
+                Strings.ownYourOwnPrivateServer.tr,
+              ),
               _buildFeatureItem(IconFont.icon65, Strings.closeAds.tr),
             ],
           ),

+ 103 - 0
lib/config/translations/ar_AR/ar_ar_translation.dart

@@ -246,4 +246,107 @@ final Map<String, String> arAR = {
 
   // Connection status
   Strings.activeTime: 'الوقت النشط',
+  Strings.yearPlanPrice: 'الخطة السنوية @price سنوياً',
+
+  // Login & Signup
+  Strings.login: 'تسجيل الدخول',
+  Strings.loginButton: 'تسجيل الدخول',
+  Strings.loginDescription:
+      'بعد تسجيل الدخول بنجاح، سيتم تطبيق النسخة التجريبية المجانية، وسيتم مزامنة العضوية المتبقية مع حسابك للاستخدام عبر جميع الأجهزة المرتبطة.',
+  Strings.signup: 'التسجيل في NOMO',
+  Strings.signupButton: 'التسجيل',
+  Strings.signupDescription:
+      'بعد التسجيل، سيتم خصم النسخة التجريبية المجانية، وسيتم نقل وقت العضوية الآخر إلى حسابك للاستخدام متعدد الأجهزة.',
+  Strings.username: 'اسم المستخدم',
+  Strings.password: 'كلمة المرور',
+  Strings.usernamePasswordRule: '6-20 حرفاً (أحرف أو أرقام)',
+  Strings.noAccount: 'لا يوجد حساب؟ ',
+  Strings.registerNow: ' سجل الآن',
+  Strings.alreadyHaveAccount: 'هل لديك حساب بالفعل؟ ',
+  Strings.loginNow: ' تسجيل الدخول الآن',
+
+  // Feedback
+  Strings.feedbackPlaceholder: 'نسخة إنجليزية للمرجع: صف\nمشكلتك أو اقتراحك...',
+  Strings.emailAddressForReply: '• عنوان بريدك الإلكتروني (لردنا)',
+  Strings.send: 'إرسال',
+
+  // Account page additions
+  Strings.changeSubscription: 'تغيير الاشتراك',
+  Strings.awaitingActivation: 'في انتظار التفعيل',
+  Strings.relieve: 'إلغاء',
+  Strings.configureAuthorizedDevices: 'تكوين الأجهزة المصرح بها...',
+  Strings.authorizeUpTo4DevicesAsPremium:
+      'صرّح لما يصل إلى @max أجهزة كمستخدم مميز (@current/@max)',
+  Strings.youCanAuthorizeOtherDevices:
+      'يمكنك تصريح أجهزة أخرى كمستخدمين مميزين (@current/@max)',
+
+  // Pre Code page
+  Strings.preCodeInfoMessage:
+      'رمز Pre هو بيانات اعتماد المستخدم المميز الخاص بك.\nاستخدمه لتفعيل المزايا أو مزامنة حسابك\nعلى الأجهزة الأخرى.',
+  Strings.pleaseStoreSecurely: 'يرجى تخزينه بشكل آمن!',
+  Strings.sendPreCodeEmailDesc:
+      'أرسل رمز Pre الخاص بك إلى عنوان بريدك الإلكتروني المسجل',
+  Strings.storeLocalCopyDesc: 'احتفظ بنسخة من رمز Pre الخاص بك على هذا الجهاز',
+  Strings.preview: 'معاينة',
+  Strings.hide: 'إخفاء',
+  Strings.sendToEmail: 'إرسال إلى البريد الإلكتروني',
+  Strings.saveLocalCopy: 'حفظ نسخة محلية',
+
+  // Splash page
+  Strings.secureYourConnection: 'اتصال آمن',
+  Strings.secureYourConnectionDesc:
+      'يمكنك تسجيل الدخول أو التسجيل في حساب لمشاركة الاشتراك عبر أجهزة مختلفة.',
+
+  // Pre Code Save Dialog
+  Strings.save: 'حفظ',
+
+  // Split Tunneling
+  Strings.onlyOneModeActive: 'يمكن تفعيل وضع واحد فقط في كل مرة.',
+  Strings.chooseAppsExcludeDesc:
+      'اختر التطبيقات التي ستتصل مباشرة بدون استخدام VPN.',
+  Strings.chooseAppsIncludeDesc:
+      'اختر التطبيقات التي ستستخدم VPN بينما تتصل الأخرى بشكل عادي.',
+  Strings.splitTunnelingDesc:
+      'يتيح لك النفق المقسم التحكم في التطبيقات التي تستخدم اتصال VPN والتي تتصل مباشرة. يساعدك على إدارة النطاق الترددي والوصول إلى المحتوى المحلي أو الأجنبي دون إيقاف VPN.',
+  Strings.selectAppsExclude: 'اختر التطبيقات التي لن تستخدم VPN',
+  Strings.selectAppsInclude: 'اختر التطبيقات التي ستستخدم VPN',
+  Strings.deselectAll: 'إلغاء تحديد الكل',
+  Strings.allApps: 'جميع التطبيقات',
+
+  // Feedback Bottom Sheet
+  Strings.howExperience: 'كيف كانت\nتجربتك حتى الآن؟',
+  Strings.wedLoveToKnow: 'نود أن نعرف!',
+
+  // Feedback Tags - Bad 😡
+  Strings.vpnConnectionFailed: 'فشل اتصال VPN',
+  Strings.internetTooSlow: 'الإنترنت بطيء جداً',
+  Strings.keepsDisconnecting: 'يستمر في الانقطاع',
+  Strings.appCrashes: 'التطبيق يتعطل أو يتجمد',
+  Strings.otherIssues: 'مشاكل أخرى',
+
+  // Feedback Tags - Poor 😥
+  Strings.connectionUnstable: 'الاتصال غير مستقر',
+  Strings.speedNotExpected: 'السرعة ليست كما هو متوقع',
+  Strings.hardToUse: 'صعب الاستخدام / واجهة مربكة',
+
+  // Feedback Tags - Okay 🤭
+  Strings.worksFineNotFast: 'يعمل بشكل جيد لكن ليس سريعاً بما فيه الكفاية',
+  Strings.limitedFreeServers: 'خوادم مجانية محدودة',
+  Strings.appCouldBeSimpler: 'يمكن أن يكون التطبيق أبسط',
+  Strings.sometimesDisconnects: 'ينقطع أحياناً',
+  Strings.nothingSpecial: 'لا شيء مميز',
+
+  // Feedback Tags - Good 😏
+  Strings.easyToUse: 'سهل الاستخدام',
+  Strings.fastConnection: 'اتصال سريع',
+  Strings.stablePerformance: 'أداء مستقر',
+  Strings.usefulFreeVersion: 'نسخة مجانية مفيدة',
+  Strings.satisfiedOverall: 'راضٍ بشكل عام',
+
+  // Feedback Tags - Excellent 🥰
+  Strings.fastAndStable: 'اتصال سريع ومستقر',
+  Strings.greatUserExperience: 'تجربة مستخدم رائعة',
+  Strings.excellentPremiumFeatures: 'ميزات مميزة ممتازة',
+  Strings.worthRecommending: 'يستحق التوصية',
+  Strings.loveTheDesign: 'أحب التصميم',
 };

+ 105 - 0
lib/config/translations/de_DE/de_de_translation.dart

@@ -249,4 +249,109 @@ const Map<String, String> deDE = {
 
   // Connection status
   Strings.activeTime: 'Aktive Zeit',
+  Strings.yearPlanPrice: 'Jahresplan @price pro Jahr',
+
+  // Login & Signup
+  Strings.login: 'Anmelden',
+  Strings.loginButton: 'Anmelden',
+  Strings.loginDescription:
+      'Nach erfolgreicher Anmeldung wird Ihre kostenlose Testversion aktiviert und die verbleibende Mitgliedschaft wird mit Ihrem Konto synchronisiert, um sie auf allen verknüpften Geräten zu nutzen.',
+  Strings.signup: 'Bei NOMO anmelden',
+  Strings.signupButton: 'Registrieren',
+  Strings.signupDescription:
+      'Nach der Registrierung wird Ihre kostenlose Testversion abgezogen und andere Mitgliedschaftszeit wird auf Ihr Konto übertragen, um sie auf mehreren Geräten zu nutzen.',
+  Strings.username: 'Benutzername',
+  Strings.password: 'Passwort',
+  Strings.usernamePasswordRule: '6-20 Zeichen (Buchstaben oder Zahlen)',
+  Strings.noAccount: 'Kein Konto? ',
+  Strings.registerNow: ' Jetzt registrieren',
+  Strings.alreadyHaveAccount: 'Haben Sie bereits ein Konto? ',
+  Strings.loginNow: ' Jetzt anmelden',
+
+  // Feedback
+  Strings.feedbackPlaceholder:
+      'Eine englische Version als Referenz: Beschreiben Sie\nIhr Problem oder Ihren Vorschlag...',
+  Strings.emailAddressForReply: '• Ihre E-Mail-Adresse (für unsere Antwort)',
+  Strings.send: 'Senden',
+
+  // Account page additions
+  Strings.changeSubscription: 'Abonnement ändern',
+  Strings.awaitingActivation: 'Warte auf Aktivierung',
+  Strings.relieve: 'Entfernen',
+  Strings.configureAuthorizedDevices: 'Autorisierte Geräte konfigurieren...',
+  Strings.authorizeUpTo4DevicesAsPremium:
+      'Bis zu @max Geräte als Premium autorisieren (@current/@max)',
+  Strings.youCanAuthorizeOtherDevices:
+      'Sie können andere Geräte als Premium-Benutzer autorisieren (@current/@max)',
+
+  // Pre Code page
+  Strings.preCodeInfoMessage:
+      'Der Pre-Code ist Ihre Premium-Benutzeranmeldeinformation.\nVerwenden Sie ihn, um Vorteile zu aktivieren oder Ihr Konto\nauf anderen Geräten zu synchronisieren.',
+  Strings.pleaseStoreSecurely: 'Bitte sicher aufbewahren!',
+  Strings.sendPreCodeEmailDesc:
+      'Senden Sie Ihren Pre-Code an Ihre registrierte E-Mail-Adresse',
+  Strings.storeLocalCopyDesc:
+      'Speichern Sie eine Kopie Ihres Pre-Codes auf diesem Gerät',
+  Strings.preview: 'Vorschau',
+  Strings.hide: 'Verbergen',
+  Strings.sendToEmail: 'An E-Mail senden',
+  Strings.saveLocalCopy: 'Lokale Kopie speichern',
+
+  // Splash page
+  Strings.secureYourConnection: 'Sichere Verbindung',
+  Strings.secureYourConnectionDesc:
+      'Sie können sich anmelden oder ein Konto registrieren, um Mitgliedschaften auf verschiedenen Geräten zu teilen.',
+
+  // Pre Code Save Dialog
+  Strings.save: 'Speichern',
+
+  // Split Tunneling
+  Strings.onlyOneModeActive: 'Es kann jeweils nur ein Modus aktiv sein.',
+  Strings.chooseAppsExcludeDesc:
+      'Wählen Sie Apps aus, die direkt ohne VPN verbunden werden.',
+  Strings.chooseAppsIncludeDesc:
+      'Wählen Sie Apps aus, die das VPN verwenden, während andere normal verbinden.',
+  Strings.splitTunnelingDesc:
+      'Split-Tunneling ermöglicht es Ihnen zu steuern, welche Apps die VPN-Verbindung nutzen und welche direkt verbinden. Es hilft Ihnen, Bandbreite zu verwalten und auf lokale oder ausländische Inhalte zuzugreifen, ohne das VPN auszuschalten.',
+  Strings.selectAppsExclude: 'Wählen Sie Apps aus, die kein VPN verwenden',
+  Strings.selectAppsInclude: 'Wählen Sie Apps aus, die VPN verwenden',
+  Strings.deselectAll: 'Alle abwählen',
+  Strings.allApps: 'Alle Apps',
+
+  // Feedback Bottom Sheet
+  Strings.howExperience: 'Wie ist Ihre\nErfahrung bisher?',
+  Strings.wedLoveToKnow: 'Wir würden es gerne wissen!',
+
+  // Feedback Tags - Bad 😡
+  Strings.vpnConnectionFailed: 'VPN-Verbindung fehlgeschlagen',
+  Strings.internetTooSlow: 'Internet zu langsam',
+  Strings.keepsDisconnecting: 'Trennt ständig die Verbindung',
+  Strings.appCrashes: 'App stürzt ab oder friert ein',
+  Strings.otherIssues: 'Andere Probleme',
+
+  // Feedback Tags - Poor 😥
+  Strings.connectionUnstable: 'Verbindung instabil',
+  Strings.speedNotExpected: 'Geschwindigkeit nicht wie erwartet',
+  Strings.hardToUse: 'Schwer zu bedienen / verwirrende UI',
+
+  // Feedback Tags - Okay 🤭
+  Strings.worksFineNotFast: 'Funktioniert gut, aber nicht schnell genug',
+  Strings.limitedFreeServers: 'Begrenzte kostenlose Server',
+  Strings.appCouldBeSimpler: 'App könnte einfacher sein',
+  Strings.sometimesDisconnects: 'Trennt manchmal',
+  Strings.nothingSpecial: 'Nichts Besonderes',
+
+  // Feedback Tags - Good 😏
+  Strings.easyToUse: 'Einfach zu bedienen',
+  Strings.fastConnection: 'Schnelle Verbindung',
+  Strings.stablePerformance: 'Stabile Leistung',
+  Strings.usefulFreeVersion: 'Nützliche kostenlose Version',
+  Strings.satisfiedOverall: 'Insgesamt zufrieden',
+
+  // Feedback Tags - Excellent 🥰
+  Strings.fastAndStable: 'Schnelle und stabile Verbindung',
+  Strings.greatUserExperience: 'Großartige Benutzererfahrung',
+  Strings.excellentPremiumFeatures: 'Ausgezeichnete Premium-Funktionen',
+  Strings.worthRecommending: 'Empfehlenswert',
+  Strings.loveTheDesign: 'Ich liebe das Design',
 };

+ 104 - 0
lib/config/translations/en_US/en_us_translation.dart

@@ -251,4 +251,108 @@ Map<String, String> enUs = {
 
   // Connection status
   Strings.activeTime: 'Active time',
+  Strings.yearPlanPrice: 'Year Plan @price per year',
+
+  // Login & Signup
+  Strings.login: 'Log in',
+  Strings.loginButton: 'Log In',
+  Strings.loginDescription:
+      'After a successful login, your free trial will be applied, and the remaining membership will be synced to your account for use across all linked devices.',
+  Strings.signup: 'Sign up to NOMO',
+  Strings.signupButton: 'Sign Up',
+  Strings.signupDescription:
+      'After registration, your free trial will be deducted, and other membership time shifts to your account for multi-device use.',
+  Strings.username: 'Username',
+  Strings.password: 'Password',
+  Strings.usernamePasswordRule: '6-20 characters (letters or numbers)',
+  Strings.noAccount: 'No account? ',
+  Strings.registerNow: ' Register now',
+  Strings.alreadyHaveAccount: 'Already have an account? ',
+  Strings.loginNow: ' Login now',
+
+  // Feedback
+  Strings.feedbackPlaceholder:
+      'An English version for reference: Describe\nyour issue or suggestion...',
+  Strings.emailAddressForReply: '• Your email address (for our reply)',
+  Strings.send: 'Send',
+
+  // Account page additions
+  Strings.changeSubscription: 'Change Subscription',
+  Strings.awaitingActivation: 'Awaiting Activation',
+  Strings.relieve: 'Relieve',
+  Strings.configureAuthorizedDevices: 'Configure authorized devices...',
+  Strings.authorizeUpTo4DevicesAsPremium:
+      'Authorize up to @max devices as Premium (@current/@max)',
+  Strings.youCanAuthorizeOtherDevices:
+      'You can authorize other devices as Premium users (@current/@max)',
+
+  // Pre Code page
+  Strings.preCodeInfoMessage:
+      'Pre Code is your premium user credential.\nUse it to activate benefits or sync your account\non other devices.',
+  Strings.pleaseStoreSecurely: 'Please store it securely !',
+  Strings.sendPreCodeEmailDesc:
+      'Send your Pre Code to your registered email address',
+  Strings.storeLocalCopyDesc: 'Store a copy of your Pre Code on this device',
+  Strings.preview: 'Preview',
+  Strings.hide: 'Hide',
+  Strings.sendToEmail: 'Send to Email',
+  Strings.saveLocalCopy: 'Save Local Copy',
+
+  // Splash page
+  Strings.secureYourConnection: 'Secure Your Connection',
+  Strings.secureYourConnectionDesc:
+      'You can log in or register an account to share membership across different devices.',
+
+  // Pre Code Save Dialog
+  Strings.save: 'Save',
+
+  // Split Tunneling
+  Strings.onlyOneModeActive: 'Only one mode can be active at a time.',
+  Strings.chooseAppsExcludeDesc:
+      'Choose apps that will connect directly without using the VPN.',
+  Strings.chooseAppsIncludeDesc:
+      'Choose apps that will use the VPN while others connect normally.',
+  Strings.splitTunnelingDesc:
+      'Split tunneling lets you control which apps use the VPN connection and which connect directly. It helps you manage bandwidth and access local or foreign content without turning off the VPN.',
+  Strings.selectAppsExclude: 'Select apps that will not use the VPN',
+  Strings.selectAppsInclude: 'Select apps that will use the VPN',
+  Strings.deselectAll: 'Deselect all',
+  Strings.allApps: 'All apps',
+
+  // Feedback Bottom Sheet
+  Strings.howExperience: "How's your\nexperience so far ?",
+  Strings.wedLoveToKnow: "we'd love to know !",
+
+  // Feedback Tags - Bad 😡
+  Strings.vpnConnectionFailed: 'VPN connection failed',
+  Strings.internetTooSlow: 'Internet too slow',
+  Strings.keepsDisconnecting: 'Keeps disconnecting',
+  Strings.appCrashes: 'App crashes or freezes',
+  Strings.otherIssues: 'Other issues',
+
+  // Feedback Tags - Poor 😥
+  Strings.connectionUnstable: 'Connection unstable',
+  Strings.speedNotExpected: 'Speed not as expected',
+  Strings.hardToUse: 'Hard to use / confusing UI',
+
+  // Feedback Tags - Okay 🤭
+  Strings.worksFineNotFast: 'Works fine but not fast enough',
+  Strings.limitedFreeServers: 'Limited free servers',
+  Strings.appCouldBeSimpler: 'App could be simpler',
+  Strings.sometimesDisconnects: 'Sometimes disconnects',
+  Strings.nothingSpecial: 'Nothing special',
+
+  // Feedback Tags - Good 😏
+  Strings.easyToUse: 'Easy to use',
+  Strings.fastConnection: 'Fast connection',
+  Strings.stablePerformance: 'Stable performance',
+  Strings.usefulFreeVersion: 'Useful free version',
+  Strings.satisfiedOverall: 'Satisfied overall',
+
+  // Feedback Tags - Excellent 🥰
+  Strings.fastAndStable: 'Fast and stable connection',
+  Strings.greatUserExperience: 'Great user experience',
+  Strings.excellentPremiumFeatures: 'Excellent premium features',
+  Strings.worthRecommending: 'Worth recommending',
+  Strings.loveTheDesign: 'I love the design',
 };

+ 106 - 0
lib/config/translations/es_ES/es_es_translation.dart

@@ -254,4 +254,110 @@ const Map<String, String> esEs = {
 
   // Connection status
   Strings.activeTime: 'Tiempo activo',
+  Strings.yearPlanPrice: 'Plan anual @price por año',
+
+  // Login & Signup
+  Strings.login: 'Iniciar sesión',
+  Strings.loginButton: 'Iniciar sesión',
+  Strings.loginDescription:
+      'Después de un inicio de sesión exitoso, se aplicará su prueba gratuita y la membresía restante se sincronizará con su cuenta para usarla en todos los dispositivos vinculados.',
+  Strings.signup: 'Registrarse en NOMO',
+  Strings.signupButton: 'Registrarse',
+  Strings.signupDescription:
+      'Después del registro, se deducirá su prueba gratuita y el tiempo de membresía restante se transferirá a su cuenta para uso en múltiples dispositivos.',
+  Strings.username: 'Nombre de usuario',
+  Strings.password: 'Contraseña',
+  Strings.usernamePasswordRule: '6-20 caracteres (letras o números)',
+  Strings.noAccount: '¿No tienes cuenta? ',
+  Strings.registerNow: ' Regístrate ahora',
+  Strings.alreadyHaveAccount: '¿Ya tienes una cuenta? ',
+  Strings.loginNow: ' Inicia sesión ahora',
+
+  // Feedback
+  Strings.feedbackPlaceholder:
+      'Una versión en inglés como referencia: Describe\ntu problema o sugerencia...',
+  Strings.emailAddressForReply:
+      '• Tu dirección de correo (para nuestra respuesta)',
+  Strings.send: 'Enviar',
+
+  // Account page additions
+  Strings.changeSubscription: 'Cambiar suscripción',
+  Strings.awaitingActivation: 'Esperando activación',
+  Strings.relieve: 'Liberar',
+  Strings.configureAuthorizedDevices: 'Configurar dispositivos autorizados...',
+  Strings.authorizeUpTo4DevicesAsPremium:
+      'Autorizar hasta @max dispositivos como Premium (@current/@max)',
+  Strings.youCanAuthorizeOtherDevices:
+      'Puedes autorizar otros dispositivos como usuarios Premium (@current/@max)',
+
+  // Pre Code page
+  Strings.preCodeInfoMessage:
+      'El código Pre es tu credencial de usuario premium.\nÚsalo para activar beneficios o sincronizar tu cuenta\nen otros dispositivos.',
+  Strings.pleaseStoreSecurely: '¡Por favor, guárdalo de forma segura!',
+  Strings.sendPreCodeEmailDesc:
+      'Envía tu código Pre a tu dirección de correo registrada',
+  Strings.storeLocalCopyDesc:
+      'Guarda una copia de tu código Pre en este dispositivo',
+  Strings.preview: 'Vista previa',
+  Strings.hide: 'Ocultar',
+  Strings.sendToEmail: 'Enviar por correo',
+  Strings.saveLocalCopy: 'Guardar copia local',
+
+  // Splash page
+  Strings.secureYourConnection: 'Conexión segura',
+  Strings.secureYourConnectionDesc:
+      'Puedes iniciar sesión o registrarte para compartir membresía en diferentes dispositivos.',
+
+  // Pre Code Save Dialog
+  Strings.save: 'Guardar',
+
+  // Split Tunneling
+  Strings.onlyOneModeActive: 'Solo puede estar activo un modo a la vez.',
+  Strings.chooseAppsExcludeDesc:
+      'Elige apps que se conectarán directamente sin usar la VPN.',
+  Strings.chooseAppsIncludeDesc:
+      'Elige apps que usarán la VPN mientras otras se conectan normalmente.',
+  Strings.splitTunnelingDesc:
+      'El túnel dividido te permite controlar qué apps usan la conexión VPN y cuáles se conectan directamente. Te ayuda a gestionar el ancho de banda y acceder a contenido local o extranjero sin desactivar la VPN.',
+  Strings.selectAppsExclude: 'Selecciona apps que no usarán VPN',
+  Strings.selectAppsInclude: 'Selecciona apps que usarán VPN',
+  Strings.deselectAll: 'Deseleccionar todas',
+  Strings.allApps: 'Todas las apps',
+
+  // Feedback Bottom Sheet
+  Strings.howExperience: '¿Cómo ha sido\ntu experiencia hasta ahora?',
+  Strings.wedLoveToKnow: '¡Nos encantaría saberlo!',
+
+  // Feedback Tags - Bad 😡
+  Strings.vpnConnectionFailed: 'Falló la conexión VPN',
+  Strings.internetTooSlow: 'Internet demasiado lento',
+  Strings.keepsDisconnecting: 'Se desconecta constantemente',
+  Strings.appCrashes: 'La app se bloquea o congela',
+  Strings.otherIssues: 'Otros problemas',
+
+  // Feedback Tags - Poor 😥
+  Strings.connectionUnstable: 'Conexión inestable',
+  Strings.speedNotExpected: 'Velocidad no esperada',
+  Strings.hardToUse: 'Difícil de usar / UI confusa',
+
+  // Feedback Tags - Okay 🤭
+  Strings.worksFineNotFast: 'Funciona bien pero no lo suficientemente rápido',
+  Strings.limitedFreeServers: 'Servidores gratuitos limitados',
+  Strings.appCouldBeSimpler: 'La app podría ser más simple',
+  Strings.sometimesDisconnects: 'A veces se desconecta',
+  Strings.nothingSpecial: 'Nada especial',
+
+  // Feedback Tags - Good 😏
+  Strings.easyToUse: 'Fácil de usar',
+  Strings.fastConnection: 'Conexión rápida',
+  Strings.stablePerformance: 'Rendimiento estable',
+  Strings.usefulFreeVersion: 'Versión gratuita útil',
+  Strings.satisfiedOverall: 'Satisfecho en general',
+
+  // Feedback Tags - Excellent 🥰
+  Strings.fastAndStable: 'Conexión rápida y estable',
+  Strings.greatUserExperience: 'Gran experiencia de usuario',
+  Strings.excellentPremiumFeatures: 'Excelentes funciones premium',
+  Strings.worthRecommending: 'Vale la pena recomendarlo',
+  Strings.loveTheDesign: 'Me encanta el diseño',
 };

+ 107 - 0
lib/config/translations/fa_IR/fa_ir_translation.dart

@@ -249,4 +249,111 @@ const Map<String, String> faIR = {
 
   // Connection status
   Strings.activeTime: 'زمان فعال',
+  Strings.yearPlanPrice: 'طرح سالانه @price در سال',
+
+  // Login & Signup
+  Strings.login: 'ورود',
+  Strings.loginButton: 'ورود',
+  Strings.loginDescription:
+      'پس از ورود موفق، دوره آزمایشی رایگان شما اعمال می‌شود و عضویت باقی‌مانده با حساب شما همگام‌سازی می‌شود تا در تمام دستگاه‌های متصل استفاده شود.',
+  Strings.signup: 'ثبت نام در NOMO',
+  Strings.signupButton: 'ثبت نام',
+  Strings.signupDescription:
+      'پس از ثبت نام، دوره آزمایشی رایگان شما کسر می‌شود و زمان عضویت دیگر به حساب شما منتقل می‌شود تا در چندین دستگاه استفاده کنید.',
+  Strings.username: 'نام کاربری',
+  Strings.password: 'رمز عبور',
+  Strings.usernamePasswordRule: '6-20 کاراکتر (حروف یا اعداد)',
+  Strings.noAccount: 'حساب کاربری ندارید؟ ',
+  Strings.registerNow: ' اکنون ثبت نام کنید',
+  Strings.alreadyHaveAccount: 'قبلاً حساب کاربری دارید؟ ',
+  Strings.loginNow: ' اکنون وارد شوید',
+
+  // Feedback
+  Strings.feedbackPlaceholder:
+      'نسخه انگلیسی برای مرجع: مشکل\nیا پیشنهاد خود را توضیح دهید...',
+  Strings.emailAddressForReply: '• آدرس ایمیل شما (برای پاسخ ما)',
+  Strings.send: 'ارسال',
+
+  // Account page additions
+  Strings.changeSubscription: 'تغییر اشتراک',
+  Strings.awaitingActivation: 'در انتظار فعال‌سازی',
+  Strings.relieve: 'لغو مجوز',
+  Strings.configureAuthorizedDevices: 'پیکربندی دستگاه‌های مجاز...',
+  Strings.authorizeUpTo4DevicesAsPremium:
+      'تا @max دستگاه را به عنوان پریمیوم مجاز کنید (@current/@max)',
+  Strings.youCanAuthorizeOtherDevices:
+      'می‌توانید دستگاه‌های دیگر را به عنوان کاربران پریمیوم مجاز کنید (@current/@max)',
+
+  // Pre Code page
+  Strings.preCodeInfoMessage:
+      'کد Pre اعتبار کاربر ویژه شماست.\nاز آن برای فعال کردن مزایا یا همگام‌سازی حساب خود\nدر دستگاه‌های دیگر استفاده کنید.',
+  Strings.pleaseStoreSecurely: 'لطفاً آن را به طور ایمن ذخیره کنید!',
+  Strings.sendPreCodeEmailDesc:
+      'کد Pre خود را به آدرس ایمیل ثبت شده خود ارسال کنید',
+  Strings.storeLocalCopyDesc:
+      'یک کپی از کد Pre خود را در این دستگاه ذخیره کنید',
+  Strings.preview: 'پیش‌نمایش',
+  Strings.hide: 'مخفی کردن',
+  Strings.sendToEmail: 'ارسال به ایمیل',
+  Strings.saveLocalCopy: 'ذخیره کپی محلی',
+
+  // Splash page
+  Strings.secureYourConnection: 'اتصال ایمن',
+  Strings.secureYourConnectionDesc:
+      'شما می‌توانید وارد شوید یا ثبت نام کنید تا اشتراک اشتراک را در دستگاه‌های مختلف به اشتراک بگذارید.',
+
+  // Pre Code Save Dialog
+  Strings.save: 'ذخیره',
+
+  // Split Tunneling
+  Strings.onlyOneModeActive: 'فقط یک حالت می‌تواند همزمان فعال باشد.',
+  Strings.chooseAppsExcludeDesc:
+      'برنامه‌هایی را انتخاب کنید که بدون استفاده از VPN مستقیماً متصل می‌شوند.',
+  Strings.chooseAppsIncludeDesc:
+      'برنامه‌هایی را انتخاب کنید که از VPN استفاده می‌کنند در حالی که سایرین به طور عادی متصل می‌شوند.',
+  Strings.splitTunnelingDesc:
+      'تونل تقسیم شده به شما امکان می‌دهد کنترل کنید کدام برنامه‌ها از اتصال VPN استفاده می‌کنند و کدام مستقیماً متصل می‌شوند. این به شما کمک می‌کند پهنای باند را مدیریت کنید و بدون خاموش کردن VPN به محتوای محلی یا خارجی دسترسی پیدا کنید.',
+  Strings.selectAppsExclude:
+      'برنامه‌هایی را انتخاب کنید که از VPN استفاده نمی‌کنند',
+  Strings.selectAppsInclude:
+      'برنامه‌هایی را انتخاب کنید که از VPN استفاده می‌کنند',
+  Strings.deselectAll: 'لغو انتخاب همه',
+  Strings.allApps: 'همه برنامه‌ها',
+
+  // Feedback Bottom Sheet
+  Strings.howExperience: 'تجربه شما\nتا اکنون چطور بوده؟',
+  Strings.wedLoveToKnow: 'دوست داریم بدانیم!',
+
+  // Feedback Tags - Bad 😡
+  Strings.vpnConnectionFailed: 'اتصال VPN ناموفق',
+  Strings.internetTooSlow: 'اینترنت خیلی کند',
+  Strings.keepsDisconnecting: 'مدام قطع می‌شود',
+  Strings.appCrashes: 'برنامه کرش می‌کند یا می‌ایستد',
+  Strings.otherIssues: 'مشکلات دیگر',
+
+  // Feedback Tags - Poor 😥
+  Strings.connectionUnstable: 'اتصال ناپایدار',
+  Strings.speedNotExpected: 'سرعت مطابق انتظار نیست',
+  Strings.hardToUse: 'سخت در استفاده / رابط کاربری گیج‌کننده',
+
+  // Feedback Tags - Okay 🤭
+  Strings.worksFineNotFast: 'خوب کار می‌کند اما به اندازه کافی سریع نیست',
+  Strings.limitedFreeServers: 'سرورهای رایگان محدود',
+  Strings.appCouldBeSimpler: 'برنامه می‌تواند ساده‌تر باشد',
+  Strings.sometimesDisconnects: 'گاهی قطع می‌شود',
+  Strings.nothingSpecial: 'چیز خاصی نیست',
+
+  // Feedback Tags - Good 😏
+  Strings.easyToUse: 'آسان در استفاده',
+  Strings.fastConnection: 'اتصال سریع',
+  Strings.stablePerformance: 'عملکرد پایدار',
+  Strings.usefulFreeVersion: 'نسخه رایگان مفید',
+  Strings.satisfiedOverall: 'به طور کلی راضی',
+
+  // Feedback Tags - Excellent 🥰
+  Strings.fastAndStable: 'اتصال سریع و پایدار',
+  Strings.greatUserExperience: 'تجربه کاربری عالی',
+  Strings.excellentPremiumFeatures: 'ویژگی‌های پریمیوم عالی',
+  Strings.worthRecommending: 'ارزش توصیه دارد',
+  Strings.loveTheDesign: 'من طراحی را دوست دارم',
 };

+ 106 - 0
lib/config/translations/fr_FR/fr_fr_translation.dart

@@ -255,4 +255,110 @@ const Map<String, String> frFR = {
 
   // Connection status
   Strings.activeTime: 'Temps actif',
+  Strings.yearPlanPrice: 'Forfait annuel @price par an',
+
+  // Login & Signup
+  Strings.login: 'Se connecter',
+  Strings.loginButton: 'Se connecter',
+  Strings.loginDescription:
+      'Après une connexion réussie, votre essai gratuit sera appliqué et l\'adhésion restante sera synchronisée avec votre compte pour une utilisation sur tous les appareils liés.',
+  Strings.signup: 'S\'inscrire à NOMO',
+  Strings.signupButton: 'S\'inscrire',
+  Strings.signupDescription:
+      'Après l\'inscription, votre essai gratuit sera déduit et le temps d\'adhésion restant sera transféré à votre compte pour une utilisation multi-appareils.',
+  Strings.username: 'Nom d\'utilisateur',
+  Strings.password: 'Mot de passe',
+  Strings.usernamePasswordRule: '6-20 caractères (lettres ou chiffres)',
+  Strings.noAccount: 'Pas de compte ? ',
+  Strings.registerNow: ' Inscrivez-vous maintenant',
+  Strings.alreadyHaveAccount: 'Vous avez déjà un compte ? ',
+  Strings.loginNow: ' Connectez-vous maintenant',
+
+  // Feedback
+  Strings.feedbackPlaceholder:
+      'Une version anglaise pour référence : Décrivez\nvotre problème ou suggestion...',
+  Strings.emailAddressForReply: '• Votre adresse e-mail (pour notre réponse)',
+  Strings.send: 'Envoyer',
+
+  // Account page additions
+  Strings.changeSubscription: 'Changer d\'abonnement',
+  Strings.awaitingActivation: 'En attente d\'activation',
+  Strings.relieve: 'Retirer',
+  Strings.configureAuthorizedDevices: 'Configurer les appareils autorisés...',
+  Strings.authorizeUpTo4DevicesAsPremium:
+      'Autoriser jusqu\'à @max appareils en tant que Premium (@current/@max)',
+  Strings.youCanAuthorizeOtherDevices:
+      'Vous pouvez autoriser d\'autres appareils en tant qu\'utilisateurs Premium (@current/@max)',
+
+  // Pre Code page
+  Strings.preCodeInfoMessage:
+      'Le code Pre est votre identifiant d\'utilisateur premium.\nUtilisez-le pour activer des avantages ou synchroniser votre compte\nsur d\'autres appareils.',
+  Strings.pleaseStoreSecurely: 'Veuillez le stocker en toute sécurité !',
+  Strings.sendPreCodeEmailDesc:
+      'Envoyez votre code Pre à votre adresse e-mail enregistrée',
+  Strings.storeLocalCopyDesc:
+      'Stockez une copie de votre code Pre sur cet appareil',
+  Strings.preview: 'Aperçu',
+  Strings.hide: 'Masquer',
+  Strings.sendToEmail: 'Envoyer par e-mail',
+  Strings.saveLocalCopy: 'Enregistrer une copie locale',
+
+  // Splash page
+  Strings.secureYourConnection: 'Connexion sécurisée',
+  Strings.secureYourConnectionDesc:
+      'Vous pouvez vous connecter ou vous inscrire pour partager votre abonnement sur différents appareils.',
+
+  // Pre Code Save Dialog
+  Strings.save: 'Enregistrer',
+
+  // Split Tunneling
+  Strings.onlyOneModeActive: 'Un seul mode peut être actif à la fois.',
+  Strings.chooseAppsExcludeDesc:
+      'Choisissez les apps qui se connecteront directement sans utiliser le VPN.',
+  Strings.chooseAppsIncludeDesc:
+      'Choisissez les apps qui utiliseront le VPN tandis que les autres se connectent normalement.',
+  Strings.splitTunnelingDesc:
+      'Le tunneling fractionné vous permet de contrôler quelles apps utilisent la connexion VPN et lesquelles se connectent directement. Il vous aide à gérer la bande passante et à accéder au contenu local ou étranger sans désactiver le VPN.',
+  Strings.selectAppsExclude:
+      'Sélectionnez les apps qui n\'utiliseront pas le VPN',
+  Strings.selectAppsInclude: 'Sélectionnez les apps qui utiliseront le VPN',
+  Strings.deselectAll: 'Tout désélectionner',
+  Strings.allApps: 'Toutes les apps',
+
+  // Feedback Bottom Sheet
+  Strings.howExperience: 'Comment s\'est passée\nvotre expérience jusqu\'ici ?',
+  Strings.wedLoveToKnow: 'Nous aimerions le savoir !',
+
+  // Feedback Tags - Bad 😡
+  Strings.vpnConnectionFailed: 'Échec de la connexion VPN',
+  Strings.internetTooSlow: 'Internet trop lent',
+  Strings.keepsDisconnecting: 'Déconnexion constante',
+  Strings.appCrashes: 'L\'app se bloque ou gèle',
+  Strings.otherIssues: 'Autres problèmes',
+
+  // Feedback Tags - Poor 😥
+  Strings.connectionUnstable: 'Connexion instable',
+  Strings.speedNotExpected: 'Vitesse pas comme attendu',
+  Strings.hardToUse: 'Difficile à utiliser / UI confuse',
+
+  // Feedback Tags - Okay 🤭
+  Strings.worksFineNotFast: 'Fonctionne bien mais pas assez rapide',
+  Strings.limitedFreeServers: 'Serveurs gratuits limités',
+  Strings.appCouldBeSimpler: 'L\'app pourrait être plus simple',
+  Strings.sometimesDisconnects: 'Se déconnecte parfois',
+  Strings.nothingSpecial: 'Rien de spécial',
+
+  // Feedback Tags - Good 😏
+  Strings.easyToUse: 'Facile à utiliser',
+  Strings.fastConnection: 'Connexion rapide',
+  Strings.stablePerformance: 'Performance stable',
+  Strings.usefulFreeVersion: 'Version gratuite utile',
+  Strings.satisfiedOverall: 'Satisfait dans l\'ensemble',
+
+  // Feedback Tags - Excellent 🥰
+  Strings.fastAndStable: 'Connexion rapide et stable',
+  Strings.greatUserExperience: 'Excellente expérience utilisateur',
+  Strings.excellentPremiumFeatures: 'Excellentes fonctionnalités premium',
+  Strings.worthRecommending: 'Vaut la peine d\'être recommandé',
+  Strings.loveTheDesign: 'J\'adore le design',
 };

+ 100 - 0
lib/config/translations/ja_JP/ja_jp_translation.dart

@@ -234,4 +234,104 @@ const Map<String, String> jaJP = {
 
   // Connection status
   Strings.activeTime: 'アクティブ時間',
+  Strings.yearPlanPrice: '年間プラン @price 年間',
+
+  // Login & Signup
+  Strings.login: 'ログイン',
+  Strings.loginButton: 'ログイン',
+  Strings.loginDescription:
+      'ログインに成功すると、無料トライアルが適用され、残りのメンバーシップがアカウントに同期され、すべてのリンクされたデバイスで使用できるようになります。',
+  Strings.signup: 'NOMOに登録',
+  Strings.signupButton: '登録',
+  Strings.signupDescription:
+      '登録後、無料トライアルが差し引かれ、その他のメンバーシップ時間がアカウントに移行され、複数のデバイスで使用できるようになります。',
+  Strings.username: 'ユーザー名',
+  Strings.password: 'パスワード',
+  Strings.usernamePasswordRule: '6-20文字(英字または数字)',
+  Strings.noAccount: 'アカウントをお持ちでないですか? ',
+  Strings.registerNow: ' 今すぐ登録',
+  Strings.alreadyHaveAccount: 'すでにアカウントをお持ちですか? ',
+  Strings.loginNow: ' 今すぐログイン',
+
+  // Feedback
+  Strings.feedbackPlaceholder: '参考用の英語版:問題や提案を\n説明してください...',
+  Strings.emailAddressForReply: '• メールアドレス(返信用)',
+  Strings.send: '送信',
+
+  // Account page additions
+  Strings.changeSubscription: 'サブスクリプションを変更',
+  Strings.awaitingActivation: 'アクティベーション待ち',
+  Strings.relieve: '解除',
+  Strings.configureAuthorizedDevices: '認証済みデバイスを設定...',
+  Strings.authorizeUpTo4DevicesAsPremium:
+      '最大@maxデバイスをプレミアムとして認証 (@current/@max)',
+  Strings.youCanAuthorizeOtherDevices:
+      '他のデバイスをプレミアムユーザーとして認証できます (@current/@max)',
+
+  // Pre Code page
+  Strings.preCodeInfoMessage:
+      'Preコードはプレミアムユーザーの資格情報です。\n特典を有効にしたり、アカウントを同期したり\n他のデバイスで使用できます。',
+  Strings.pleaseStoreSecurely: '安全に保管してください!',
+  Strings.sendPreCodeEmailDesc: '登録されたメールアドレスにPreコードを送信します',
+  Strings.storeLocalCopyDesc: 'Preコードのコピーをこのデバイスに保存します',
+  Strings.preview: 'プレビュー',
+  Strings.hide: '非表示',
+  Strings.sendToEmail: 'メールで送信',
+  Strings.saveLocalCopy: 'ローカルコピーを保存',
+
+  // Splash page
+  Strings.secureYourConnection: '安全な接続',
+  Strings.secureYourConnectionDesc:
+      'ログインまたはアカウント登録を行うことで、異なるデバイス間でメンバーシップを共有できます。',
+
+  // Pre Code Save Dialog
+  Strings.save: '保存',
+
+  // Split Tunneling
+  Strings.onlyOneModeActive: '一度にアクティブにできるモードは1つだけです。',
+  Strings.chooseAppsExcludeDesc: 'VPNを使用せずに直接接続するアプリを選択してください。',
+  Strings.chooseAppsIncludeDesc: 'VPNを使用するアプリを選択してください。他のアプリは通常通り接続します。',
+  Strings.splitTunnelingDesc:
+      'スプリットトンネリングを使用すると、どのアプリがVPN接続を使用し、どのアプリが直接接続するかを制御できます。帯域幅を管理し、VPNをオフにせずにローカルまたは外国のコンテンツにアクセスするのに役立ちます。',
+  Strings.selectAppsExclude: 'VPNを使用しないアプリを選択',
+  Strings.selectAppsInclude: 'VPNを使用するアプリを選択',
+  Strings.deselectAll: 'すべて選択解除',
+  Strings.allApps: 'すべてのアプリ',
+
+  // Feedback Bottom Sheet
+  Strings.howExperience: 'これまでの\nご体験はいかがでしたか?',
+  Strings.wedLoveToKnow: 'ぜひお聞かせください!',
+
+  // Feedback Tags - Bad 😡
+  Strings.vpnConnectionFailed: 'VPN接続に失敗しました',
+  Strings.internetTooSlow: 'インターネットが遅すぎます',
+  Strings.keepsDisconnecting: '接続が切れ続けます',
+  Strings.appCrashes: 'アプリがクラッシュまたはフリーズします',
+  Strings.otherIssues: 'その他の問題',
+
+  // Feedback Tags - Poor 😥
+  Strings.connectionUnstable: '接続が不安定',
+  Strings.speedNotExpected: '速度が期待通りではありません',
+  Strings.hardToUse: '使いにくい / UIが分かりにくい',
+
+  // Feedback Tags - Okay 🤭
+  Strings.worksFineNotFast: '正常に動作しますが、十分な速度ではありません',
+  Strings.limitedFreeServers: '無料サーバーが限られています',
+  Strings.appCouldBeSimpler: 'アプリはもっとシンプルにできます',
+  Strings.sometimesDisconnects: '時々切断されます',
+  Strings.nothingSpecial: '特に特別なことはありません',
+
+  // Feedback Tags - Good 😏
+  Strings.easyToUse: '使いやすい',
+  Strings.fastConnection: '高速接続',
+  Strings.stablePerformance: '安定したパフォーマンス',
+  Strings.usefulFreeVersion: '便利な無料版',
+  Strings.satisfiedOverall: '全体的に満足',
+
+  // Feedback Tags - Excellent 🥰
+  Strings.fastAndStable: '高速で安定した接続',
+  Strings.greatUserExperience: '素晴らしいユーザーエクスペリエンス',
+  Strings.excellentPremiumFeatures: '優れたプレミアム機能',
+  Strings.worthRecommending: 'おすすめする価値があります',
+  Strings.loveTheDesign: 'デザインが大好きです',
 };

+ 99 - 0
lib/config/translations/ko_KR/ko_kr_translation.dart

@@ -228,4 +228,103 @@ const Map<String, String> koKR = {
 
   // Connection status
   Strings.activeTime: '활성 시간',
+  Strings.yearPlanPrice: '연간 플랜 @price 연간',
+
+  // Login & Signup
+  Strings.login: '로그인',
+  Strings.loginButton: '로그인',
+  Strings.loginDescription:
+      '로그인에 성공하면 무료 평가판이 적용되고 남은 멤버십이 계정에 동기화되어 모든 연결된 기기에서 사용할 수 있습니다.',
+  Strings.signup: 'NOMO 가입',
+  Strings.signupButton: '가입',
+  Strings.signupDescription:
+      '등록 후 무료 평가판이 차감되고 다른 멤버십 시간이 계정으로 전환되어 여러 기기에서 사용할 수 있습니다.',
+  Strings.username: '사용자 이름',
+  Strings.password: '비밀번호',
+  Strings.usernamePasswordRule: '6-20자 (영문자 또는 숫자)',
+  Strings.noAccount: '계정이 없으신가요? ',
+  Strings.registerNow: ' 지금 가입하기',
+  Strings.alreadyHaveAccount: '이미 계정이 있으신가요? ',
+  Strings.loginNow: ' 지금 로그인',
+
+  // Feedback
+  Strings.feedbackPlaceholder: '참고용 영어 버전: 문제나 제안을\n설명해주세요...',
+  Strings.emailAddressForReply: '• 이메일 주소 (답변용)',
+  Strings.send: '보내기',
+
+  // Account page additions
+  Strings.changeSubscription: '구독 변경',
+  Strings.awaitingActivation: '활성화 대기 중',
+  Strings.relieve: '해제',
+  Strings.configureAuthorizedDevices: '인증된 기기 구성...',
+  Strings.authorizeUpTo4DevicesAsPremium:
+      '최대 @max개의 기기를 프리미엄으로 인증 (@current/@max)',
+  Strings.youCanAuthorizeOtherDevices:
+      '다른 기기를 프리미엄 사용자로 인증할 수 있습니다 (@current/@max)',
+
+  // Pre Code page
+  Strings.preCodeInfoMessage:
+      'Pre 코드는 프리미엄 사용자 자격 증명입니다.\n혜택을 활성화하거나 계정을 동기화하여\n다른 기기에서 사용할 수 있습니다.',
+  Strings.pleaseStoreSecurely: '안전하게 보관하세요!',
+  Strings.sendPreCodeEmailDesc: '등록된 이메일 주소로 Pre 코드를 보냅니다',
+  Strings.storeLocalCopyDesc: '이 기기에 Pre 코드 사본을 저장합니다',
+  Strings.preview: '미리보기',
+  Strings.hide: '숨기기',
+  Strings.sendToEmail: '이메일로 보내기',
+  Strings.saveLocalCopy: '로컬 사본 저장',
+
+  // Splash page
+  Strings.secureYourConnection: '안전한 연결',
+  Strings.secureYourConnectionDesc: '로그인하거나 계정을 등록하여 다른 기기에서 멤버십을 공유할 수 있습니다.',
+
+  // Pre Code Save Dialog
+  Strings.save: '저장',
+
+  // Split Tunneling
+  Strings.onlyOneModeActive: '한 번에 하나의 모드만 활성화할 수 있습니다.',
+  Strings.chooseAppsExcludeDesc: 'VPN을 사용하지 않고 직접 연결할 앱을 선택하세요.',
+  Strings.chooseAppsIncludeDesc: 'VPN을 사용할 앱을 선택하고 다른 앱은 정상적으로 연결됩니다.',
+  Strings.splitTunnelingDesc:
+      '분할 터널링을 사용하면 어떤 앱이 VPN 연결을 사용하고 어떤 앱이 직접 연결하는지 제어할 수 있습니다. 대역폭을 관리하고 VPN을 끄지 않고 로컬 또는 외국 콘텐츠에 액세스하는 데 도움이 됩니다.',
+  Strings.selectAppsExclude: 'VPN을 사용하지 않을 앱 선택',
+  Strings.selectAppsInclude: 'VPN을 사용할 앱 선택',
+  Strings.deselectAll: '모두 선택 해제',
+  Strings.allApps: '모든 앱',
+
+  // Feedback Bottom Sheet
+  Strings.howExperience: '지금까지의\n경험은 어떠셨나요?',
+  Strings.wedLoveToKnow: '알려주세요!',
+
+  // Feedback Tags - Bad 😡
+  Strings.vpnConnectionFailed: 'VPN 연결 실패',
+  Strings.internetTooSlow: '인터넷이 너무 느림',
+  Strings.keepsDisconnecting: '계속 연결이 끊김',
+  Strings.appCrashes: '앱이 충돌하거나 멈춤',
+  Strings.otherIssues: '기타 문제',
+
+  // Feedback Tags - Poor 😥
+  Strings.connectionUnstable: '연결이 불안정함',
+  Strings.speedNotExpected: '예상한 속도가 아님',
+  Strings.hardToUse: '사용하기 어려움 / 혼란스러운 UI',
+
+  // Feedback Tags - Okay 🤭
+  Strings.worksFineNotFast: '잘 작동하지만 충분히 빠르지 않음',
+  Strings.limitedFreeServers: '제한된 무료 서버',
+  Strings.appCouldBeSimpler: '앱이 더 간단할 수 있음',
+  Strings.sometimesDisconnects: '가끔 연결이 끊김',
+  Strings.nothingSpecial: '특별한 것 없음',
+
+  // Feedback Tags - Good 😏
+  Strings.easyToUse: '사용하기 쉬움',
+  Strings.fastConnection: '빠른 연결',
+  Strings.stablePerformance: '안정적인 성능',
+  Strings.usefulFreeVersion: '유용한 무료 버전',
+  Strings.satisfiedOverall: '전반적으로 만족',
+
+  // Feedback Tags - Excellent 🥰
+  Strings.fastAndStable: '빠르고 안정적인 연결',
+  Strings.greatUserExperience: '훌륭한 사용자 경험',
+  Strings.excellentPremiumFeatures: '뛰어난 프리미엄 기능',
+  Strings.worthRecommending: '추천할 가치가 있음',
+  Strings.loveTheDesign: '디자인이 마음에 듦',
 };

+ 108 - 0
lib/config/translations/my_MM/my_mm_translation.dart

@@ -256,4 +256,112 @@ const Map<String, String> myMM = {
 
   // Connection status
   Strings.activeTime: 'တက်ကြွသောအချိန်',
+  Strings.yearPlanPrice: 'နှစ်စဉ်အစီအစဉ် @price နှစ်စဉ်',
+
+  // Login & Signup
+  Strings.login: 'အကောင့်ဝင်ရန်',
+  Strings.loginButton: 'အကောင့်ဝင်ရန်',
+  Strings.loginDescription:
+      'အောင်မြင်စွာအကောင့်ဝင်ပြီးနောက်၊ သင့်အခမဲ့စမ်းသပ်မှုကို အသုံးချပြီး ကျန်အဖွဲ့ဝင်မှုကို သင့်အကောင့်သို့ sync လုပ်ပြီး ချိတ်ဆက်ထားသော စက်အားလုံးတွင် အသုံးပြုနိုင်ပါမည်။',
+  Strings.signup: 'NOMO တွင် စာရင်းသွင်းရန်',
+  Strings.signupButton: 'စာရင်းသွင်းရန်',
+  Strings.signupDescription:
+      'စာရင်းသွင်းပြီးနောက်၊ သင့်အခမဲ့စမ်းသပ်မှုကို နုတ်ယူပြီး အခြားအဖွဲ့ဝင်အချိန်ကို သင့်အကောင့်သို့ ပြောင်းရွှေ့ပြီး စက်များစွာတွင် အသုံးပြုနိုင်ပါမည်။',
+  Strings.username: 'အသုံးပြုသူအမည်',
+  Strings.password: 'စကားဝှက်',
+  Strings.usernamePasswordRule:
+      '6-20 အက္ခရာများ (စာလုံးများ သို့မဟုတ် ဂဏန်းများ)',
+  Strings.noAccount: 'အကောင့်မရှိဘူးလား။ ',
+  Strings.registerNow: ' ယခုစာရင်းသွင်းပါ',
+  Strings.alreadyHaveAccount: 'အကောင့်ရှိပြီးသားလား။ ',
+  Strings.loginNow: ' ယခုအကောင့်ဝင်ပါ',
+
+  // Feedback
+  Strings.feedbackPlaceholder:
+      'ရည်ညွှန်းအတွက် အင်္ဂလိပ်ဗားရှင်း: သင့်ပြဿနာ သို့မဟုတ်\nအကြံပြုချက်ကို ဖော်ပြပါ...',
+  Strings.emailAddressForReply:
+      '• သင့်အီးမေးလ်လိပ်စာ (ကျွန်ုပ်တို့၏ပြန်လည်ဖြေကြားမှုအတွက်)',
+  Strings.send: 'ပို့ပါ',
+
+  // Account page additions
+  Strings.changeSubscription: 'စာရင်းသွင်းမှုပြောင်းလဲရန်',
+  Strings.awaitingActivation: 'အသက်ဝင်မှုကို စောင့်ဆိုင်းနေသည်',
+  Strings.relieve: 'ဖယ်ရှားမည်',
+  Strings.configureAuthorizedDevices: 'ခွင့်ပြုထားသောစက်များကို စီစဉ်ခြင်း...',
+  Strings.authorizeUpTo4DevicesAsPremium:
+      '@max စက်အထိ ပရီမီယံအဖြစ် ခွင့်ပြုပါ (@current/@max)',
+  Strings.youCanAuthorizeOtherDevices:
+      'အခြားစက်များကို ပရီမီယံအသုံးပြုသူများအဖြစ် ခွင့်ပြုနိုင်ပါသည် (@current/@max)',
+
+  // Pre Code page
+  Strings.preCodeInfoMessage:
+      'Pre ကုဒ်သည် သင့်ပရီမီယံအသုံးပြုသူ အထောက်အထားဖြစ်သည်။\nအကျိုးကျေးဇူးများ ဖွင့်ရန် သို့မဟုတ် သင့်အကောင့်ကို\nအခြားစက်များတွင် sync လုပ်ရန် အသုံးပြုပါ။',
+  Strings.pleaseStoreSecurely: 'ကျေးဇူးပြု၍ လုံခြုံစွာသိမ်းဆည်းပါ!',
+  Strings.sendPreCodeEmailDesc:
+      'သင့် Pre ကုဒ်ကို သင့်မှတ်ပုံတင်ထားသောအီးမေးလ်လိပ်စာသို့ ပို့ပါ',
+  Strings.storeLocalCopyDesc:
+      'သင့် Pre ကုဒ်၏ မိတ္တူတစ်ခုကို ဤစက်တွင် သိမ်းဆည်းပါ',
+  Strings.preview: 'အစမ်းကြည့်ရန်',
+  Strings.hide: 'ဖျောက်ရန်',
+  Strings.sendToEmail: 'အီးမေးလ်သို့ပို့ရန်',
+  Strings.saveLocalCopy: 'ဒေသဆိုင်ရာမိတ္တူ သိမ်းဆည်းရန်',
+
+  // Splash page
+  Strings.secureYourConnection: 'လုံခြုံသောချိတ်ဆက်မှု',
+  Strings.secureYourConnectionDesc:
+      'သင်သည် အကောင့်ဝင်ခြင်းသို့မဟုတ် စာရင်းသွင်းခြင်းကို လုပ်ကိုင်ပြီး အခြားစက်များတွင် စာရင်းသွင်းခြင်းကို အသုံးပြုနိုင်ပါမည်။',
+
+  // Pre Code Save Dialog
+  Strings.save: 'သိမ်းဆည်းမည်',
+
+  // Split Tunneling
+  Strings.onlyOneModeActive: 'တစ်ကြိမ်လျှင် mode တစ်ခုကိုသာ အသုံးပြုနိုင်သည်။',
+  Strings.chooseAppsExcludeDesc:
+      'VPN မသုံးဘဲ တိုက်ရိုက်ချိတ်ဆက်မည့် အက်ပ်များကို ရွေးချယ်ပါ။',
+  Strings.chooseAppsIncludeDesc:
+      'VPN သုံးမည့် အက်ပ်များကို ရွေးချယ်ပြီး အခြားအက်ပ်များသည် ပုံမှန်ချိတ်ဆက်မည်။',
+  Strings.splitTunnelingDesc:
+      'Split tunneling သည် VPN ချိတ်ဆက်မှုကို အသုံးပြုမည့် အက်ပ်များနှင့် တိုက်ရိုက်ချိတ်ဆက်မည့် အက်ပ်များကို ထိန်းချုပ်နိုင်စေသည်။ ၎င်းသည် bandwidth စီမံခန့်ခွဲရန်နှင့် VPN မပိတ်ဘဲ ပြည်တွင်း သို့မဟုတ် နိုင်ငံခြားအကြောင်းအရာများကို ဝင်ရောက်ကြည့်ရှုနိုင်စေသည်။',
+  Strings.selectAppsExclude: 'VPN မသုံးမည့် အက်ပ်များကို ရွေးချယ်ပါ',
+  Strings.selectAppsInclude: 'VPN သုံးမည့် အက်ပ်များကို ရွေးချယ်ပါ',
+  Strings.deselectAll: 'အားလုံးကို ရွေးချယ်မှုဖျက်မည်',
+  Strings.allApps: 'အက်ပ်အားလုံး',
+
+  // Feedback Bottom Sheet
+  Strings.howExperience: 'သင့်အတွေ့အကြုံ\nဘယ်လိုပါလဲ?',
+  Strings.wedLoveToKnow: 'ကျွန်ုပ်တို့သိလိုပါသည်!',
+
+  // Feedback Tags - Bad 😡
+  Strings.vpnConnectionFailed: 'VPN ချိတ်ဆက်မှု မအောင်မြင်ပါ',
+  Strings.internetTooSlow: 'အင်တာနက် အလွန်နှေးသည်',
+  Strings.keepsDisconnecting: 'ဆက်တိုက် ချိတ်ဆက်မှုပြတ်နေသည်',
+  Strings.appCrashes: 'အက်ပ် ပျက်စီးသည် သို့မဟုတ် ရပ်တန့်သည်',
+  Strings.otherIssues: 'အခြားပြဿနာများ',
+
+  // Feedback Tags - Poor 😥
+  Strings.connectionUnstable: 'ချိတ်ဆက်မှု မတည်ငြိမ်ပါ',
+  Strings.speedNotExpected: 'မျှော်လင့်ထားသောအမြန်နှုန်းမဟုတ်ပါ',
+  Strings.hardToUse: 'အသုံးပြုရန် ခက်ခဲသည် / ရှုပ်ထွေးသော UI',
+
+  // Feedback Tags - Okay 🤭
+  Strings.worksFineNotFast:
+      'ကောင်းကောင်းအလုပ်လုပ်သည် သို့သော် လုံလောက်သော အမြန်မရှိပါ',
+  Strings.limitedFreeServers: 'အကန့်အသတ်ရှိသော အခမဲ့ဆာဗာများ',
+  Strings.appCouldBeSimpler: 'အက်ပ်ကို ပိုရိုးရှင်းအောင် လုပ်နိုင်သည်',
+  Strings.sometimesDisconnects: 'တစ်ခါတစ်ရံ ချိတ်ဆက်မှုပြတ်သည်',
+  Strings.nothingSpecial: 'အထူးဘာမှမရှိပါ',
+
+  // Feedback Tags - Good 😏
+  Strings.easyToUse: 'အသုံးပြုရလွယ်သည်',
+  Strings.fastConnection: 'မြန်သောချိတ်ဆက်မှု',
+  Strings.stablePerformance: 'တည်ငြိမ်သောစွမ်းဆောင်ရည်',
+  Strings.usefulFreeVersion: 'အသုံးဝင်သော အခမဲ့ဗားရှင်း',
+  Strings.satisfiedOverall: 'အလုံးစုံ ကျေနပ်သည်',
+
+  // Feedback Tags - Excellent 🥰
+  Strings.fastAndStable: 'မြန်ဆန်ပြီး တည်ငြိမ်သောချိတ်ဆက်မှု',
+  Strings.greatUserExperience: 'အလွန်ကောင်းသော အသုံးပြုသူအတွေ့အကြုံ',
+  Strings.excellentPremiumFeatures: 'ကောင်းမွန်သော ပရီမီယံ features များ',
+  Strings.worthRecommending: 'အကြံပြုထိုက်သည်',
+  Strings.loveTheDesign: 'ဒီဇိုင်းကို နှစ်သက်သည်',
 };

+ 108 - 0
lib/config/translations/ru_RU/ru_ru_translation.dart

@@ -252,4 +252,112 @@ const Map<String, String> ruRU = {
 
   // Connection status
   Strings.activeTime: 'Активное время',
+  Strings.yearPlanPrice: 'Годовой план @price в год',
+
+  // Login & Signup
+  Strings.login: 'Войти',
+  Strings.loginButton: 'Войти',
+  Strings.loginDescription:
+      'После успешного входа будет применена ваша бесплатная пробная версия, а оставшееся членство будет синхронизировано с вашей учетной записью для использования на всех связанных устройствах.',
+  Strings.signup: 'Зарегистрироваться в NOMO',
+  Strings.signupButton: 'Зарегистрироваться',
+  Strings.signupDescription:
+      'После регистрации ваша бесплатная пробная версия будет вычтена, а оставшееся время членства будет переведено на вашу учетную запись для использования на нескольких устройствах.',
+  Strings.username: 'Имя пользователя',
+  Strings.password: 'Пароль',
+  Strings.usernamePasswordRule: '6-20 символов (буквы или цифры)',
+  Strings.noAccount: 'Нет учетной записи? ',
+  Strings.registerNow: ' Зарегистрируйтесь сейчас',
+  Strings.alreadyHaveAccount: 'Уже есть учетная запись? ',
+  Strings.loginNow: ' Войдите сейчас',
+
+  // Feedback
+  Strings.feedbackPlaceholder:
+      'Английская версия для справки: Опишите\nвашу проблему или предложение...',
+  Strings.emailAddressForReply: '• Ваш адрес email (для нашего ответа)',
+  Strings.send: 'Отправить',
+
+  // Account page additions
+  Strings.changeSubscription: 'Изменить подписку',
+  Strings.awaitingActivation: 'Ожидание активации',
+  Strings.relieve: 'Удалить',
+  Strings.configureAuthorizedDevices: 'Настроить авторизованные устройства...',
+  Strings.authorizeUpTo4DevicesAsPremium:
+      'Авторизовать до @max устройств как Premium (@current/@max)',
+  Strings.youCanAuthorizeOtherDevices:
+      'Вы можете авторизовать другие устройства как пользователей Premium (@current/@max)',
+
+  // Pre Code page
+  Strings.preCodeInfoMessage:
+      'Pre код - это ваши учетные данные премиум-пользователя.\nИспользуйте его для активации преимуществ или синхронизации учетной записи\nна других устройствах.',
+  Strings.pleaseStoreSecurely: 'Пожалуйста, храните его в безопасности!',
+  Strings.sendPreCodeEmailDesc:
+      'Отправьте ваш Pre код на ваш зарегистрированный адрес email',
+  Strings.storeLocalCopyDesc:
+      'Сохраните копию вашего Pre кода на этом устройстве',
+  Strings.preview: 'Предпросмотр',
+  Strings.hide: 'Скрыть',
+  Strings.sendToEmail: 'Отправить по email',
+  Strings.saveLocalCopy: 'Сохранить локальную копию',
+
+  // Splash page
+  Strings.secureYourConnection: 'Безопасное соединение',
+  Strings.secureYourConnectionDesc:
+      'Вы можете войти или зарегистрироваться, чтобы разделить ваше членство на разных устройствах.',
+
+  // Pre Code Save Dialog
+  Strings.save: 'Сохранить',
+
+  // Split Tunneling
+  Strings.onlyOneModeActive:
+      'Только один режим может быть активным одновременно.',
+  Strings.chooseAppsExcludeDesc:
+      'Выберите приложения, которые будут подключаться напрямую без использования VPN.',
+  Strings.chooseAppsIncludeDesc:
+      'Выберите приложения, которые будут использовать VPN, а другие подключатся обычным образом.',
+  Strings.splitTunnelingDesc:
+      'Раздельное туннелирование позволяет вам контролировать, какие приложения используют VPN-соединение, а какие подключаются напрямую. Это помогает управлять пропускной способностью и получать доступ к локальному или зарубежному контенту без отключения VPN.',
+  Strings.selectAppsExclude:
+      'Выберите приложения, которые не будут использовать VPN',
+  Strings.selectAppsInclude:
+      'Выберите приложения, которые будут использовать VPN',
+  Strings.deselectAll: 'Снять выбор со всех',
+  Strings.allApps: 'Все приложения',
+
+  // Feedback Bottom Sheet
+  Strings.howExperience: 'Как вам\nнаш сервис?',
+  Strings.wedLoveToKnow: 'Мы хотели бы знать!',
+
+  // Feedback Tags - Bad 😡
+  Strings.vpnConnectionFailed: 'Сбой VPN-соединения',
+  Strings.internetTooSlow: 'Интернет слишком медленный',
+  Strings.keepsDisconnecting: 'Постоянно отключается',
+  Strings.appCrashes: 'Приложение вылетает или зависает',
+  Strings.otherIssues: 'Другие проблемы',
+
+  // Feedback Tags - Poor 😥
+  Strings.connectionUnstable: 'Нестабильное соединение',
+  Strings.speedNotExpected: 'Скорость не соответствует ожиданиям',
+  Strings.hardToUse: 'Сложно использовать / запутанный интерфейс',
+
+  // Feedback Tags - Okay 🤭
+  Strings.worksFineNotFast: 'Работает нормально, но недостаточно быстро',
+  Strings.limitedFreeServers: 'Ограниченные бесплатные серверы',
+  Strings.appCouldBeSimpler: 'Приложение могло бы быть проще',
+  Strings.sometimesDisconnects: 'Иногда отключается',
+  Strings.nothingSpecial: 'Ничего особенного',
+
+  // Feedback Tags - Good 😏
+  Strings.easyToUse: 'Легко использовать',
+  Strings.fastConnection: 'Быстрое соединение',
+  Strings.stablePerformance: 'Стабильная производительность',
+  Strings.usefulFreeVersion: 'Полезная бесплатная версия',
+  Strings.satisfiedOverall: 'В целом доволен',
+
+  // Feedback Tags - Excellent 🥰
+  Strings.fastAndStable: 'Быстрое и стабильное соединение',
+  Strings.greatUserExperience: 'Отличный пользовательский опыт',
+  Strings.excellentPremiumFeatures: 'Превосходные премиум-функции',
+  Strings.worthRecommending: 'Стоит рекомендовать',
+  Strings.loveTheDesign: 'Мне нравится дизайн',
 };

+ 110 - 0
lib/config/translations/strings_enum.dart

@@ -212,6 +212,12 @@ class Strings {
   static const String currentDevice = 'Current Device';
   static const String androidDevices = 'Android devices';
   static const String authCodeCopied = 'Authorization code copied to clipboard';
+  static const String awaitingActivation = 'Awaiting Activation';
+  static const String relieve = 'Relieve';
+  static const String configureAuthorizedDevices =
+      'Configure authorized devices...';
+  static const String authorizeUpTo4DevicesAsPremium =
+      'Authorize up to @max devices as Premium (@current/@max)';
 
   // Pre Code Email
   static const String codeBackedUpMessage =
@@ -265,4 +271,108 @@ class Strings {
 
   // Connection status
   static const String activeTime = 'Active time';
+  static const String yearPlanPrice = 'Year Plan @price per year';
+
+  // Login & Signup
+  static const String login = 'Log in';
+  static const String loginButton = 'Log In';
+  static const String loginDescription =
+      'After a successful login, your free trial will be applied, and the remaining membership will be synced to your account for use across all linked devices.';
+  static const String signup = 'Sign up to NOMO';
+  static const String signupButton = 'Sign Up';
+  static const String signupDescription =
+      'After registration, your free trial will be deducted, and other membership time shifts to your account for multi-device use.';
+  static const String username = 'Username';
+  static const String password = 'Password';
+  static const String usernamePasswordRule =
+      '6-20 characters (letters or numbers)';
+  static const String noAccount = 'No account? ';
+  static const String registerNow = ' Register now';
+  static const String alreadyHaveAccount = 'Already have an account? ';
+  static const String loginNow = ' Login now';
+
+  // Feedback
+  static const String feedbackPlaceholder =
+      'An English version for reference: Describe\nyour issue or suggestion...';
+  static const String emailAddressForReply =
+      '• Your email address (for our reply)';
+  static const String send = 'Send';
+
+  // Account page additions
+  static const String changeSubscription = 'Change Subscription';
+  static const String youCanAuthorizeOtherDevices =
+      'You can authorize other devices as Premium users (@current/@max)';
+
+  // Pre Code page
+  static const String preCodeInfoMessage =
+      'Pre Code is your premium user credential.\nUse it to activate benefits or sync your account\non other devices.';
+  static const String pleaseStoreSecurely = 'Please store it securely !';
+  static const String sendPreCodeEmailDesc =
+      'Send your Pre Code to your registered email address';
+  static const String storeLocalCopyDesc =
+      'Store a copy of your Pre Code on this device';
+  static const String preview = 'Preview';
+  static const String hide = 'Hide';
+  static const String sendToEmail = 'Send to Email';
+  static const String saveLocalCopy = 'Save Local Copy';
+
+  // Splash page
+  static const String secureYourConnection = 'Secure Your Connection';
+  static const String secureYourConnectionDesc =
+      'You can log in or register an account to share membership across different devices.';
+
+  // Pre Code Save Dialog
+  static const String save = 'Save';
+
+  // Split Tunneling
+  static const String onlyOneModeActive =
+      'Only one mode can be active at a time.';
+  static const String chooseAppsExcludeDesc =
+      'Choose apps that will connect directly without using the VPN.';
+  static const String chooseAppsIncludeDesc =
+      'Choose apps that will use the VPN while others connect normally.';
+  static const String splitTunnelingDesc =
+      'Split tunneling lets you control which apps use the VPN connection and which connect directly. It helps you manage bandwidth and access local or foreign content without turning off the VPN.';
+  static const String selectAppsExclude =
+      'Select apps that will not use the VPN';
+  static const String selectAppsInclude = 'Select apps that will use the VPN';
+  static const String deselectAll = 'Deselect all';
+  static const String allApps = 'All apps';
+
+  // Feedback Bottom Sheet
+  static const String howExperience = "How's your\nexperience so far ?";
+  static const String wedLoveToKnow = "we'd love to know !";
+
+  // Feedback Tags - Bad 😡
+  static const String vpnConnectionFailed = 'VPN connection failed';
+  static const String internetTooSlow = 'Internet too slow';
+  static const String keepsDisconnecting = 'Keeps disconnecting';
+  static const String appCrashes = 'App crashes or freezes';
+  static const String otherIssues = 'Other issues';
+
+  // Feedback Tags - Poor 😥
+  static const String connectionUnstable = 'Connection unstable';
+  static const String speedNotExpected = 'Speed not as expected';
+  static const String hardToUse = 'Hard to use / confusing UI';
+
+  // Feedback Tags - Okay 🤭
+  static const String worksFineNotFast = 'Works fine but not fast enough';
+  static const String limitedFreeServers = 'Limited free servers';
+  static const String appCouldBeSimpler = 'App could be simpler';
+  static const String sometimesDisconnects = 'Sometimes disconnects';
+  static const String nothingSpecial = 'Nothing special';
+
+  // Feedback Tags - Good 😏
+  static const String easyToUse = 'Easy to use';
+  static const String fastConnection = 'Fast connection';
+  static const String stablePerformance = 'Stable performance';
+  static const String usefulFreeVersion = 'Useful free version';
+  static const String satisfiedOverall = 'Satisfied overall';
+
+  // Feedback Tags - Excellent 🥰
+  static const String fastAndStable = 'Fast and stable connection';
+  static const String greatUserExperience = 'Great user experience';
+  static const String excellentPremiumFeatures = 'Excellent premium features';
+  static const String worthRecommending = 'Worth recommending';
+  static const String loveTheDesign = 'I love the design';
 }