fix locale in get-cli standard (#81)

* refactor project in get-cli standard

* use local trackers when github is not connectable
upgrade stylish_bottom_bar to 1.0.0
responsive view for home_view
treeview for file_list_vie
fluent ui integrating

* improve responsive view.
treeView add light theme.fix overflow bugs

* responsive view,treeView,file select
downloaded and downloading pages
file extension icons
fix some minor bugs

* use local trackers when github is not connectable
upgrade stylish_bottom_bar to 1.0.0
responsive view for home_view
treeview for file_list_vie
fluent ui integrating

* improve responsive view.
treeView add light theme.fix overflow bugs

* bottom bar index fix

* refactor project in get-cli standard

---------

Co-authored-by: wuke2022 <[email protected]>
This commit is contained in:
Neginegiandwuke2022 authored and GitHub committed 2023-02-19 21:22:20 +08:00
1 parent 74c24ad860
commit c0e24ce869
19 files changed
+41 -270

No files matched your search

+3 -1
View File
@@ -20,7 +20,9 @@ start the front-end flutter project in `debug` mode to run.
The internationalization files of Gopeed are located in the `ui/flutter/assets/locales` directory.
You only need to add the corresponding language file in this directory.
Generate locales after you edit locales/internationalization:
Generate locales after you edit locales:
```
get generate locales
+6 -2
View File
@@ -16,7 +16,9 @@ flutter 项目即可运行。
Gopeed 的国际化文件位于 `ui/flutter/assets/locales` 目录下,只需要在该目录下添加对应的语言文件即可。
编辑locales/internationalization后请运行以下命令:
编辑locales后请运行以下命令:
```
get generate locales
@@ -24,7 +26,9 @@ get generate locales
请注意以 `en_US.json` 为参照进行翻译。
## flutter development
## flutter开发
每次提交前请务必运行`dart format .`
+2 -1
View File
@@ -29,7 +29,8 @@
.packages
.pub-cache/
.pub/
/build/
build/
.fvm/
# Web related
+1 -1
View File
@@ -9,7 +9,7 @@
"downloading": "downloading",
"downloaded": "downloaded",
"setting": "تنظیمات",
"title": "ایجاد کار",
"create": "ایجاد کار",
"downloadLink": "لینک دانلود",
"downloadLinkValid": "لطفا لینک دانلود را وارد کنید",
"downloadLinkHit": "Please enter the download link, HTTP/HTTPS/MAGNET supported@append",
+1 -1
View File
@@ -9,7 +9,7 @@
"downloading": "downloading",
"downloaded": "downloaded",
"setting": "Настройки",
"title": "Создать задачу",
"create": "Создать задачу",
"downloadLink": "Ссылка для скачивание",
"downloadLinkValid": "Пожалуйста, введите ссылку для скачивания",
"downloadLinkHit": "Пожалуйста, введите ссылку для скачивания, HTTP/HTTPS/MAGNET supported@append",
+1 -1
View File
@@ -9,7 +9,7 @@
"downloading": "下载中",
"downloaded": "已完成",
"setting": "设置",
"title": "创建任务",
"create": "创建任务",
"downloadLink": "下载链接",
"downloadLinkValid": "请输入下载链接",
"downloadLinkHit": "请输入下载链接,支持 HTTP/HTTPS/MAGNET@append",
@@ -9,6 +9,7 @@ import 'package:shared_preferences/shared_preferences.dart';
import '../../../../api/api.dart';
import '../../../../api/model/downloader_config.dart';
import '../../../../core/common/start_config.dart';
import '../../../../generated/locales.g.dart';
import '../../../../i18n/messages.dart';
import '../../../../util/log_util.dart';
import '../../../../util/util.dart';
@@ -184,7 +185,7 @@ class AppController extends GetxController {
}
if (extra.locale.isEmpty) {
final systemLocale = getLocaleKey(ui.window.locale);
extra.locale = messages.keys.containsKey(systemLocale)
extra.locale = AppTranslation.translations.containsKey(systemLocale)
? systemLocale
: getLocaleKey(fallbackLocale);
}
@@ -29,7 +29,8 @@ class AppView extends GetView<AppController> {
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: messages.keys.keys.map((e) => toLocale(e)).toList(),
supportedLocales:
AppTranslation.translations.keys.map((e) => toLocale(e)).toList(),
getPages: AppPages.routes,
);
}
@@ -31,7 +31,7 @@ class CreateView extends GetView<CreateController> {
icon: const Icon(Icons.arrow_back),
onPressed: () => Get.rootDelegate.offNamed(Routes.DOWNLOADING)),
// actions: [],
title: Text('create.title'.tr),
title: Text('create'.tr),
),
body: DropTarget(
onDragDone: (details) {
@@ -52,12 +52,12 @@ class CreateView extends GetView<CreateController> {
decoration: InputDecoration(
hintText: _hitText(),
hintStyle: const TextStyle(fontSize: 12),
labelText: 'create.downloadLink'.tr,
labelText: 'downloadLink'.tr,
icon: const Icon(Icons.link)),
validator: (v) {
return v!.trim().isNotEmpty
? null
: 'create.downloadLinkValid'.tr;
: 'downloadLinkValid'.tr;
}),
Center(
child: Padding(
@@ -98,8 +98,8 @@ class CreateView extends GetView<CreateController> {
}
String _hitText() {
return 'create.downloadLinkHit'.trParams({
'append': Util.isDesktop() ? 'create.downloadLinkHitDesktop'.tr : '',
return 'downloadLinkHit'.trParams({
'append': Util.isDesktop() ? 'downloadLinkHitDesktop'.tr : '',
});
}
@@ -172,7 +172,7 @@ class CreateView extends GetView<CreateController> {
// if (Util.isAndroid()) {
// if (!await Permission.storage.request().isGranted) {
// Get.snackbar('error'.tr,
// 'create.error.noStoragePermission'.tr);
// 'noStoragePermission'.tr);
// return;
// }
// }
@@ -195,7 +195,7 @@ class CreateView extends GetView<CreateController> {
}
},
controller: downloadController,
child: Text('create.download'.tr),
child: Text('download'.tr),
),
),
],
@@ -22,7 +22,7 @@ class HomeView extends GetView<HomeController> {
? NavigationRail(
extended: true,
labelType: NavigationRailLabelType.none,
minExtendedWidth: 140,
minExtendedWidth: 170,
groupAlignment: 0,
// useIndicator: false,
onDestinationSelected: (int index) {
@@ -7,6 +7,7 @@ import 'package:get/get.dart';
import 'package:intl/intl.dart';
import 'package:url_launcher/url_launcher.dart';
import '../../../../generated/locales.g.dart';
import '../../../../i18n/messages.dart';
import '../../../../util/package_info.dart';
import '../../../../util/util.dart';
@@ -202,7 +203,8 @@ class SettingView extends GetView<SettingController> {
));
final buildLocale = _buildConfigItem(
'locale',
() => messages.keys[downloaderCfg.value.extra.locale]!['label']!,
() => AppTranslation
.translations[downloaderCfg.value.extra.locale]!['label']!,
(Key key) => DropdownButton<String>(
key: key,
value: downloaderCfg.value.extra.locale,
@@ -216,10 +218,10 @@ class SettingView extends GetView<SettingController> {
await debounceSave();
},
items: messages.keys.keys
items: AppTranslation.translations.keys
.map((e) => DropdownMenuItem<String>(
value: e,
child: Text(messages.keys[e]!['label']!),
child: Text(AppTranslation.translations[e]!['label']!),
))
.toList(),
));
@@ -24,7 +24,7 @@ class BuildTaskListView extends GetView {
actions: <Widget>[
IconButton(
icon: const Icon(Icons.add),
tooltip: 'create.title'.tr,
tooltip: 'create'.tr,
onPressed: () {
Get.rootDelegate.toNamed(Routes.CREATE);
},
@@ -32,14 +32,14 @@ class BuildTaskListView extends GetView {
//TODO appBar toggleALl/start selected/delete selected/
// IconButton(
// icon: const Icon(Icons.pause),
// tooltip: 'create.title'.tr,
// tooltip: 'title'.tr,
// onPressed: () {
// // pause all
// },
// ),
// IconButton(
// icon: const Icon(Icons.delete),
// tooltip: 'create.title'.tr,
// tooltip: 'title'.tr,
// onPressed: () {
// // delete all
// },
@@ -141,7 +141,7 @@ class FileListView extends GetView {
children: [
const Padding(padding: EdgeInsets.only(top: 10)),
Text(
'create.selectFile'.tr,
'selectFile'.tr,
// style: TextStyle(color: themeData.hintColor),
),
Expanded(
-58
View File
@@ -1,58 +0,0 @@
const enUS = {
'en_US': {
'label': 'English',
'error': 'Error',
'tip': 'Tip',
'confirm': 'Confirm',
'cancel': 'Cancel',
'selectAll': 'Select All',
'home.task': 'Task',
'home.downloading': 'downloading',
'home.downloaded': 'downloaded',
'home.setting': 'Setting',
'create.title': 'Create Task',
'create.downloadLink': 'Download Link',
'create.downloadLinkValid': 'Please enter the download link',
'create.downloadLinkHit':
'Please enter the download link, HTTP/HTTPS/MAGNET supported@append',
'create.downloadLinkHitDesktop': ', or drag the torrent file here directly',
'create.download': 'Download',
'create.error.noStoragePermission': 'Storage permission required',
'create.selectFile': 'Select File',
'setting.title': 'Setting',
'setting.basic': 'Basic',
'setting.advanced': 'Advanced',
'setting.general': 'General',
'setting.downloadDir': 'Download Directory',
'setting.downloadDirValid': 'Please select the download directory',
'setting.connections': 'Connections',
'setting.items': '@count items',
'setting.subscribeTracker': 'Subscribe Tracker',
'setting.subscribeFail':
'Subscribe failed, please check network or try again later',
'setting.update': 'Update',
'setting.updateDaily': 'Update daily',
'setting.lastUpdate': 'Last update: @time',
'setting.addTracker': 'Add Tracker',
'setting.addTrackerHit':
'Please enter the tracker server url, one per line',
'setting.ui': 'UI',
'setting.theme': 'Theme',
'setting.themeSystem': 'System',
'setting.themeLight': 'Light',
'setting.themeDark': 'Dark',
'setting.locale': 'Language',
'setting.about': 'About',
'setting.homepage': 'Homepage',
'setting.version': 'Version',
'setting.protocol': 'Protocol',
'setting.port': 'Port',
'setting.apiToken': 'API Token',
'setting.notSet': 'NS',
'setting.set': 'SET',
'setting.effectAfterRestart': 'Effect after restart',
'task.deleteTask': 'Delete Task',
'task.deleteTaskTip': 'Keep downloaded files',
'task.delete': 'Delete',
},
};
-58
View File
@@ -1,58 +0,0 @@
const faIR = {
'fa_ir': {
'label': 'فارسی',
'error': 'اررور',
'tip': 'Tip',
'confirm': 'تایید',
'cancel': 'انصراف',
'selectAll': 'انتخاب همه',
'home.task': 'کار',
'home.downloading': 'downloading',
'home.downloaded': 'downloaded',
'home.setting': 'تنظیمات',
'create.title': 'ایجاد کار',
'create.downloadLink': 'لینک دانلود',
'create.downloadLinkValid': 'لطفا لینک دانلود را وارد کنید',
'create.downloadLinkHit':
'Please enter the download link, HTTP/HTTPS/MAGNET supported@append',
'create.downloadLinkHitDesktop': ', or drag the torrent file here directly',
'create.download': 'دانلود',
'create.error.noStoragePermission': 'مجوز ذخیره سازی مورد نیاز است',
'create.selectFile': 'انتخاب فایل',
'setting.title': 'تنظیمات',
'setting.basic': 'پایه',
'setting.advanced': 'پیشرفته',
'setting.general': 'عمومی',
'setting.downloadDir': 'دایرکتوری دانلود',
'setting.downloadDirValid': 'لطفا دایرکتوری دانلود را انتخاب کنید',
'setting.connections': 'اتصالات',
'setting.items': '@count آیتم ها',
'setting.subscribeTracker': 'Subscribe Tracker',
'setting.subscribeFail':
'Subscribe failed, please check network or try again later',
'setting.update': 'بروزرسانی',
'setting.updateDaily': 'بروزرسانی روزانه',
'setting.lastUpdate': 'Last update: @time',
'setting.addTracker': 'Add Tracker',
'setting.addTrackerHit':
'Please enter the tracker server url, one per line',
'setting.ui': 'رابط کاربری',
'setting.theme': 'پوسته',
'setting.themeSystem': 'سیستم',
'setting.themeLight': 'روشن',
'setting.themeDark': 'تاریک',
'setting.locale': 'Language',
'setting.about': 'درباره ی',
'setting.homepage': 'صفحه اصلی',
'setting.version': 'نسخه',
'setting.protocol': 'پروتکل',
'setting.port': 'پورت',
'setting.apiToken': 'API توکن',
'setting.notSet': 'NS',
'setting.set': 'SET',
'setting.effectAfterRestart': 'Effect after restart',
'task.deleteTask': 'پاک کردن کار',
'task.deleteTaskTip': 'فایل های دانلود شده را نگه دارد',
'task.delete': 'پاک کردن',
},
};
-58
View File
@@ -1,58 +0,0 @@
const ruRU = {
'ru_RU': {
'label': 'Русский(Россия)',
'error': 'Ошибка',
'tip': 'Подсказка',
'confirm': 'Подтвердить',
'cancel': 'Отмена',
'selectAll': 'Выбрать все',
'home.task': 'Задачи',
'home.downloading': 'downloading',
'home.downloaded': 'downloaded',
'home.setting': 'Настройки',
'create.title': 'Создать задачу',
'create.downloadLink': 'Ссылка для скачивание',
'create.downloadLinkValid': 'Пожалуйста, введите ссылку для скачивания',
'create.downloadLinkHit':
'Пожалуйста, введите ссылку для скачивания, HTTP/HTTPS/MAGNET supported@append',
'create.downloadLinkHitDesktop': ', или перетащите сюда торрент-файл',
'create.download': 'Скачать',
'create.error.noStoragePermission': 'Требуется доступ к хранилищу',
'create.selectFile': 'Выберать файл',
'setting.title': 'Настройки',
'setting.basic': 'Основные параметры',
'setting.advanced': 'Расширенные',
'setting.general': 'Общие',
'setting.downloadDir': 'Папка загрузки',
'setting.downloadDirValid': 'Пожалуйста, выберите папку для загрузки',
'setting.connections': 'Соединений',
'setting.items': '@подсчет элементов',
'setting.subscribeTracker': 'Подпись трекера',
'setting.subscribeFail':
'Подписка не удалась, пожалуйста, проверьте сеть или повторите попытку позже',
'setting.update': 'Обновить',
'setting.updateDaily': 'Обновлять ежедневно',
'setting.lastUpdate': 'Последнее обновление: @время',
'setting.addTracker': 'Добавить трекер',
'setting.addTrackerHit':
'Пожалуйста, введите url трекера, по одному в строке',
'setting.ui': 'UI',
'setting.theme': 'Тема',
'setting.themeSystem': 'Системная',
'setting.themeLight': 'Светлая',
'setting.themeDark': 'Темная',
'setting.locale': 'Язык',
'setting.about': 'О приложении',
'setting.homepage': 'Домашняя страница',
'setting.version': 'Версия',
'setting.protocol': 'Протокол',
'setting.port': 'Порт',
'setting.apiToken': 'API Токен',
'setting.notSet': 'Не установлено',
'setting.set': 'Установлено',
'setting.effectAfterRestart': 'Эффект после перезагрузки',
'task.deleteTask': 'Удалить задачу',
'task.deleteTaskTip': 'Сохранить загруженные файлы',
'task.delete': 'Удалить',
},
};
-55
View File
@@ -1,55 +0,0 @@
const zhCN = {
'zh_CN': {
'label': '中文(简体)',
'error': '错误',
'tip': '提示',
'confirm': '确认',
'cancel': '取消',
'selectAll': '全选',
'home.task': '任务',
'home.downloading': '下载中',
'home.downloaded': '已完成',
'home.setting': '设置',
'create.title': '创建任务',
'create.downloadLink': '下载链接',
'create.downloadLinkValid': '请输入下载链接',
'create.downloadLinkHit': '请输入下载链接,支持 HTTP/HTTPS/MAGNET@append',
'create.downloadLinkHitDesktop': ',也可以直接拖拽种子文件到此处',
'create.download': '下载',
'create.error.noStoragePermission': '需要开启存储权限',
'create.selectFile': '选择文件',
'setting.title': '设置',
'setting.basic': '基础',
'setting.advanced': '高级',
'setting.general': '通用',
'setting.downloadDir': '下载目录',
'setting.downloadDirValid': '请选择下载目录',
'setting.connections': '连接数',
'setting.items': '@count 条',
'setting.subscribeTracker': '订阅 Tracker',
'setting.subscribeFail': '订阅失败,请检查网络或稍后重试',
'setting.update': '更新',
'setting.updateDaily': '每天自动更新',
'setting.lastUpdate': '上次更新:@time',
'setting.addTracker': '添加 Tracker',
'setting.addTrackerHit': '请输入 tracker 服务器地址,每行一条',
'setting.ui': '界面',
'setting.theme': '主题',
'setting.themeSystem': '跟随系统',
'setting.themeLight': '明亮主题',
'setting.themeDark': '暗黑主题',
'setting.locale': '语言',
'setting.about': '关于',
'setting.homepage': '主页',
'setting.version': '版本',
'setting.protocol': '通讯协议',
'setting.port': '端口',
'setting.apiToken': '接口令牌',
'setting.notSet': '未设置',
'setting.set': '已设置',
'setting.effectAfterRestart': '此配置项将在重启应用后生效',
'task.deleteTask': '删除任务',
'task.deleteTaskTip': '保留已下载的文件',
'task.delete': '删除',
}
};
-14
View File
@@ -1,10 +1,4 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:gopeed/i18n/langs/ru_RU.dart';
import 'package:gopeed/i18n/langs/fa_ir.dart';
import 'langs/en_us.dart';
import 'langs/zh_cn.dart';
Locale toLocale(String key) {
final arr = key.split('_');
@@ -15,13 +9,5 @@ String getLocaleKey(Locale locale) {
return '${locale.languageCode}_${locale.countryCode}';
}
final messages = _Messages();
const mainLocale = Locale('zh', 'CN');
const fallbackLocale = Locale('en', 'US');
class _Messages extends Translations {
// just include available locales here
@override
Map<String, Map<String, String>> get keys =>
{...zhCN, ...enUS, ...ruRU, ...faIR};
}
+6 -3
View File
@@ -7,6 +7,7 @@ import 'package:gopeed/i18n/messages.dart';
import 'app/modules/app/controllers/app_controller.dart';
import 'app/modules/app/views/app_view.dart';
import 'core/libgopeed_boot.dart';
import 'generated/locales.g.dart';
import 'util/log_util.dart';
import 'util/mac_secure_util.dart';
import 'util/package_info.dart';
@@ -52,9 +53,11 @@ Future<void> onStart() async {
// if is debug mode, check language message is complete
if (kDebugMode) {
final mainLang = getLocaleKey(mainLocale);
final fullMessages = messages.keys[mainLang];
messages.keys.keys.where((e) => e != mainLang).forEach((lang) {
final langMessages = messages.keys[lang];
final fullMessages = AppTranslation.translations[mainLang];
AppTranslation.translations.keys
.where((e) => e != mainLang)
.forEach((lang) {
final langMessages = AppTranslation.translations[lang];
if (langMessages == null) {
logger.w("missing language: $lang");
return;