lilu 6 месяцев назад
Родитель
Сommit
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 {
   String get _title {
     switch (type) {
     switch (type) {
       case RestrictedType.network:
       case RestrictedType.network:
-        return "Oops!";
+        return Strings.oops.tr;
       default:
       default:
-        return "Sorry";
+        return Strings.sorry.tr;
     }
     }
   }
   }
 
 
   String get _content {
   String get _content {
     switch (type) {
     switch (type) {
       case RestrictedType.network:
       case RestrictedType.network:
-        return "Something went wrong\nUnable to load data";
+        return "${Strings.someThingWentWorng.tr}\n${Strings.unableToLoadData.tr}";
       default:
       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 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 
 
 import '../../../../config/theme/dark_theme_colors.dart';
 import '../../../../config/theme/dark_theme_colors.dart';
+import '../../../../config/translations/strings_enum.dart';
 import '../../../constants/assets.dart';
 import '../../../constants/assets.dart';
 import '../../../constants/iconfont/iconfont.dart';
 import '../../../constants/iconfont/iconfont.dart';
 import '../../../widgets/ix_image.dart';
 import '../../../widgets/ix_image.dart';
@@ -18,7 +19,7 @@ class AccountView extends BaseView<AccountController> {
   const AccountView({super.key});
   const AccountView({super.key});
 
 
   @override
   @override
-  PreferredSizeWidget? get appBar => IXAppBar(title: 'Account');
+  PreferredSizeWidget? get appBar => IXAppBar(title: Strings.account.tr);
 
 
   @override
   @override
   Widget buildContent(BuildContext context) {
   Widget buildContent(BuildContext context) {
@@ -116,7 +117,7 @@ class AccountView extends BaseView<AccountController> {
     return ClickOpacity(
     return ClickOpacity(
       onTap: () {
       onTap: () {
         Clipboard.setData(ClipboardData(text: controller.uid));
         Clipboard.setData(ClipboardData(text: controller.uid));
-        Get.snackbar('已复制', 'UID 已复制到剪贴板');
+        Get.snackbar(Strings.copied.tr, 'UID ${Strings.copied.tr}');
       },
       },
       child: Container(
       child: Container(
         height: 56.w,
         height: 56.w,
@@ -330,7 +331,7 @@ class AccountView extends BaseView<AccountController> {
         children: [
         children: [
           // Upgrade to Premium 按钮
           // Upgrade to Premium 按钮
           SubmitButton(
           SubmitButton(
-            text: 'Upgrade to Premium',
+            text: Strings.upgradeToPremium.tr,
             bgColor: Get.reactiveTheme.highlightColor,
             bgColor: Get.reactiveTheme.highlightColor,
             textColor: DarkThemeColors.subscriptionColor,
             textColor: DarkThemeColors.subscriptionColor,
             onPressed: () {
             onPressed: () {
@@ -340,7 +341,7 @@ class AccountView extends BaseView<AccountController> {
           20.verticalSpaceFromWidth,
           20.verticalSpaceFromWidth,
           // Activate Pre Code 按钮
           // Activate Pre Code 按钮
           _buildSecondaryButton(
           _buildSecondaryButton(
-            text: 'Activate Pre Code',
+            text: Strings.activatePreCode.tr,
             icon: IconFont.icon23,
             icon: IconFont.icon23,
             onTap: () {
             onTap: () {
               // TODO: 激活兑换码
               // TODO: 激活兑换码
@@ -349,7 +350,7 @@ class AccountView extends BaseView<AccountController> {
           10.verticalSpaceFromWidth,
           10.verticalSpaceFromWidth,
           // 提示文字
           // 提示文字
           Text(
           Text(
-            'If you have a Pre code, please enter it to claim your Pre benefits.',
+            Strings.preCodeHint.tr,
             textAlign: TextAlign.center,
             textAlign: TextAlign.center,
             style: TextStyle(
             style: TextStyle(
               fontSize: 12.sp,
               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 'package:pinput/pinput.dart';
 
 
 import '../../../../config/theme/dark_theme_colors.dart';
 import '../../../../config/theme/dark_theme_colors.dart';
+import '../../../../config/translations/strings_enum.dart';
 import '../../../constants/iconfont/iconfont.dart';
 import '../../../constants/iconfont/iconfont.dart';
 import '../../../widgets/info_card.dart';
 import '../../../widgets/info_card.dart';
 import '../controllers/deviceauth_controller.dart';
 import '../controllers/deviceauth_controller.dart';
@@ -18,7 +19,7 @@ class DeviceauthView extends BaseView<DeviceauthController> {
   const DeviceauthView({super.key});
   const DeviceauthView({super.key});
 
 
   @override
   @override
-  PreferredSizeWidget? get appBar => IXAppBar(title: 'Device Authorization');
+  PreferredSizeWidget? get appBar => IXAppBar(title: Strings.deviceAuthorization.tr);
 
 
   @override
   @override
   Widget buildContent(BuildContext context) {
   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:get/get.dart';
 import 'package:nomo/app/constants/iconfont/iconfont.dart';
 import 'package:nomo/app/constants/iconfont/iconfont.dart';
 import '../../../../config/theme/theme_extensions/theme_extension.dart';
 import '../../../../config/theme/theme_extensions/theme_extension.dart';
+import '../../../../config/translations/strings_enum.dart';
 import '../../../base/base_view.dart';
 import '../../../base/base_view.dart';
 import '../../../constants/assets.dart';
 import '../../../constants/assets.dart';
 import '../../../routes/app_pages.dart';
 import '../../../routes/app_pages.dart';
@@ -264,7 +265,7 @@ class HomeView extends BaseView<HomeController> {
                     ),
                     ),
                     SizedBox(width: 4.w),
                     SizedBox(width: 4.w),
                     Text(
                     Text(
-                      'Recent',
+                      Strings.recent.tr,
                       style: TextStyle(
                       style: TextStyle(
                         fontSize: 12.sp,
                         fontSize: 12.sp,
                         height: 1.2,
                         height: 1.2,

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

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

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

@@ -1,5 +1,7 @@
 import 'package:get/get.dart';
 import 'package:get/get.dart';
 
 
+import '../../../../config/translations/localization_service.dart';
+
 class LanguageInfo {
 class LanguageInfo {
   final String code;
   final String code;
   final String name;
   final String name;
@@ -19,11 +21,11 @@ class LanguageController extends GetxController {
   // 支持的语言列表
   // 支持的语言列表
   final List<LanguageInfo> languages = [
   final List<LanguageInfo> languages = [
     LanguageInfo(code: 'en', name: 'English', nativeName: '英语'),
     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: 'es', name: 'Español', nativeName: '西班牙语'),
     LanguageInfo(code: 'fr', name: 'Français', nativeName: '法语'),
     LanguageInfo(code: 'fr', name: 'Français', nativeName: '法语'),
     LanguageInfo(code: 'de', name: 'Deutsch', nativeName: '德语'),
     LanguageInfo(code: 'de', name: 'Deutsch', nativeName: '德语'),
@@ -34,21 +36,13 @@ class LanguageController extends GetxController {
   @override
   @override
   void onInit() {
   void onInit() {
     super.onInit();
     super.onInit();
-  }
-
-  @override
-  void onReady() {
-    super.onReady();
-  }
-
-  @override
-  void onClose() {
-    super.onClose();
+    selectedLanguage.value = LocalizationService.getCurrentLocal().languageCode;
   }
   }
 
 
   /// 选择语言
   /// 选择语言
   void selectLanguage(String languageCode) {
   void selectLanguage(String languageCode) {
     selectedLanguage.value = 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/app/widgets/ix_app_bar.dart';
 import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 
 
+import '../../../../config/translations/strings_enum.dart';
 import '../controllers/language_controller.dart';
 import '../controllers/language_controller.dart';
 
 
 class LanguageView extends BaseView<LanguageController> {
 class LanguageView extends BaseView<LanguageController> {
   const LanguageView({super.key});
   const LanguageView({super.key});
 
 
   @override
   @override
-  PreferredSizeWidget? get appBar => IXAppBar(title: 'Language');
+  PreferredSizeWidget? get appBar => IXAppBar(title: Strings.language.tr);
 
 
   @override
   @override
   Widget buildContent(BuildContext context) {
   Widget buildContent(BuildContext context) {

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

@@ -1,5 +1,7 @@
 import 'package:get/get.dart';
 import 'package:get/get.dart';
 
 
+import '../../../../config/translations/strings_enum.dart';
+
 /// 流媒体服务数据模型
 /// 流媒体服务数据模型
 class StreamingService {
 class StreamingService {
   final String name;
   final String name;
@@ -19,25 +21,25 @@ class MedialocationController extends GetxController {
   final isConnecting = false.obs;
   final isConnecting = false.obs;
 
 
   // 流媒体服务列表
   // 流媒体服务列表
-  final List<StreamingService> streamingServices = [
+  List<StreamingService> get streamingServices => [
     StreamingService(
     StreamingService(
-      name: 'Netflix',
-      description: 'Nifty Streaming',
+      name: Strings.netflix.tr,
+      description: Strings.niftyStreaming.tr,
       logoUrl: 'assets/images/netflix_logo.png',
       logoUrl: 'assets/images/netflix_logo.png',
     ),
     ),
     StreamingService(
     StreamingService(
-      name: 'YouTube',
-      description: 'YouTube Streaming',
+      name: Strings.youtube.tr,
+      description: Strings.youtubeStreaming.tr,
       logoUrl: 'assets/images/youtube_logo.png',
       logoUrl: 'assets/images/youtube_logo.png',
     ),
     ),
     StreamingService(
     StreamingService(
-      name: 'hulu',
-      description: 'hulu Streaming',
+      name: Strings.hulu.tr,
+      description: Strings.huluStreaming.tr,
       logoUrl: 'assets/images/hulu_logo.png',
       logoUrl: 'assets/images/hulu_logo.png',
     ),
     ),
     StreamingService(
     StreamingService(
-      name: 'Amazon',
-      description: 'Amazon Streaming',
+      name: Strings.amazon.tr,
+      description: Strings.amazonStreaming.tr,
       logoUrl: 'assets/images/amazon_logo.png',
       logoUrl: 'assets/images/amazon_logo.png',
     ),
     ),
   ];
   ];
@@ -60,8 +62,8 @@ class MedialocationController extends GetxController {
   /// 打开流媒体服务
   /// 打开流媒体服务
   void openStreamingService(StreamingService service) {
   void openStreamingService(StreamingService service) {
     Get.snackbar(
     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;
       isConnecting.value = false;
       isConnected.value = true;
       isConnected.value = true;
       Get.snackbar(
       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:get/get.dart';
 import 'package:nomo/config/theme/dark_theme_colors.dart';
 import 'package:nomo/config/theme/dark_theme_colors.dart';
 
 
+import '../../../../config/translations/strings_enum.dart';
 import '../../../constants/assets.dart';
 import '../../../constants/assets.dart';
 import '../../../constants/iconfont/iconfont.dart';
 import '../../../constants/iconfont/iconfont.dart';
 import '../../../widgets/click_opacity.dart';
 import '../../../widgets/click_opacity.dart';
@@ -149,10 +150,10 @@ class MedialocationView extends GetView<MedialocationController> {
           // 连接状态
           // 连接状态
           Obx(() {
           Obx(() {
             final text = controller.isConnected.value
             final text = controller.isConnected.value
-                ? 'Connected'
+                ? Strings.connected.tr
                 : controller.isConnecting.value
                 : controller.isConnecting.value
-                ? 'Connecting'
-                : 'Disconnected';
+                ? Strings.connecting.tr
+                : Strings.disconnected.tr;
             final textColor = controller.isConnected.value
             final textColor = controller.isConnected.value
                 ? DarkThemeColors.text1
                 ? DarkThemeColors.text1
                 : controller.isConnecting.value
                 : controller.isConnecting.value
@@ -281,7 +282,7 @@ class MedialocationView extends GetView<MedialocationController> {
                 borderRadius: BorderRadius.circular(20.r),
                 borderRadius: BorderRadius.circular(20.r),
               ),
               ),
               child: Text(
               child: Text(
-                'Open',
+                Strings.open.tr,
                 style: TextStyle(fontSize: 13.sp, color: DarkThemeColors.text1),
                 style: TextStyle(fontSize: 13.sp, color: DarkThemeColors.text1),
               ),
               ),
             ),
             ),
@@ -350,10 +351,10 @@ class MedialocationView extends GetView<MedialocationController> {
       child: Obx(() {
       child: Obx(() {
         return SubmitButton(
         return SubmitButton(
           text: controller.isConnected.value
           text: controller.isConnected.value
-              ? 'Disconnect'
+              ? Strings.disconnect.tr
               : controller.isConnecting.value
               : controller.isConnecting.value
-              ? 'Connecting...'
-              : 'Connect',
+              ? Strings.connecting.tr
+              : Strings.connect.tr,
           onPressed: controller.isConnected.value
           onPressed: controller.isConnected.value
               ? controller.disconnect
               ? controller.disconnect
               : controller.connect,
               : 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:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
 import 'package:get/get.dart';
 import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
+import '../../../../config/translations/strings_enum.dart';
 import '../../../base/base_view.dart';
 import '../../../base/base_view.dart';
 import '../../../widgets/ix_app_bar.dart';
 import '../../../widgets/ix_app_bar.dart';
 import '../controllers/node_controller.dart';
 import '../controllers/node_controller.dart';
@@ -11,7 +12,7 @@ class NodeView extends BaseView<NodeController> {
   const NodeView({super.key});
   const NodeView({super.key});
 
 
   @override
   @override
-  PreferredSizeWidget? get appBar => IXAppBar(title: 'Select Server');
+  PreferredSizeWidget? get appBar => IXAppBar(title: Strings.selectServer.tr);
 
 
   @override
   @override
   Widget buildContent(BuildContext context) {
   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 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 
 
 import '../../../../../config/theme/dark_theme_colors.dart';
 import '../../../../../config/theme/dark_theme_colors.dart';
+import '../../../../../config/translations/strings_enum.dart';
 import '../../../../constants/assets.dart';
 import '../../../../constants/assets.dart';
 import '../../../../constants/iconfont/iconfont.dart';
 import '../../../../constants/iconfont/iconfont.dart';
 import '../../../../widgets/info_card.dart';
 import '../../../../widgets/info_card.dart';
@@ -18,7 +19,7 @@ class PrecodeSendemailView extends BaseView<PrecodeSendemailController> {
   const PrecodeSendemailView({super.key});
   const PrecodeSendemailView({super.key});
 
 
   @override
   @override
-  PreferredSizeWidget? get appBar => IXAppBar(title: 'Send Pre Code to Email');
+  PreferredSizeWidget? get appBar => IXAppBar(title: Strings.sendPreCodeToEmail.tr);
 
 
   @override
   @override
   Widget buildContent(BuildContext context) {
   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 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 
 
 import '../../../../config/theme/dark_theme_colors.dart';
 import '../../../../config/theme/dark_theme_colors.dart';
+import '../../../../config/translations/strings_enum.dart';
 import '../../../constants/assets.dart';
 import '../../../constants/assets.dart';
 import '../../../constants/iconfont/iconfont.dart';
 import '../../../constants/iconfont/iconfont.dart';
 import '../../../widgets/ix_app_bar.dart';
 import '../../../widgets/ix_app_bar.dart';
@@ -17,7 +18,7 @@ class PrecodeView extends BaseView<PrecodeController> {
   const PrecodeView({super.key});
   const PrecodeView({super.key});
 
 
   @override
   @override
-  PreferredSizeWidget? get appBar => IXAppBar(title: 'My Pre Code');
+  PreferredSizeWidget? get appBar => IXAppBar(title: Strings.myPreCode.tr);
 
 
   @override
   @override
   Widget buildContent(BuildContext context) {
   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/app/widgets/ix_app_bar.dart';
 import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 
 
+import '../../../../config/translations/strings_enum.dart';
 import '../../../constants/iconfont/iconfont.dart';
 import '../../../constants/iconfont/iconfont.dart';
 import '../controllers/routingmode_controller.dart';
 import '../controllers/routingmode_controller.dart';
 
 
@@ -13,7 +14,7 @@ class RoutingmodeView extends BaseView<RoutingmodeController> {
   const RoutingmodeView({super.key});
   const RoutingmodeView({super.key});
 
 
   @override
   @override
-  PreferredSizeWidget? get appBar => IXAppBar(title: 'Routing Mode');
+  PreferredSizeWidget? get appBar => IXAppBar(title: Strings.routingMode.tr);
 
 
   @override
   @override
   Widget buildContent(BuildContext context) {
   Widget buildContent(BuildContext context) {

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

@@ -10,14 +10,4 @@ class SettingController extends GetxController {
   void onInit() {
   void onInit() {
     super.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 'package:nomo/utils/device_manager.dart';
 
 
 import '../../../../config/theme/dark_theme_colors.dart';
 import '../../../../config/theme/dark_theme_colors.dart';
+import '../../../../config/translations/localization_service.dart';
 import '../../../../config/translations/strings_enum.dart';
 import '../../../../config/translations/strings_enum.dart';
 import '../../../../utils/system_helper.dart';
 import '../../../../utils/system_helper.dart';
 import '../../../components/ix_snackbar.dart';
 import '../../../components/ix_snackbar.dart';
@@ -24,18 +25,18 @@ class SettingView extends BaseView<SettingController> {
   const SettingView({super.key});
   const SettingView({super.key});
 
 
   @override
   @override
-  PreferredSizeWidget? get appBar => IXAppBar(title: 'Settings');
+  PreferredSizeWidget? get appBar => IXAppBar(title: Strings.settings.tr);
 
 
   @override
   @override
   Widget buildContent(BuildContext context) {
   Widget buildContent(BuildContext context) {
     return CustomScrollView(
     return CustomScrollView(
       slivers: [
       slivers: [
         // Account Section
         // Account Section
-        _buildSectionHeader('Account'),
+        _buildSectionHeader(Strings.account.tr),
         _buildAccountSection(),
         _buildAccountSection(),
 
 
         // Network Section
         // Network Section
-        _buildSectionHeader('Network'),
+        _buildSectionHeader(Strings.networkSection.tr),
         _buildNetworkSection(),
         _buildNetworkSection(),
 
 
         // APP Section
         // APP Section
@@ -43,7 +44,7 @@ class SettingView extends BaseView<SettingController> {
         _buildAppSection(),
         _buildAppSection(),
 
 
         // Security Section
         // Security Section
-        _buildSectionHeader('Security'),
+        _buildSectionHeader(Strings.securitySection.tr),
         _buildSecuritySection(),
         _buildSecuritySection(),
 
 
         // 底部间距
         // 底部间距
@@ -85,7 +86,7 @@ class SettingView extends BaseView<SettingController> {
               _buildSettingItem(
               _buildSettingItem(
                 icon: IconFont.icon29,
                 icon: IconFont.icon29,
                 iconColor: Get.reactiveTheme.shadowColor,
                 iconColor: Get.reactiveTheme.shadowColor,
-                title: 'Account',
+                title: Strings.account.tr,
                 trailing: IXImage(
                 trailing: IXImage(
                   source: isPremium ? Assets.premium : Assets.free,
                   source: isPremium ? Assets.premium : Assets.free,
                   width: isPremium ? 92.w : 64.w,
                   width: isPremium ? 92.w : 64.w,
@@ -130,7 +131,7 @@ class SettingView extends BaseView<SettingController> {
                 _buildSettingItem(
                 _buildSettingItem(
                   icon: IconFont.icon23,
                   icon: IconFont.icon23,
                   iconColor: Get.reactiveTheme.shadowColor,
                   iconColor: Get.reactiveTheme.shadowColor,
-                  title: 'My Pre Code',
+                  title: Strings.myPreCode.tr,
                   trailing: Row(
                   trailing: Row(
                     mainAxisSize: MainAxisSize.min,
                     mainAxisSize: MainAxisSize.min,
                     children: [
                     children: [
@@ -158,7 +159,7 @@ class SettingView extends BaseView<SettingController> {
                 _buildSettingItem(
                 _buildSettingItem(
                   icon: IconFont.icon30,
                   icon: IconFont.icon30,
                   iconColor: Get.reactiveTheme.shadowColor,
                   iconColor: Get.reactiveTheme.shadowColor,
-                  title: 'Valid Term',
+                  title: Strings.validTerm.tr,
                   trailing: Text(
                   trailing: Text(
                     'Year / 2026-12-12',
                     'Year / 2026-12-12',
                     style: TextStyle(
                     style: TextStyle(
@@ -175,7 +176,7 @@ class SettingView extends BaseView<SettingController> {
                 _buildSettingItem(
                 _buildSettingItem(
                   icon: IconFont.icon30,
                   icon: IconFont.icon30,
                   iconColor: Get.reactiveTheme.shadowColor,
                   iconColor: Get.reactiveTheme.shadowColor,
-                  title: 'Free Time',
+                  title: Strings.freeTime.tr,
                   trailing: Text(
                   trailing: Text(
                     '01:60:59 / Days',
                     '01:60:59 / Days',
                     style: TextStyle(
                     style: TextStyle(
@@ -190,7 +191,7 @@ class SettingView extends BaseView<SettingController> {
               _buildSettingItem(
               _buildSettingItem(
                 icon: IconFont.icon31,
                 icon: IconFont.icon31,
                 iconColor: Get.reactiveTheme.shadowColor,
                 iconColor: Get.reactiveTheme.shadowColor,
-                title: 'Device Authorization',
+                title: Strings.deviceAuthorization.tr,
                 trailing: Row(
                 trailing: Row(
                   mainAxisSize: MainAxisSize.min,
                   mainAxisSize: MainAxisSize.min,
                   children: [
                   children: [
@@ -234,7 +235,7 @@ class SettingView extends BaseView<SettingController> {
             _buildSettingItem(
             _buildSettingItem(
               icon: IconFont.icon34,
               icon: IconFont.icon34,
               iconColor: Get.reactiveTheme.primaryColor,
               iconColor: Get.reactiveTheme.primaryColor,
-              title: 'Routing Mode',
+              title: Strings.routingMode.tr,
               trailing: Icon(
               trailing: Icon(
                 IconFont.icon02,
                 IconFont.icon02,
                 size: 20.w,
                 size: 20.w,
@@ -249,7 +250,7 @@ class SettingView extends BaseView<SettingController> {
             _buildSettingItem(
             _buildSettingItem(
               icon: IconFont.icon32,
               icon: IconFont.icon32,
               iconColor: Get.reactiveTheme.primaryColor,
               iconColor: Get.reactiveTheme.primaryColor,
-              title: 'Split Tunneling',
+              title: Strings.splitTunneling.tr,
               trailing: Icon(
               trailing: Icon(
                 IconFont.icon02,
                 IconFont.icon02,
                 size: 20.w,
                 size: 20.w,
@@ -264,7 +265,7 @@ class SettingView extends BaseView<SettingController> {
             _buildSettingItem(
             _buildSettingItem(
               icon: IconFont.icon33,
               icon: IconFont.icon33,
               iconColor: Get.reactiveTheme.primaryColor,
               iconColor: Get.reactiveTheme.primaryColor,
-              title: 'Auto Reconnect',
+              title: Strings.autoReconnect.tr,
               trailing: Obx(
               trailing: Obx(
                 () => CupertinoSwitch(
                 () => CupertinoSwitch(
                   value: controller.autoReconnect.value,
                   value: controller.autoReconnect.value,
@@ -282,7 +283,7 @@ class SettingView extends BaseView<SettingController> {
             _buildSettingItem(
             _buildSettingItem(
               icon: IconFont.icon35,
               icon: IconFont.icon35,
               iconColor: Get.reactiveTheme.primaryColor,
               iconColor: Get.reactiveTheme.primaryColor,
-              title: 'Restore Default',
+              title: Strings.restoreDefault.tr,
               trailing: Icon(
               trailing: Icon(
                 IconFont.icon02,
                 IconFont.icon02,
                 size: 20.w,
                 size: 20.w,
@@ -320,12 +321,12 @@ class SettingView extends BaseView<SettingController> {
                 begin: Alignment.topCenter,
                 begin: Alignment.topCenter,
                 end: Alignment.bottomCenter,
                 end: Alignment.bottomCenter,
               ),
               ),
-              title: 'Language',
+              title: Strings.language.tr,
               trailing: Row(
               trailing: Row(
                 mainAxisSize: MainAxisSize.min,
                 mainAxisSize: MainAxisSize.min,
                 children: [
                 children: [
                   Text(
                   Text(
-                    'English',
+                    LocalizationService.getGlobalLanguageTitle(),
                     style: TextStyle(
                     style: TextStyle(
                       fontSize: 13.sp,
                       fontSize: 13.sp,
                       color: Get.reactiveTheme.hintColor,
                       color: Get.reactiveTheme.hintColor,
@@ -356,7 +357,7 @@ class SettingView extends BaseView<SettingController> {
                 begin: Alignment.topCenter,
                 begin: Alignment.topCenter,
                 end: Alignment.bottomCenter,
                 end: Alignment.bottomCenter,
               ),
               ),
-              title: 'Feedback',
+              title: Strings.feedback.tr,
               trailing: Icon(
               trailing: Icon(
                 IconFont.icon02,
                 IconFont.icon02,
                 size: 20.w,
                 size: 20.w,
@@ -379,7 +380,7 @@ class SettingView extends BaseView<SettingController> {
                 begin: Alignment.topCenter,
                 begin: Alignment.topCenter,
                 end: Alignment.bottomCenter,
                 end: Alignment.bottomCenter,
               ),
               ),
-              title: 'Privacy Policy',
+              title: Strings.privacyPolicy.tr,
               trailing: Icon(
               trailing: Icon(
                 IconFont.icon02,
                 IconFont.icon02,
                 size: 20.w,
                 size: 20.w,
@@ -402,7 +403,7 @@ class SettingView extends BaseView<SettingController> {
                 begin: Alignment.topCenter,
                 begin: Alignment.topCenter,
                 end: Alignment.bottomCenter,
                 end: Alignment.bottomCenter,
               ),
               ),
-              title: 'Terms of Service',
+              title: Strings.termsOfService.tr,
               trailing: Icon(
               trailing: Icon(
                 IconFont.icon02,
                 IconFont.icon02,
                 size: 20.w,
                 size: 20.w,
@@ -425,7 +426,7 @@ class SettingView extends BaseView<SettingController> {
                 begin: Alignment.topCenter,
                 begin: Alignment.topCenter,
                 end: Alignment.bottomCenter,
                 end: Alignment.bottomCenter,
               ),
               ),
-              title: 'Version',
+              title: Strings.version.tr,
               trailing: Text(
               trailing: Text(
                 'V1.0.0',
                 'V1.0.0',
                 style: TextStyle(
                 style: TextStyle(
@@ -463,7 +464,7 @@ class SettingView extends BaseView<SettingController> {
                 begin: Alignment.topCenter,
                 begin: Alignment.topCenter,
                 end: Alignment.bottomCenter,
                 end: Alignment.bottomCenter,
               ),
               ),
-              title: 'Delete Account',
+              title: Strings.deleteAccount.tr,
               onTap: () {
               onTap: () {
                 // TODO: 删除账户
                 // TODO: 删除账户
               },
               },
@@ -481,7 +482,7 @@ class SettingView extends BaseView<SettingController> {
                 begin: Alignment.topCenter,
                 begin: Alignment.topCenter,
                 end: Alignment.bottomCenter,
                 end: Alignment.bottomCenter,
               ),
               ),
-              title: 'Logout',
+              title: Strings.logout.tr,
               titleColor: const Color(0xFFEF0000),
               titleColor: const Color(0xFFEF0000),
               onTap: () {
               onTap: () {
                 // TODO: 退出登录
                 // 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/app/widgets/ix_image.dart';
 import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 
 
+import '../../../../config/translations/strings_enum.dart';
 import '../controllers/splittunneling_controller.dart';
 import '../controllers/splittunneling_controller.dart';
 import '../selectapp/controllers/splittunneling_selectapp_controller.dart';
 import '../selectapp/controllers/splittunneling_selectapp_controller.dart';
 
 
@@ -16,7 +17,7 @@ class SplittunnelingView extends BaseView<SplittunnelingController> {
   const SplittunnelingView({super.key});
   const SplittunnelingView({super.key});
 
 
   @override
   @override
-  PreferredSizeWidget? get appBar => IXAppBar(title: 'Split Tunneling');
+  PreferredSizeWidget? get appBar => IXAppBar(title: Strings.splitTunneling.tr);
 
 
   @override
   @override
   Widget buildContent(BuildContext context) {
   Widget buildContent(BuildContext context) {
@@ -79,7 +80,7 @@ class SplittunnelingView extends BaseView<SplittunnelingController> {
         _buildModeCard(
         _buildModeCard(
           mode: SplitTunnelingMode.exclude,
           mode: SplitTunnelingMode.exclude,
           icon: IconFont.icon42,
           icon: IconFont.icon42,
-          title: 'Exclude selected apps from VPN',
+          title: Strings.excludeSelectedAppsFromVPN.tr,
           description:
           description:
               'Choose apps that will connect directly without using the VPN.',
               'Choose apps that will connect directly without using the VPN.',
           onTap: () {
           onTap: () {
@@ -94,7 +95,7 @@ class SplittunnelingView extends BaseView<SplittunnelingController> {
         _buildModeCard(
         _buildModeCard(
           mode: SplitTunnelingMode.include,
           mode: SplitTunnelingMode.include,
           icon: IconFont.icon43,
           icon: IconFont.icon43,
-          title: 'Use VPN for selected apps only',
+          title: Strings.useVPNForSelectedAppsOnly.tr,
           description:
           description:
               'Choose apps that will use the VPN while others connect normally.',
               'Choose apps that will use the VPN while others connect normally.',
           onTap: () {
           onTap: () {
@@ -230,7 +231,7 @@ class SplittunnelingView extends BaseView<SplittunnelingController> {
           child: Row(
           child: Row(
             children: [
             children: [
               Text(
               Text(
-                'Select apps',
+                Strings.selectApps.tr,
                 style: TextStyle(
                 style: TextStyle(
                   fontSize: 12.sp,
                   fontSize: 12.sp,
                   color: Get.reactiveTheme.hintColor,
                   color: Get.reactiveTheme.hintColor,
@@ -343,7 +344,7 @@ class SplittunnelingView extends BaseView<SplittunnelingController> {
               ),
               ),
               4.horizontalSpace,
               4.horizontalSpace,
               Text(
               Text(
-                'Customize your VPN',
+                Strings.customizeYourVPN.tr,
                 style: TextStyle(
                 style: TextStyle(
                   fontSize: 14.sp,
                   fontSize: 14.sp,
                   height: 1.6,
                   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/dark_theme_colors.dart';
 import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 import 'package:video_player/video_player.dart';
 import 'package:video_player/video_player.dart';
+import '../../../../config/translations/strings_enum.dart';
 import '../../../constants/assets.dart';
 import '../../../constants/assets.dart';
 import '../../../widgets/info_card.dart';
 import '../../../widgets/info_card.dart';
 import '../../../widgets/ix_image.dart';
 import '../../../widgets/ix_image.dart';
@@ -99,7 +100,7 @@ class SubscriptionView extends GetView<SubscriptionController> {
         children: [
         children: [
           SizedBox(width: 32.w),
           SizedBox(width: 32.w),
           Text(
           Text(
-            'Subscription',
+            Strings.subscription.tr,
             style: TextStyle(
             style: TextStyle(
               fontSize: 16.sp,
               fontSize: 16.sp,
               height: 1.4,
               height: 1.4,
@@ -150,7 +151,7 @@ class SubscriptionView extends GetView<SubscriptionController> {
                   ),
                   ),
                   4.horizontalSpace,
                   4.horizontalSpace,
                   Text(
                   Text(
-                    'Current subscription',
+                    Strings.currentSubscription.tr,
                     style: TextStyle(
                     style: TextStyle(
                       fontSize: 14.sp,
                       fontSize: 14.sp,
                       height: 1.4,
                       height: 1.4,
@@ -311,26 +312,24 @@ class SubscriptionView extends GetView<SubscriptionController> {
   // 计划变更信息
   // 计划变更信息
   Widget _buildPlanChangeInfo() {
   Widget _buildPlanChangeInfo() {
     return InfoCard(
     return InfoCard(
-      title: 'Plan change info',
+      title: Strings.planChangeInfo.tr,
       items: [
       items: [
         InfoItem(
         InfoItem(
           imageSource: Assets.subscriptionPlanChange1,
           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,
           iconColor: DarkThemeColors.primaryColor,
         ),
         ),
         InfoItem(
         InfoItem(
           imageSource: Assets.subscriptionPlanChange2,
           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,
           iconColor: DarkThemeColors.primaryColor,
         ),
         ),
         InfoItem(
         InfoItem(
           imageSource: Assets.subscriptionPlanChange3,
           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,
           iconColor: DarkThemeColors.primaryColor,
         ),
         ),
       ],
       ],
@@ -343,7 +342,7 @@ class SubscriptionView extends GetView<SubscriptionController> {
       crossAxisAlignment: CrossAxisAlignment.start,
       crossAxisAlignment: CrossAxisAlignment.start,
       children: [
       children: [
         Text(
         Text(
-          'Premium\'s included',
+          Strings.premiumsIncluded.tr,
           style: TextStyle(
           style: TextStyle(
             fontSize: 16.sp,
             fontSize: 16.sp,
             color: DarkThemeColors.subscriptionColor,
             color: DarkThemeColors.subscriptionColor,
@@ -359,12 +358,12 @@ class SubscriptionView extends GetView<SubscriptionController> {
           ),
           ),
           child: Column(
           child: Column(
             children: [
             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: Center(
                 child: Text(
                 child: Text(
-                  'Confirm Change',
+                  Strings.confirmChange.tr,
                   style: TextStyle(
                   style: TextStyle(
                     fontSize: 16.sp,
                     fontSize: 16.sp,
                     color: DarkThemeColors.subscriptionColor,
                     color: DarkThemeColors.subscriptionColor,
@@ -444,7 +443,7 @@ class SubscriptionView extends GetView<SubscriptionController> {
               GestureDetector(
               GestureDetector(
                 onTap: controller.restorePurchases,
                 onTap: controller.restorePurchases,
                 child: Text(
                 child: Text(
-                  'Restore Purchases',
+                  Strings.restorePurchases.tr,
                   style: TextStyle(
                   style: TextStyle(
                     fontSize: 16.sp,
                     fontSize: 16.sp,
                     color: DarkThemeColors.bodyTextColor,
                     color: DarkThemeColors.bodyTextColor,
@@ -461,7 +460,7 @@ class SubscriptionView extends GetView<SubscriptionController> {
               GestureDetector(
               GestureDetector(
                 onTap: controller.handlePaymentIssue,
                 onTap: controller.handlePaymentIssue,
                 child: Text(
                 child: Text(
-                  'Payment issue',
+                  Strings.paymentIssue.tr,
                   style: TextStyle(
                   style: TextStyle(
                     fontSize: 16.sp,
                     fontSize: 16.sp,
                     color: DarkThemeColors.bodyTextColor,
                     color: DarkThemeColors.bodyTextColor,
@@ -482,7 +481,7 @@ class SubscriptionView extends GetView<SubscriptionController> {
               ),
               ),
               10.horizontalSpace,
               10.horizontalSpace,
               Text(
               Text(
-                'Yearly auto-renew. Cancel anytime',
+                Strings.yearlyAutoRenewCancelAnytime.tr,
                 style: TextStyle(
                 style: TextStyle(
                   fontSize: 13.sp,
                   fontSize: 13.sp,
                   color: DarkThemeColors.hintTextColor,
                   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.signOut: 'تسجيل الخروج',
 
 
   // حوار تسجيل الخروج
   // حوار تسجيل الخروج
-  Strings.signOutTitle: 'تسجيل الخروج',
   Strings.signOutMessage:
   Strings.signOutMessage:
       'سيؤدي هذا إلى حذف جميع البيانات المحلية (بما في ذلك الإعدادات والسجل) من هذا الجهاز.',
       'سيؤدي هذا إلى حذف جميع البيانات المحلية (بما في ذلك الإعدادات والسجل) من هذا الجهاز.',
   Strings.signOutWarning: 'لا يمكن التراجع عن هذا الإجراء.',
   Strings.signOutWarning: 'لا يمكن التراجع عن هذا الإجراء.',
@@ -336,4 +335,93 @@ final Map<String, String> arAR = {
 
 
   // local boost
   // local boost
   Strings.localBoost: 'تعزيز محلي',
   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',
   Strings.signOut: 'Abmelden',
 
 
   // Sign out dialog
   // Sign out dialog
-  Strings.signOutTitle: 'Abmelden',
   Strings.signOutMessage:
   Strings.signOutMessage:
       'Dies löscht alle lokalen Daten (einschließlich Einstellungen und Verlauf) von diesem Gerät.',
       '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.',
   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
   // local boost
   Strings.localBoost: 'Lokales Boosten',
   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',
   Strings.signOut: 'Sign Out',
 
 
   // Sign out dialog
   // Sign out dialog
-  Strings.signOutTitle: 'Sign Out',
   Strings.signOutMessage:
   Strings.signOutMessage:
       'This will delete all local data (including settings and history) from this device.',
       'This will delete all local data (including settings and history) from this device.',
   Strings.signOutWarning: 'This action cannot be undone.',
   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
   // local boost
   Strings.localBoost: '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',
   Strings.signOut: 'Cerrar Sesión',
 
 
   // Diálogo de cierre de sesión
   // Diálogo de cierre de sesión
-  Strings.signOutTitle: 'Cerrar Sesión',
   Strings.signOutMessage:
   Strings.signOutMessage:
       'Esto eliminará todos los datos locales (incluyendo configuraciones e historial) de este dispositivo.',
       'Esto eliminará todos los datos locales (incluyendo configuraciones e historial) de este dispositivo.',
   Strings.signOutWarning: 'Esta acción no se puede deshacer.',
   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
   // local boost
   Strings.localBoost: 'Impulso Local',
   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.signOut: 'خروج از حساب',
 
 
   // دیالوگ خروج از حساب
   // دیالوگ خروج از حساب
-  Strings.signOutTitle: 'خروج از حساب',
   Strings.signOutMessage:
   Strings.signOutMessage:
       'این کار تمام داده‌های محلی (شامل تنظیمات و تاریخچه) را از این دستگاه حذف خواهد کرد.',
       'این کار تمام داده‌های محلی (شامل تنظیمات و تاریخچه) را از این دستگاه حذف خواهد کرد.',
   Strings.signOutWarning: 'این عمل قابل بازگشت نیست.',
   Strings.signOutWarning: 'این عمل قابل بازگشت نیست.',
@@ -343,4 +342,95 @@ const Map<String, String> faIR = {
 
 
   // local boost
   // local boost
   Strings.localBoost: 'بوست محلی',
   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',
   Strings.signOut: 'Se déconnecter',
 
 
   // Sign out dialog
   // Sign out dialog
-  Strings.signOutTitle: 'Se déconnecter',
   Strings.signOutMessage:
   Strings.signOutMessage:
       'Cela supprimera toutes les données locales (y compris les paramètres et l\'historique) de cet appareil.',
       '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.',
   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
   // local boost
   Strings.localBoost: 'Boost Local',
   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: 'サインアウト',
   Strings.signOut: 'サインアウト',
 
 
   // Sign out dialog
   // Sign out dialog
-  Strings.signOutTitle: 'サインアウト',
   Strings.signOutMessage: 'これにより、このデバイスからすべてのローカルデータ(設定や履歴を含む)が削除されます。',
   Strings.signOutMessage: 'これにより、このデバイスからすべてのローカルデータ(設定や履歴を含む)が削除されます。',
   Strings.signOutWarning: 'この操作は元に戻せません。',
   Strings.signOutWarning: 'この操作は元に戻せません。',
   Strings.confirm: '確認',
   Strings.confirm: '確認',
@@ -320,4 +319,90 @@ const Map<String, String> jaJP = {
 
 
   // local boost
   // local boost
   Strings.localBoost: 'ローカルブースト',
   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: '로그아웃',
   Strings.signOut: '로그아웃',
 
 
   // Sign out dialog
   // Sign out dialog
-  Strings.signOutTitle: '로그아웃',
   Strings.signOutMessage: '이렇게 하면 이 기기에서 모든 로컬 데이터(설정 및 기록 포함)가 삭제됩니다.',
   Strings.signOutMessage: '이렇게 하면 이 기기에서 모든 로컬 데이터(설정 및 기록 포함)가 삭제됩니다.',
   Strings.signOutWarning: '이 작업은 취소할 수 없습니다.',
   Strings.signOutWarning: '이 작업은 취소할 수 없습니다.',
   Strings.confirm: '확인',
   Strings.confirm: '확인',
@@ -318,4 +317,90 @@ const Map<String, String> koKR = {
 
 
   // local boost
   // local boost
   Strings.localBoost: '로컬 부스트',
   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.signOut: 'အကောင့်ထွက်ရန်',
 
 
   // အကောင့်ထွက်ရန် ဒိုင်ယာလော့
   // အကောင့်ထွက်ရန် ဒိုင်ယာလော့
-  Strings.signOutTitle: 'အကောင့်ထွက်ရန်',
   Strings.signOutMessage:
   Strings.signOutMessage:
       'ဤလုပ်ဆောင်ချက်သည် ဤစက်ပစ္စည်းမှ ဒေသတွင်းဒေတာအားလုံး (ဆက်တင်များနှင့် မှတ်တမ်းများအပါအဝင်) ကို ဖျက်ပစ်မည်ဖြစ်သည်။',
       'ဤလုပ်ဆောင်ချက်သည် ဤစက်ပစ္စည်းမှ ဒေသတွင်းဒေတာအားလုံး (ဆက်တင်များနှင့် မှတ်တမ်းများအပါအဝင်) ကို ဖျက်ပစ်မည်ဖြစ်သည်။',
   Strings.signOutWarning: 'ဤလုပ်ဆောင်ချက်ကို ပြန်လည်ပြင်ဆင်၍မရပါ။',
   Strings.signOutWarning: 'ဤလုပ်ဆောင်ချက်ကို ပြန်လည်ပြင်ဆင်၍မရပါ။',
@@ -354,4 +353,98 @@ const Map<String, String> myMM = {
 
 
   // local boost
   // local boost
   Strings.localBoost: 'ပိုက်ဆံမှုကိုလည်းပြုလုပ်ပါ',
   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: 'Выйти',
   Strings.signOut: 'Выйти',
 
 
   // Sign out dialog
   // Sign out dialog
-  Strings.signOutTitle: 'Выйти',
   Strings.signOutMessage:
   Strings.signOutMessage:
       'Это удалит все локальные данные (включая настройки и историю) с этого устройства.',
       'Это удалит все локальные данные (включая настройки и историю) с этого устройства.',
   Strings.signOutWarning: 'Это действие нельзя отменить.',
   Strings.signOutWarning: 'Это действие нельзя отменить.',
@@ -349,4 +348,96 @@ const Map<String, String> ruRU = {
 
 
   // local boost
   // local boost
   Strings.localBoost: 'Локальный Буст',
   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 {
 class Strings {
-  static const String hello = 'hello';
   static const String loading = 'loading';
   static const String loading = 'loading';
 
 
   static const String changeTheme = 'change_theme';
   static const String changeTheme = 'change_theme';
@@ -70,7 +69,6 @@ class Strings {
   static const String go = 'go';
   static const String go = 'go';
   static const String bottomBarGames = 'games';
   static const String bottomBarGames = 'games';
   static const String bottomBarBoost = 'boost';
   static const String bottomBarBoost = 'boost';
-  static const String bottomBarMe = 'me';
 
 
   static const String titleGame = 'game';
   static const String titleGame = 'game';
   static const String tabAll = 'all';
   static const String tabAll = 'all';
@@ -78,20 +76,16 @@ class Strings {
   static const String tabTrending = 'trending';
   static const String tabTrending = 'trending';
   static const String tabNew = 'new';
   static const String tabNew = 'new';
   static const String download = 'download';
   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 gameNotFound = 'game not found';
   static const String exploreGames = 'explore games!';
   static const String exploreGames = 'explore games!';
   static const String chooseServer = 'choose server';
   static const String chooseServer = 'choose server';
 
 
-  static const String titleMe = 'device';
   static const String searchHistory = 'search history';
   static const String searchHistory = 'search history';
   static const String searchHint = 'enter game name';
   static const String searchHint = 'enter game name';
   static const String searchNoGame = 'no game I want to boost';
   static const String searchNoGame = 'no game I want to boost';
   static const String searchNoRelatedGames =
   static const String searchNoRelatedGames =
       'no related games found. browse ourselection?';
       'no related games found. browse ourselection?';
-  static const String searchContactUs = 'contact us';
   static const String submitGameTitle = 'submit game';
   static const String submitGameTitle = 'submit game';
   static const String submitGameContent =
   static const String submitGameContent =
       'could not find the game you wish to boost?';
       'could not find the game you wish to boost?';
@@ -170,14 +164,14 @@ class Strings {
       "Please check your network and try again.";
       "Please check your network and try again.";
   static const String error = 'Error';
   static const String error = 'Error';
 
 
-// 登录注册相关
+  // 登录注册相关
   static const String registerWithEmail = "Register With Email";
   static const String registerWithEmail = "Register With Email";
   static const String signInWithEmail = "Sign In With Email";
   static const String signInWithEmail = "Sign In With Email";
   static const String continueWithGoogle = "Continue With Google";
   static const String continueWithGoogle = "Continue With Google";
   static const String continueWithApple = "Continue With Apple";
   static const String continueWithApple = "Continue With Apple";
   static const String continueWithFacebook = "Continue With Facebook";
   static const String continueWithFacebook = "Continue With Facebook";
 
 
-// 注册页面
+  // 注册页面
   static const String signUp = "Sign Up";
   static const String signUp = "Sign Up";
   static const String emailAddress = "Email address";
   static const String emailAddress = "Email address";
   static const String password = "Password";
   static const String password = "Password";
@@ -185,18 +179,18 @@ class Strings {
   static const String alreadyHaveAccount = "Already have an account?";
   static const String alreadyHaveAccount = "Already have an account?";
   static const String signIn = "Sign In";
   static const String signIn = "Sign In";
 
 
-// 密码规则提示
+  // 密码规则提示
   static const String passwordMustInclude = "Your password must include:";
   static const String passwordMustInclude = "Your password must include:";
   static const String atLeast6Characters = "At least 6 characters";
   static const String atLeast6Characters = "At least 6 characters";
   static const String atLeastOneUppercase = "At least one uppercase letter";
   static const String atLeastOneUppercase = "At least one uppercase letter";
   static const String atLeastOneLowercase = "At least one lowercase letter";
   static const String atLeastOneLowercase = "At least one lowercase letter";
   static const String atLeastOneNumber = "At least one number";
   static const String atLeastOneNumber = "At least one number";
 
 
-// 登录页面
+  // 登录页面
   static const String forgotPassword = "Forgot Password?";
   static const String forgotPassword = "Forgot Password?";
   static const String dontHaveAccount = "Don't have account?";
   static const String dontHaveAccount = "Don't have account?";
 
 
-// 隐私政策
+  // 隐私政策
   static const String termsAndPrivacy =
   static const String termsAndPrivacy =
       "By signing up or continuing, you agree to our Terms and Privacy";
       "By signing up or continuing, you agree to our Terms and Privacy";
   static const String terms = "Terms";
   static const String terms = "Terms";
@@ -205,7 +199,7 @@ class Strings {
       "By signing up or continuing, you agree to our ";
       "By signing up or continuing, you agree to our ";
   static const String termsAgreementConnector = " and ";
   static const String termsAgreementConnector = " and ";
 
 
-// 账户激活
+  // 账户激活
   static const String activateAccount = 'Activate Account';
   static const String activateAccount = 'Activate Account';
   static const String passwordSetup = 'Password Setup';
   static const String passwordSetup = 'Password Setup';
   static const String emailVerificationHint =
   static const String emailVerificationHint =
@@ -221,62 +215,63 @@ class Strings {
   static const String forgotPasswordTitle = 'Forgot Password';
   static const String forgotPasswordTitle = 'Forgot Password';
 
 
   // Account page
   // 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
   // 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
   // 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
   // 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
   // boost report
-  static const String boostReport = 'boost_report';
+  static const String boostReport = 'Boost Report';
 
 
   // sign out dialog
   // 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
   // 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 =
   static const String networkRestricted =
@@ -344,4 +339,97 @@ class Strings {
 
 
   // local boost
   // local boost
   static const String localBoost = '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...';
 }
 }