lilu преди 6 месеца
родител
ревизия
91b035766e
променени са 29 файла, в които са добавени 1159 реда и са изтрити 182 реда
  1. 4 4
      lib/app/components/country_restricted_overlay.dart
  2. 6 5
      lib/app/modules/account/views/account_view.dart
  3. 2 1
      lib/app/modules/deviceauth/views/deviceauth_view.dart
  4. 2 1
      lib/app/modules/home/views/home_view.dart
  5. 1 1
      lib/app/modules/home/widgets/bottom_navigation_bar.dart
  6. 7 6
      lib/app/modules/home/widgets/menu_list.dart
  7. 9 15
      lib/app/modules/language/controllers/language_controller.dart
  8. 2 1
      lib/app/modules/language/views/language_view.dart
  9. 15 13
      lib/app/modules/medialocation/controllers/medialocation_controller.dart
  10. 8 7
      lib/app/modules/medialocation/views/medialocation_view.dart
  11. 2 1
      lib/app/modules/node/views/node_view.dart
  12. 2 1
      lib/app/modules/precode/sendemail/views/precode_sendemail_view.dart
  13. 2 1
      lib/app/modules/precode/views/precode_view.dart
  14. 2 1
      lib/app/modules/routingmode/views/routingmode_view.dart
  15. 0 10
      lib/app/modules/setting/controllers/setting_controller.dart
  16. 22 21
      lib/app/modules/setting/views/setting_view.dart
  17. 6 5
      lib/app/modules/splittunneling/views/splittunneling_view.dart
  18. 21 22
      lib/app/modules/subscription/views/subscription_view.dart
  19. 89 1
      lib/config/translations/ar_AR/ar_ar_translation.dart
  20. 90 1
      lib/config/translations/de_DE/de_de_translation.dart
  21. 89 1
      lib/config/translations/en_US/en_us_translation.dart
  22. 92 1
      lib/config/translations/es_ES/es_es_translation.dart
  23. 91 1
      lib/config/translations/fa_IR/fa_ir_translation.dart
  24. 93 1
      lib/config/translations/fr_FR/fr_fr_translation.dart
  25. 86 1
      lib/config/translations/ja_JP/ja_jp_translation.dart
  26. 86 1
      lib/config/translations/ko_KR/ko_kr_translation.dart
  27. 94 1
      lib/config/translations/my_MM/my_mm_translation.dart
  28. 92 1
      lib/config/translations/ru_RU/ru_ru_translation.dart
  29. 144 56
      lib/config/translations/strings_enum.dart

+ 4 - 4
lib/app/components/country_restricted_overlay.dart

@@ -28,18 +28,18 @@ class CountryRestrictedOverlay extends StatelessWidget {
   String get _title {
     switch (type) {
       case RestrictedType.network:
-        return "Oops!";
+        return Strings.oops.tr;
       default:
-        return "Sorry";
+        return Strings.sorry.tr;
     }
   }
 
   String get _content {
     switch (type) {
       case RestrictedType.network:
-        return "Something went wrong\nUnable to load data";
+        return "${Strings.someThingWentWorng.tr}\n${Strings.unableToLoadData.tr}";
       default:
-        return "Due to local laws and regulations, \nNOMOVPN services are not available in \nyour current region.";
+        return Strings.dueLawsAndRegulations.tr;
     }
   }
 

+ 6 - 5
lib/app/modules/account/views/account_view.dart

@@ -9,6 +9,7 @@ import 'package:nomo/app/widgets/submit_btn.dart';
 import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 
 import '../../../../config/theme/dark_theme_colors.dart';
+import '../../../../config/translations/strings_enum.dart';
 import '../../../constants/assets.dart';
 import '../../../constants/iconfont/iconfont.dart';
 import '../../../widgets/ix_image.dart';
@@ -18,7 +19,7 @@ class AccountView extends BaseView<AccountController> {
   const AccountView({super.key});
 
   @override
-  PreferredSizeWidget? get appBar => IXAppBar(title: 'Account');
+  PreferredSizeWidget? get appBar => IXAppBar(title: Strings.account.tr);
 
   @override
   Widget buildContent(BuildContext context) {
@@ -116,7 +117,7 @@ class AccountView extends BaseView<AccountController> {
     return ClickOpacity(
       onTap: () {
         Clipboard.setData(ClipboardData(text: controller.uid));
-        Get.snackbar('已复制', 'UID 已复制到剪贴板');
+        Get.snackbar(Strings.copied.tr, 'UID ${Strings.copied.tr}');
       },
       child: Container(
         height: 56.w,
@@ -330,7 +331,7 @@ class AccountView extends BaseView<AccountController> {
         children: [
           // Upgrade to Premium 按钮
           SubmitButton(
-            text: 'Upgrade to Premium',
+            text: Strings.upgradeToPremium.tr,
             bgColor: Get.reactiveTheme.highlightColor,
             textColor: DarkThemeColors.subscriptionColor,
             onPressed: () {
@@ -340,7 +341,7 @@ class AccountView extends BaseView<AccountController> {
           20.verticalSpaceFromWidth,
           // Activate Pre Code 按钮
           _buildSecondaryButton(
-            text: 'Activate Pre Code',
+            text: Strings.activatePreCode.tr,
             icon: IconFont.icon23,
             onTap: () {
               // TODO: 激活兑换码
@@ -349,7 +350,7 @@ class AccountView extends BaseView<AccountController> {
           10.verticalSpaceFromWidth,
           // 提示文字
           Text(
-            'If you have a Pre code, please enter it to claim your Pre benefits.',
+            Strings.preCodeHint.tr,
             textAlign: TextAlign.center,
             style: TextStyle(
               fontSize: 12.sp,

+ 2 - 1
lib/app/modules/deviceauth/views/deviceauth_view.dart

@@ -9,6 +9,7 @@ import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 import 'package:pinput/pinput.dart';
 
 import '../../../../config/theme/dark_theme_colors.dart';
+import '../../../../config/translations/strings_enum.dart';
 import '../../../constants/iconfont/iconfont.dart';
 import '../../../widgets/info_card.dart';
 import '../controllers/deviceauth_controller.dart';
@@ -18,7 +19,7 @@ class DeviceauthView extends BaseView<DeviceauthController> {
   const DeviceauthView({super.key});
 
   @override
-  PreferredSizeWidget? get appBar => IXAppBar(title: 'Device Authorization');
+  PreferredSizeWidget? get appBar => IXAppBar(title: Strings.deviceAuthorization.tr);
 
   @override
   Widget buildContent(BuildContext context) {

+ 2 - 1
lib/app/modules/home/views/home_view.dart

@@ -4,6 +4,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
 import 'package:nomo/app/constants/iconfont/iconfont.dart';
 import '../../../../config/theme/theme_extensions/theme_extension.dart';
+import '../../../../config/translations/strings_enum.dart';
 import '../../../base/base_view.dart';
 import '../../../constants/assets.dart';
 import '../../../routes/app_pages.dart';
@@ -264,7 +265,7 @@ class HomeView extends BaseView<HomeController> {
                     ),
                     SizedBox(width: 4.w),
                     Text(
-                      'Recent',
+                      Strings.recent.tr,
                       style: TextStyle(
                         fontSize: 12.sp,
                         height: 1.2,

+ 1 - 1
lib/app/modules/home/widgets/bottom_navigation_bar.dart

@@ -43,7 +43,7 @@ class IXBottomNavigationBar extends StatelessWidget {
               ),
               _buildNavItem(
                 icon: Icons.person,
-                label: Strings.bottomBarMe.tr,
+                label: Strings.me.tr,
                 index: 2,
                 onTap: () => onTap(2),
               ),

+ 7 - 6
lib/app/modules/home/widgets/menu_list.dart

@@ -3,6 +3,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 '../../../constants/iconfont/iconfont.dart';
 import '../../../routes/app_pages.dart';
 
@@ -30,7 +31,7 @@ class MenuList extends StatelessWidget {
     return [
       MenuItem(
         icon: IconFont.icon19,
-        title: 'Movies&TV',
+        title: Strings.moviesAndTV.tr,
         iconColor: const Color(0xFFFF3B30),
         onTap: () {
           // 处理点击事件
@@ -40,7 +41,7 @@ class MenuList extends StatelessWidget {
       ),
       MenuItem(
         icon: IconFont.icon26,
-        title: 'Social',
+        title: Strings.social.tr,
         iconColor: const Color(0xFF007AFF),
         onTap: () {
           print('Social tapped');
@@ -48,7 +49,7 @@ class MenuList extends StatelessWidget {
       ),
       MenuItem(
         icon: IconFont.icon28,
-        title: 'Support',
+        title: Strings.support.tr,
         iconColor: const Color(0xFF34C759),
         onTap: () {
           print('Support tapped');
@@ -56,7 +57,7 @@ class MenuList extends StatelessWidget {
       ),
       MenuItem(
         icon: IconFont.icon41,
-        title: 'Sport',
+        title: Strings.sport.tr,
         iconColor: const Color(0xFFFF9500),
         onTap: () {
           print('Sport tapped');
@@ -64,7 +65,7 @@ class MenuList extends StatelessWidget {
       ),
       MenuItem(
         icon: IconFont.icon52,
-        title: 'Movies&TV',
+        title: Strings.music.tr,
         iconColor: const Color(0xFF00C7BE),
         onTap: () {
           print('Music tapped');
@@ -72,7 +73,7 @@ class MenuList extends StatelessWidget {
       ),
       MenuItem(
         icon: IconFont.icon53,
-        title: 'Movies&TV',
+        title: Strings.game.tr,
         iconColor: const Color(0xFFAF52DE),
         onTap: () {
           print('Game tapped');

+ 9 - 15
lib/app/modules/language/controllers/language_controller.dart

@@ -1,5 +1,7 @@
 import 'package:get/get.dart';
 
+import '../../../../config/translations/localization_service.dart';
+
 class LanguageInfo {
   final String code;
   final String name;
@@ -19,11 +21,11 @@ class LanguageController extends GetxController {
   // 支持的语言列表
   final List<LanguageInfo> languages = [
     LanguageInfo(code: 'en', name: 'English', nativeName: '英语'),
-    LanguageInfo(
-      code: 'zh',
-      name: 'Chinese (Simplified)',
-      nativeName: '中文 (简体)',
-    ),
+    // LanguageInfo(
+    //   code: 'zh',
+    //   name: 'Chinese (Simplified)',
+    //   nativeName: '中文 (简体)',
+    // ),
     LanguageInfo(code: 'es', name: 'Español', nativeName: '西班牙语'),
     LanguageInfo(code: 'fr', name: 'Français', nativeName: '法语'),
     LanguageInfo(code: 'de', name: 'Deutsch', nativeName: '德语'),
@@ -34,21 +36,13 @@ class LanguageController extends GetxController {
   @override
   void onInit() {
     super.onInit();
-  }
-
-  @override
-  void onReady() {
-    super.onReady();
-  }
-
-  @override
-  void onClose() {
-    super.onClose();
+    selectedLanguage.value = LocalizationService.getCurrentLocal().languageCode;
   }
 
   /// 选择语言
   void selectLanguage(String languageCode) {
     selectedLanguage.value = languageCode;
+    LocalizationService.updateLanguage(languageCode);
   }
 
   /// 获取当前选中的语言信息

+ 2 - 1
lib/app/modules/language/views/language_view.dart

@@ -6,13 +6,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/language_controller.dart';
 
 class LanguageView extends BaseView<LanguageController> {
   const LanguageView({super.key});
 
   @override
-  PreferredSizeWidget? get appBar => IXAppBar(title: 'Language');
+  PreferredSizeWidget? get appBar => IXAppBar(title: Strings.language.tr);
 
   @override
   Widget buildContent(BuildContext context) {

+ 15 - 13
lib/app/modules/medialocation/controllers/medialocation_controller.dart

@@ -1,5 +1,7 @@
 import 'package:get/get.dart';
 
+import '../../../../config/translations/strings_enum.dart';
+
 /// 流媒体服务数据模型
 class StreamingService {
   final String name;
@@ -19,25 +21,25 @@ class MedialocationController extends GetxController {
   final isConnecting = false.obs;
 
   // 流媒体服务列表
-  final List<StreamingService> streamingServices = [
+  List<StreamingService> get streamingServices => [
     StreamingService(
-      name: 'Netflix',
-      description: 'Nifty Streaming',
+      name: Strings.netflix.tr,
+      description: Strings.niftyStreaming.tr,
       logoUrl: 'assets/images/netflix_logo.png',
     ),
     StreamingService(
-      name: 'YouTube',
-      description: 'YouTube Streaming',
+      name: Strings.youtube.tr,
+      description: Strings.youtubeStreaming.tr,
       logoUrl: 'assets/images/youtube_logo.png',
     ),
     StreamingService(
-      name: 'hulu',
-      description: 'hulu Streaming',
+      name: Strings.hulu.tr,
+      description: Strings.huluStreaming.tr,
       logoUrl: 'assets/images/hulu_logo.png',
     ),
     StreamingService(
-      name: 'Amazon',
-      description: 'Amazon Streaming',
+      name: Strings.amazon.tr,
+      description: Strings.amazonStreaming.tr,
       logoUrl: 'assets/images/amazon_logo.png',
     ),
   ];
@@ -60,8 +62,8 @@ class MedialocationController extends GetxController {
   /// 打开流媒体服务
   void openStreamingService(StreamingService service) {
     Get.snackbar(
-      'Opening',
-      '${service.name} will open soon',
+      Strings.opening.tr,
+      '${service.name} ${Strings.willOpenSoon.tr}',
     );
   }
 
@@ -76,8 +78,8 @@ class MedialocationController extends GetxController {
       isConnecting.value = false;
       isConnected.value = true;
       Get.snackbar(
-        'Success',
-        'Connected successfully',
+        Strings.success.tr,
+        Strings.connectedSuccessfully.tr,
       );
     });
   }

+ 8 - 7
lib/app/modules/medialocation/views/medialocation_view.dart

@@ -3,6 +3,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
 import 'package:nomo/config/theme/dark_theme_colors.dart';
 
+import '../../../../config/translations/strings_enum.dart';
 import '../../../constants/assets.dart';
 import '../../../constants/iconfont/iconfont.dart';
 import '../../../widgets/click_opacity.dart';
@@ -149,10 +150,10 @@ class MedialocationView extends GetView<MedialocationController> {
           // 连接状态
           Obx(() {
             final text = controller.isConnected.value
-                ? 'Connected'
+                ? Strings.connected.tr
                 : controller.isConnecting.value
-                ? 'Connecting'
-                : 'Disconnected';
+                ? Strings.connecting.tr
+                : Strings.disconnected.tr;
             final textColor = controller.isConnected.value
                 ? DarkThemeColors.text1
                 : controller.isConnecting.value
@@ -281,7 +282,7 @@ class MedialocationView extends GetView<MedialocationController> {
                 borderRadius: BorderRadius.circular(20.r),
               ),
               child: Text(
-                'Open',
+                Strings.open.tr,
                 style: TextStyle(fontSize: 13.sp, color: DarkThemeColors.text1),
               ),
             ),
@@ -350,10 +351,10 @@ class MedialocationView extends GetView<MedialocationController> {
       child: Obx(() {
         return SubmitButton(
           text: controller.isConnected.value
-              ? 'Disconnect'
+              ? Strings.disconnect.tr
               : controller.isConnecting.value
-              ? 'Connecting...'
-              : 'Connect',
+              ? Strings.connecting.tr
+              : Strings.connect.tr,
           onPressed: controller.isConnected.value
               ? controller.disconnect
               : controller.connect,

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

@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
 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 '../../../widgets/ix_app_bar.dart';
 import '../controllers/node_controller.dart';
@@ -11,7 +12,7 @@ class NodeView extends BaseView<NodeController> {
   const NodeView({super.key});
 
   @override
-  PreferredSizeWidget? get appBar => IXAppBar(title: 'Select Server');
+  PreferredSizeWidget? get appBar => IXAppBar(title: Strings.selectServer.tr);
 
   @override
   Widget buildContent(BuildContext context) {

+ 2 - 1
lib/app/modules/precode/sendemail/views/precode_sendemail_view.dart

@@ -6,6 +6,7 @@ import 'package:nomo/app/widgets/submit_btn.dart';
 import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 
 import '../../../../../config/theme/dark_theme_colors.dart';
+import '../../../../../config/translations/strings_enum.dart';
 import '../../../../constants/assets.dart';
 import '../../../../constants/iconfont/iconfont.dart';
 import '../../../../widgets/info_card.dart';
@@ -18,7 +19,7 @@ class PrecodeSendemailView extends BaseView<PrecodeSendemailController> {
   const PrecodeSendemailView({super.key});
 
   @override
-  PreferredSizeWidget? get appBar => IXAppBar(title: 'Send Pre Code to Email');
+  PreferredSizeWidget? get appBar => IXAppBar(title: Strings.sendPreCodeToEmail.tr);
 
   @override
   Widget buildContent(BuildContext context) {

+ 2 - 1
lib/app/modules/precode/views/precode_view.dart

@@ -7,6 +7,7 @@ import 'package:nomo/app/widgets/ix_image.dart';
 import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 
 import '../../../../config/theme/dark_theme_colors.dart';
+import '../../../../config/translations/strings_enum.dart';
 import '../../../constants/assets.dart';
 import '../../../constants/iconfont/iconfont.dart';
 import '../../../widgets/ix_app_bar.dart';
@@ -17,7 +18,7 @@ class PrecodeView extends BaseView<PrecodeController> {
   const PrecodeView({super.key});
 
   @override
-  PreferredSizeWidget? get appBar => IXAppBar(title: 'My Pre Code');
+  PreferredSizeWidget? get appBar => IXAppBar(title: Strings.myPreCode.tr);
 
   @override
   Widget buildContent(BuildContext context) {

+ 2 - 1
lib/app/modules/routingmode/views/routingmode_view.dart

@@ -6,6 +6,7 @@ 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 '../../../constants/iconfont/iconfont.dart';
 import '../controllers/routingmode_controller.dart';
 
@@ -13,7 +14,7 @@ class RoutingmodeView extends BaseView<RoutingmodeController> {
   const RoutingmodeView({super.key});
 
   @override
-  PreferredSizeWidget? get appBar => IXAppBar(title: 'Routing Mode');
+  PreferredSizeWidget? get appBar => IXAppBar(title: Strings.routingMode.tr);
 
   @override
   Widget buildContent(BuildContext context) {

+ 0 - 10
lib/app/modules/setting/controllers/setting_controller.dart

@@ -10,14 +10,4 @@ class SettingController extends GetxController {
   void onInit() {
     super.onInit();
   }
-
-  @override
-  void onReady() {
-    super.onReady();
-  }
-
-  @override
-  void onClose() {
-    super.onClose();
-  }
 }

+ 22 - 21
lib/app/modules/setting/views/setting_view.dart

@@ -12,6 +12,7 @@ import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 import 'package:nomo/utils/device_manager.dart';
 
 import '../../../../config/theme/dark_theme_colors.dart';
+import '../../../../config/translations/localization_service.dart';
 import '../../../../config/translations/strings_enum.dart';
 import '../../../../utils/system_helper.dart';
 import '../../../components/ix_snackbar.dart';
@@ -24,18 +25,18 @@ class SettingView extends BaseView<SettingController> {
   const SettingView({super.key});
 
   @override
-  PreferredSizeWidget? get appBar => IXAppBar(title: 'Settings');
+  PreferredSizeWidget? get appBar => IXAppBar(title: Strings.settings.tr);
 
   @override
   Widget buildContent(BuildContext context) {
     return CustomScrollView(
       slivers: [
         // Account Section
-        _buildSectionHeader('Account'),
+        _buildSectionHeader(Strings.account.tr),
         _buildAccountSection(),
 
         // Network Section
-        _buildSectionHeader('Network'),
+        _buildSectionHeader(Strings.networkSection.tr),
         _buildNetworkSection(),
 
         // APP Section
@@ -43,7 +44,7 @@ class SettingView extends BaseView<SettingController> {
         _buildAppSection(),
 
         // Security Section
-        _buildSectionHeader('Security'),
+        _buildSectionHeader(Strings.securitySection.tr),
         _buildSecuritySection(),
 
         // 底部间距
@@ -85,7 +86,7 @@ class SettingView extends BaseView<SettingController> {
               _buildSettingItem(
                 icon: IconFont.icon29,
                 iconColor: Get.reactiveTheme.shadowColor,
-                title: 'Account',
+                title: Strings.account.tr,
                 trailing: IXImage(
                   source: isPremium ? Assets.premium : Assets.free,
                   width: isPremium ? 92.w : 64.w,
@@ -130,7 +131,7 @@ class SettingView extends BaseView<SettingController> {
                 _buildSettingItem(
                   icon: IconFont.icon23,
                   iconColor: Get.reactiveTheme.shadowColor,
-                  title: 'My Pre Code',
+                  title: Strings.myPreCode.tr,
                   trailing: Row(
                     mainAxisSize: MainAxisSize.min,
                     children: [
@@ -158,7 +159,7 @@ class SettingView extends BaseView<SettingController> {
                 _buildSettingItem(
                   icon: IconFont.icon30,
                   iconColor: Get.reactiveTheme.shadowColor,
-                  title: 'Valid Term',
+                  title: Strings.validTerm.tr,
                   trailing: Text(
                     'Year / 2026-12-12',
                     style: TextStyle(
@@ -175,7 +176,7 @@ class SettingView extends BaseView<SettingController> {
                 _buildSettingItem(
                   icon: IconFont.icon30,
                   iconColor: Get.reactiveTheme.shadowColor,
-                  title: 'Free Time',
+                  title: Strings.freeTime.tr,
                   trailing: Text(
                     '01:60:59 / Days',
                     style: TextStyle(
@@ -190,7 +191,7 @@ class SettingView extends BaseView<SettingController> {
               _buildSettingItem(
                 icon: IconFont.icon31,
                 iconColor: Get.reactiveTheme.shadowColor,
-                title: 'Device Authorization',
+                title: Strings.deviceAuthorization.tr,
                 trailing: Row(
                   mainAxisSize: MainAxisSize.min,
                   children: [
@@ -234,7 +235,7 @@ class SettingView extends BaseView<SettingController> {
             _buildSettingItem(
               icon: IconFont.icon34,
               iconColor: Get.reactiveTheme.primaryColor,
-              title: 'Routing Mode',
+              title: Strings.routingMode.tr,
               trailing: Icon(
                 IconFont.icon02,
                 size: 20.w,
@@ -249,7 +250,7 @@ class SettingView extends BaseView<SettingController> {
             _buildSettingItem(
               icon: IconFont.icon32,
               iconColor: Get.reactiveTheme.primaryColor,
-              title: 'Split Tunneling',
+              title: Strings.splitTunneling.tr,
               trailing: Icon(
                 IconFont.icon02,
                 size: 20.w,
@@ -264,7 +265,7 @@ class SettingView extends BaseView<SettingController> {
             _buildSettingItem(
               icon: IconFont.icon33,
               iconColor: Get.reactiveTheme.primaryColor,
-              title: 'Auto Reconnect',
+              title: Strings.autoReconnect.tr,
               trailing: Obx(
                 () => CupertinoSwitch(
                   value: controller.autoReconnect.value,
@@ -282,7 +283,7 @@ class SettingView extends BaseView<SettingController> {
             _buildSettingItem(
               icon: IconFont.icon35,
               iconColor: Get.reactiveTheme.primaryColor,
-              title: 'Restore Default',
+              title: Strings.restoreDefault.tr,
               trailing: Icon(
                 IconFont.icon02,
                 size: 20.w,
@@ -320,12 +321,12 @@ class SettingView extends BaseView<SettingController> {
                 begin: Alignment.topCenter,
                 end: Alignment.bottomCenter,
               ),
-              title: 'Language',
+              title: Strings.language.tr,
               trailing: Row(
                 mainAxisSize: MainAxisSize.min,
                 children: [
                   Text(
-                    'English',
+                    LocalizationService.getGlobalLanguageTitle(),
                     style: TextStyle(
                       fontSize: 13.sp,
                       color: Get.reactiveTheme.hintColor,
@@ -356,7 +357,7 @@ class SettingView extends BaseView<SettingController> {
                 begin: Alignment.topCenter,
                 end: Alignment.bottomCenter,
               ),
-              title: 'Feedback',
+              title: Strings.feedback.tr,
               trailing: Icon(
                 IconFont.icon02,
                 size: 20.w,
@@ -379,7 +380,7 @@ class SettingView extends BaseView<SettingController> {
                 begin: Alignment.topCenter,
                 end: Alignment.bottomCenter,
               ),
-              title: 'Privacy Policy',
+              title: Strings.privacyPolicy.tr,
               trailing: Icon(
                 IconFont.icon02,
                 size: 20.w,
@@ -402,7 +403,7 @@ class SettingView extends BaseView<SettingController> {
                 begin: Alignment.topCenter,
                 end: Alignment.bottomCenter,
               ),
-              title: 'Terms of Service',
+              title: Strings.termsOfService.tr,
               trailing: Icon(
                 IconFont.icon02,
                 size: 20.w,
@@ -425,7 +426,7 @@ class SettingView extends BaseView<SettingController> {
                 begin: Alignment.topCenter,
                 end: Alignment.bottomCenter,
               ),
-              title: 'Version',
+              title: Strings.version.tr,
               trailing: Text(
                 'V1.0.0',
                 style: TextStyle(
@@ -463,7 +464,7 @@ class SettingView extends BaseView<SettingController> {
                 begin: Alignment.topCenter,
                 end: Alignment.bottomCenter,
               ),
-              title: 'Delete Account',
+              title: Strings.deleteAccount.tr,
               onTap: () {
                 // TODO: 删除账户
               },
@@ -481,7 +482,7 @@ class SettingView extends BaseView<SettingController> {
                 begin: Alignment.topCenter,
                 end: Alignment.bottomCenter,
               ),
-              title: 'Logout',
+              title: Strings.logout.tr,
               titleColor: const Color(0xFFEF0000),
               onTap: () {
                 // TODO: 退出登录

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

@@ -9,6 +9,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 '../controllers/splittunneling_controller.dart';
 import '../selectapp/controllers/splittunneling_selectapp_controller.dart';
 
@@ -16,7 +17,7 @@ class SplittunnelingView extends BaseView<SplittunnelingController> {
   const SplittunnelingView({super.key});
 
   @override
-  PreferredSizeWidget? get appBar => IXAppBar(title: 'Split Tunneling');
+  PreferredSizeWidget? get appBar => IXAppBar(title: Strings.splitTunneling.tr);
 
   @override
   Widget buildContent(BuildContext context) {
@@ -79,7 +80,7 @@ class SplittunnelingView extends BaseView<SplittunnelingController> {
         _buildModeCard(
           mode: SplitTunnelingMode.exclude,
           icon: IconFont.icon42,
-          title: 'Exclude selected apps from VPN',
+          title: Strings.excludeSelectedAppsFromVPN.tr,
           description:
               'Choose apps that will connect directly without using the VPN.',
           onTap: () {
@@ -94,7 +95,7 @@ class SplittunnelingView extends BaseView<SplittunnelingController> {
         _buildModeCard(
           mode: SplitTunnelingMode.include,
           icon: IconFont.icon43,
-          title: 'Use VPN for selected apps only',
+          title: Strings.useVPNForSelectedAppsOnly.tr,
           description:
               'Choose apps that will use the VPN while others connect normally.',
           onTap: () {
@@ -230,7 +231,7 @@ class SplittunnelingView extends BaseView<SplittunnelingController> {
           child: Row(
             children: [
               Text(
-                'Select apps',
+                Strings.selectApps.tr,
                 style: TextStyle(
                   fontSize: 12.sp,
                   color: Get.reactiveTheme.hintColor,
@@ -343,7 +344,7 @@ class SplittunnelingView extends BaseView<SplittunnelingController> {
               ),
               4.horizontalSpace,
               Text(
-                'Customize your VPN',
+                Strings.customizeYourVPN.tr,
                 style: TextStyle(
                   fontSize: 14.sp,
                   height: 1.6,

+ 21 - 22
lib/app/modules/subscription/views/subscription_view.dart

@@ -5,6 +5,7 @@ import 'package:nomo/app/constants/iconfont/iconfont.dart';
 import 'package:nomo/config/theme/dark_theme_colors.dart';
 import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 import 'package:video_player/video_player.dart';
+import '../../../../config/translations/strings_enum.dart';
 import '../../../constants/assets.dart';
 import '../../../widgets/info_card.dart';
 import '../../../widgets/ix_image.dart';
@@ -99,7 +100,7 @@ class SubscriptionView extends GetView<SubscriptionController> {
         children: [
           SizedBox(width: 32.w),
           Text(
-            'Subscription',
+            Strings.subscription.tr,
             style: TextStyle(
               fontSize: 16.sp,
               height: 1.4,
@@ -150,7 +151,7 @@ class SubscriptionView extends GetView<SubscriptionController> {
                   ),
                   4.horizontalSpace,
                   Text(
-                    'Current subscription',
+                    Strings.currentSubscription.tr,
                     style: TextStyle(
                       fontSize: 14.sp,
                       height: 1.4,
@@ -311,26 +312,24 @@ class SubscriptionView extends GetView<SubscriptionController> {
   // 计划变更信息
   Widget _buildPlanChangeInfo() {
     return InfoCard(
-      title: 'Plan change info',
+      title: Strings.planChangeInfo.tr,
       items: [
         InfoItem(
           imageSource: Assets.subscriptionPlanChange1,
-          title: 'When it starts',
-          description: 'Your new plan begins right away.',
+          title: Strings.whenItStarts.tr,
+          description: Strings.yourNewPlanBeginsRightAway.tr,
           iconColor: DarkThemeColors.primaryColor,
         ),
         InfoItem(
           imageSource: Assets.subscriptionPlanChange2,
-          title: 'What happens to your balance',
-          description:
-              'Any unused amount from your old plan will be added to the new one.',
+          title: Strings.whatHappensToYourBalance.tr,
+          description: Strings.anyUnusedAmountFromYourOldPlan.tr,
           iconColor: DarkThemeColors.primaryColor,
         ),
         InfoItem(
           imageSource: Assets.subscriptionPlanChange3,
-          title: 'Extra time',
-          description:
-              'You\'ll get extra days based on your remaining balance.',
+          title: Strings.extraTime.tr,
+          description: Strings.youllGetExtraDays.tr,
           iconColor: DarkThemeColors.primaryColor,
         ),
       ],
@@ -343,7 +342,7 @@ class SubscriptionView extends GetView<SubscriptionController> {
       crossAxisAlignment: CrossAxisAlignment.start,
       children: [
         Text(
-          'Premium\'s included',
+          Strings.premiumsIncluded.tr,
           style: TextStyle(
             fontSize: 16.sp,
             color: DarkThemeColors.subscriptionColor,
@@ -359,12 +358,12 @@ class SubscriptionView extends GetView<SubscriptionController> {
           ),
           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),
             ],
           ),
         ),
@@ -426,7 +425,7 @@ class SubscriptionView extends GetView<SubscriptionController> {
               ),
               child: Center(
                 child: Text(
-                  'Confirm Change',
+                  Strings.confirmChange.tr,
                   style: TextStyle(
                     fontSize: 16.sp,
                     color: DarkThemeColors.subscriptionColor,
@@ -444,7 +443,7 @@ class SubscriptionView extends GetView<SubscriptionController> {
               GestureDetector(
                 onTap: controller.restorePurchases,
                 child: Text(
-                  'Restore Purchases',
+                  Strings.restorePurchases.tr,
                   style: TextStyle(
                     fontSize: 16.sp,
                     color: DarkThemeColors.bodyTextColor,
@@ -461,7 +460,7 @@ class SubscriptionView extends GetView<SubscriptionController> {
               GestureDetector(
                 onTap: controller.handlePaymentIssue,
                 child: Text(
-                  'Payment issue',
+                  Strings.paymentIssue.tr,
                   style: TextStyle(
                     fontSize: 16.sp,
                     color: DarkThemeColors.bodyTextColor,
@@ -482,7 +481,7 @@ class SubscriptionView extends GetView<SubscriptionController> {
               ),
               10.horizontalSpace,
               Text(
-                'Yearly auto-renew. Cancel anytime',
+                Strings.yearlyAutoRenewCancelAnytime.tr,
                 style: TextStyle(
                   fontSize: 13.sp,
                   color: DarkThemeColors.hintTextColor,

+ 89 - 1
lib/config/translations/ar_AR/ar_ar_translation.dart

@@ -224,7 +224,6 @@ final Map<String, String> arAR = {
   Strings.signOut: 'تسجيل الخروج',
 
   // حوار تسجيل الخروج
-  Strings.signOutTitle: 'تسجيل الخروج',
   Strings.signOutMessage:
       'سيؤدي هذا إلى حذف جميع البيانات المحلية (بما في ذلك الإعدادات والسجل) من هذا الجهاز.',
   Strings.signOutWarning: 'لا يمكن التراجع عن هذا الإجراء.',
@@ -336,4 +335,93 @@ final Map<String, String> arAR = {
 
   // local boost
   Strings.localBoost: 'تعزيز محلي',
+
+  // setting page
+  Strings.networkSection: 'الشبكة',
+  Strings.securitySection: 'الأمان',
+  Strings.myPreCode: 'رمزي المسبق',
+  Strings.validTerm: 'المدة الصالحة',
+  Strings.freeTime: 'الوقت المجاني',
+  Strings.deviceAuthorization: 'ترخيص الجهاز',
+  Strings.routingMode: 'وضع التوجيه',
+  Strings.splitTunneling: 'النفق المقسم',
+  Strings.autoReconnect: 'إعادة الاتصال التلقائي',
+  Strings.restoreDefault: 'استعادة الافتراضي',
+  Strings.deleteAccount: 'حذف الحساب',
+  Strings.logout: 'تسجيل الخروج',
+
+  // media location page
+  Strings.connected: 'متصل',
+  Strings.disconnected: 'غير متصل',
+  Strings.open: 'فتح',
+  Strings.disconnect: 'قطع الاتصال',
+  Strings.connect: 'اتصال',
+  Strings.opening: 'جاري الفتح',
+  Strings.connectedSuccessfully: 'تم الاتصال بنجاح',
+  Strings.willOpenSoon: 'سيتم فتحه قريبًا',
+  Strings.netflix: 'Netflix',
+  Strings.youtube: 'YouTube',
+  Strings.amazon: 'Amazon',
+  Strings.hulu: 'hulu',
+  Strings.niftyStreaming: 'Nifty Streaming',
+  Strings.youtubeStreaming: 'YouTube Streaming',
+  Strings.amazonStreaming: 'Amazon Streaming',
+  Strings.huluStreaming: 'hulu Streaming',
+
+  // split tunneling page
+  Strings.excludeSelectedAppsFromVPN: 'استبعاد التطبيقات المحددة من VPN',
+  Strings.useVPNForSelectedAppsOnly: 'استخدام VPN للتطبيقات المحددة فقط',
+  Strings.selectApps: 'اختيار التطبيقات',
+  Strings.customizeYourVPN: 'تخصيص VPN الخاص بك',
+
+  // subscription page
+  Strings.subscription: 'الاشتراك',
+  Strings.currentSubscription: 'الاشتراك الحالي',
+  Strings.upgradeToPremium: 'الترقية إلى Premium',
+  Strings.activatePreCode: 'تفعيل الرمز المسبق',
+  Strings.preCodeHint:
+      'إذا كان لديك رمز مسبق، يرجى إدخاله للمطالبة بمزايا Pre الخاصة بك.',
+  Strings.planChangeInfo: 'معلومات تغيير الخطة',
+  Strings.whenItStarts: 'متى يبدأ',
+  Strings.whatHappensToYourBalance: 'ماذا يحدث لرصيدك',
+  Strings.extraTime: 'وقت إضافي',
+  Strings.yourNewPlanBeginsRightAway: 'تبدأ خطتك الجديدة على الفور.',
+  Strings.anyUnusedAmountFromYourOldPlan:
+      'سيتم إضافة أي مبلغ غير مستخدم من خطتك القديمة إلى الجديدة.',
+  Strings.youllGetExtraDays: 'ستحصل على أيام إضافية بناءً على رصيدك المتبقي.',
+  Strings.premiumsIncluded: 'Premium مشمول',
+  Strings.unlockAllFreeLocations: 'فتح جميع المواقع المجانية',
+  Strings.unlockSmartMode: 'فتح الوضع الذكي',
+  Strings.unlockMultiHopMode: 'فتح وضع Multi-hop',
+  Strings.premiumCanShareXDevices: 'يمكن لـ Premium مشاركة X أجهزة',
+  Strings.ownYourOwnPrivateServer: 'امتلك خادمك الخاص',
+  Strings.closeAds: 'إغلاق الإعلانات',
+  Strings.confirmChange: 'تأكيد التغيير',
+  Strings.restorePurchases: 'استعادة المشتريات',
+  Strings.paymentIssue: 'مشكلة في الدفع',
+  Strings.yearlyAutoRenewCancelAnytime:
+      'التجديد التلقائي السنوي. يمكن الإلغاء في أي وقت',
+
+  // home page
+  Strings.recent: 'الأخيرة',
+  Strings.moviesAndTV: 'أفلام وتلفزيون',
+  Strings.social: 'اجتماعي',
+  Strings.support: 'الدعم',
+  Strings.sport: 'رياضة',
+  Strings.music: 'موسيقى',
+  Strings.game: 'ألعاب',
+
+  // country restricted
+  Strings.sorry: 'عذرًا',
+  Strings.unableToLoadData: 'تعذر تحميل البيانات',
+  Strings.dueLawsAndRegulations:
+      'بسبب القوانين واللوائح المحلية، \nخدمات NOMOVPN غير متاحة في \nمنطقتك الحالية.',
+
+  // more pages
+  Strings.sendPreCodeToEmail: 'إرسال الرمز المسبق إلى البريد الإلكتروني',
+  Strings.selectServer: 'اختيار الخادم',
+  Strings.relieveDevice: 'إلغاء ترخيص الجهاز',
+  Strings.relieve: 'إلغاء الترخيص',
+  Strings.info: 'معلومات',
+  Strings.restoringPurchases: 'جاري استعادة المشتريات...',
 };

+ 90 - 1
lib/config/translations/de_DE/de_de_translation.dart

@@ -242,7 +242,6 @@ Ihr Surfen ist mit「FKey.win」privat - keine Verfolgung oder Datensammlung.'''
   Strings.signOut: 'Abmelden',
 
   // Sign out dialog
-  Strings.signOutTitle: 'Abmelden',
   Strings.signOutMessage:
       'Dies löscht alle lokalen Daten (einschließlich Einstellungen und Verlauf) von diesem Gerät.',
   Strings.signOutWarning: 'Diese Aktion kann nicht rückgängig gemacht werden.',
@@ -355,4 +354,94 @@ Ihr Surfen ist mit「FKey.win」privat - keine Verfolgung oder Datensammlung.'''
 
   // local boost
   Strings.localBoost: 'Lokales Boosten',
+
+  // setting page
+  Strings.networkSection: 'Netzwerk',
+  Strings.securitySection: 'Sicherheit',
+  Strings.myPreCode: 'Mein Pre-Code',
+  Strings.validTerm: 'Gültige Laufzeit',
+  Strings.freeTime: 'Kostenlose Zeit',
+  Strings.deviceAuthorization: 'Geräteautorisierung',
+  Strings.routingMode: 'Routing-Modus',
+  Strings.splitTunneling: 'Split-Tunneling',
+  Strings.autoReconnect: 'Automatisch erneut verbinden',
+  Strings.restoreDefault: 'Standard wiederherstellen',
+  Strings.deleteAccount: 'Konto löschen',
+  Strings.logout: 'Abmelden',
+
+  // media location page
+  Strings.connected: 'Verbunden',
+  Strings.disconnected: 'Getrennt',
+  Strings.open: 'Öffnen',
+  Strings.disconnect: 'Trennen',
+  Strings.connect: 'Verbinden',
+  Strings.opening: 'Wird geöffnet',
+  Strings.connectedSuccessfully: 'Erfolgreich verbunden',
+  Strings.willOpenSoon: 'wird bald geöffnet',
+  Strings.netflix: 'Netflix',
+  Strings.youtube: 'YouTube',
+  Strings.amazon: 'Amazon',
+  Strings.hulu: 'hulu',
+  Strings.niftyStreaming: 'Nifty Streaming',
+  Strings.youtubeStreaming: 'YouTube Streaming',
+  Strings.amazonStreaming: 'Amazon Streaming',
+  Strings.huluStreaming: 'hulu Streaming',
+
+  // split tunneling page
+  Strings.excludeSelectedAppsFromVPN: 'Ausgewählte Apps von VPN ausschließen',
+  Strings.useVPNForSelectedAppsOnly: 'VPN nur für ausgewählte Apps verwenden',
+  Strings.selectApps: 'Apps auswählen',
+  Strings.customizeYourVPN: 'Passen Sie Ihr VPN an',
+
+  // subscription page
+  Strings.subscription: 'Abonnement',
+  Strings.currentSubscription: 'Aktuelles Abonnement',
+  Strings.upgradeToPremium: 'Auf Premium upgraden',
+  Strings.activatePreCode: 'Pre-Code aktivieren',
+  Strings.preCodeHint:
+      'Wenn Sie einen Pre-Code haben, geben Sie ihn ein, um Ihre Pre-Vorteile zu beanspruchen.',
+  Strings.planChangeInfo: 'Plan-Änderungsinformationen',
+  Strings.whenItStarts: 'Wann es beginnt',
+  Strings.whatHappensToYourBalance: 'Was mit Ihrem Guthaben passiert',
+  Strings.extraTime: 'Zusätzliche Zeit',
+  Strings.yourNewPlanBeginsRightAway: 'Ihr neuer Plan beginnt sofort.',
+  Strings.anyUnusedAmountFromYourOldPlan:
+      'Jeder nicht genutzte Betrag aus Ihrem alten Plan wird dem neuen hinzugefügt.',
+  Strings.youllGetExtraDays:
+      'Sie erhalten zusätzliche Tage basierend auf Ihrem verbleibenden Guthaben.',
+  Strings.premiumsIncluded: 'Premium inklusive',
+  Strings.unlockAllFreeLocations: 'Alle kostenlosen Standorte freischalten',
+  Strings.unlockSmartMode: 'Smart-Modus freischalten',
+  Strings.unlockMultiHopMode: 'Multi-Hop-Modus freischalten',
+  Strings.premiumCanShareXDevices: 'Premium kann X Geräte teilen',
+  Strings.ownYourOwnPrivateServer: 'Besitzen Sie Ihren eigenen privaten Server',
+  Strings.closeAds: 'Anzeigen schließen',
+  Strings.confirmChange: 'Änderung bestätigen',
+  Strings.restorePurchases: 'Käufe wiederherstellen',
+  Strings.paymentIssue: 'Zahlungsproblem',
+  Strings.yearlyAutoRenewCancelAnytime:
+      'Jährliche automatische Verlängerung. Jederzeit kündbar',
+
+  // home page
+  Strings.recent: 'Aktuell',
+  Strings.moviesAndTV: 'Filme und TV',
+  Strings.social: 'Sozial',
+  Strings.support: 'Unterstützung',
+  Strings.sport: 'Sport',
+  Strings.music: 'Musik',
+  Strings.game: 'Spiel',
+
+  // country restricted
+  Strings.sorry: 'Entschuldigung',
+  Strings.unableToLoadData: 'Daten können nicht geladen werden',
+  Strings.dueLawsAndRegulations:
+      'Aufgrund lokaler Gesetze und Vorschriften sind \nNOMOVPN-Dienste in \nIhrer aktuellen Region nicht verfügbar.',
+
+  // more pages
+  Strings.sendPreCodeToEmail: 'Pre-Code an E-Mail senden',
+  Strings.selectServer: 'Server auswählen',
+  Strings.relieveDevice: 'Gerät freigeben',
+  Strings.relieve: 'Freigeben',
+  Strings.info: 'Info',
+  Strings.restoringPurchases: 'Käufe werden wiederhergestellt...',
 };

+ 89 - 1
lib/config/translations/en_US/en_us_translation.dart

@@ -234,7 +234,6 @@ Your browsing is private with 「FKey.win」 – no tracking or data collection.
   Strings.signOut: 'Sign Out',
 
   // Sign out dialog
-  Strings.signOutTitle: 'Sign Out',
   Strings.signOutMessage:
       'This will delete all local data (including settings and history) from this device.',
   Strings.signOutWarning: 'This action cannot be undone.',
@@ -345,4 +344,93 @@ Your browsing is private with 「FKey.win」 – no tracking or data collection.
 
   // local boost
   Strings.localBoost: 'Local Boost',
+
+  // setting page
+  Strings.networkSection: 'Network',
+  Strings.securitySection: 'Security',
+  Strings.myPreCode: 'My Pre Code',
+  Strings.validTerm: 'Valid Term',
+  Strings.freeTime: 'Free Time',
+  Strings.deviceAuthorization: 'Device Authorization',
+  Strings.routingMode: 'Routing Mode',
+  Strings.splitTunneling: 'Split Tunneling',
+  Strings.autoReconnect: 'Auto Reconnect',
+  Strings.restoreDefault: 'Restore Default',
+  Strings.deleteAccount: 'Delete Account',
+  Strings.logout: 'Logout',
+
+  // media location page
+  Strings.connected: 'Connected',
+  Strings.disconnected: 'Disconnected',
+  Strings.open: 'Open',
+  Strings.disconnect: 'Disconnect',
+  Strings.connect: 'Connect',
+  Strings.opening: 'Opening',
+  Strings.connectedSuccessfully: 'Connected successfully',
+  Strings.willOpenSoon: 'will open soon',
+  Strings.netflix: 'Netflix',
+  Strings.youtube: 'YouTube',
+  Strings.amazon: 'Amazon',
+  Strings.hulu: 'hulu',
+  Strings.niftyStreaming: 'Nifty Streaming',
+  Strings.youtubeStreaming: 'YouTube Streaming',
+  Strings.amazonStreaming: 'Amazon Streaming',
+  Strings.huluStreaming: 'hulu Streaming',
+
+  // split tunneling page
+  Strings.excludeSelectedAppsFromVPN: 'Exclude selected apps from VPN',
+  Strings.useVPNForSelectedAppsOnly: 'Use VPN for selected apps only',
+  Strings.selectApps: 'Select apps',
+  Strings.customizeYourVPN: 'Customize your VPN',
+
+  // subscription page
+  Strings.subscription: 'Subscription',
+  Strings.currentSubscription: 'Current subscription',
+  Strings.upgradeToPremium: 'Upgrade to Premium',
+  Strings.activatePreCode: 'Activate Pre Code',
+  Strings.preCodeHint:
+      'If you have a Pre code, please enter it to claim your Pre benefits.',
+  Strings.planChangeInfo: 'Plan change info',
+  Strings.whenItStarts: 'When it starts',
+  Strings.whatHappensToYourBalance: 'What happens to your balance',
+  Strings.extraTime: 'Extra time',
+  Strings.yourNewPlanBeginsRightAway: 'Your new plan begins right away.',
+  Strings.anyUnusedAmountFromYourOldPlan:
+      'Any unused amount from your old plan will be added to the new one.',
+  Strings.youllGetExtraDays:
+      'You\'ll get extra days based on your remaining balance.',
+  Strings.premiumsIncluded: 'Premium\'s included',
+  Strings.unlockAllFreeLocations: 'Unlock all free locations',
+  Strings.unlockSmartMode: 'Unlock smart mode',
+  Strings.unlockMultiHopMode: 'Unlock Multi-hop mode',
+  Strings.premiumCanShareXDevices: 'Premium can share X devices',
+  Strings.ownYourOwnPrivateServer: 'Own your own private server',
+  Strings.closeAds: 'Close ads',
+  Strings.confirmChange: 'Confirm Change',
+  Strings.restorePurchases: 'Restore Purchases',
+  Strings.paymentIssue: 'Payment issue',
+  Strings.yearlyAutoRenewCancelAnytime: 'Yearly auto-renew. Cancel anytime',
+
+  // home page
+  Strings.recent: 'Recent',
+  Strings.moviesAndTV: 'Movies&TV',
+  Strings.social: 'Social',
+  Strings.support: 'Support',
+  Strings.sport: 'Sport',
+  Strings.music: 'Music',
+  Strings.game: 'Game',
+
+  // country restricted
+  Strings.sorry: 'Sorry',
+  Strings.unableToLoadData: 'Unable to load data',
+  Strings.dueLawsAndRegulations:
+      'Due to local laws and regulations, \nNOMOVPN services are not available in \nyour current region.',
+
+  // more pages
+  Strings.sendPreCodeToEmail: 'Send Pre Code to Email',
+  Strings.selectServer: 'Select Server',
+  Strings.relieveDevice: 'Relieve Device',
+  Strings.relieve: 'Relieve',
+  Strings.info: 'Info',
+  Strings.restoringPurchases: 'Restoring purchases...',
 };

+ 92 - 1
lib/config/translations/es_ES/es_es_translation.dart

@@ -237,7 +237,6 @@ Su navegación es privada con「FKey.win」- sin rastreo ni recopilación de dat
   Strings.signOut: 'Cerrar Sesión',
 
   // Diálogo de cierre de sesión
-  Strings.signOutTitle: 'Cerrar Sesión',
   Strings.signOutMessage:
       'Esto eliminará todos los datos locales (incluyendo configuraciones e historial) de este dispositivo.',
   Strings.signOutWarning: 'Esta acción no se puede deshacer.',
@@ -351,4 +350,96 @@ Su navegación es privada con「FKey.win」- sin rastreo ni recopilación de dat
 
   // local boost
   Strings.localBoost: 'Impulso Local',
+
+  // setting page
+  Strings.networkSection: 'Red',
+  Strings.securitySection: 'Seguridad',
+  Strings.myPreCode: 'Mi Pre Código',
+  Strings.validTerm: 'Término Válido',
+  Strings.freeTime: 'Tiempo Gratis',
+  Strings.deviceAuthorization: 'Autorización de Dispositivo',
+  Strings.routingMode: 'Modo de Enrutamiento',
+  Strings.splitTunneling: 'Túnel Dividido',
+  Strings.autoReconnect: 'Reconexión Automática',
+  Strings.restoreDefault: 'Restaurar Predeterminado',
+  Strings.deleteAccount: 'Eliminar Cuenta',
+  Strings.logout: 'Cerrar Sesión',
+
+  // media location page
+  Strings.connected: 'Conectado',
+  Strings.disconnected: 'Desconectado',
+  Strings.open: 'Abrir',
+  Strings.disconnect: 'Desconectar',
+  Strings.connect: 'Conectar',
+  Strings.opening: 'Abriendo',
+  Strings.connectedSuccessfully: 'Conectado exitosamente',
+  Strings.willOpenSoon: 'se abrirá pronto',
+  Strings.netflix: 'Netflix',
+  Strings.youtube: 'YouTube',
+  Strings.amazon: 'Amazon',
+  Strings.hulu: 'hulu',
+  Strings.niftyStreaming: 'Nifty Streaming',
+  Strings.youtubeStreaming: 'YouTube Streaming',
+  Strings.amazonStreaming: 'Amazon Streaming',
+  Strings.huluStreaming: 'hulu Streaming',
+
+  // split tunneling page
+  Strings.excludeSelectedAppsFromVPN:
+      'Excluir aplicaciones seleccionadas de VPN',
+  Strings.useVPNForSelectedAppsOnly:
+      'Usar VPN solo para aplicaciones seleccionadas',
+  Strings.selectApps: 'Seleccionar aplicaciones',
+  Strings.customizeYourVPN: 'Personaliza tu VPN',
+
+  // subscription page
+  Strings.subscription: 'Suscripción',
+  Strings.currentSubscription: 'Suscripción actual',
+  Strings.upgradeToPremium: 'Actualizar a Premium',
+  Strings.activatePreCode: 'Activar Pre Código',
+  Strings.preCodeHint:
+      'Si tienes un código Pre, ingrésalo para reclamar tus beneficios Pre.',
+  Strings.planChangeInfo: 'Información de cambio de plan',
+  Strings.whenItStarts: 'Cuándo comienza',
+  Strings.whatHappensToYourBalance: 'Qué sucede con tu saldo',
+  Strings.extraTime: 'Tiempo extra',
+  Strings.yourNewPlanBeginsRightAway: 'Tu nuevo plan comienza de inmediato.',
+  Strings.anyUnusedAmountFromYourOldPlan:
+      'Cualquier cantidad no utilizada de tu plan anterior se agregará al nuevo.',
+  Strings.youllGetExtraDays:
+      'Obtendrás días adicionales según tu saldo restante.',
+  Strings.premiumsIncluded: 'Premium incluido',
+  Strings.unlockAllFreeLocations: 'Desbloquear todas las ubicaciones gratuitas',
+  Strings.unlockSmartMode: 'Desbloquear modo inteligente',
+  Strings.unlockMultiHopMode: 'Desbloquear modo Multi-salto',
+  Strings.premiumCanShareXDevices: 'Premium puede compartir X dispositivos',
+  Strings.ownYourOwnPrivateServer: 'Ten tu propio servidor privado',
+  Strings.closeAds: 'Cerrar anuncios',
+  Strings.confirmChange: 'Confirmar Cambio',
+  Strings.restorePurchases: 'Restaurar Compras',
+  Strings.paymentIssue: 'Problema de pago',
+  Strings.yearlyAutoRenewCancelAnytime:
+      'Renovación automática anual. Cancela en cualquier momento',
+
+  // home page
+  Strings.recent: 'Reciente',
+  Strings.moviesAndTV: 'Películas y TV',
+  Strings.social: 'Social',
+  Strings.support: 'Soporte',
+  Strings.sport: 'Deporte',
+  Strings.music: 'Música',
+  Strings.game: 'Juego',
+
+  // country restricted
+  Strings.sorry: 'Lo sentimos',
+  Strings.unableToLoadData: 'No se pueden cargar los datos',
+  Strings.dueLawsAndRegulations:
+      'Debido a leyes y regulaciones locales, \nlos servicios de NOMOVPN no están disponibles en \ntu región actual.',
+
+  // more pages
+  Strings.sendPreCodeToEmail: 'Enviar Pre Código al Correo',
+  Strings.selectServer: 'Seleccionar Servidor',
+  Strings.relieveDevice: 'Liberar Dispositivo',
+  Strings.relieve: 'Liberar',
+  Strings.info: 'Información',
+  Strings.restoringPurchases: 'Restaurando compras...',
 };

+ 91 - 1
lib/config/translations/fa_IR/fa_ir_translation.dart

@@ -229,7 +229,6 @@ const Map<String, String> faIR = {
   Strings.signOut: 'خروج از حساب',
 
   // دیالوگ خروج از حساب
-  Strings.signOutTitle: 'خروج از حساب',
   Strings.signOutMessage:
       'این کار تمام داده‌های محلی (شامل تنظیمات و تاریخچه) را از این دستگاه حذف خواهد کرد.',
   Strings.signOutWarning: 'این عمل قابل بازگشت نیست.',
@@ -343,4 +342,95 @@ const Map<String, String> faIR = {
 
   // local boost
   Strings.localBoost: 'بوست محلی',
+
+  // setting page
+  Strings.networkSection: 'شبکه',
+  Strings.securitySection: 'امنیت',
+  Strings.myPreCode: 'پیش کد من',
+  Strings.validTerm: 'مدت اعتبار',
+  Strings.freeTime: 'زمان رایگان',
+  Strings.deviceAuthorization: 'مجوز دستگاه',
+  Strings.routingMode: 'حالت مسیریابی',
+  Strings.splitTunneling: 'تونل تقسیم شده',
+  Strings.autoReconnect: 'اتصال مجدد خودکار',
+  Strings.restoreDefault: 'بازگردانی پیش‌فرض',
+  Strings.deleteAccount: 'حذف حساب',
+  Strings.logout: 'خروج',
+
+  // media location page
+  Strings.connected: 'متصل',
+  Strings.disconnected: 'قطع اتصال',
+  Strings.open: 'باز کردن',
+  Strings.disconnect: 'قطع اتصال',
+  Strings.connect: 'اتصال',
+  Strings.opening: 'در حال باز شدن',
+  Strings.connectedSuccessfully: 'با موفقیت متصل شد',
+  Strings.willOpenSoon: 'به زودی باز می‌شود',
+  Strings.netflix: 'Netflix',
+  Strings.youtube: 'YouTube',
+  Strings.amazon: 'Amazon',
+  Strings.hulu: 'hulu',
+  Strings.niftyStreaming: 'Nifty Streaming',
+  Strings.youtubeStreaming: 'YouTube Streaming',
+  Strings.amazonStreaming: 'Amazon Streaming',
+  Strings.huluStreaming: 'hulu Streaming',
+
+  // split tunneling page
+  Strings.excludeSelectedAppsFromVPN: 'حذف برنامه‌های انتخابی از VPN',
+  Strings.useVPNForSelectedAppsOnly:
+      'استفاده از VPN فقط برای برنامه‌های انتخابی',
+  Strings.selectApps: 'انتخاب برنامه‌ها',
+  Strings.customizeYourVPN: 'VPN خود را سفارشی کنید',
+
+  // subscription page
+  Strings.subscription: 'اشتراک',
+  Strings.currentSubscription: 'اشتراک فعلی',
+  Strings.upgradeToPremium: 'ارتقا به Premium',
+  Strings.activatePreCode: 'فعال‌سازی پیش کد',
+  Strings.preCodeHint:
+      'اگر پیش کد دارید، لطفاً آن را وارد کنید تا مزایای Pre خود را دریافت کنید.',
+  Strings.planChangeInfo: 'اطلاعات تغییر طرح',
+  Strings.whenItStarts: 'زمان شروع',
+  Strings.whatHappensToYourBalance: 'چه اتفاقی برای موجودی شما می‌افتد',
+  Strings.extraTime: 'زمان اضافی',
+  Strings.yourNewPlanBeginsRightAway: 'طرح جدید شما بلافاصله شروع می‌شود.',
+  Strings.anyUnusedAmountFromYourOldPlan:
+      'هر مبلغ استفاده نشده از طرح قدیمی شما به طرح جدید اضافه می‌شود.',
+  Strings.youllGetExtraDays:
+      'بر اساس موجودی باقی‌مانده، روزهای اضافی دریافت خواهید کرد.',
+  Strings.premiumsIncluded: 'Premium شامل می‌شود',
+  Strings.unlockAllFreeLocations: 'باز کردن قفل تمام مکان‌های رایگان',
+  Strings.unlockSmartMode: 'باز کردن قفل حالت هوشمند',
+  Strings.unlockMultiHopMode: 'باز کردن قفل حالت Multi-hop',
+  Strings.premiumCanShareXDevices:
+      'Premium می‌تواند X دستگاه را به اشتراک بگذارد',
+  Strings.ownYourOwnPrivateServer: 'سرور خصوصی خود را داشته باشید',
+  Strings.closeAds: 'بستن تبلیغات',
+  Strings.confirmChange: 'تأیید تغییر',
+  Strings.restorePurchases: 'بازیابی خریدها',
+  Strings.paymentIssue: 'مشکل پرداخت',
+  Strings.yearlyAutoRenewCancelAnytime: 'تمدید خودکار سالانه. هر زمان قابل لغو',
+
+  // home page
+  Strings.recent: 'اخیر',
+  Strings.moviesAndTV: 'فیلم و تلویزیون',
+  Strings.social: 'اجتماعی',
+  Strings.support: 'پشتیبانی',
+  Strings.sport: 'ورزش',
+  Strings.music: 'موسیقی',
+  Strings.game: 'بازی',
+
+  // country restricted
+  Strings.sorry: 'متأسفیم',
+  Strings.unableToLoadData: 'قادر به بارگذاری داده‌ها نیست',
+  Strings.dueLawsAndRegulations:
+      'به دلیل قوانین و مقررات محلی، \nخدمات NOMOVPN در \nمنطقه فعلی شما در دسترس نیست.',
+
+  // more pages
+  Strings.sendPreCodeToEmail: 'ارسال پیش کد به ایمیل',
+  Strings.selectServer: 'انتخاب سرور',
+  Strings.relieveDevice: 'آزادسازی دستگاه',
+  Strings.relieve: 'آزاد کردن',
+  Strings.info: 'اطلاعات',
+  Strings.restoringPurchases: 'در حال بازیابی خریدها...',
 };

+ 93 - 1
lib/config/translations/fr_FR/fr_fr_translation.dart

@@ -238,7 +238,6 @@ Votre navigation est privée avec「FKey.win」- aucun suivi ou collecte de donn
   Strings.signOut: 'Se déconnecter',
 
   // Sign out dialog
-  Strings.signOutTitle: 'Se déconnecter',
   Strings.signOutMessage:
       'Cela supprimera toutes les données locales (y compris les paramètres et l\'historique) de cet appareil.',
   Strings.signOutWarning: 'Cette action ne peut pas être annulée.',
@@ -352,4 +351,97 @@ Votre navigation est privée avec「FKey.win」- aucun suivi ou collecte de donn
 
   // local boost
   Strings.localBoost: 'Boost Local',
+
+  // setting page
+  Strings.networkSection: 'Réseau',
+  Strings.securitySection: 'Sécurité',
+  Strings.myPreCode: 'Mon pré-code',
+  Strings.validTerm: 'Terme valide',
+  Strings.freeTime: 'Temps gratuit',
+  Strings.deviceAuthorization: 'Autorisation de l\'appareil',
+  Strings.routingMode: 'Mode de routage',
+  Strings.splitTunneling: 'Tunneling fractionné',
+  Strings.autoReconnect: 'Reconnexion automatique',
+  Strings.restoreDefault: 'Restaurer par défaut',
+  Strings.deleteAccount: 'Supprimer le compte',
+  Strings.logout: 'Déconnexion',
+
+  // media location page
+  Strings.connected: 'Connecté',
+  Strings.disconnected: 'Déconnecté',
+  Strings.open: 'Ouvrir',
+  Strings.disconnect: 'Déconnecter',
+  Strings.connect: 'Connecter',
+  Strings.opening: 'Ouverture',
+  Strings.connectedSuccessfully: 'Connecté avec succès',
+  Strings.willOpenSoon: 's\'ouvrira bientôt',
+  Strings.netflix: 'Netflix',
+  Strings.youtube: 'YouTube',
+  Strings.amazon: 'Amazon',
+  Strings.hulu: 'hulu',
+  Strings.niftyStreaming: 'Nifty Streaming',
+  Strings.youtubeStreaming: 'YouTube Streaming',
+  Strings.amazonStreaming: 'Amazon Streaming',
+  Strings.huluStreaming: 'hulu Streaming',
+
+  // split tunneling page
+  Strings.excludeSelectedAppsFromVPN:
+      'Exclure les applications sélectionnées du VPN',
+  Strings.useVPNForSelectedAppsOnly:
+      'Utiliser le VPN uniquement pour les applications sélectionnées',
+  Strings.selectApps: 'Sélectionner les applications',
+  Strings.customizeYourVPN: 'Personnalisez votre VPN',
+
+  // subscription page
+  Strings.subscription: 'Abonnement',
+  Strings.currentSubscription: 'Abonnement actuel',
+  Strings.upgradeToPremium: 'Passer à Premium',
+  Strings.activatePreCode: 'Activer le pré-code',
+  Strings.preCodeHint:
+      'Si vous avez un pré-code, veuillez le saisir pour réclamer vos avantages Pre.',
+  Strings.planChangeInfo: 'Informations sur le changement de plan',
+  Strings.whenItStarts: 'Quand cela commence',
+  Strings.whatHappensToYourBalance: 'Ce qui arrive à votre solde',
+  Strings.extraTime: 'Temps supplémentaire',
+  Strings.yourNewPlanBeginsRightAway:
+      'Votre nouveau plan commence immédiatement.',
+  Strings.anyUnusedAmountFromYourOldPlan:
+      'Tout montant inutilisé de votre ancien plan sera ajouté au nouveau.',
+  Strings.youllGetExtraDays:
+      'Vous obtiendrez des jours supplémentaires en fonction de votre solde restant.',
+  Strings.premiumsIncluded: 'Premium inclus',
+  Strings.unlockAllFreeLocations: 'Débloquer tous les emplacements gratuits',
+  Strings.unlockSmartMode: 'Débloquer le mode intelligent',
+  Strings.unlockMultiHopMode: 'Débloquer le mode Multi-saut',
+  Strings.premiumCanShareXDevices: 'Premium peut partager X appareils',
+  Strings.ownYourOwnPrivateServer: 'Possédez votre propre serveur privé',
+  Strings.closeAds: 'Fermer les publicités',
+  Strings.confirmChange: 'Confirmer le changement',
+  Strings.restorePurchases: 'Restaurer les achats',
+  Strings.paymentIssue: 'Problème de paiement',
+  Strings.yearlyAutoRenewCancelAnytime:
+      'Renouvellement automatique annuel. Annulez à tout moment',
+
+  // home page
+  Strings.recent: 'Récent',
+  Strings.moviesAndTV: 'Films et TV',
+  Strings.social: 'Social',
+  Strings.support: 'Support',
+  Strings.sport: 'Sport',
+  Strings.music: 'Musique',
+  Strings.game: 'Jeu',
+
+  // country restricted
+  Strings.sorry: 'Désolé',
+  Strings.unableToLoadData: 'Impossible de charger les données',
+  Strings.dueLawsAndRegulations:
+      'En raison des lois et réglementations locales, \nles services NOMOVPN ne sont pas disponibles dans \nvotre région actuelle.',
+
+  // more pages
+  Strings.sendPreCodeToEmail: 'Envoyer le pré-code par e-mail',
+  Strings.selectServer: 'Sélectionner le serveur',
+  Strings.relieveDevice: 'Libérer l\'appareil',
+  Strings.relieve: 'Libérer',
+  Strings.info: 'Info',
+  Strings.restoringPurchases: 'Restauration des achats...',
 };

+ 86 - 1
lib/config/translations/ja_JP/ja_jp_translation.dart

@@ -214,7 +214,6 @@ const Map<String, String> jaJP = {
   Strings.signOut: 'サインアウト',
 
   // Sign out dialog
-  Strings.signOutTitle: 'サインアウト',
   Strings.signOutMessage: 'これにより、このデバイスからすべてのローカルデータ(設定や履歴を含む)が削除されます。',
   Strings.signOutWarning: 'この操作は元に戻せません。',
   Strings.confirm: '確認',
@@ -320,4 +319,90 @@ const Map<String, String> jaJP = {
 
   // local boost
   Strings.localBoost: 'ローカルブースト',
+
+  // setting page
+  Strings.networkSection: 'ネットワーク',
+  Strings.securitySection: 'セキュリティ',
+  Strings.myPreCode: 'マイプレコード',
+  Strings.validTerm: '有効期間',
+  Strings.freeTime: '無料時間',
+  Strings.deviceAuthorization: 'デバイス認証',
+  Strings.routingMode: 'ルーティングモード',
+  Strings.splitTunneling: 'スプリットトンネリング',
+  Strings.autoReconnect: '自動再接続',
+  Strings.restoreDefault: 'デフォルトに戻す',
+  Strings.deleteAccount: 'アカウントを削除',
+  Strings.logout: 'ログアウト',
+
+  // media location page
+  Strings.connected: '接続済み',
+  Strings.disconnected: '切断',
+  Strings.open: '開く',
+  Strings.disconnect: '切断',
+  Strings.connect: '接続',
+  Strings.opening: '開いています',
+  Strings.connectedSuccessfully: '正常に接続されました',
+  Strings.willOpenSoon: 'まもなく開きます',
+  Strings.netflix: 'Netflix',
+  Strings.youtube: 'YouTube',
+  Strings.amazon: 'Amazon',
+  Strings.hulu: 'hulu',
+  Strings.niftyStreaming: 'Nifty Streaming',
+  Strings.youtubeStreaming: 'YouTube Streaming',
+  Strings.amazonStreaming: 'Amazon Streaming',
+  Strings.huluStreaming: 'hulu Streaming',
+
+  // split tunneling page
+  Strings.excludeSelectedAppsFromVPN: '選択したアプリをVPNから除外',
+  Strings.useVPNForSelectedAppsOnly: '選択したアプリのみVPNを使用',
+  Strings.selectApps: 'アプリを選択',
+  Strings.customizeYourVPN: 'VPNをカスタマイズ',
+
+  // subscription page
+  Strings.subscription: 'サブスクリプション',
+  Strings.currentSubscription: '現在のサブスクリプション',
+  Strings.upgradeToPremium: 'Premiumにアップグレード',
+  Strings.activatePreCode: 'プレコードを有効化',
+  Strings.preCodeHint: 'プレコードをお持ちの場合は、入力してPre特典を請求してください。',
+  Strings.planChangeInfo: 'プラン変更情報',
+  Strings.whenItStarts: 'いつ始まるか',
+  Strings.whatHappensToYourBalance: '残高はどうなるか',
+  Strings.extraTime: '追加時間',
+  Strings.yourNewPlanBeginsRightAway: '新しいプランはすぐに開始されます。',
+  Strings.anyUnusedAmountFromYourOldPlan: '古いプランの未使用金額は新しいプランに追加されます。',
+  Strings.youllGetExtraDays: '残高に基づいて追加日数が付与されます。',
+  Strings.premiumsIncluded: 'Premiumに含まれる',
+  Strings.unlockAllFreeLocations: 'すべての無料ロケーションを解除',
+  Strings.unlockSmartMode: 'スマートモードを解除',
+  Strings.unlockMultiHopMode: 'マルチホップモードを解除',
+  Strings.premiumCanShareXDevices: 'PremiumはXデバイスを共有できます',
+  Strings.ownYourOwnPrivateServer: '自分専用のプライベートサーバーを所有',
+  Strings.closeAds: '広告を閉じる',
+  Strings.confirmChange: '変更を確認',
+  Strings.restorePurchases: '購入を復元',
+  Strings.paymentIssue: '支払いの問題',
+  Strings.yearlyAutoRenewCancelAnytime: '年間自動更新。いつでもキャンセル可能',
+
+  // home page
+  Strings.recent: '最近',
+  Strings.moviesAndTV: '映画とTV',
+  Strings.social: 'ソーシャル',
+  Strings.support: 'サポート',
+  Strings.sport: 'スポーツ',
+  Strings.music: '音楽',
+  Strings.game: 'ゲーム',
+
+  // country restricted
+  Strings.sorry: 'ごめんなさい',
+  Strings.unableToLoadData: 'データを読み込めません',
+  Strings.dueLawsAndRegulations:
+      '地域の法律および規制により、\nNOMOVPNサービスは\n現在の地域では利用できません。',
+
+  // more pages
+  Strings.sendPreCodeToEmail: 'プレコードをメールに送信',
+  Strings.selectServer: 'サーバーを選択',
+  Strings.relieveDevice: 'デバイスを解除',
+  Strings.relieve: '解除',
+  Strings.info: '情報',
+  Strings.restoringPurchases: '購入を復元しています...',
 };

+ 86 - 1
lib/config/translations/ko_KR/ko_kr_translation.dart

@@ -212,7 +212,6 @@ const Map<String, String> koKR = {
   Strings.signOut: '로그아웃',
 
   // Sign out dialog
-  Strings.signOutTitle: '로그아웃',
   Strings.signOutMessage: '이렇게 하면 이 기기에서 모든 로컬 데이터(설정 및 기록 포함)가 삭제됩니다.',
   Strings.signOutWarning: '이 작업은 취소할 수 없습니다.',
   Strings.confirm: '확인',
@@ -318,4 +317,90 @@ const Map<String, String> koKR = {
 
   // local boost
   Strings.localBoost: '로컬 부스트',
+
+  // setting page
+  Strings.networkSection: '네트워크',
+  Strings.securitySection: '보안',
+  Strings.myPreCode: '내 사전 코드',
+  Strings.validTerm: '유효 기간',
+  Strings.freeTime: '무료 시간',
+  Strings.deviceAuthorization: '장치 인증',
+  Strings.routingMode: '라우팅 모드',
+  Strings.splitTunneling: '분할 터널링',
+  Strings.autoReconnect: '자동 재연결',
+  Strings.restoreDefault: '기본값 복원',
+  Strings.deleteAccount: '계정 삭제',
+  Strings.logout: '로그아웃',
+
+  // media location page
+  Strings.connected: '연결됨',
+  Strings.disconnected: '연결 끊김',
+  Strings.open: '열기',
+  Strings.disconnect: '연결 해제',
+  Strings.connect: '연결',
+  Strings.opening: '열고 있습니다',
+  Strings.connectedSuccessfully: '성공적으로 연결되었습니다',
+  Strings.willOpenSoon: '곧 열립니다',
+  Strings.netflix: 'Netflix',
+  Strings.youtube: 'YouTube',
+  Strings.amazon: 'Amazon',
+  Strings.hulu: 'hulu',
+  Strings.niftyStreaming: 'Nifty Streaming',
+  Strings.youtubeStreaming: 'YouTube Streaming',
+  Strings.amazonStreaming: 'Amazon Streaming',
+  Strings.huluStreaming: 'hulu Streaming',
+
+  // split tunneling page
+  Strings.excludeSelectedAppsFromVPN: '선택한 앱을 VPN에서 제외',
+  Strings.useVPNForSelectedAppsOnly: '선택한 앱에만 VPN 사용',
+  Strings.selectApps: '앱 선택',
+  Strings.customizeYourVPN: 'VPN 맞춤 설정',
+
+  // subscription page
+  Strings.subscription: '구독',
+  Strings.currentSubscription: '현재 구독',
+  Strings.upgradeToPremium: 'Premium으로 업그레이드',
+  Strings.activatePreCode: '사전 코드 활성화',
+  Strings.preCodeHint: '사전 코드가 있는 경우 입력하여 Pre 혜택을 받으세요.',
+  Strings.planChangeInfo: '플랜 변경 정보',
+  Strings.whenItStarts: '시작 시기',
+  Strings.whatHappensToYourBalance: '잔액 처리',
+  Strings.extraTime: '추가 시간',
+  Strings.yourNewPlanBeginsRightAway: '새로운 플랜이 즉시 시작됩니다.',
+  Strings.anyUnusedAmountFromYourOldPlan: '이전 플랜의 미사용 금액은 새 플랜에 추가됩니다.',
+  Strings.youllGetExtraDays: '남은 잔액에 따라 추가 일수를 받게 됩니다.',
+  Strings.premiumsIncluded: 'Premium 포함',
+  Strings.unlockAllFreeLocations: '모든 무료 위치 잠금 해제',
+  Strings.unlockSmartMode: '스마트 모드 잠금 해제',
+  Strings.unlockMultiHopMode: '멀티 홉 모드 잠금 해제',
+  Strings.premiumCanShareXDevices: 'Premium은 X 기기 공유 가능',
+  Strings.ownYourOwnPrivateServer: '자신만의 전용 서버 소유',
+  Strings.closeAds: '광고 닫기',
+  Strings.confirmChange: '변경 확인',
+  Strings.restorePurchases: '구매 복원',
+  Strings.paymentIssue: '결제 문제',
+  Strings.yearlyAutoRenewCancelAnytime: '연간 자동 갱신. 언제든지 취소 가능',
+
+  // home page
+  Strings.recent: '최근',
+  Strings.moviesAndTV: '영화 및 TV',
+  Strings.social: '소셜',
+  Strings.support: '지원',
+  Strings.sport: '스포츠',
+  Strings.music: '음악',
+  Strings.game: '게임',
+
+  // country restricted
+  Strings.sorry: '죄송합니다',
+  Strings.unableToLoadData: '데이터를 로드할 수 없습니다',
+  Strings.dueLawsAndRegulations:
+      '현지 법률 및 규정으로 인해 \nNOMOVPN 서비스를 \n현재 지역에서 이용할 수 없습니다.',
+
+  // more pages
+  Strings.sendPreCodeToEmail: '이메일로 사전 코드 보내기',
+  Strings.selectServer: '서버 선택',
+  Strings.relieveDevice: '장치 해제',
+  Strings.relieve: '해제',
+  Strings.info: '정보',
+  Strings.restoringPurchases: '구매 복원 중...',
 };

+ 94 - 1
lib/config/translations/my_MM/my_mm_translation.dart

@@ -238,7 +238,6 @@ const Map<String, String> myMM = {
   Strings.signOut: 'အကောင့်ထွက်ရန်',
 
   // အကောင့်ထွက်ရန် ဒိုင်ယာလော့
-  Strings.signOutTitle: 'အကောင့်ထွက်ရန်',
   Strings.signOutMessage:
       'ဤလုပ်ဆောင်ချက်သည် ဤစက်ပစ္စည်းမှ ဒေသတွင်းဒေတာအားလုံး (ဆက်တင်များနှင့် မှတ်တမ်းများအပါအဝင်) ကို ဖျက်ပစ်မည်ဖြစ်သည်။',
   Strings.signOutWarning: 'ဤလုပ်ဆောင်ချက်ကို ပြန်လည်ပြင်ဆင်၍မရပါ။',
@@ -354,4 +353,98 @@ const Map<String, String> myMM = {
 
   // local boost
   Strings.localBoost: 'ပိုက်ဆံမှုကိုလည်းပြုလုပ်ပါ',
+
+  // setting page
+  Strings.networkSection: 'ကွန်ယက်',
+  Strings.securitySection: 'လုံခြုံရေး',
+  Strings.myPreCode: 'ကျွန်ုပ်၏ ကြိုတင်ကုဒ်',
+  Strings.validTerm: 'အသက်တမ်းကာလ',
+  Strings.freeTime: 'အခမဲ့အချိန်',
+  Strings.deviceAuthorization: 'ကိရိယာ ခွင့်ပြုချက်',
+  Strings.routingMode: 'လမ်းကြောင်းမုဒ်',
+  Strings.splitTunneling: 'ခွဲထုတ်ထားသော ကွန်ယက်',
+  Strings.autoReconnect: 'အလိုအလျောက်ပြန်လည်ချိတ်ဆက်ခြင်း',
+  Strings.restoreDefault: 'မူလအတိုင်း ပြန်လည်ထားရှိပါ',
+  Strings.deleteAccount: 'အကောင့်ကို ဖျက်ပါ',
+  Strings.logout: 'ထွက်မည်',
+
+  // media location page
+  Strings.connected: 'ချိတ်ဆက်ပြီး',
+  Strings.disconnected: 'ချိတ်ဆက်ခြင်းမရှိ',
+  Strings.open: 'ဖွင့်ပါ',
+  Strings.disconnect: 'ချိတ်ဆက်မှုဖြတ်ပါ',
+  Strings.connect: 'ချိတ်ဆက်ပါ',
+  Strings.opening: 'ဖွင့်နေသည်',
+  Strings.connectedSuccessfully: 'အောင်မြင်စွာ ချိတ်ဆက်ပြီး',
+  Strings.willOpenSoon: 'မကြာမီ ဖွင့်ပါမည်',
+  Strings.netflix: 'Netflix',
+  Strings.youtube: 'YouTube',
+  Strings.amazon: 'Amazon',
+  Strings.hulu: 'hulu',
+  Strings.niftyStreaming: 'Nifty Streaming',
+  Strings.youtubeStreaming: 'YouTube Streaming',
+  Strings.amazonStreaming: 'Amazon Streaming',
+  Strings.huluStreaming: 'hulu Streaming',
+
+  // split tunneling page
+  Strings.excludeSelectedAppsFromVPN:
+      'ရွေးချယ်ထားသောအက်ပ်များကို VPN မှ ဖယ်ရှားပါ',
+  Strings.useVPNForSelectedAppsOnly:
+      'ရွေးချယ်ထားသောအက်ပ်များအတွက်သာ VPN ကို အသုံးပြုပါ',
+  Strings.selectApps: 'အက်ပ်များရွေးချယ်ပါ',
+  Strings.customizeYourVPN: 'သင်၏ VPN ကို စိတ်ကြိုက်ပြင်ဆင်ပါ',
+
+  // subscription page
+  Strings.subscription: 'စာရင်းသွင်းခြင်း',
+  Strings.currentSubscription: 'လက်ရှိ စာရင်းသွင်းခြင်း',
+  Strings.upgradeToPremium: 'Premium သို့ အဆင့်မြှင့်ပါ',
+  Strings.activatePreCode: 'ကြိုတင်ကုဒ်ကို အသက်သွင်းပါ',
+  Strings.preCodeHint:
+      'သင့်တွင် Pre code ရှိပါက၊ သင်၏ Pre အကျိုးခံစားခွင့်များကို ရယူရန် ထည့်သွင်းပါ။',
+  Strings.planChangeInfo: 'အစီအစဉ်ပြောင်းလဲခြင်း အချက်အလက်',
+  Strings.whenItStarts: 'မည်သည့်အချိန်တွင် စတင်မည်',
+  Strings.whatHappensToYourBalance: 'သင်၏ လက်ကျန်ငွေကို ဘာဖြစ်မည်',
+  Strings.extraTime: 'အပိုအချိန်',
+  Strings.yourNewPlanBeginsRightAway: 'သင်၏ အစီအစဉ်အသစ်သည် ချက်ချင်း စတင်မည်။',
+  Strings.anyUnusedAmountFromYourOldPlan:
+      'သင်၏ ဟောင်းအစီအစဉ်မှ အသုံးမပြုသော ပမာဏကို အသစ်သို့ ပေါင်းထည့်ပေးမည်။',
+  Strings.youllGetExtraDays:
+      'သင်၏ ကျန်ရှိသော လက်ကျန်ငွေအပေါ်အခြေခံ၍ အပိုရက်များ ရရှိမည်။',
+  Strings.premiumsIncluded: 'Premium ပါဝင်သည်',
+  Strings.unlockAllFreeLocations: 'အခမဲ့ တည်နေရာအားလုံးကို သော့ဖွင့်ပါ',
+  Strings.unlockSmartMode: 'စမတ်မုဒ်ကို သော့ဖွင့်ပါ',
+  Strings.unlockMultiHopMode: 'Multi-hop မုဒ်ကို သော့ဖွင့်ပါ',
+  Strings.premiumCanShareXDevices:
+      'Premium သည် X စက်ပစ္စည်းများကို မျှဝေနိုင်သည်',
+  Strings.ownYourOwnPrivateServer:
+      'သင့်ကိုယ်ပိုင် ကိုယ်ပိုင်ဆာဗာကို ပိုင်ဆိုင်ပါ',
+  Strings.closeAds: 'ကြော်ငြာများကို ပိတ်ပါ',
+  Strings.confirmChange: 'ပြောင်းလဲမှုကို အတည်ပြုပါ',
+  Strings.restorePurchases: 'ဝယ်ယူမှုများကို ပြန်လည်ရယူပါ',
+  Strings.paymentIssue: 'ငွေပေးချေမှု ပြဿနာ',
+  Strings.yearlyAutoRenewCancelAnytime:
+      'နှစ်စဉ် အလိုအလျောက် သက်တမ်းတိုးမည်။ အချိန်မရွေး ပယ်ဖျက်နိုင်သည်',
+
+  // home page
+  Strings.recent: 'မကြာသေးမီက',
+  Strings.moviesAndTV: 'ရုပ်ရှင်နှင့် TV',
+  Strings.social: 'လူမှုရေး',
+  Strings.support: 'ထောက်ပံ့မှု',
+  Strings.sport: 'အားကစား',
+  Strings.music: 'ဂီတ',
+  Strings.game: 'ဂိမ်း',
+
+  // country restricted
+  Strings.sorry: 'တောင်းပန်ပါသည်',
+  Strings.unableToLoadData: 'ဒေတာကို တင်ဆက်၍မရပါ',
+  Strings.dueLawsAndRegulations:
+      'ဒေသန္တရ ဥပဒေများနှင့် စည်းမျဉ်းများအရ၊ \nNOMOVPN ဝန်ဆောင်မှုများသည် \nသင့်လက်ရှိဒေသတွင် မရနိုင်ပါ။',
+
+  // more pages
+  Strings.sendPreCodeToEmail: 'အီးမေးလ်သို့ ကြိုတင်ကုဒ် ပို့ပါ',
+  Strings.selectServer: 'ဆာဗာရွေးချယ်ပါ',
+  Strings.relieveDevice: 'ကိရိယာကို ဖြေလွှတ်ပါ',
+  Strings.relieve: 'ဖြေလွှတ်ပါ',
+  Strings.info: 'အချက်အလက်',
+  Strings.restoringPurchases: 'ဝယ်ယူမှုများ ပြန်လည်ရယူနေသည်...',
 };

+ 92 - 1
lib/config/translations/ru_RU/ru_ru_translation.dart

@@ -236,7 +236,6 @@ const Map<String, String> ruRU = {
   Strings.signOut: 'Выйти',
 
   // Sign out dialog
-  Strings.signOutTitle: 'Выйти',
   Strings.signOutMessage:
       'Это удалит все локальные данные (включая настройки и историю) с этого устройства.',
   Strings.signOutWarning: 'Это действие нельзя отменить.',
@@ -349,4 +348,96 @@ const Map<String, String> ruRU = {
 
   // local boost
   Strings.localBoost: 'Локальный Буст',
+
+  // setting page
+  Strings.networkSection: 'Сеть',
+  Strings.securitySection: 'Безопасность',
+  Strings.myPreCode: 'Мой Пре-код',
+  Strings.validTerm: 'Срок действия',
+  Strings.freeTime: 'Бесплатное время',
+  Strings.deviceAuthorization: 'Авторизация Устройства',
+  Strings.routingMode: 'Режим Маршрутизации',
+  Strings.splitTunneling: 'Раздельное Туннелирование',
+  Strings.autoReconnect: 'Автоматическое Переподключение',
+  Strings.restoreDefault: 'Восстановить По Умолчанию',
+  Strings.deleteAccount: 'Удалить Аккаунт',
+  Strings.logout: 'Выход',
+
+  // media location page
+  Strings.connected: 'Подключено',
+  Strings.disconnected: 'Отключено',
+  Strings.open: 'Открыть',
+  Strings.disconnect: 'Отключиться',
+  Strings.connect: 'Подключиться',
+  Strings.opening: 'Открывается',
+  Strings.connectedSuccessfully: 'Успешно подключено',
+  Strings.willOpenSoon: 'скоро откроется',
+  Strings.netflix: 'Netflix',
+  Strings.youtube: 'YouTube',
+  Strings.amazon: 'Amazon',
+  Strings.hulu: 'hulu',
+  Strings.niftyStreaming: 'Nifty Streaming',
+  Strings.youtubeStreaming: 'YouTube Streaming',
+  Strings.amazonStreaming: 'Amazon Streaming',
+  Strings.huluStreaming: 'hulu Streaming',
+
+  // split tunneling page
+  Strings.excludeSelectedAppsFromVPN: 'Исключить выбранные приложения из VPN',
+  Strings.useVPNForSelectedAppsOnly:
+      'Использовать VPN только для выбранных приложений',
+  Strings.selectApps: 'Выбрать приложения',
+  Strings.customizeYourVPN: 'Настройте свой VPN',
+
+  // subscription page
+  Strings.subscription: 'Подписка',
+  Strings.currentSubscription: 'Текущая подписка',
+  Strings.upgradeToPremium: 'Обновить до Premium',
+  Strings.activatePreCode: 'Активировать Пре-код',
+  Strings.preCodeHint:
+      'Если у вас есть Пре-код, введите его, чтобы получить свои Pre преимущества.',
+  Strings.planChangeInfo: 'Информация об изменении плана',
+  Strings.whenItStarts: 'Когда начинается',
+  Strings.whatHappensToYourBalance: 'Что происходит с вашим балансом',
+  Strings.extraTime: 'Дополнительное время',
+  Strings.yourNewPlanBeginsRightAway: 'Ваш новый план начинается немедленно.',
+  Strings.anyUnusedAmountFromYourOldPlan:
+      'Любая неиспользованная сумма из вашего старого плана будет добавлена к новому.',
+  Strings.youllGetExtraDays:
+      'Вы получите дополнительные дни в зависимости от вашего остатка.',
+  Strings.premiumsIncluded: 'Premium включено',
+  Strings.unlockAllFreeLocations: 'Разблокировать все бесплатные локации',
+  Strings.unlockSmartMode: 'Разблокировать умный режим',
+  Strings.unlockMultiHopMode: 'Разблокировать режим Multi-hop',
+  Strings.premiumCanShareXDevices: 'Premium может делиться X устройствами',
+  Strings.ownYourOwnPrivateServer:
+      'Владейте своим собственным частным сервером',
+  Strings.closeAds: 'Закрыть рекламу',
+  Strings.confirmChange: 'Подтвердить Изменение',
+  Strings.restorePurchases: 'Восстановить Покупки',
+  Strings.paymentIssue: 'Проблема с платежом',
+  Strings.yearlyAutoRenewCancelAnytime:
+      'Годовое автоматическое продление. Отменить в любое время',
+
+  // home page
+  Strings.recent: 'Недавние',
+  Strings.moviesAndTV: 'Фильмы и ТВ',
+  Strings.social: 'Социальные',
+  Strings.support: 'Поддержка',
+  Strings.sport: 'Спорт',
+  Strings.music: 'Музыка',
+  Strings.game: 'Игра',
+
+  // country restricted
+  Strings.sorry: 'Извините',
+  Strings.unableToLoadData: 'Не удалось загрузить данные',
+  Strings.dueLawsAndRegulations:
+      'В связи с местными законами и правилами, \nуслуги NOMOVPN недоступны в \nвашем текущем регионе.',
+
+  // more pages
+  Strings.sendPreCodeToEmail: 'Отправить Пре-код на Email',
+  Strings.selectServer: 'Выбрать Сервер',
+  Strings.relieveDevice: 'Освободить Устройство',
+  Strings.relieve: 'Освободить',
+  Strings.info: 'Инфо',
+  Strings.restoringPurchases: 'Восстановление покупок...',
 };

+ 144 - 56
lib/config/translations/strings_enum.dart

@@ -1,5 +1,4 @@
 class Strings {
-  static const String hello = 'hello';
   static const String loading = 'loading';
 
   static const String changeTheme = 'change_theme';
@@ -70,7 +69,6 @@ class Strings {
   static const String go = 'go';
   static const String bottomBarGames = 'games';
   static const String bottomBarBoost = 'boost';
-  static const String bottomBarMe = 'me';
 
   static const String titleGame = 'game';
   static const String tabAll = 'all';
@@ -78,20 +76,16 @@ class Strings {
   static const String tabTrending = 'trending';
   static const String tabNew = 'new';
   static const String download = 'download';
-  static const String boost = 'boost';
 
-  static const String titleBoost = 'boost';
   static const String gameNotFound = 'game not found';
   static const String exploreGames = 'explore games!';
   static const String chooseServer = 'choose server';
 
-  static const String titleMe = 'device';
   static const String searchHistory = 'search history';
   static const String searchHint = 'enter game name';
   static const String searchNoGame = 'no game I want to boost';
   static const String searchNoRelatedGames =
       'no related games found. browse ourselection?';
-  static const String searchContactUs = 'contact us';
   static const String submitGameTitle = 'submit game';
   static const String submitGameContent =
       'could not find the game you wish to boost?';
@@ -170,14 +164,14 @@ class Strings {
       "Please check your network and try again.";
   static const String error = 'Error';
 
-// 登录注册相关
+  // 登录注册相关
   static const String registerWithEmail = "Register With Email";
   static const String signInWithEmail = "Sign In With Email";
   static const String continueWithGoogle = "Continue With Google";
   static const String continueWithApple = "Continue With Apple";
   static const String continueWithFacebook = "Continue With Facebook";
 
-// 注册页面
+  // 注册页面
   static const String signUp = "Sign Up";
   static const String emailAddress = "Email address";
   static const String password = "Password";
@@ -185,18 +179,18 @@ class Strings {
   static const String alreadyHaveAccount = "Already have an account?";
   static const String signIn = "Sign In";
 
-// 密码规则提示
+  // 密码规则提示
   static const String passwordMustInclude = "Your password must include:";
   static const String atLeast6Characters = "At least 6 characters";
   static const String atLeastOneUppercase = "At least one uppercase letter";
   static const String atLeastOneLowercase = "At least one lowercase letter";
   static const String atLeastOneNumber = "At least one number";
 
-// 登录页面
+  // 登录页面
   static const String forgotPassword = "Forgot Password?";
   static const String dontHaveAccount = "Don't have account?";
 
-// 隐私政策
+  // 隐私政策
   static const String termsAndPrivacy =
       "By signing up or continuing, you agree to our Terms and Privacy";
   static const String terms = "Terms";
@@ -205,7 +199,7 @@ class Strings {
       "By signing up or continuing, you agree to our ";
   static const String termsAgreementConnector = " and ";
 
-// 账户激活
+  // 账户激活
   static const String activateAccount = 'Activate Account';
   static const String passwordSetup = 'Password Setup';
   static const String emailVerificationHint =
@@ -221,62 +215,63 @@ class Strings {
   static const String forgotPasswordTitle = 'Forgot Password';
 
   // Account page
-  static const String createYourAccount = 'createYourAccount';
-  static const String account = 'account';
-  static const String freePlanUnlocked = 'freePlanUnlocked';
-  static const String activateToEnableFeatures = 'activateToEnableFeatures';
-  static const String activateNow = 'activateNow';
-  static const String changePassword = 'changePassword';
-  static const String signOut = 'signOut';
+  static const String createYourAccount = 'Create Your Account';
+  static const String account = 'Account';
+  static const String freePlanUnlocked = 'Free Plan Unlocked';
+  static const String activateToEnableFeatures =
+      'Activate Now to Enable Features';
+  static const String activateNow = 'Activate Now';
+  static const String changePassword = 'Change Password';
+  static const String signOut = 'Sign Out';
 
   // Sign out dialog
-  static const String signOutTitle = 'signOutTitle';
-  static const String signOutMessage = 'signOutMessage';
-  static const String signOutWarning = 'signOutWarning';
-  static const String confirm = 'confirm';
+  static const String signOutMessage =
+      'This will delete all local data (including settings and history) from this device.';
+  static const String signOutWarning = 'This action cannot be undone.';
+  static const String confirm = 'Confirm';
 
   // Dialog texts
-  static const String processing = 'processing';
-  static const String success = 'success';
-  static const String unknownError = 'unknown_error';
-  static const String failed = 'failed';
+  static const String processing = 'Processing...';
+  static const String success = 'Success';
+  static const String unknownError = 'Unknown error';
+  static const String failed = 'Failed';
 
   // Loading Dialog Messages
-  static const String submitting = 'submitting';
-  static const String submissionSuccessful = 'submission_successful';
-  static const String sendingVerificationCode = 'sending_verification_code';
-  static const String verificationCodeSent = 'verification_code_sent';
-  static const String verifyingEmail = 'verifying_email';
-  static const String emailVerified = 'email_verified';
-  static const String resettingPassword = 'resetting_password';
-  static const String passwordResetSuccessful = 'password_reset_successful';
-  static const String signingIn = 'signing_in';
-  static const String signInSuccessful = 'sign_in_successful';
-  static const String signingUp = 'signing_up';
-  static const String signUpSuccessful = 'sign_up_successful';
-  static const String activatingAccount = 'activating_account';
-  static const String accountActivated = 'account_activated';
-  static const String changingPassword = 'changing_password';
-  static const String passwordChanged = 'password_changed';
+  static const String submitting = 'Submitting...';
+  static const String submissionSuccessful = 'Submission successful';
+  static const String sendingVerificationCode = 'Sending verification code...';
+  static const String verificationCodeSent = 'Verification code sent';
+  static const String verifyingEmail = 'Verifying email...';
+  static const String emailVerified = 'Email verified';
+  static const String resettingPassword = 'Resetting password...';
+  static const String passwordResetSuccessful = 'Password reset successful';
+  static const String signingIn = 'Signing in...';
+  static const String signInSuccessful = 'Sign in successful';
+  static const String signingUp = 'Signing up...';
+  static const String signUpSuccessful = 'Sign up successful';
+  static const String activatingAccount = 'Activating account...';
+  static const String accountActivated = 'Account activated';
+  static const String changingPassword = 'Changing password...';
+  static const String passwordChanged = 'Password changed';
 
   // boost report
-  static const String boostReport = 'boost_report';
+  static const String boostReport = 'Boost Report';
 
   // sign out dialog
-  static const String signOuting = 'signOuting';
-  static const String signOutSuccessful = 'signOutSuccessful';
+  static const String signOuting = 'Signing out...';
+  static const String signOutSuccessful = 'Sign out successful';
 
   // boost report
-  static const String totalTime = 'total_time';
-  static const String improved = 'improved';
-  static const String ping = 'ping';
-  static const String loss = 'loss';
-  static const String avoidLag = 'avoid_lag';
-  static const String times = 'times';
-  static const String beforeBoostingPing = 'before_boosting_ping';
-  static const String afterBoostingPing = 'after_boosting_ping';
-  static const String afterVipBoostingPing = 'after_vip_boosting_ping';
-  static const String boostRating = 'boost_rating';
+  static const String totalTime = 'Total Time';
+  static const String improved = 'Improved';
+  static const String ping = 'Ping';
+  static const String loss = 'Loss';
+  static const String avoidLag = 'Avoid Lag';
+  static const String times = 'Times';
+  static const String beforeBoostingPing = 'Before Boosting Ping';
+  static const String afterBoostingPing = 'After Boosting Ping';
+  static const String afterVipBoostingPing = 'After VIP Boosting Ping';
+  static const String boostRating = 'Boost Rating';
 
   // 错误提示
   static const String networkRestricted =
@@ -344,4 +339,97 @@ class Strings {
 
   // local boost
   static const String localBoost = 'Local Boost';
+
+  // setting page
+  static const String networkSection = 'Network';
+  static const String securitySection = 'Security';
+  static const String myPreCode = 'My Pre Code';
+  static const String validTerm = 'Valid Term';
+  static const String freeTime = 'Free Time';
+  static const String deviceAuthorization = 'Device Authorization';
+  static const String routingMode = 'Routing Mode';
+  static const String splitTunneling = 'Split Tunneling';
+  static const String autoReconnect = 'Auto Reconnect';
+  static const String restoreDefault = 'Restore Default';
+  static const String deleteAccount = 'Delete Account';
+  static const String logout = 'Logout';
+
+  // media location page
+  static const String connected = 'Connected';
+  static const String disconnected = 'Disconnected';
+  static const String open = 'Open';
+  static const String disconnect = 'Disconnect';
+  static const String connect = 'Connect';
+  static const String opening = 'Opening';
+  static const String connectedSuccessfully = 'Connected successfully';
+  static const String willOpenSoon = 'will open soon';
+  static const String netflix = 'Netflix';
+  static const String youtube = 'YouTube';
+  static const String amazon = 'Amazon';
+  static const String hulu = 'hulu';
+  static const String niftyStreaming = 'Nifty Streaming';
+  static const String youtubeStreaming = 'YouTube Streaming';
+  static const String amazonStreaming = 'Amazon Streaming';
+  static const String huluStreaming = 'hulu Streaming';
+
+  // split tunneling page
+  static const String excludeSelectedAppsFromVPN =
+      'Exclude selected apps from VPN';
+  static const String useVPNForSelectedAppsOnly =
+      'Use VPN for selected apps only';
+  static const String selectApps = 'Select apps';
+  static const String customizeYourVPN = 'Customize your VPN';
+
+  // subscription page
+  static const String subscription = 'Subscription';
+  static const String currentSubscription = 'Current subscription';
+  static const String upgradeToPremium = 'Upgrade to Premium';
+  static const String activatePreCode = 'Activate Pre Code';
+  static const String preCodeHint =
+      'If you have a Pre code, please enter it to claim your Pre benefits.';
+  static const String planChangeInfo = 'Plan change info';
+  static const String whenItStarts = 'When it starts';
+  static const String whatHappensToYourBalance = 'What happens to your balance';
+  static const String extraTime = 'Extra time';
+  static const String yourNewPlanBeginsRightAway =
+      'Your new plan begins right away.';
+  static const String anyUnusedAmountFromYourOldPlan =
+      'Any unused amount from your old plan will be added to the new one.';
+  static const String youllGetExtraDays =
+      'You\'ll get extra days based on your remaining balance.';
+  static const String premiumsIncluded = 'Premium\'s included';
+  static const String unlockAllFreeLocations = 'Unlock all free locations';
+  static const String unlockSmartMode = 'Unlock smart mode';
+  static const String unlockMultiHopMode = 'Unlock Multi-hop mode';
+  static const String premiumCanShareXDevices = 'Premium can share X devices';
+  static const String ownYourOwnPrivateServer = 'Own your own private server';
+  static const String closeAds = 'Close ads';
+  static const String confirmChange = 'Confirm Change';
+  static const String restorePurchases = 'Restore Purchases';
+  static const String paymentIssue = 'Payment issue';
+  static const String yearlyAutoRenewCancelAnytime =
+      'Yearly auto-renew. Cancel anytime';
+
+  // home page
+  static const String recent = 'Recent';
+  static const String moviesAndTV = 'Movies&TV';
+  static const String social = 'Social';
+  static const String support = 'Support';
+  static const String sport = 'Sport';
+  static const String music = 'Music';
+  static const String game = 'Game';
+
+  // country restricted
+  static const String sorry = 'Sorry';
+  static const String unableToLoadData = 'Unable to load data';
+  static const String dueLawsAndRegulations =
+      'Due to local laws and regulations, \nNOMOVPN services are not available in \nyour current region.';
+
+  // more pages
+  static const String sendPreCodeToEmail = 'Send Pre Code to Email';
+  static const String selectServer = 'Select Server';
+  static const String relieveDevice = 'Relieve Device';
+  static const String relieve = 'Relieve';
+  static const String info = 'Info';
+  static const String restoringPurchases = 'Restoring purchases...';
 }