Compare commits

...

50 Commits

Author SHA1 Message Date
lollipopkit🏳️‍⚧️
8e7de604ee fix: linux build 2025-06-09 18:50:01 +08:00
lollipopkit🏳️‍⚧️
6f2a58ce18 bump: v1184 2025-06-09 16:01:39 +08:00
lollipopkit🏳️‍⚧️
066629d7e0 fix: android build 2025-06-08 20:59:58 +08:00
lollipopkit🏳️‍⚧️
4b3953e0d2 readd: serverTabPreferDiskAmount (#780)
Fixes #643
2025-06-08 11:15:54 +08:00
lollipopkit🏳️‍⚧️
b5aec55106 fix android reload when physical keyboard changes (#779) 2025-06-08 10:46:47 +08:00
lollipopkit🏳️‍⚧️
ba686db847 fix: ssh terminal ui 2025-06-07 17:18:42 +08:00
lollipopkit🏳️‍⚧️
4d52023982 opt.: ssh terminal ux (#778) 2025-06-07 17:07:13 +08:00
lollipopkit🏳️‍⚧️
7a71a96442 fix: examples UI of importing (#777)
Fixes #601
2025-06-05 09:22:54 +08:00
lollipopkit🏳️‍⚧️
79c515c903 new: bio_auth -> local_auth (#776)
Fixes #722
2025-06-05 09:07:28 +08:00
lollipopkit🏳️‍⚧️
4701757857 feat: SSH page background (#775) 2025-06-05 08:53:00 +08:00
lollipopkit🏳️‍⚧️
176cb7da03 feat: disk smart info (#773) 2025-06-05 07:31:45 +08:00
lollipopkit🏳️‍⚧️
741a6442e0 fix: batch delete servers (#772) 2025-06-04 19:28:58 +08:00
lollipopkit🏳️‍⚧️
f6d394c71e opt.: custom terminal emulator (#771) 2025-06-04 19:13:31 +08:00
lollipopkit🏳️‍⚧️
7127c960f7 opt.: server detail page columns 2025-06-04 17:29:03 +08:00
lollipopkit🏳️‍⚧️
1084c49a5f opt.: ui 2025-06-04 01:52:27 +08:00
lollipopkit🏳️‍⚧️
bc824691e0 opt.: server card loading UI 2025-06-04 00:47:18 +08:00
lollipopkit🏳️‍⚧️
0c1ada0067 fix: cloud sync (#769) 2025-06-04 00:11:31 +08:00
lollipopkit🏳️‍⚧️
9547d92ac5 migrate: flutter 3.32 2025-05-25 17:05:46 +08:00
lollipopkit🏳️‍⚧️
7e16d2f159 new: parse disk info via lsblk output Fixes #709 (#760) 2025-05-17 00:45:38 +08:00
lollipopkit🏳️‍⚧️
d88e97e699 new: use generated ids for servers (#765)
* new: use generated ids for servers
Fixes #743

* fix: deps.

* fix: migrate related settings

* fix: restore servers from json
2025-05-16 21:50:44 +08:00
lollipopkit🏳️‍⚧️
d29bd1d806 opt.: ssh page sftp path checking (#763) 2025-05-15 21:01:10 +08:00
lollipopkit🏳️‍⚧️
2b2f1ddb60 opt.: handle esc btn in ssh page (#761) 2025-05-15 20:35:45 +08:00
lollipopkit🏳️‍⚧️
4f16d510c8 fix: code editor page popping (#759)
Fixes #713
2025-05-14 18:58:58 +08:00
lollipopkit🏳️‍⚧️
94cded39a6 fix: horizontal ssh virt keys ui (#758)
Fixes #737
2025-05-14 18:21:18 +08:00
lollipopkit🏳️‍⚧️
12082e1235 chore: README 2025-05-14 16:54:28 +08:00
lollipopkit🏳️‍⚧️
28e34e2183 opt.: editor lang parse 2025-05-14 16:19:26 +08:00
lollipopkit🏳️‍⚧️
4d45d01074 feat: searching in editor page (#756)
* feat: searching in editor page
Fixes #734

* opt.: editor searching ui
2025-05-14 05:09:32 +08:00
lollipopkit🏳️‍⚧️
f6b3ec2a62 opt.: editor (#755)
Fixes #753
2025-05-14 04:07:21 +08:00
lollipopkit🏳️‍⚧️
d6cf33fb70 bug: can't select file on macOS (#754)
Fixes #750
2025-05-14 04:04:19 +08:00
lollipopkit🏳️‍⚧️
1eea133b69 opt.: appbar scrolledUnderElevation (#752)
Fixes #751
2025-05-14 04:02:30 +08:00
lollipopkit🏳️‍⚧️
2b46cb6dcc fix: android monochrome icon (#749)
Fixes #732
2025-05-14 03:22:02 +08:00
lollipopkit🏳️‍⚧️
8627ff823f optimization: desktop UI (#747) 2025-05-13 04:57:37 +08:00
lollipopkit🏳️‍⚧️
e520929411 chore: migrate fl_lib 2025-04-28 23:15:54 +08:00
lollipopkit🏳️‍⚧️
8f09085cf3 Merge remote-tracking branch 'origin/lollipopkit/issue727' 2025-04-25 18:33:36 +08:00
lollipopkit🏳️‍⚧️
9e66071cb0 opt. 2025-04-25 18:32:29 +08:00
Noo6
fa90c1ef31 opt: navigation bar (#740) 2025-04-22 11:54:29 +08:00
Noo6
ede238c647 feat: adaptive navigation bar (#739) 2025-04-22 11:19:19 +08:00
lollipopkit🏳️‍⚧️
6e7fee20b8 opt.: routes 2025-04-10 15:28:47 +08:00
lollipopkit🏳️‍⚧️
391e4f6b65 opt.: page struct 2025-04-09 12:15:42 +08:00
lollipopkit🏳️‍⚧️
e185414355 fix: logo url dist null check 2025-04-08 14:49:26 +08:00
lollipopkit🏳️‍⚧️
2a2f348063 migrate: fl_lib 2025-03-24 23:07:52 +08:00
moli765
95ca6bcfc9 reslove issue 717 about logo url and add coreelec support (#718) 2025-03-22 23:19:54 +08:00
lollipopkit🏳️‍⚧️
275041247a migrate: webdav_client_plus (#729)
Fixes #723
2025-03-22 01:27:17 +08:00
lollipopkit🏳️‍⚧️
24d64b835d opt.: app bar
Fixes #727
2025-03-20 20:20:13 +08:00
lollipopkit🏳️‍⚧️
dd5fea09b1 opt.: skip updating home widget on desktop 2025-03-13 16:07:45 +08:00
𝗛𝗼𝗹𝗶
0a404e035e Improve Turkish Language (#721) 2025-03-10 15:21:17 +08:00
Noo6
b5ab5b1cab fix: window title bar might not be displayed (#701) 2025-02-12 13:33:49 +08:00
Noo6
5cb83001c6 opt: windows app icon (#700) 2025-02-12 13:17:54 +08:00
Noo6
20a39f0292 feat: record window position (#692) 2025-02-05 20:59:04 +08:00
Noo6
900686f955 chore: Fns & FnRes (#690) 2025-02-04 22:41:03 +08:00
180 changed files with 12329 additions and 7840 deletions

View File

@@ -20,7 +20,7 @@ jobs:
uses: subosito/flutter-action@v2
with:
channel: "stable"
flutter-version: "3.27.3"
flutter-version: "3.32.1"
- uses: actions/setup-java@v4
with:
distribution: "zulu"
@@ -66,8 +66,7 @@ jobs:
sudo chmod +x /bin/appimagetool
- name: Build
run: |
dart run fl_build
dart run flutter_distributor:main package --platform=linux --target=appimage
dart run fl_build -p linux
- name: Rename artifacts
run: |
appimage_name=$(ls dist/*/*.AppImage)
@@ -108,7 +107,7 @@ jobs:
# uses: subosito/flutter-action@v2
# with:
# channel: 'stable'
# flutter-version: '3.22.2'
# flutter-version: '3.32.1'
# - name: Build
# run: dart run fl_build -p ios,mac
# - name: Create Release

1
.gitignore vendored
View File

@@ -65,3 +65,4 @@ untranlated.json
.vscode/settings.json
more_build_data.json
trans.txt
android/app/.cxx

View File

@@ -6,6 +6,7 @@ English | [简体中文](README_zh.md)
<a href="https://cdn.lpkt.cn/donate"><img alt="donate" src="https://img.shields.io/badge/donate-me-pink"></a>
<img alt="lang" src="https://img.shields.io/badge/lang-dart-cyan">
<img alt="license" src="https://img.shields.io/badge/license-GPLv3-yellow">
<a href="https://deepwiki.com/lollipopkit/flutter_server_box"><img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki"></a>
</div>
<p align="center">
@@ -14,8 +15,8 @@ A Flutter project which provide charts to display <a href="https://github.com/lo
Especially thanks to <a href="https://github.com/TerminalStudio/dartssh2">dartssh2</a> & <a href="https://github.com/TerminalStudio/xterm.dart">xterm.dart</a>.
</p>
## 🏙️ Screenshots
<table>
<tr>
<td><img width="200px" src="https://cdn.lpkt.cn/serverbox/screenshot/1.jpg"></td>
@@ -25,7 +26,6 @@ Especially thanks to <a href="https://github.com/TerminalStudio/dartssh2">dartss
</tr>
</table>
## 📥 Install
| Platform | From |
@@ -36,13 +36,12 @@ Especially thanks to <a href="https://github.com/TerminalStudio/dartssh2">dartss
Please only download pkgs from the source that **you trust**!
## 🔖 Feature
- `Status chart` (CPU, Sensors, GPU...), `SSH` Term, `SFTP`, `Docker & Process & Systemd`...
- Platform specific: `Bio auth``Msg push``Home widget``watchOS App`...
- English, 简体中文; Deutsch [@its-tom](https://github.com/its-tom), 繁體中文 [@kalashnikov](https://github.com/kalashnikov), Indonesian [@azkadev](https://github.com/azkadev), Français [@FrancXPT](https://github.com/FrancXPT), Dutch [@QazCetelic](https://github.com/QazCetelic), Türkçe [@mikropsoft](https://github.com/mikropsoft), Українська мова [@CakesTwix](https://github.com/CakesTwix); Español, Русский язык, Português, 日本語 (Generated by GPT)
## 🆘 Help
<div align="center">
@@ -54,30 +53,33 @@ Please only download pkgs from the source that **you trust**!
- **Common issues** can be found in [app wiki](https://github.com/lollipopkit/flutter_server_box/wiki).
Before you open an issue, please read the following:
1. Paste the **entire log** (click the top right of the home page) in the issue template.
2. Make sure whether the issue is caused by ServerBox app.
3. Welcome all valid and positive feedback, subjective feedback (such as you think other UI is better) may not be accepted.
After you read the above, you can open an [issue](https://github.com/lollipopkit/flutter_server_box/issues/new).
## 🧱 Contribution
Any positive contribution is welcome.
### Development
1. Setup [Flutter](https://flutter.dev/docs/get-started/install) environment.
2. Clone this repo, run `flutter run` to start the app.
3. Run `dart run fl_build -p PLATFORM` to build the app.
### Translation
- [Guide](https://blog.lpkt.cn/posts/faq/) can be found in my blog.
- We need your help! Just feel free to open a PR.
## 💡 My other apps
- [GPT Box](https://github.com/lollipopkit/flutter_gpt_box) - A third-party GPT Client for OpenAI API on all platforms.
- [More](https://github.com/lollipopkit) - Tools & etc.
## 📝 License
`GPL v3 lollipopkit`

View File

@@ -6,6 +6,7 @@
<a href="https://cdn.lpkt.cn/donate"><img alt="donate" src="https://img.shields.io/badge/捐赠-我-pink"></a>
<img alt="语言" src="https://img.shields.io/badge/语言-dart-cyan">
<img alt="license" src="https://img.shields.io/badge/证书-GPLv3-yellow">
<a href="https://deepwiki.com/lollipopkit/flutter_server_box"><img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki"></a>
</div>
<p align="center">

View File

@@ -11,11 +11,13 @@ include: package:flutter_lints/flutter.yaml
analyzer:
exclude:
- '**/*.g.dart'
- "**/*.g.dart"
language:
# strict-casts: true
# strict-inference: true
# strict-raw-types: true
errors:
invalid_annotation_target: ignore
linter:
# The lint rules applied to this project can be customized in the
@@ -41,8 +43,9 @@ linter:
annotate_overrides: true
avoid_empty_else: true
# avoid_print: false # Uncomment to disable the `avoid_print` rule
prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
avoid_return_types_on_setters: true
directives_ordering: true # Enable sorting of imports
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options

View File

@@ -85,13 +85,11 @@ android {
}
debug {
applicationIdSuffix '.debug'
resValue "string", "app_name", "SrvBxD"
// No applicationIdSuffix or resValue here
}
profile {
applicationIdSuffix '.debug'
resValue "string", "app_name", "SrvBxP"
// No applicationIdSuffix or resValue here
}
}
}

View File

@@ -23,7 +23,7 @@
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout|locale|layoutDirection|fontScale|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 761 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 411 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 895 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -9,6 +9,23 @@ rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects { subproject ->
// Only works on com.android.application(the main app module)
if (subproject.plugins.hasPlugin('com.android.application')) {
subproject.afterEvaluate {
android.buildTypes.matching { it.name == 'profile' }.all { buildType ->
buildType.applicationIdSuffix = ".profile"
buildTypes.profile.resValue 'string', 'app_name', 'SrvBxP'
}
android.buildTypes.matching { it.name == 'debug' }.all { buildType ->
buildType.applicationIdSuffix = ".debug"
buildTypes.debug.resValue 'string', 'app_name', 'SrvBxD'
}
}
}
}
subprojects {
project.evaluationDependsOn(':app')
}

View File

@@ -20,7 +20,7 @@ pluginManagement {
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version '8.6.0' apply false
id "org.jetbrains.kotlin.android" version "1.8.10" apply false
id "org.jetbrains.kotlin.android" version "2.1.21" apply false
}
include ":app"

View File

@@ -6,13 +6,6 @@ PODS:
- file_picker (0.0.1):
- Flutter
- Flutter (1.0.0)
- flutter_inappwebview_ios (0.0.1):
- Flutter
- flutter_inappwebview_ios/Core (= 0.0.1)
- OrderedSet (~> 6.0.3)
- flutter_inappwebview_ios/Core (0.0.1):
- Flutter
- OrderedSet (~> 6.0.3)
- flutter_native_splash (2.4.3):
- Flutter
- icloud_storage (0.0.1):
@@ -20,7 +13,6 @@ PODS:
- local_auth_darwin (0.0.1):
- Flutter
- FlutterMacOS
- OrderedSet (6.0.3)
- package_info_plus (0.4.5):
- Flutter
- path_provider_foundation (0.0.1):
@@ -45,7 +37,6 @@ DEPENDENCIES:
- camera_avfoundation (from `.symlinks/plugins/camera_avfoundation/ios`)
- file_picker (from `.symlinks/plugins/file_picker/ios`)
- Flutter (from `Flutter`)
- flutter_inappwebview_ios (from `.symlinks/plugins/flutter_inappwebview_ios/ios`)
- flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`)
- icloud_storage (from `.symlinks/plugins/icloud_storage/ios`)
- local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`)
@@ -58,10 +49,6 @@ DEPENDENCIES:
- wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`)
- watch_connectivity (from `.symlinks/plugins/watch_connectivity/ios`)
SPEC REPOS:
trunk:
- OrderedSet
EXTERNAL SOURCES:
app_links:
:path: ".symlinks/plugins/app_links/ios"
@@ -71,8 +58,6 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/file_picker/ios"
Flutter:
:path: Flutter
flutter_inappwebview_ios:
:path: ".symlinks/plugins/flutter_inappwebview_ios/ios"
flutter_native_splash:
:path: ".symlinks/plugins/flutter_native_splash/ios"
icloud_storage:
@@ -97,23 +82,21 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/watch_connectivity/ios"
SPEC CHECKSUMS:
app_links: e7a6750a915a9e161c58d91bc610e8cd1d4d0ad0
camera_avfoundation: dd002b0330f4981e1bbcb46ae9b62829237459a4
file_picker: c79185e70b9b45728cde2a8d8da454e0cb43f287
app_links: 76b66b60cc809390ca1ad69bfd66b998d2387ac7
camera_avfoundation: be3be85408cd4126f250386828e9b1dfa40ab436
file_picker: fb04e739ae6239a76ce1f571863a196a922c87d4
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
flutter_inappwebview_ios: 6f63631e2c62a7c350263b13fa5427aedefe81d4
flutter_native_splash: e8a1e01082d97a8099d973f919f57904c925008a
icloud_storage: d9ac7a33ced81df08ba7ea1bf3099cc0ee58f60a
local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
plain_notification_token: b36467dc91939a7b6754267c701bbaca14996ee1
share_plus: 8b6f8b3447e494cca5317c8c3073de39b3600d1f
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
wakelock_plus: 78ec7c5b202cab7761af8e2b2b3d0671be6c4ae1
watch_connectivity: 715eb484685e05846eab74795348a44bb2809b82
flutter_native_splash: c32d145d68aeda5502d5f543ee38c192065986cf
icloud_storage: e55639f0c0d7cb2b0ba9c0b3d5968ccca9cd9aa2
local_auth_darwin: 553ce4f9b16d3fdfeafce9cf042e7c9f77c1c391
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
plain_notification_token: 047876b9d80a5b93565ddcc13a487a7e7b906f7d
share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7
url_launcher_ios: 694010445543906933d732453a59da0a173ae33d
wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556
watch_connectivity: 88e5bea25b473e66ef8d3f960954d154ed0356d6
PODFILE CHECKSUM: ec6ef69056f066e8b21a3391082f23b5ad2d37f8

View File

@@ -672,7 +672,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 1128;
CURRENT_PROJECT_VERSION = 1185;
DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
@@ -682,7 +682,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.1128;
MARKETING_VERSION = 1.0.1185;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -808,7 +808,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 1128;
CURRENT_PROJECT_VERSION = 1185;
DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
@@ -818,7 +818,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.1128;
MARKETING_VERSION = 1.0.1185;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -836,7 +836,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 1128;
CURRENT_PROJECT_VERSION = 1185;
DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
@@ -846,7 +846,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.1128;
MARKETING_VERSION = 1.0.1185;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -867,7 +867,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1128;
CURRENT_PROJECT_VERSION = 1185;
DEVELOPMENT_TEAM = BA88US33G6;
GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES;
@@ -880,7 +880,7 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0.1128;
MARKETING_VERSION = 1.0.1185;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
@@ -906,7 +906,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1128;
CURRENT_PROJECT_VERSION = 1185;
DEVELOPMENT_TEAM = BA88US33G6;
GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES;
@@ -919,7 +919,7 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0.1128;
MARKETING_VERSION = 1.0.1185;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -942,7 +942,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1128;
CURRENT_PROJECT_VERSION = 1185;
DEVELOPMENT_TEAM = BA88US33G6;
GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES;
@@ -955,7 +955,7 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0.1128;
MARKETING_VERSION = 1.0.1185;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -978,7 +978,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1128;
CURRENT_PROJECT_VERSION = 1185;
DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_PREVIEWS = YES;
@@ -990,7 +990,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.1128;
MARKETING_VERSION = 1.0.1185;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
@@ -1019,7 +1019,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1128;
CURRENT_PROJECT_VERSION = 1185;
DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_PREVIEWS = YES;
@@ -1031,7 +1031,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.1128;
MARKETING_VERSION = 1.0.1185;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
PRODUCT_NAME = ServerBox;
@@ -1057,7 +1057,7 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1128;
CURRENT_PROJECT_VERSION = 1185;
DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = BA88US33G6;
ENABLE_PREVIEWS = YES;
@@ -1069,7 +1069,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.1128;
MARKETING_VERSION = 1.0.1185;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
PRODUCT_NAME = ServerBox;

View File

@@ -26,6 +26,7 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
@@ -43,11 +44,13 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
enableGPUValidationMode = "1"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">

View File

@@ -2,14 +2,13 @@ import 'package:dynamic_color/dynamic_color.dart';
import 'package:fl_lib/fl_lib.dart';
import 'package:fl_lib/generated/l10n/lib_l10n.dart';
import 'package:flutter/material.dart';
import 'package:icons_plus/icons_plus.dart';
import 'package:responsive_framework/responsive_framework.dart';
import 'package:server_box/core/extension/context/locale.dart';
import 'package:server_box/data/res/build_data.dart';
import 'package:server_box/data/res/rebuild.dart';
import 'package:server_box/data/res/store.dart';
import 'package:server_box/generated/l10n/l10n.dart';
import 'package:server_box/view/page/home/home.dart';
import 'package:icons_plus/icons_plus.dart';
import 'package:server_box/view/page/home.dart';
part 'intro.dart';
@@ -23,48 +22,67 @@ class MyApp extends StatelessWidget {
listenable: RNodes.app,
builder: (context, _) {
if (!Stores.setting.useSystemPrimaryColor.fetch()) {
final colorSeed = Color(Stores.setting.colorSeed.fetch());
UIs.colorSeed = colorSeed;
// Past code uses [UIs.primaryColor] as the primary color
UIs.primaryColor = colorSeed;
return _buildApp(
context,
light: ThemeData(
useMaterial3: true,
colorSchemeSeed: UIs.colorSeed,
),
dark: ThemeData(
useMaterial3: true,
brightness: Brightness.dark,
colorSchemeSeed: UIs.colorSeed,
),
);
return _build(context);
}
return DynamicColorBuilder(
builder: (light, dark) {
final lightTheme = ThemeData(
useMaterial3: true,
colorScheme: light,
);
final darkTheme = ThemeData(
useMaterial3: true,
brightness: Brightness.dark,
colorScheme: dark,
);
if (context.isDark && dark != null) {
UIs.primaryColor = dark.primary;
} else if (!context.isDark && light != null) {
UIs.primaryColor = light.primary;
}
return _buildApp(context, light: lightTheme, dark: darkTheme);
},
);
return _buildDynamicColor(context);
},
);
}
Widget _buildApp(BuildContext ctx,
{required ThemeData light, required ThemeData dark}) {
Widget _build(BuildContext context) {
final colorSeed = Color(Stores.setting.colorSeed.fetch());
UIs.colorSeed = colorSeed;
UIs.primaryColor = colorSeed;
return _buildApp(
context,
light: ThemeData(
useMaterial3: true,
colorSchemeSeed: UIs.colorSeed,
appBarTheme: AppBarTheme(
scrolledUnderElevation: 0.0,
),
),
dark: ThemeData(
useMaterial3: true,
brightness: Brightness.dark,
colorSchemeSeed: UIs.colorSeed,
appBarTheme: AppBarTheme(
scrolledUnderElevation: 0.0,
),
),
);
}
Widget _buildDynamicColor(BuildContext context) {
return DynamicColorBuilder(
builder: (light, dark) {
final lightTheme = ThemeData(
useMaterial3: true,
colorScheme: light,
);
final darkTheme = ThemeData(
useMaterial3: true,
brightness: Brightness.dark,
colorScheme: dark,
);
if (context.isDark && dark != null) {
UIs.primaryColor = dark.primary;
} else if (!context.isDark && light != null) {
UIs.primaryColor = light.primary;
}
return _buildApp(context, light: lightTheme, dark: darkTheme);
},
);
}
Widget _buildApp(
BuildContext ctx, {
required ThemeData light,
required ThemeData dark,
}) {
final tMode = Stores.setting.themeMode.fetch();
// Issue #57
final themeMode = switch (tMode) {
@@ -76,6 +94,14 @@ class MyApp extends StatelessWidget {
return MaterialApp(
key: ValueKey(locale),
builder: (context, child) => ResponsiveBreakpoints.builder(
child: child ?? UIs.placeholder,
breakpoints: const [
Breakpoint(start: 0, end: 450, name: MOBILE),
Breakpoint(start: 451, end: 800, name: TABLET),
Breakpoint(start: 801, end: 1920, name: DESKTOP),
],
),
locale: locale,
localizationsDelegates: const [
LibLocalizations.delegate,
@@ -88,21 +114,25 @@ class MyApp extends StatelessWidget {
themeMode: themeMode,
theme: light.fixWindowsFont,
darkTheme: (tMode < 3 ? dark : dark.toAmoled).fixWindowsFont,
home: VirtualWindowFrame(
child: Builder(
builder: (context) {
context.setLibL10n();
final appL10n = AppLocalizations.of(context);
if (appL10n != null) l10n = appL10n;
home: Builder(
builder: (context) {
context.setLibL10n();
final appL10n = AppLocalizations.of(context);
if (appL10n != null) l10n = appL10n;
final intros = _IntroPage.builders;
if (intros.isNotEmpty) {
return _IntroPage(intros);
}
Widget child;
final intros = _IntroPage.builders;
if (intros.isNotEmpty) {
child = _IntroPage(intros);
}
return const HomePage();
},
),
child = const HomePage();
return VirtualWindowFrame(
title: BuildData.name,
child: child,
);
},
),
);
}

View File

@@ -1,5 +1,7 @@
import 'package:fl_lib/fl_lib.dart';
import 'package:flutter/services.dart';
import 'package:server_box/data/res/misc.dart';
import 'package:server_box/data/res/store.dart';
abstract final class MethodChans {
static const _channel = MethodChannel('${Miscs.pkgName}/main_chan');
@@ -21,7 +23,8 @@ abstract final class MethodChans {
}
static void updateHomeWidget() async {
//if (!Stores.setting.autoUpdateHomeWidget.fetch()) return;
if (!isIOS || !isAndroid) return;
if (!Stores.setting.autoUpdateHomeWidget.fetch()) return;
await _channel.invokeMethod('updateHomeWidget');
}
}

View File

@@ -1,4 +1,9 @@
import 'package:flutter/widgets.dart';
import 'package:server_box/generated/l10n/l10n.dart';
import 'package:server_box/generated/l10n/l10n_en.dart';
AppLocalizations l10n = AppLocalizationsEn();
extension LocaleX on BuildContext {
AppLocalizations get l10n => AppLocalizations.of(this)!;
}

View File

@@ -12,17 +12,17 @@ extension SftpFileX on SftpFileMode {
UnixPerm toUnixPerm() {
return UnixPerm(
user: RWX(
user: UnixPermOp(
r: userRead,
w: userWrite,
x: userExecute,
),
group: RWX(
group: UnixPermOp(
r: groupRead,
w: groupWrite,
x: groupExecute,
),
other: RWX(
other: UnixPermOp(
r: otherRead,
w: otherWrite,
x: otherExecute,

View File

@@ -1,169 +1,9 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:server_box/data/model/server/private_key_info.dart';
import 'package:server_box/data/model/server/server_private_info.dart';
import 'package:server_box/data/res/store.dart';
import 'package:server_box/view/page/container.dart';
import 'package:server_box/view/page/home/home.dart';
import 'package:server_box/view/page/iperf.dart';
import 'package:server_box/view/page/ping.dart';
import 'package:server_box/view/page/private_key/edit.dart';
import 'package:server_box/view/page/pve.dart';
import 'package:server_box/view/page/server/detail/view.dart';
import 'package:server_box/view/page/setting/platform/android.dart';
import 'package:server_box/view/page/setting/platform/ios.dart';
import 'package:server_box/view/page/setting/seq/srv_func_seq.dart';
import 'package:server_box/view/page/snippet/result.dart';
import 'package:server_box/view/page/ssh/page.dart';
import 'package:server_box/view/page/setting/seq/virt_key.dart';
import 'package:server_box/data/model/server/snippet.dart';
import 'package:server_box/view/page/process.dart';
import 'package:server_box/view/page/server/tab.dart';
import 'package:server_box/view/page/setting/seq/srv_detail_seq.dart';
import 'package:server_box/view/page/setting/seq/srv_seq.dart';
import 'package:server_box/view/page/snippet/edit.dart';
import 'package:server_box/view/page/storage/sftp.dart';
import 'package:server_box/view/page/storage/sftp_mission.dart';
class AppRoutes {
final Widget page;
final String title;
/// The args class for [AppRoute].
final class SpiRequiredArgs {
/// The only required argument for this class.
final Spi spi;
AppRoutes(this.page, this.title);
Future<T?> go<T>(BuildContext context) {
return Navigator.push<T>(
context,
Stores.setting.cupertinoRoute.fetch()
? CupertinoPageRoute(builder: (context) => page)
: MaterialPageRoute(builder: (context) => page),
);
}
Future<T?> checkGo<T>({
required BuildContext context,
required bool Function() check,
}) {
if (check()) {
return go(context);
}
return Future.value(null);
}
static AppRoutes serverDetail({Key? key, required Spi spi}) {
return AppRoutes(ServerDetailPage(key: key, spi: spi), 'server_detail');
}
static AppRoutes serverTab({Key? key}) {
return AppRoutes(ServerPage(key: key), 'server_tab');
}
static AppRoutes keyEdit({Key? key, PrivateKeyInfo? pki}) {
return AppRoutes(
PrivateKeyEditPage(pki: pki),
'key_${pki == null ? 'add' : 'edit'}',
);
}
static AppRoutes snippetEdit({Key? key, Snippet? snippet}) {
return AppRoutes(
SnippetEditPage(snippet: snippet),
'snippet_${snippet == null ? 'add' : 'edit'}',
);
}
static AppRoutes ssh({
Key? key,
required Spi spi,
String? initCmd,
Snippet? initSnippet,
}) {
return AppRoutes(
SSHPage(
key: key,
spi: spi,
initCmd: initCmd,
initSnippet: initSnippet,
),
'ssh_term',
);
}
static AppRoutes sshVirtKeySetting({Key? key}) {
return AppRoutes(SSHVirtKeySettingPage(key: key), 'ssh_virt_key_setting');
}
static AppRoutes sftpMission({Key? key}) {
return AppRoutes(SftpMissionPage(key: key), 'sftp_mission');
}
static AppRoutes sftp(
{Key? key, required Spi spi, String? initPath, bool isSelect = false}) {
return AppRoutes(
SftpPage(
key: key,
spi: spi,
initPath: initPath,
isSelect: isSelect,
),
'sftp');
}
static AppRoutes docker({Key? key, required Spi spi}) {
return AppRoutes(ContainerPage(key: key, spi: spi), 'docker');
}
// static AppRoutes fullscreen({Key? key}) {
// return AppRoutes(FullScreenPage(key: key), 'fullscreen');
// }
static AppRoutes home({Key? key}) {
return AppRoutes(HomePage(key: key), 'home');
}
static AppRoutes ping({Key? key}) {
return AppRoutes(PingPage(key: key), 'ping');
}
static AppRoutes process({Key? key, required Spi spi}) {
return AppRoutes(ProcessPage(key: key, spi: spi), 'process');
}
static AppRoutes serverOrder({Key? key}) {
return AppRoutes(ServerOrderPage(key: key), 'server_order');
}
static AppRoutes serverDetailOrder({Key? key}) {
return AppRoutes(ServerDetailOrderPage(key: key), 'server_detail_order');
}
static AppRoutes iosSettings({Key? key}) {
return AppRoutes(IOSSettingsPage(key: key), 'ios_setting');
}
static AppRoutes androidSettings({Key? key}) {
return AppRoutes(AndroidSettingsPage(key: key), 'android_setting');
}
static AppRoutes snippetResult(
{Key? key, required List<SnippetResult?> results}) {
return AppRoutes(
SnippetResultPage(
key: key,
results: results,
),
'snippet_result');
}
static AppRoutes iperf({Key? key, required Spi spi}) {
return AppRoutes(IPerfPage(key: key, spi: spi), 'iperf');
}
static AppRoutes serverFuncBtnsOrder({Key? key}) {
return AppRoutes(ServerFuncBtnsOrderPage(key: key), 'server_func_btns_seq');
}
static AppRoutes pve({Key? key, required Spi spi}) {
return AppRoutes(PvePage(key: key, spi: spi), 'pve');
}
const SpiRequiredArgs(this.spi);
}

View File

@@ -1,27 +1,23 @@
import 'dart:io';
import 'package:fl_lib/fl_lib.dart';
import 'package:server_box/data/model/app/backup.dart';
import 'package:server_box/data/model/app/bak/backup2.dart';
import 'package:server_box/data/model/app/bak/utils.dart';
const bakSync = BakSyncer._();
final icloud = ICloud(containerId: 'iCloud.tech.lolli.serverbox');
final class BakSyncer extends SyncIface<Backup> {
final class BakSyncer extends SyncIface {
const BakSyncer._() : super();
@override
void init() {
Webdav.shared.prefix = 'serverbox/';
}
Future<void> saveToFile() => BackupV2.backup();
@override
Future<void> saveToFile() => Backup.backup();
@override
Future<Backup> fromFile(String path) async {
Future<Mergeable> fromFile(String path) async {
final content = await File(path).readAsString();
return Backup.fromJsonString(content);
return MergeableUtils.fromJsonString(content).$1;
}
@override

View File

@@ -4,9 +4,8 @@ import 'package:dartssh2/dartssh2.dart';
import 'package:fl_lib/fl_lib.dart';
import 'package:flutter/foundation.dart';
import 'package:server_box/data/model/app/error.dart';
import 'package:server_box/data/res/store.dart';
import 'package:server_box/data/model/server/server_private_info.dart';
import 'package:server_box/data/res/store.dart';
/// Must put this func out of any Class.
///

View File

@@ -1,37 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'backup.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Backup _$BackupFromJson(Map<String, dynamic> json) => Backup(
version: (json['version'] as num).toInt(),
date: json['date'] as String,
spis: (json['spis'] as List<dynamic>)
.map((e) => Spi.fromJson(e as Map<String, dynamic>))
.toList(),
snippets: (json['snippets'] as List<dynamic>)
.map((e) => Snippet.fromJson(e as Map<String, dynamic>))
.toList(),
keys: (json['keys'] as List<dynamic>)
.map((e) => PrivateKeyInfo.fromJson(e as Map<String, dynamic>))
.toList(),
container: json['container'] as Map<String, dynamic>,
history: json['history'] as Map<String, dynamic>,
settings: json['settings'] as Map<String, dynamic>?,
lastModTime: (json['lastModTime'] as num?)?.toInt(),
);
Map<String, dynamic> _$BackupToJson(Backup instance) => <String, dynamic>{
'version': instance.version,
'date': instance.date,
'spis': instance.spis,
'snippets': instance.snippets,
'keys': instance.keys,
'container': instance.container,
'history': instance.history,
'lastModTime': instance.lastModTime,
'settings': instance.settings,
};

View File

@@ -8,7 +8,6 @@ import 'package:server_box/data/model/server/private_key_info.dart';
import 'package:server_box/data/model/server/server_private_info.dart';
import 'package:server_box/data/model/server/snippet.dart';
import 'package:server_box/data/res/misc.dart';
import 'package:server_box/data/res/rebuild.dart';
import 'package:server_box/data/res/store.dart';
part 'backup.g.dart';
@@ -47,17 +46,17 @@ class Backup implements Mergeable {
Map<String, dynamic> toJson() => _$BackupToJson(this);
static Future<Backup> loadFromStore() async {
final lastModTime = Stores.lastModTime?.millisecondsSinceEpoch;
final lastModTime = Stores.lastModTime;
return Backup(
version: backupFormatVersion,
date: DateTime.now().toString().split('.').firstOrNull ?? '',
spis: Stores.server.fetch(),
snippets: Stores.snippet.fetch(),
keys: Stores.key.fetch(),
container: await Stores.container.getAllMap(),
container: Stores.container.getAllMap(),
lastModTime: lastModTime,
history: await Stores.history.getAllMap(),
settings: await Stores.setting.getAllMap(),
history: Stores.history.getAllMap(),
settings: Stores.setting.getAllMap(),
);
}
@@ -71,7 +70,7 @@ class Backup implements Mergeable {
@override
Future<void> merge({bool force = false}) async {
final curTime = Stores.lastModTime?.millisecondsSinceEpoch ?? 0;
final curTime = Stores.lastModTime;
final bakTime = lastModTime ?? 0;
final shouldRestore = force || curTime < bakTime;
if (!shouldRestore) {
@@ -235,3 +234,4 @@ String _diyDecrypt(String raw) {
rethrow;
}
}

View File

@@ -0,0 +1,37 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'backup.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Backup _$BackupFromJson(Map<String, dynamic> json) => Backup(
version: (json['version'] as num).toInt(),
date: json['date'] as String,
spis: (json['spis'] as List<dynamic>)
.map((e) => Spi.fromJson(e as Map<String, dynamic>))
.toList(),
snippets: (json['snippets'] as List<dynamic>)
.map((e) => Snippet.fromJson(e as Map<String, dynamic>))
.toList(),
keys: (json['keys'] as List<dynamic>)
.map((e) => PrivateKeyInfo.fromJson(e as Map<String, dynamic>))
.toList(),
container: json['container'] as Map<String, dynamic>,
history: json['history'] as Map<String, dynamic>,
settings: json['settings'] as Map<String, dynamic>?,
lastModTime: (json['lastModTime'] as num?)?.toInt(),
);
Map<String, dynamic> _$BackupToJson(Backup instance) => <String, dynamic>{
'version': instance.version,
'date': instance.date,
'spis': instance.spis,
'snippets': instance.snippets,
'keys': instance.keys,
'container': instance.container,
'history': instance.history,
'lastModTime': instance.lastModTime,
'settings': instance.settings,
};

View File

@@ -0,0 +1,89 @@
import 'dart:convert';
import 'dart:io';
import 'package:fl_lib/fl_lib.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:logging/logging.dart';
import 'package:server_box/data/res/misc.dart';
import 'package:server_box/data/res/store.dart';
part 'backup2.freezed.dart';
part 'backup2.g.dart';
final _loggerV2 = Logger('BackupV2');
@freezed
abstract class BackupV2 with _$BackupV2 implements Mergeable {
const BackupV2._();
/// Construct a backup with the latest format (v2).
///
/// All `Map<String, dynamic>` are:
/// ```json
/// {
/// "key1": Model{},
/// "_lastModTime": {
/// "key1": 1234567890,
/// },
/// }
/// ```
const factory BackupV2({
required int version,
required int date,
required Map<String, Object?> spis,
required Map<String, Object?> snippets,
required Map<String, Object?> keys,
required Map<String, Object?> container,
required Map<String, Object?> history,
required Map<String, Object?> settings,
}) = _BackupV2;
factory BackupV2.fromJson(Map<String, dynamic> json) => _$BackupV2FromJson(json);
@override
Future<void> merge({bool force = false}) async {
_loggerV2.info('Merging...');
// Merge each store
await Mergeable.mergeStore(backupData: spis, store: Stores.server, force: force);
await Mergeable.mergeStore(backupData: snippets, store: Stores.snippet, force: force);
await Mergeable.mergeStore(backupData: keys, store: Stores.key, force: force);
await Mergeable.mergeStore(backupData: container, store: Stores.container, force: force);
await Mergeable.mergeStore(backupData: history, store: Stores.history, force: force);
await Mergeable.mergeStore(backupData: settings, store: Stores.setting, force: force);
// Reload providers and notify listeners
Provider.reload();
RNodes.app.notify();
_loggerV2.info('Merge completed');
}
static const formatVer = 2;
static Future<BackupV2> loadFromStore() async {
return BackupV2(
version: formatVer,
date: DateTimeX.timestamp,
spis: Stores.server.getAllMap(includeInternalKeys: true),
snippets: Stores.snippet.getAllMap(includeInternalKeys: true),
keys: Stores.key.getAllMap(includeInternalKeys: true),
container: Stores.container.getAllMap(includeInternalKeys: true),
history: Stores.history.getAllMap(includeInternalKeys: true),
settings: Stores.setting.getAllMap(includeInternalKeys: true),
);
}
static Future<String> backup([String? name]) async {
final bak = await BackupV2.loadFromStore();
final result = json.encode(bak.toJson());
final path = Paths.doc.joinPath(name ?? Miscs.bakFileName);
await File(path).writeAsString(result);
return path;
}
factory BackupV2.fromJsonString(String jsonString) {
final map = json.decode(jsonString) as Map<String, dynamic>;
return BackupV2.fromJson(map);
}
}

View File

@@ -0,0 +1,372 @@
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'backup2.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
T _$identity<T>(T value) => value;
final _privateConstructorUsedError = UnsupportedError(
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models',
);
BackupV2 _$BackupV2FromJson(Map<String, dynamic> json) {
return _BackupV2.fromJson(json);
}
/// @nodoc
mixin _$BackupV2 {
int get version => throw _privateConstructorUsedError;
int get date => throw _privateConstructorUsedError;
Map<String, Object?> get spis => throw _privateConstructorUsedError;
Map<String, Object?> get snippets => throw _privateConstructorUsedError;
Map<String, Object?> get keys => throw _privateConstructorUsedError;
Map<String, Object?> get container => throw _privateConstructorUsedError;
Map<String, Object?> get history => throw _privateConstructorUsedError;
Map<String, Object?> get settings => throw _privateConstructorUsedError;
/// Serializes this BackupV2 to a JSON map.
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
/// Create a copy of BackupV2
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$BackupV2CopyWith<BackupV2> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $BackupV2CopyWith<$Res> {
factory $BackupV2CopyWith(BackupV2 value, $Res Function(BackupV2) then) =
_$BackupV2CopyWithImpl<$Res, BackupV2>;
@useResult
$Res call({
int version,
int date,
Map<String, Object?> spis,
Map<String, Object?> snippets,
Map<String, Object?> keys,
Map<String, Object?> container,
Map<String, Object?> history,
Map<String, Object?> settings,
});
}
/// @nodoc
class _$BackupV2CopyWithImpl<$Res, $Val extends BackupV2>
implements $BackupV2CopyWith<$Res> {
_$BackupV2CopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of BackupV2
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? version = null,
Object? date = null,
Object? spis = null,
Object? snippets = null,
Object? keys = null,
Object? container = null,
Object? history = null,
Object? settings = null,
}) {
return _then(
_value.copyWith(
version: null == version
? _value.version
: version // ignore: cast_nullable_to_non_nullable
as int,
date: null == date
? _value.date
: date // ignore: cast_nullable_to_non_nullable
as int,
spis: null == spis
? _value.spis
: spis // ignore: cast_nullable_to_non_nullable
as Map<String, Object?>,
snippets: null == snippets
? _value.snippets
: snippets // ignore: cast_nullable_to_non_nullable
as Map<String, Object?>,
keys: null == keys
? _value.keys
: keys // ignore: cast_nullable_to_non_nullable
as Map<String, Object?>,
container: null == container
? _value.container
: container // ignore: cast_nullable_to_non_nullable
as Map<String, Object?>,
history: null == history
? _value.history
: history // ignore: cast_nullable_to_non_nullable
as Map<String, Object?>,
settings: null == settings
? _value.settings
: settings // ignore: cast_nullable_to_non_nullable
as Map<String, Object?>,
)
as $Val,
);
}
}
/// @nodoc
abstract class _$$BackupV2ImplCopyWith<$Res>
implements $BackupV2CopyWith<$Res> {
factory _$$BackupV2ImplCopyWith(
_$BackupV2Impl value,
$Res Function(_$BackupV2Impl) then,
) = __$$BackupV2ImplCopyWithImpl<$Res>;
@override
@useResult
$Res call({
int version,
int date,
Map<String, Object?> spis,
Map<String, Object?> snippets,
Map<String, Object?> keys,
Map<String, Object?> container,
Map<String, Object?> history,
Map<String, Object?> settings,
});
}
/// @nodoc
class __$$BackupV2ImplCopyWithImpl<$Res>
extends _$BackupV2CopyWithImpl<$Res, _$BackupV2Impl>
implements _$$BackupV2ImplCopyWith<$Res> {
__$$BackupV2ImplCopyWithImpl(
_$BackupV2Impl _value,
$Res Function(_$BackupV2Impl) _then,
) : super(_value, _then);
/// Create a copy of BackupV2
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? version = null,
Object? date = null,
Object? spis = null,
Object? snippets = null,
Object? keys = null,
Object? container = null,
Object? history = null,
Object? settings = null,
}) {
return _then(
_$BackupV2Impl(
version: null == version
? _value.version
: version // ignore: cast_nullable_to_non_nullable
as int,
date: null == date
? _value.date
: date // ignore: cast_nullable_to_non_nullable
as int,
spis: null == spis
? _value._spis
: spis // ignore: cast_nullable_to_non_nullable
as Map<String, Object?>,
snippets: null == snippets
? _value._snippets
: snippets // ignore: cast_nullable_to_non_nullable
as Map<String, Object?>,
keys: null == keys
? _value._keys
: keys // ignore: cast_nullable_to_non_nullable
as Map<String, Object?>,
container: null == container
? _value._container
: container // ignore: cast_nullable_to_non_nullable
as Map<String, Object?>,
history: null == history
? _value._history
: history // ignore: cast_nullable_to_non_nullable
as Map<String, Object?>,
settings: null == settings
? _value._settings
: settings // ignore: cast_nullable_to_non_nullable
as Map<String, Object?>,
),
);
}
}
/// @nodoc
@JsonSerializable()
class _$BackupV2Impl extends _BackupV2 {
const _$BackupV2Impl({
required this.version,
required this.date,
required final Map<String, Object?> spis,
required final Map<String, Object?> snippets,
required final Map<String, Object?> keys,
required final Map<String, Object?> container,
required final Map<String, Object?> history,
required final Map<String, Object?> settings,
}) : _spis = spis,
_snippets = snippets,
_keys = keys,
_container = container,
_history = history,
_settings = settings,
super._();
factory _$BackupV2Impl.fromJson(Map<String, dynamic> json) =>
_$$BackupV2ImplFromJson(json);
@override
final int version;
@override
final int date;
final Map<String, Object?> _spis;
@override
Map<String, Object?> get spis {
if (_spis is EqualUnmodifiableMapView) return _spis;
// ignore: implicit_dynamic_type
return EqualUnmodifiableMapView(_spis);
}
final Map<String, Object?> _snippets;
@override
Map<String, Object?> get snippets {
if (_snippets is EqualUnmodifiableMapView) return _snippets;
// ignore: implicit_dynamic_type
return EqualUnmodifiableMapView(_snippets);
}
final Map<String, Object?> _keys;
@override
Map<String, Object?> get keys {
if (_keys is EqualUnmodifiableMapView) return _keys;
// ignore: implicit_dynamic_type
return EqualUnmodifiableMapView(_keys);
}
final Map<String, Object?> _container;
@override
Map<String, Object?> get container {
if (_container is EqualUnmodifiableMapView) return _container;
// ignore: implicit_dynamic_type
return EqualUnmodifiableMapView(_container);
}
final Map<String, Object?> _history;
@override
Map<String, Object?> get history {
if (_history is EqualUnmodifiableMapView) return _history;
// ignore: implicit_dynamic_type
return EqualUnmodifiableMapView(_history);
}
final Map<String, Object?> _settings;
@override
Map<String, Object?> get settings {
if (_settings is EqualUnmodifiableMapView) return _settings;
// ignore: implicit_dynamic_type
return EqualUnmodifiableMapView(_settings);
}
@override
String toString() {
return 'BackupV2(version: $version, date: $date, spis: $spis, snippets: $snippets, keys: $keys, container: $container, history: $history, settings: $settings)';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$BackupV2Impl &&
(identical(other.version, version) || other.version == version) &&
(identical(other.date, date) || other.date == date) &&
const DeepCollectionEquality().equals(other._spis, _spis) &&
const DeepCollectionEquality().equals(other._snippets, _snippets) &&
const DeepCollectionEquality().equals(other._keys, _keys) &&
const DeepCollectionEquality().equals(
other._container,
_container,
) &&
const DeepCollectionEquality().equals(other._history, _history) &&
const DeepCollectionEquality().equals(other._settings, _settings));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode => Object.hash(
runtimeType,
version,
date,
const DeepCollectionEquality().hash(_spis),
const DeepCollectionEquality().hash(_snippets),
const DeepCollectionEquality().hash(_keys),
const DeepCollectionEquality().hash(_container),
const DeepCollectionEquality().hash(_history),
const DeepCollectionEquality().hash(_settings),
);
/// Create a copy of BackupV2
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$BackupV2ImplCopyWith<_$BackupV2Impl> get copyWith =>
__$$BackupV2ImplCopyWithImpl<_$BackupV2Impl>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$$BackupV2ImplToJson(this);
}
}
abstract class _BackupV2 extends BackupV2 {
const factory _BackupV2({
required final int version,
required final int date,
required final Map<String, Object?> spis,
required final Map<String, Object?> snippets,
required final Map<String, Object?> keys,
required final Map<String, Object?> container,
required final Map<String, Object?> history,
required final Map<String, Object?> settings,
}) = _$BackupV2Impl;
const _BackupV2._() : super._();
factory _BackupV2.fromJson(Map<String, dynamic> json) =
_$BackupV2Impl.fromJson;
@override
int get version;
@override
int get date;
@override
Map<String, Object?> get spis;
@override
Map<String, Object?> get snippets;
@override
Map<String, Object?> get keys;
@override
Map<String, Object?> get container;
@override
Map<String, Object?> get history;
@override
Map<String, Object?> get settings;
/// Create a copy of BackupV2
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
_$$BackupV2ImplCopyWith<_$BackupV2Impl> get copyWith =>
throw _privateConstructorUsedError;
}

View File

@@ -0,0 +1,31 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'backup2.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_$BackupV2Impl _$$BackupV2ImplFromJson(Map<String, dynamic> json) =>
_$BackupV2Impl(
version: (json['version'] as num).toInt(),
date: (json['date'] as num).toInt(),
spis: json['spis'] as Map<String, dynamic>,
snippets: json['snippets'] as Map<String, dynamic>,
keys: json['keys'] as Map<String, dynamic>,
container: json['container'] as Map<String, dynamic>,
history: json['history'] as Map<String, dynamic>,
settings: json['settings'] as Map<String, dynamic>,
);
Map<String, dynamic> _$$BackupV2ImplToJson(_$BackupV2Impl instance) =>
<String, dynamic>{
'version': instance.version,
'date': instance.date,
'spis': instance.spis,
'snippets': instance.snippets,
'keys': instance.keys,
'container': instance.container,
'history': instance.history,
'settings': instance.settings,
};

View File

@@ -0,0 +1,15 @@
import 'package:fl_lib/fl_lib.dart';
import 'package:server_box/data/model/app/bak/backup.dart';
import 'package:server_box/data/model/app/bak/backup2.dart';
abstract final class MergeableUtils {
static (Mergeable, String) fromJsonString(String json) {
try {
final bak = BackupV2.fromJsonString(json);
return (bak, DateTime.fromMillisecondsSinceEpoch(bak.date).hms());
} catch (e) {
final bak = Backup.fromJsonString(json);
return (bak, bak.date);
}
}
}

View File

@@ -1,27 +1,6 @@
import 'package:fl_lib/fl_lib.dart';
import 'package:server_box/core/extension/context/locale.dart';
enum ErrFrom {
unknown,
apt,
docker,
sftp,
ssh,
status,
icloud,
webdav,
;
}
abstract class Err<T> {
final ErrFrom from;
final T type;
final String? message;
String? get solution;
Err({required this.from, required this.type, this.message});
}
enum SSHErrType {
unknown,
connect,
@@ -35,7 +14,7 @@ enum SSHErrType {
}
class SSHErr extends Err<SSHErrType> {
SSHErr({required super.type, super.message}) : super(from: ErrFrom.ssh);
SSHErr({required super.type, super.message});
@override
String? get solution => switch (type) {
@@ -45,11 +24,6 @@ class SSHErr extends Err<SSHErrType> {
SSHErrType.noPrivateKey => l10n.noPrivateKeyTip,
_ => null,
};
@override
String toString() {
return 'SSHErr<$type>: $message';
}
}
enum ContainerErrType {
@@ -65,16 +39,10 @@ enum ContainerErrType {
}
class ContainerErr extends Err<ContainerErrType> {
ContainerErr({required super.type, super.message})
: super(from: ErrFrom.docker);
ContainerErr({required super.type, super.message});
@override
String? get solution => null;
@override
String toString() {
return 'ContainerErr<$type>: $message';
}
}
enum ICloudErrType {
@@ -84,15 +52,10 @@ enum ICloudErrType {
}
class ICloudErr extends Err<ICloudErrType> {
ICloudErr({required super.type, super.message}) : super(from: ErrFrom.icloud);
ICloudErr({required super.type, super.message});
@override
String? get solution => null;
@override
String toString() {
return 'ICloudErr<$type>: $message';
}
}
enum WebdavErrType {
@@ -102,15 +65,10 @@ enum WebdavErrType {
}
class WebdavErr extends Err<WebdavErrType> {
WebdavErr({required super.type, super.message}) : super(from: ErrFrom.webdav);
WebdavErr({required super.type, super.message});
@override
String? get solution => null;
@override
String toString() {
return 'WebdavErr<$type>: $message';
}
}
enum PveErrType {
@@ -121,13 +79,8 @@ enum PveErrType {
}
class PveErr extends Err<PveErrType> {
PveErr({required super.type, super.message}) : super(from: ErrFrom.status);
PveErr({required super.type, super.message});
@override
String? get solution => null;
@override
String toString() {
return 'PveErr<$type>: $message';
}
}

View File

@@ -1,36 +1,23 @@
import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:icons_plus/icons_plus.dart';
import 'package:server_box/core/extension/context/locale.dart';
import 'package:server_box/data/res/store.dart';
part 'server_func.g.dart';
@HiveType(typeId: 6)
enum ServerFuncBtn {
@HiveField(0)
terminal._(),
@HiveField(1)
sftp._(),
@HiveField(2)
container._(),
@HiveField(3)
process._(),
//@HiveField(4)
//pkg,
@HiveField(5)
snippet._(),
@HiveField(6)
iperf._(),
// @HiveField(7)
// pve,
@HiveField(8)
systemd._(1058),
terminal(),
sftp(),
container(),
process(),
//pkg(),
snippet(),
iperf(),
// pve(),
systemd(1058),
;
final int? addedVersion;
const ServerFuncBtn._([this.addedVersion]);
const ServerFuncBtn([this.addedVersion]);
static void autoAddNewFuncs(int cur) {
if (cur >= systemd.addedVersion!) {

View File

@@ -1,71 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'server_func.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class ServerFuncBtnAdapter extends TypeAdapter<ServerFuncBtn> {
@override
final int typeId = 6;
@override
ServerFuncBtn read(BinaryReader reader) {
switch (reader.readByte()) {
case 0:
return ServerFuncBtn.terminal;
case 1:
return ServerFuncBtn.sftp;
case 2:
return ServerFuncBtn.container;
case 3:
return ServerFuncBtn.process;
case 5:
return ServerFuncBtn.snippet;
case 6:
return ServerFuncBtn.iperf;
case 8:
return ServerFuncBtn.systemd;
default:
return ServerFuncBtn.terminal;
}
}
@override
void write(BinaryWriter writer, ServerFuncBtn obj) {
switch (obj) {
case ServerFuncBtn.terminal:
writer.writeByte(0);
break;
case ServerFuncBtn.sftp:
writer.writeByte(1);
break;
case ServerFuncBtn.container:
writer.writeByte(2);
break;
case ServerFuncBtn.process:
writer.writeByte(3);
break;
case ServerFuncBtn.snippet:
writer.writeByte(5);
break;
case ServerFuncBtn.iperf:
writer.writeByte(6);
break;
case ServerFuncBtn.systemd:
writer.writeByte(8);
break;
}
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is ServerFuncBtnAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

View File

@@ -1,17 +1,10 @@
import 'package:fl_lib/fl_lib.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:server_box/core/extension/context/locale.dart';
import 'package:server_box/data/model/server/server.dart';
part 'net_view.g.dart';
@HiveType(typeId: 5)
enum NetViewType {
@HiveField(0)
conn,
@HiveField(1)
speed,
@HiveField(2)
traffic;
NetViewType get next => switch (this) {

View File

@@ -1,51 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'net_view.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class NetViewTypeAdapter extends TypeAdapter<NetViewType> {
@override
final int typeId = 5;
@override
NetViewType read(BinaryReader reader) {
switch (reader.readByte()) {
case 0:
return NetViewType.conn;
case 1:
return NetViewType.speed;
case 2:
return NetViewType.traffic;
default:
return NetViewType.conn;
}
}
@override
void write(BinaryWriter writer, NetViewType obj) {
switch (obj) {
case NetViewType.conn:
writer.writeByte(0);
break;
case NetViewType.speed:
writer.writeByte(1);
break;
case NetViewType.traffic:
writer.writeByte(2);
break;
}
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is NetViewTypeAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

View File

@@ -11,13 +11,13 @@ enum ServerDetailCards {
swap(Icons.swap_horiz),
gpu(Bootstrap.gpu_card),
disk(Bootstrap.device_hdd_fill),
smart(Icons.health_and_safety, sinceBuild: 1174),
net(ZondIcons.network),
sensor(MingCute.dashboard_4_line),
temp(FontAwesome.temperature_empty_solid),
battery(Icons.battery_full),
pve(BoxIcons.bxs_dashboard, sinceBuild: 818),
custom(Icons.code, sinceBuild: 825),
;
custom(Icons.code, sinceBuild: 825);
final int? sinceBuild;
@@ -31,19 +31,20 @@ enum ServerDetailCards {
static final names = values.map((e) => e.name).toList();
String get toStr => switch (this) {
about => libL10n.about,
cpu => 'CPU',
mem => 'RAM',
swap => 'Swap',
gpu => 'GPU',
disk => l10n.disk,
net => l10n.net,
sensor => l10n.sensors,
temp => l10n.temperature,
battery => l10n.battery,
pve => 'PVE',
custom => l10n.cmd,
};
about => libL10n.about,
cpu => 'CPU',
mem => 'RAM',
swap => 'Swap',
gpu => 'GPU',
disk => l10n.disk,
smart => l10n.diskHealth,
net => l10n.net,
sensor => l10n.sensors,
temp => l10n.temperature,
battery => l10n.battery,
pve => 'PVE',
custom => l10n.cmd,
};
/// If:
/// Version 1 => user set [about], default is [about, cpu]

View File

@@ -1,8 +1,7 @@
import 'package:server_box/core/extension/context/locale.dart';
import 'package:server_box/data/provider/server.dart';
import 'package:server_box/data/res/build_data.dart';
import 'package:server_box/data/model/server/system.dart';
import 'package:server_box/data/provider/server.dart';
import 'package:server_box/data/res/build_data.dart';
enum ShellFunc {
status,
@@ -10,8 +9,7 @@ enum ShellFunc {
process,
shutdown,
reboot,
suspend,
;
suspend;
static const seperator = 'SrvBoxSep';
@@ -30,8 +28,9 @@ enum ShellFunc {
/// Default is [scriptDirTmp]/[scriptFile], if this path is not accessible,
/// it will be changed to [scriptDirHome]/[scriptFile].
static String getScriptDir(String id) {
final customScriptDir =
ServerProvider.pick(id: id)?.value.spi.custom?.scriptDir;
final customScriptDir = ServerProvider.pick(
id: id,
)?.value.spi.custom?.scriptDir;
if (customScriptDir != null) return customScriptDir;
return _scriptDirMap.putIfAbsent(id, () {
return scriptDirTmp;
@@ -39,10 +38,10 @@ enum ShellFunc {
}
static void switchScriptDir(String id) => switch (_scriptDirMap[id]) {
scriptDirTmp => _scriptDirMap[id] = scriptDirHome,
scriptDirHome => _scriptDirMap[id] = scriptDirTmp,
_ => _scriptDirMap[id] = scriptDirHome,
};
scriptDirTmp => _scriptDirMap[id] = scriptDirHome,
scriptDirHome => _scriptDirMap[id] = scriptDirTmp,
_ => _scriptDirMap[id] = scriptDirHome,
};
static String getScriptPath(String id) {
return '${getScriptDir(id)}/$scriptFile';
@@ -59,13 +58,13 @@ chmod 755 $scriptPath
}
String get flag => switch (this) {
ShellFunc.process => 'p',
ShellFunc.shutdown => 'sd',
ShellFunc.reboot => 'r',
ShellFunc.suspend => 'sp',
ShellFunc.status => 's',
// ShellFunc.docker=> 'd',
};
ShellFunc.process => 'p',
ShellFunc.shutdown => 'sd',
ShellFunc.reboot => 'r',
ShellFunc.suspend => 'sp',
ShellFunc.status => 's',
// ShellFunc.docker=> 'd',
};
String exec(String id) => 'sh ${getScriptPath(id)} -$flag';
@@ -96,14 +95,14 @@ if [ "\$macSign" = "" ] && [ "\$bsdSign" = "" ]; then
else
\t${BSDStatusCmdType.values.map((e) => e.cmd).join(cmdDivider)}
fi''';
// case ShellFunc.docker:
// return '''
// result=\$(docker version 2>&1 | grep "permission denied")
// if [ "\$result" != "" ]; then
// \t${_dockerCmds.join(_cmdDivider)}
// else
// \t${_dockerCmds.map((e) => "sudo -S $e").join(_cmdDivider)}
// fi''';
// case ShellFunc.docker:
// return '''
// result=\$(docker version 2>&1 | grep "permission denied")
// if [ "\$result" != "" ]; then
// \t${_dockerCmds.join(_cmdDivider)}
// else
// \t${_dockerCmds.map((e) => "sudo -S $e").join(_cmdDivider)}
// fi''';
case ShellFunc.process:
return '''
if [ "\$macSign" = "" ] && [ "\$bsdSign" = "" ]; then
@@ -209,22 +208,25 @@ enum StatusCmdType {
echo._('echo ${SystemType.linuxSign}'),
time._('date +%s'),
net._('cat /proc/net/dev'),
sys._('cat /etc/*-release | grep PRETTY_NAME'),
sys._('cat /etc/*-release | grep ^PRETTY_NAME'),
cpu._('cat /proc/stat | grep cpu'),
uptime._('uptime'),
conn._('cat /proc/net/snmp'),
disk._('df'),
disk._(
'lsblk --bytes --json --output FSTYPE,PATH,NAME,KNAME,MOUNTPOINT,FSSIZE,FSUSED,FSAVAIL,FSUSE%,UUID',
),
mem._("cat /proc/meminfo | grep -E 'Mem|Swap'"),
tempType._('cat /sys/class/thermal/thermal_zone*/type'),
tempVal._('cat /sys/class/thermal/thermal_zone*/temp'),
host._('cat /etc/hostname'),
diskio._('cat /proc/diskstats'),
battery._(
'for f in /sys/class/power_supply/*/uevent; do cat "\$f"; echo; done'),
'for f in /sys/class/power_supply/*/uevent; do cat "\$f"; echo; done',
),
nvidia._('nvidia-smi -q -x'),
sensors._('sensors'),
cpuBrand._('cat /proc/cpuinfo | grep "model name"'),
;
diskSmart._('for d in \$(lsblk -dn -o KNAME); do smartctl -j /dev/\$d; echo; done'),
cpuBrand._('cat /proc/cpuinfo | grep "model name"');
final String cmd;
@@ -238,12 +240,12 @@ enum BSDStatusCmdType {
sys._('uname -or'),
cpu._('top -l 1 | grep "CPU usage"'),
uptime._('uptime'),
// Keep df -k for BSD systems as lsblk is not available on macOS/BSD
disk._('df -k'),
mem._('top -l 1 | grep PhysMem'),
//temp,
host._('hostname'),
cpuBrand._('sysctl -n machdep.cpu.brand_string'),
;
cpuBrand._('sysctl -n machdep.cpu.brand_string');
final String cmd;
@@ -252,10 +254,10 @@ enum BSDStatusCmdType {
extension StatusCmdTypeX on StatusCmdType {
String get i18n => switch (this) {
StatusCmdType.sys => l10n.system,
StatusCmdType.host => l10n.host,
StatusCmdType.uptime => l10n.uptime,
StatusCmdType.battery => l10n.battery,
final val => val.name,
};
StatusCmdType.sys => l10n.system,
StatusCmdType.host => l10n.host,
StatusCmdType.uptime => l10n.uptime,
StatusCmdType.battery => l10n.battery,
final val => val.name,
};
}

View File

@@ -1,24 +0,0 @@
import 'dart:async';
class SyncResult<T, E> {
final List<T> up;
final List<T> down;
final Map<T, E> err;
const SyncResult({
required this.up,
required this.down,
required this.err,
});
@override
String toString() {
return 'SyncResult{up: $up, down: $down, err: $err}';
}
}
abstract class SyncIface<T> {
/// Merge [other] into [this], return [this] after merge.
/// Data in [other] has higher priority than [this].
FutureOr<void> sync(T other);
}

View File

@@ -1,11 +1,11 @@
import 'package:fl_lib/fl_lib.dart';
import 'package:flutter/material.dart';
import 'package:icons_plus/icons_plus.dart';
import 'package:server_box/core/extension/context/locale.dart';
import 'package:server_box/view/page/server/tab.dart';
import 'package:server_box/view/page/server/tab/tab.dart';
// import 'package:server_box/view/page/setting/entry.dart';
import 'package:server_box/view/page/snippet/list.dart';
import 'package:server_box/view/page/ssh/tab.dart';
import 'package:icons_plus/icons_plus.dart';
import 'package:server_box/view/page/storage/local.dart';
enum AppTab {
@@ -56,7 +56,41 @@ enum AppTab {
};
}
NavigationRailDestination get navRailDestination {
return switch (this) {
server => NavigationRailDestination(
icon: const Icon(BoxIcons.bx_server),
label: Text(l10n.server),
selectedIcon: const Icon(BoxIcons.bxs_server),
),
// settings => NavigationRailDestination(
// icon: const Icon(Icons.settings),
// label: libL10n.setting,
// selectedIcon: const Icon(Icons.settings),
// ),
ssh => const NavigationRailDestination(
icon: Icon(Icons.terminal_outlined),
label: Text('SSH'),
selectedIcon: Icon(Icons.terminal),
),
snippet => NavigationRailDestination(
icon: const Icon(Icons.code),
label: Text(l10n.snippet),
selectedIcon: const Icon(Icons.code),
),
file => NavigationRailDestination(
icon: const Icon(Icons.folder_open),
label: Text(libL10n.file),
selectedIcon: const Icon(Icons.folder),
),
};
}
static List<NavigationDestination> get navDestinations {
return AppTab.values.map((e) => e.navDestination).toList();
}
static List<NavigationRailDestination> get navRailDestinations {
return AppTab.values.map((e) => e.navRailDestination).toList();
}
}

View File

@@ -105,6 +105,7 @@ enum PkgManager {
return PkgManager.apt;
case Dist.opensuse:
return PkgManager.zypper;
case Dist.coreelec:
case Dist.wrt:
return PkgManager.opkg;
case Dist.arch:

View File

@@ -1,32 +1,27 @@
import 'package:hive_flutter/adapters.dart';
import 'package:json_annotation/json_annotation.dart';
part 'custom.g.dart';
@JsonSerializable()
@HiveType(typeId: 7)
@JsonSerializable(includeIfNull: false)
final class ServerCustom {
// @HiveField(0)
// final String? temperature;
@HiveField(1)
final String? pveAddr;
@HiveField(2, defaultValue: false)
final bool pveIgnoreCert;
/// {"title": "cmd"}
@HiveField(3)
final Map<String, String>? cmds;
@HiveField(4)
final String? preferTempDev;
@HiveField(5)
final String? logoUrl;
/// The device name of the network interface displayed in the home server card.
@HiveField(6)
final String? netDev;
/// The directory where the script is stored.
@HiveField(7)
final String? scriptDir;
const ServerCustom({
@@ -40,8 +35,7 @@ final class ServerCustom {
this.scriptDir,
});
factory ServerCustom.fromJson(Map<String, dynamic> json) =>
_$ServerCustomFromJson(json);
factory ServerCustom.fromJson(Map<String, dynamic> json) => _$ServerCustomFromJson(json);
Map<String, dynamic> toJson() => _$ServerCustomToJson(this);

View File

@@ -2,85 +2,29 @@
part of 'custom.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class ServerCustomAdapter extends TypeAdapter<ServerCustom> {
@override
final int typeId = 7;
@override
ServerCustom read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return ServerCustom(
pveAddr: fields[1] as String?,
pveIgnoreCert: fields[2] == null ? false : fields[2] as bool,
cmds: (fields[3] as Map?)?.cast<String, String>(),
preferTempDev: fields[4] as String?,
logoUrl: fields[5] as String?,
netDev: fields[6] as String?,
scriptDir: fields[7] as String?,
);
}
@override
void write(BinaryWriter writer, ServerCustom obj) {
writer
..writeByte(7)
..writeByte(1)
..write(obj.pveAddr)
..writeByte(2)
..write(obj.pveIgnoreCert)
..writeByte(3)
..write(obj.cmds)
..writeByte(4)
..write(obj.preferTempDev)
..writeByte(5)
..write(obj.logoUrl)
..writeByte(6)
..write(obj.netDev)
..writeByte(7)
..write(obj.scriptDir);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is ServerCustomAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
ServerCustom _$ServerCustomFromJson(Map<String, dynamic> json) => ServerCustom(
pveAddr: json['pveAddr'] as String?,
pveIgnoreCert: json['pveIgnoreCert'] as bool? ?? false,
cmds: (json['cmds'] as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
),
preferTempDev: json['preferTempDev'] as String?,
logoUrl: json['logoUrl'] as String?,
netDev: json['netDev'] as String?,
scriptDir: json['scriptDir'] as String?,
);
pveAddr: json['pveAddr'] as String?,
pveIgnoreCert: json['pveIgnoreCert'] as bool? ?? false,
cmds: (json['cmds'] as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
),
preferTempDev: json['preferTempDev'] as String?,
logoUrl: json['logoUrl'] as String?,
netDev: json['netDev'] as String?,
scriptDir: json['scriptDir'] as String?,
);
Map<String, dynamic> _$ServerCustomToJson(ServerCustom instance) =>
<String, dynamic>{
'pveAddr': instance.pveAddr,
if (instance.pveAddr case final value?) 'pveAddr': value,
'pveIgnoreCert': instance.pveIgnoreCert,
'cmds': instance.cmds,
'preferTempDev': instance.preferTempDev,
'logoUrl': instance.logoUrl,
'netDev': instance.netDev,
'scriptDir': instance.scriptDir,
if (instance.cmds case final value?) 'cmds': value,
if (instance.preferTempDev case final value?) 'preferTempDev': value,
if (instance.logoUrl case final value?) 'logoUrl': value,
if (instance.netDev case final value?) 'netDev': value,
if (instance.scriptDir case final value?) 'scriptDir': value,
};

View File

@@ -1,29 +1,208 @@
import 'dart:convert';
import 'package:equatable/equatable.dart';
import 'package:fl_lib/fl_lib.dart';
import 'package:server_box/data/model/server/time_seq.dart';
import 'package:server_box/data/res/misc.dart';
class Disk {
final String fs;
class Disk with EquatableMixin {
final String path;
final String? fsTyp;
final String mount;
final int usedPercent;
final BigInt used;
final BigInt size;
final BigInt avail;
/// Device name (e.g., sda1, nvme0n1p1)
final String? name;
/// Internal kernel device name
final String? kname;
/// Filesystem UUID
final String? uuid;
/// Child disks (partitions)
final List<Disk> children;
const Disk({
required this.fs,
required this.path,
this.fsTyp,
required this.mount,
required this.usedPercent,
required this.used,
required this.size,
required this.avail,
this.name,
this.kname,
this.uuid,
this.children = const [],
});
static List<Disk> parse(String raw) {
final list = <Disk>[];
raw = raw.trim();
try {
if (raw.startsWith('{')) {
// Parse JSON output from lsblk command
final Map<String, dynamic> jsonData = json.decode(raw);
final List<dynamic> blockdevices = jsonData['blockdevices'] ?? [];
for (final device in blockdevices) {
// Process each device
_processTopLevelDevice(device, list);
}
} else {
// Fallback to the old parsing method in case of non-JSON output
return _parseWithOldMethod(raw);
}
} catch (e) {
Loggers.app.warning('Failed to parse disk info: $e', e);
}
return list;
}
/// Process a top-level device and add all valid disks to the list
static void _processTopLevelDevice(Map<String, dynamic> device, List<Disk> list) {
final disk = _processDiskDevice(device);
if (disk != null) {
list.add(disk);
}
// For devices with children (like physical disks with partitions),
// also process each child individually to ensure BTRFS RAID disks are properly handled
final List<dynamic> childDevices = device['children'] ?? [];
for (final childDevice in childDevices) {
final String childPath = childDevice['path']?.toString() ?? '';
final String childFsType = childDevice['fstype']?.toString() ?? '';
// If this is a BTRFS partition, add it directly to ensure it's properly represented
if (childFsType == 'btrfs' && childPath.isNotEmpty) {
final childDisk = _processSingleDevice(childDevice);
if (childDisk != null) {
list.add(childDisk);
}
}
}
}
/// Process a single device without recursively processing its children
static Disk? _processSingleDevice(Map<String, dynamic> device) {
final fstype = device['fstype']?.toString();
final String mountpoint = device['mountpoint']?.toString() ?? '';
final String path = device['path']?.toString() ?? '';
if (path.isEmpty || (fstype == null && mountpoint.isEmpty)) {
return null;
}
if (!_shouldCalc(fstype ?? '', mountpoint)) {
return null;
}
final sizeStr = device['fssize']?.toString() ?? '0';
final size = (BigInt.tryParse(sizeStr) ?? BigInt.zero) ~/ BigInt.from(1024);
final usedStr = device['fsused']?.toString() ?? '0';
final used = (BigInt.tryParse(usedStr) ?? BigInt.zero) ~/ BigInt.from(1024);
final availStr = device['fsavail']?.toString() ?? '0';
final avail = (BigInt.tryParse(availStr) ?? BigInt.zero) ~/ BigInt.from(1024);
// Parse fsuse% which is usually in the format "45%"
String usePercentStr = device['fsuse%']?.toString() ?? '0';
usePercentStr = usePercentStr.replaceAll('%', '');
final usedPercent = int.tryParse(usePercentStr) ?? 0;
final name = device['name']?.toString();
final kname = device['kname']?.toString();
final uuid = device['uuid']?.toString();
return Disk(
path: path,
fsTyp: fstype,
mount: mountpoint,
usedPercent: usedPercent,
used: used,
size: size,
avail: avail,
name: name,
kname: kname,
uuid: uuid,
children: const [], // No children for direct device
);
}
static Disk? _processDiskDevice(Map<String, dynamic> device) {
final fstype = device['fstype']?.toString();
final String mountpoint = device['mountpoint']?.toString() ?? '';
// For parent devices that don't have a mountpoint themselves
final String path = device['path']?.toString() ?? '';
final String mount = mountpoint;
final List<Disk> childDisks = [];
// Process children devices recursively
final List<dynamic> childDevices = device['children'] ?? [];
for (final childDevice in childDevices) {
final childDisk = _processDiskDevice(childDevice);
if (childDisk != null) {
childDisks.add(childDisk);
}
}
// Handle common filesystem cases or parent devices with children
if ((fstype != null && _shouldCalc(fstype, mount)) ||
(childDisks.isNotEmpty && path.isNotEmpty)) {
final sizeStr = device['fssize']?.toString() ?? '0';
final size = (BigInt.tryParse(sizeStr) ?? BigInt.zero) ~/ BigInt.from(1024);
final usedStr = device['fsused']?.toString() ?? '0';
final used = (BigInt.tryParse(usedStr) ?? BigInt.zero) ~/ BigInt.from(1024);
final availStr = device['fsavail']?.toString() ?? '0';
final avail = (BigInt.tryParse(availStr) ?? BigInt.zero) ~/ BigInt.from(1024);
// Parse fsuse% which is usually in the format "45%"
String usePercentStr = device['fsuse%']?.toString() ?? '0';
usePercentStr = usePercentStr.replaceAll('%', '');
final usedPercent = int.tryParse(usePercentStr) ?? 0;
final name = device['name']?.toString();
final kname = device['kname']?.toString();
final uuid = device['uuid']?.toString();
return Disk(
path: path,
fsTyp: fstype,
mount: mount,
usedPercent: usedPercent,
used: used,
size: size,
avail: avail,
name: name,
kname: kname,
uuid: uuid,
children: childDisks,
);
} else if (childDisks.isNotEmpty) {
// If this is a parent device with no filesystem but has children,
// return the first valid child instead
if (childDisks.isNotEmpty) {
return childDisks.first;
}
}
return null;
}
// Fallback to the old parsing method in case JSON parsing fails
static List<Disk> _parseWithOldMethod(String raw) {
final list = <Disk>[];
final items = raw.split('\n');
items.removeAt(0);
if (items.isNotEmpty) items.removeAt(0);
var pathCache = '';
for (var item in items) {
if (item.isEmpty) {
@@ -43,12 +222,12 @@ class Disk {
final mount = vals[5];
if (!_shouldCalc(fs, mount)) continue;
list.add(Disk(
fs: fs,
path: fs,
mount: mount,
usedPercent: int.parse(vals[4].replaceFirst('%', '')),
used: BigInt.parse(vals[2]),
size: BigInt.parse(vals[1]),
avail: BigInt.parse(vals[3]),
used: BigInt.parse(vals[2]) ~/ BigInt.from(1024),
size: BigInt.parse(vals[1]) ~/ BigInt.from(1024),
avail: BigInt.parse(vals[3]) ~/ BigInt.from(1024),
));
} catch (e) {
continue;
@@ -58,9 +237,8 @@ class Disk {
}
@override
String toString() {
return 'Disk{dev: $fs, mount: $mount, usedPercent: $usedPercent, used: $used, size: $size, avail: $avail}';
}
List<Object?> get props =>
[path, name, kname, fsTyp, mount, usedPercent, used, size, avail, uuid, children];
}
class DiskIO extends TimeSeq<List<DiskIOPiece>> {
@@ -72,9 +250,16 @@ class DiskIO extends TimeSeq<List<DiskIOPiece>> {
}
(double?, double?) _getSpeed(String dev) {
if (dev.startsWith('/dev/')) dev = dev.substring(5);
final old = pre.firstWhereOrNull((e) => e.dev == dev);
final new_ = now.firstWhereOrNull((e) => e.dev == dev);
// Extract the device name from path if needed
String searchDev = dev;
if (dev.startsWith('/dev/')) {
searchDev = dev.substring(5);
}
// Try to find by exact device name first
final old = pre.firstWhereOrNull((e) => e.dev == searchDev);
final new_ = now.firstWhereOrNull((e) => e.dev == searchDev);
if (old == null || new_ == null) return (null, null);
final sectorsRead = new_.sectorsRead - old.sectorsRead;
final sectorsWrite = new_.sectorsWrite - old.sectorsWrite;
@@ -111,6 +296,7 @@ class DiskIO extends TimeSeq<List<DiskIOPiece>> {
read += read_ ?? 0;
write += write_ ?? 0;
}
final readStr = '${read.bytes2Str}/s';
final writeStr = '${write.bytes2Str}/s';
return (readStr, writeStr);
@@ -168,7 +354,11 @@ class DiskUsage {
required this.size,
});
double get usedPercent => used / size * 100;
double get usedPercent {
// Avoid division by zero
if (size == BigInt.zero) return 0;
return used / size * 100;
}
/// Find all devs, add their used and size
static DiskUsage parse(List<Disk> disks) {
@@ -176,9 +366,12 @@ class DiskUsage {
var used = BigInt.zero;
var size = BigInt.zero;
for (var disk in disks) {
if (!_shouldCalc(disk.fs, disk.mount)) continue;
if (devs.contains(disk.fs)) continue;
devs.add(disk.fs);
if (!_shouldCalc(disk.path, disk.mount)) continue;
// Use a combination of path and kernel name to uniquely identify disks
// This helps distinguish between multiple physical disks in BTRFS RAID setups
final uniqueId = '${disk.path}:${disk.kname ?? "unknown"}';
if (devs.contains(uniqueId)) continue;
devs.add(uniqueId);
used += disk.used;
size += disk.size;
}
@@ -187,12 +380,24 @@ class DiskUsage {
}
bool _shouldCalc(String fs, String mount) {
// Skip swap partitions
// if (mount == '[SWAP]') return false;
// Include standard filesystems
if (fs.startsWith('/dev')) return true;
// Some NAS may have mounted path like this `//192.168.1.2/`
if (fs.startsWith('//')) return true;
if (mount.startsWith('/mnt')) return true;
// if (fs.startsWith('shm') ||
// fs.startsWith('overlay') ||
// fs.startsWith('tmpfs')) return false;
return false;
// Include common filesystem types
// final commonFsTypes = ['ext2', 'ext3', 'ext4', 'xfs', 'btrfs', 'zfs', 'ntfs', 'fat', 'vfat'];
// if (commonFsTypes.any((type) => fs.toLowerCase() == type)) return true;
// Skip special filesystems
// if (fs == 'LVM2_member' || fs == 'crypto_LUKS') return false;
if (fs.startsWith('shm') || fs.startsWith('overlay') || fs.startsWith('tmpfs')) {
return false;
}
return true;
}

View File

@@ -0,0 +1,204 @@
import 'dart:convert';
import 'package:fl_lib/fl_lib.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'disk_smart.freezed.dart';
part 'disk_smart.g.dart';
@freezed
class DiskSmart with _$DiskSmart {
const DiskSmart._();
const factory DiskSmart({
required String device,
bool? healthy,
double? temperature,
String? model,
String? serial,
int? powerOnHours,
int? powerCycleCount,
required Map<String, dynamic> rawData,
required Map<String, SmartAttribute> smartAttributes,
}) = _DiskSmart;
factory DiskSmart.fromJson(Map<String, dynamic> json) => _$DiskSmartFromJson(json);
static List<DiskSmart> parse(String raw) {
final results = <DiskSmart>[];
final jsonBlocks = raw.split('\n\n').where((s) => s.trim().isNotEmpty);
for (final jsonStr in jsonBlocks) {
try {
final data = json.decode(jsonStr.trim()) as Map<String, dynamic>;
// Basic
final device = data['device']?['name']?.toString() ?? '';
final healthy = data['smart_status']?['passed'] as bool?;
// Model and Serial
final model =
data['model_name']?.toString() ??
data['model_family']?.toString() ??
data['device']?['model_name']?.toString();
final serial = data['serial_number']?.toString() ?? data['device']?['serial_number']?.toString();
// SMART Attrs
final smartAttributes = _parseSmartAttributes(data);
final temperature = _extractTemperature(data, smartAttributes);
final powerOnHours =
data['power_on_time']?['hours'] as int? ?? smartAttributes['Power_On_Hours']?.rawValue as int?;
final powerCycleCount =
data['power_cycle_count'] as int? ?? smartAttributes['Power_Cycle_Count']?.rawValue as int?;
results.add(
DiskSmart(
device: device,
healthy: healthy,
temperature: temperature,
model: model,
serial: serial,
powerOnHours: powerOnHours,
powerCycleCount: powerCycleCount,
rawData: data,
smartAttributes: smartAttributes,
),
);
} catch (e, s) {
Loggers.app.warning('DiskSmart parse', e, s);
}
}
return results;
}
static Map<String, SmartAttribute> _parseSmartAttributes(Map<String, dynamic> data) {
final attributes = <String, SmartAttribute>{};
final attrTable = data['ata_smart_attributes']?['table'] as List?;
if (attrTable == null) return attributes;
for (final attr in attrTable) {
if (attr is Map<String, dynamic>) {
final name = attr['name']?.toString();
if (name != null) {
attributes[name] = SmartAttribute(
id: attr['id'] as int?,
name: name,
value: attr['value'] as int?,
worst: attr['worst'] as int?,
thresh: attr['thresh'] as int?,
whenFailed: attr['when_failed']?.toString(),
rawValue: attr['raw']?['value'],
rawString: attr['raw']?['string']?.toString(),
flags: SmartAttributeFlags.fromMap(attr['flags'] as Map<String, dynamic>? ?? {}),
);
}
}
}
return attributes;
}
static final _tempReg = RegExp(r'^(\d+(?:\.\d+)?)');
/// Extract temperature from the data
static double? _extractTemperature(Map<String, dynamic> data, Map<String, SmartAttribute> attrs) {
// Directly
final directTemp = data['temperature']?['current'];
if (directTemp is num) return directTemp.toDouble();
// SMART attribute
final tempAttr = attrs['Temperature_Celsius'];
if (tempAttr != null) {
// "35 (Min/Max 14/61)"
final rawString = tempAttr.rawString;
if (rawString != null) {
final match = _tempReg.firstMatch(rawString);
if (match != null) {
return double.tryParse(match.group(1)!);
}
}
// Simple numeric value
if (tempAttr.rawValue is num && tempAttr.rawValue! < 150) {
return tempAttr.rawValue!.toDouble();
}
}
return null;
}
/// Get the specific SMART attribute by name
SmartAttribute? getAttribute(String name) => smartAttributes[name];
int? get ssdLifeLeft => smartAttributes['SSD_Life_Left']?.rawValue as int?;
int? get lifetimeWritesGiB => smartAttributes['Lifetime_Writes_GiB']?.rawValue as int?;
int? get lifetimeReadsGiB => smartAttributes['Lifetime_Reads_GiB']?.rawValue as int?;
int? get unsafeShutdownCount => smartAttributes['Unsafe_Shutdown_Count']?.rawValue as int?;
int? get averageEraseCount => smartAttributes['Average_Erase_Count']?.rawValue as int?;
int? get maxEraseCount => smartAttributes['Max_Erase_Count']?.rawValue as int?;
@override
String toString() => 'DiskSmart($device)';
}
@freezed
class SmartAttribute with _$SmartAttribute {
const SmartAttribute._();
const factory SmartAttribute({
int? id,
required String name,
int? value,
int? worst,
int? thresh,
String? whenFailed,
dynamic rawValue,
String? rawString,
required SmartAttributeFlags flags,
}) = _SmartAttribute;
factory SmartAttribute.fromJson(Map<String, dynamic> json) => _$SmartAttributeFromJson(json);
@override
String toString() {
return 'SmartAttribute(id: $id, name: $name)';
}
}
@freezed
class SmartAttributeFlags with _$SmartAttributeFlags {
const SmartAttributeFlags._();
const factory SmartAttributeFlags({
int? value,
String? string,
@Default(false) bool prefailure,
@Default(false) bool updatedOnline,
@Default(false) bool performance,
@Default(false) bool errorRate,
@Default(false) bool eventCount,
@Default(false) bool autoKeep,
}) = _SmartAttributeFlags;
factory SmartAttributeFlags.fromJson(Map<String, dynamic> json) => _$SmartAttributeFlagsFromJson(json);
factory SmartAttributeFlags.fromMap(Map<String, dynamic> map) {
return SmartAttributeFlags(
value: map['value'] as int?,
string: map['string']?.toString(),
prefailure: map['prefailure'] == true,
updatedOnline: map['updated_online'] == true,
performance: map['performance'] == true,
errorRate: map['error_rate'] == true,
eventCount: map['event_count'] == true,
autoKeep: map['auto_keep'] == true,
);
}
@override
String toString() {
return 'SmartAttributeFlags(value: $value, string: $string)';
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,91 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'disk_smart.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_$DiskSmartImpl _$$DiskSmartImplFromJson(Map<String, dynamic> json) =>
_$DiskSmartImpl(
device: json['device'] as String,
healthy: json['healthy'] as bool?,
temperature: (json['temperature'] as num?)?.toDouble(),
model: json['model'] as String?,
serial: json['serial'] as String?,
powerOnHours: (json['powerOnHours'] as num?)?.toInt(),
powerCycleCount: (json['powerCycleCount'] as num?)?.toInt(),
rawData: json['rawData'] as Map<String, dynamic>,
smartAttributes: (json['smartAttributes'] as Map<String, dynamic>).map(
(k, e) =>
MapEntry(k, SmartAttribute.fromJson(e as Map<String, dynamic>)),
),
);
Map<String, dynamic> _$$DiskSmartImplToJson(_$DiskSmartImpl instance) =>
<String, dynamic>{
'device': instance.device,
'healthy': instance.healthy,
'temperature': instance.temperature,
'model': instance.model,
'serial': instance.serial,
'powerOnHours': instance.powerOnHours,
'powerCycleCount': instance.powerCycleCount,
'rawData': instance.rawData,
'smartAttributes': instance.smartAttributes,
};
_$SmartAttributeImpl _$$SmartAttributeImplFromJson(Map<String, dynamic> json) =>
_$SmartAttributeImpl(
id: (json['id'] as num?)?.toInt(),
name: json['name'] as String,
value: (json['value'] as num?)?.toInt(),
worst: (json['worst'] as num?)?.toInt(),
thresh: (json['thresh'] as num?)?.toInt(),
whenFailed: json['whenFailed'] as String?,
rawValue: json['rawValue'],
rawString: json['rawString'] as String?,
flags: SmartAttributeFlags.fromJson(
json['flags'] as Map<String, dynamic>,
),
);
Map<String, dynamic> _$$SmartAttributeImplToJson(
_$SmartAttributeImpl instance,
) => <String, dynamic>{
'id': instance.id,
'name': instance.name,
'value': instance.value,
'worst': instance.worst,
'thresh': instance.thresh,
'whenFailed': instance.whenFailed,
'rawValue': instance.rawValue,
'rawString': instance.rawString,
'flags': instance.flags,
};
_$SmartAttributeFlagsImpl _$$SmartAttributeFlagsImplFromJson(
Map<String, dynamic> json,
) => _$SmartAttributeFlagsImpl(
value: (json['value'] as num?)?.toInt(),
string: json['string'] as String?,
prefailure: json['prefailure'] as bool? ?? false,
updatedOnline: json['updatedOnline'] as bool? ?? false,
performance: json['performance'] as bool? ?? false,
errorRate: json['errorRate'] as bool? ?? false,
eventCount: json['eventCount'] as bool? ?? false,
autoKeep: json['autoKeep'] as bool? ?? false,
);
Map<String, dynamic> _$$SmartAttributeFlagsImplToJson(
_$SmartAttributeFlagsImpl instance,
) => <String, dynamic>{
'value': instance.value,
'string': instance.string,
'prefailure': instance.prefailure,
'updatedOnline': instance.updatedOnline,
'performance': instance.performance,
'errorRate': instance.errorRate,
'eventCount': instance.eventCount,
'autoKeep': instance.autoKeep,
};

View File

@@ -11,6 +11,7 @@ enum Dist {
alpine,
rocky,
deepin,
coreelec,
;
}

View File

@@ -1,3 +1,5 @@
// ignore_for_file: unintended_html_in_doc_comment
import 'package:fl_lib/fl_lib.dart';
import 'package:server_box/data/model/server/time_seq.dart';

View File

@@ -1,15 +1,11 @@
import 'package:hive_flutter/hive_flutter.dart';
import 'package:json_annotation/json_annotation.dart';
part 'private_key_info.g.dart';
@JsonSerializable()
@HiveType(typeId: 1)
class PrivateKeyInfo {
@HiveField(0)
final String id;
@JsonKey(name: 'private_key')
@HiveField(1)
final String key;
const PrivateKeyInfo({
@@ -17,8 +13,7 @@ class PrivateKeyInfo {
required this.key,
});
factory PrivateKeyInfo.fromJson(Map<String, dynamic> json) =>
_$PrivateKeyInfoFromJson(json);
factory PrivateKeyInfo.fromJson(Map<String, dynamic> json) => _$PrivateKeyInfoFromJson(json);
Map<String, dynamic> toJson() => _$PrivateKeyInfoToJson(this);

View File

@@ -2,47 +2,6 @@
part of 'private_key_info.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class PrivateKeyInfoAdapter extends TypeAdapter<PrivateKeyInfo> {
@override
final int typeId = 1;
@override
PrivateKeyInfo read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return PrivateKeyInfo(
id: fields[0] as String,
key: fields[1] as String,
);
}
@override
void write(BinaryWriter writer, PrivateKeyInfo obj) {
writer
..writeByte(2)
..writeByte(0)
..write(obj.id)
..writeByte(1)
..write(obj.key);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is PrivateKeyInfoAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
@@ -54,7 +13,4 @@ PrivateKeyInfo _$PrivateKeyInfoFromJson(Map<String, dynamic> json) =>
);
Map<String, dynamic> _$PrivateKeyInfoToJson(PrivateKeyInfo instance) =>
<String, dynamic>{
'id': instance.id,
'private_key': instance.key,
};
<String, dynamic>{'id': instance.id, 'private_key': instance.key};

View File

@@ -1,10 +1,11 @@
import 'package:dartssh2/dartssh2.dart';
import 'package:server_box/data/model/app/error.dart';
import 'package:fl_lib/fl_lib.dart';
import 'package:server_box/data/model/app/shell_func.dart';
import 'package:server_box/data/model/server/battery.dart';
import 'package:server_box/data/model/server/conn.dart';
import 'package:server_box/data/model/server/cpu.dart';
import 'package:server_box/data/model/server/disk.dart';
import 'package:server_box/data/model/server/disk_smart.dart';
import 'package:server_box/data/model/server/memory.dart';
import 'package:server_box/data/model/server/net_speed.dart';
import 'package:server_box/data/model/server/nvdia.dart';
@@ -19,12 +20,7 @@ class Server {
SSHClient? client;
ServerConn conn;
Server(
this.spi,
this.status,
this.conn, {
this.client,
});
Server(this.spi, this.status, this.conn, {this.client});
bool get needGenClient => conn < ServerConn.connecting;
@@ -44,6 +40,7 @@ class ServerStatus {
SystemType system;
Err? err;
DiskIO diskIO;
List<DiskSmart> diskSmart;
List<NvidiaSmiItem>? nvidia;
final List<Battery> batteries = [];
final Map<StatusCmdType, String> more = {};
@@ -61,6 +58,7 @@ class ServerStatus {
required this.temps,
required this.system,
required this.diskIO,
this.diskSmart = const [],
this.err,
this.nvidia,
this.diskUsage,

View File

@@ -1,15 +1,16 @@
import 'dart:convert';
import 'package:fl_lib/fl_lib.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:hive_ce_flutter/hive_flutter.dart';
import 'package:server_box/data/model/app/error.dart';
import 'package:server_box/data/model/server/custom.dart';
import 'package:server_box/data/model/server/server.dart';
import 'package:server_box/data/model/server/wol_cfg.dart';
import 'package:server_box/data/provider/server.dart';
import 'package:server_box/data/store/server.dart';
import 'package:server_box/data/model/app/error.dart';
part 'server_private_info.freezed.dart';
part 'server_private_info.g.dart';
/// In the first version, it's called `ServerPrivateInfo` which was designed to
@@ -18,79 +19,75 @@ part 'server_private_info.g.dart';
/// Some params named as `spi` in the codebase which is the abbreviation of `ServerPrivateInfo`.
///
/// Nowaday, more fields are added to this class, and it's renamed to `Spi`.
@JsonSerializable()
@HiveType(typeId: 3)
class Spi {
@HiveField(0)
final String name;
@HiveField(1)
final String ip;
@HiveField(2)
final int port;
@HiveField(3)
final String user;
@HiveField(4)
final String? pwd;
@Freezed(fromJson: false)
@JsonSerializable(includeIfNull: false)
class Spi with _$Spi {
const Spi._();
/// [id] of private key
@JsonKey(name: 'pubKeyId')
@HiveField(5)
final String? keyId;
@HiveField(6)
final List<String>? tags;
@HiveField(7)
final String? alterUrl;
@HiveField(8, defaultValue: true)
final bool autoConnect;
const factory Spi({
required String name,
required String ip,
required int port,
required String user,
String? pwd,
/// [id] of the jump server
@HiveField(9)
final String? jumpId;
/// [id] of private key
@JsonKey(name: 'pubKeyId') String? keyId,
List<String>? tags,
String? alterUrl,
@Default(true) @JsonKey(defaultValue: true) bool autoConnect,
@HiveField(10)
final ServerCustom? custom;
/// [id] of the jump server
String? jumpId,
ServerCustom? custom,
WakeOnLanCfg? wolCfg,
@HiveField(11)
final WakeOnLanCfg? wolCfg;
/// It only applies to SSH terminal.
@HiveField(12)
final Map<String, String>? envs;
final String id;
const Spi({
required this.name,
required this.ip,
required this.port,
required this.user,
required this.pwd,
this.keyId,
this.tags,
this.alterUrl,
this.autoConnect = true,
this.jumpId,
this.custom,
this.wolCfg,
this.envs,
}) : id = '$user@$ip:$port';
/// It only applies to SSH terminal.
Map<String, String>? envs,
@JsonKey(fromJson: Spi.parseId) @HiveField(13, defaultValue: '') required String id,
}) = _Spi;
factory Spi.fromJson(Map<String, dynamic> json) => _$SpiFromJson(json);
Map<String, dynamic> toJson() => _$SpiToJson(this);
@override
String toString() => id;
String toString() => 'Spi<$oldId>';
static String parseId(Object? id) {
if (id == null || id is! String || id.isEmpty) return ShortId.generate();
return id;
}
}
extension Spix on Spi {
/// After upgrading to >= 1155, this field is only recommended to be used
/// for displaying the server name.
String get oldId => '$user@$ip:$port';
/// Save the [Spi] to the local storage.
void save() => ServerStore.instance.put(this);
/// Migrate the [oldId] to the new generated [id] by [ShortId.generate].
///
/// Returns:
/// - `null` if the [id] is not empty.
/// - The new [id] if the [id] is empty.
String? migrateId() {
if (id.isNotEmpty) return null;
ServerStore.instance.delete(oldId);
final newSpi = copyWith(id: ShortId.generate());
newSpi.save();
return newSpi.id;
}
String toJsonString() => json.encode(toJson());
VNode<Server>? get server => ServerProvider.pick(spi: this);
VNode<Server>? get jumpServer => ServerProvider.pick(id: jumpId);
bool shouldReconnect(Spi old) {
return id != old.id ||
return user != old.user ||
ip != old.ip ||
port != old.port ||
pwd != old.pwd ||
keyId != old.keyId ||
alterUrl != old.alterUrl ||
@@ -122,27 +119,27 @@ extension Spix on Spi {
/// Just for showing the struct of the class.
///
/// **NOT** the default value.
static const example = Spi(
name: 'name',
ip: 'ip',
port: 22,
user: 'root',
pwd: 'pwd',
keyId: 'private_key_id',
tags: ['tag1', 'tag2'],
alterUrl: 'user@ip:port',
autoConnect: true,
jumpId: 'jump_server_id',
custom: ServerCustom(
pveAddr: 'http://localhost:8006',
pveIgnoreCert: false,
cmds: {
'echo': 'echo hello',
},
preferTempDev: 'nvme-pci-0400',
logoUrl: 'https://example.com/logo.png',
),
);
static final example = Spi(
name: 'name',
ip: 'ip',
port: 22,
user: 'root',
pwd: 'pwd',
keyId: 'private_key_id',
tags: ['tag1', 'tag2'],
alterUrl: 'user@ip:port',
autoConnect: true,
jumpId: 'jump_server_id',
custom: ServerCustom(
pveAddr: 'http://localhost:8006',
pveIgnoreCert: false,
cmds: {
'echo': 'echo hello',
},
preferTempDev: 'nvme-pci-0400',
logoUrl: 'https://example.com/logo.png',
),
id: 'id');
bool get isRoot => user == 'root';
}

View File

@@ -0,0 +1,487 @@
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'server_private_info.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
T _$identity<T>(T value) => value;
final _privateConstructorUsedError = UnsupportedError(
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models',
);
/// @nodoc
mixin _$Spi {
String get name => throw _privateConstructorUsedError;
String get ip => throw _privateConstructorUsedError;
int get port => throw _privateConstructorUsedError;
String get user => throw _privateConstructorUsedError;
String? get pwd => throw _privateConstructorUsedError;
/// [id] of private key
@JsonKey(name: 'pubKeyId')
String? get keyId => throw _privateConstructorUsedError;
List<String>? get tags => throw _privateConstructorUsedError;
String? get alterUrl => throw _privateConstructorUsedError;
@JsonKey(defaultValue: true)
bool get autoConnect => throw _privateConstructorUsedError;
/// [id] of the jump server
String? get jumpId => throw _privateConstructorUsedError;
ServerCustom? get custom => throw _privateConstructorUsedError;
WakeOnLanCfg? get wolCfg => throw _privateConstructorUsedError;
/// It only applies to SSH terminal.
Map<String, String>? get envs => throw _privateConstructorUsedError;
@JsonKey(fromJson: Spi.parseId)
@HiveField(13, defaultValue: '')
String get id => throw _privateConstructorUsedError;
/// Serializes this Spi to a JSON map.
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
/// Create a copy of Spi
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$SpiCopyWith<Spi> get copyWith => throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $SpiCopyWith<$Res> {
factory $SpiCopyWith(Spi value, $Res Function(Spi) then) =
_$SpiCopyWithImpl<$Res, Spi>;
@useResult
$Res call({
String name,
String ip,
int port,
String user,
String? pwd,
@JsonKey(name: 'pubKeyId') String? keyId,
List<String>? tags,
String? alterUrl,
@JsonKey(defaultValue: true) bool autoConnect,
String? jumpId,
ServerCustom? custom,
WakeOnLanCfg? wolCfg,
Map<String, String>? envs,
@JsonKey(fromJson: Spi.parseId) @HiveField(13, defaultValue: '') String id,
});
}
/// @nodoc
class _$SpiCopyWithImpl<$Res, $Val extends Spi> implements $SpiCopyWith<$Res> {
_$SpiCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of Spi
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? name = null,
Object? ip = null,
Object? port = null,
Object? user = null,
Object? pwd = freezed,
Object? keyId = freezed,
Object? tags = freezed,
Object? alterUrl = freezed,
Object? autoConnect = null,
Object? jumpId = freezed,
Object? custom = freezed,
Object? wolCfg = freezed,
Object? envs = freezed,
Object? id = null,
}) {
return _then(
_value.copyWith(
name: null == name
? _value.name
: name // ignore: cast_nullable_to_non_nullable
as String,
ip: null == ip
? _value.ip
: ip // ignore: cast_nullable_to_non_nullable
as String,
port: null == port
? _value.port
: port // ignore: cast_nullable_to_non_nullable
as int,
user: null == user
? _value.user
: user // ignore: cast_nullable_to_non_nullable
as String,
pwd: freezed == pwd
? _value.pwd
: pwd // ignore: cast_nullable_to_non_nullable
as String?,
keyId: freezed == keyId
? _value.keyId
: keyId // ignore: cast_nullable_to_non_nullable
as String?,
tags: freezed == tags
? _value.tags
: tags // ignore: cast_nullable_to_non_nullable
as List<String>?,
alterUrl: freezed == alterUrl
? _value.alterUrl
: alterUrl // ignore: cast_nullable_to_non_nullable
as String?,
autoConnect: null == autoConnect
? _value.autoConnect
: autoConnect // ignore: cast_nullable_to_non_nullable
as bool,
jumpId: freezed == jumpId
? _value.jumpId
: jumpId // ignore: cast_nullable_to_non_nullable
as String?,
custom: freezed == custom
? _value.custom
: custom // ignore: cast_nullable_to_non_nullable
as ServerCustom?,
wolCfg: freezed == wolCfg
? _value.wolCfg
: wolCfg // ignore: cast_nullable_to_non_nullable
as WakeOnLanCfg?,
envs: freezed == envs
? _value.envs
: envs // ignore: cast_nullable_to_non_nullable
as Map<String, String>?,
id: null == id
? _value.id
: id // ignore: cast_nullable_to_non_nullable
as String,
)
as $Val,
);
}
}
/// @nodoc
abstract class _$$SpiImplCopyWith<$Res> implements $SpiCopyWith<$Res> {
factory _$$SpiImplCopyWith(_$SpiImpl value, $Res Function(_$SpiImpl) then) =
__$$SpiImplCopyWithImpl<$Res>;
@override
@useResult
$Res call({
String name,
String ip,
int port,
String user,
String? pwd,
@JsonKey(name: 'pubKeyId') String? keyId,
List<String>? tags,
String? alterUrl,
@JsonKey(defaultValue: true) bool autoConnect,
String? jumpId,
ServerCustom? custom,
WakeOnLanCfg? wolCfg,
Map<String, String>? envs,
@JsonKey(fromJson: Spi.parseId) @HiveField(13, defaultValue: '') String id,
});
}
/// @nodoc
class __$$SpiImplCopyWithImpl<$Res> extends _$SpiCopyWithImpl<$Res, _$SpiImpl>
implements _$$SpiImplCopyWith<$Res> {
__$$SpiImplCopyWithImpl(_$SpiImpl _value, $Res Function(_$SpiImpl) _then)
: super(_value, _then);
/// Create a copy of Spi
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? name = null,
Object? ip = null,
Object? port = null,
Object? user = null,
Object? pwd = freezed,
Object? keyId = freezed,
Object? tags = freezed,
Object? alterUrl = freezed,
Object? autoConnect = null,
Object? jumpId = freezed,
Object? custom = freezed,
Object? wolCfg = freezed,
Object? envs = freezed,
Object? id = null,
}) {
return _then(
_$SpiImpl(
name: null == name
? _value.name
: name // ignore: cast_nullable_to_non_nullable
as String,
ip: null == ip
? _value.ip
: ip // ignore: cast_nullable_to_non_nullable
as String,
port: null == port
? _value.port
: port // ignore: cast_nullable_to_non_nullable
as int,
user: null == user
? _value.user
: user // ignore: cast_nullable_to_non_nullable
as String,
pwd: freezed == pwd
? _value.pwd
: pwd // ignore: cast_nullable_to_non_nullable
as String?,
keyId: freezed == keyId
? _value.keyId
: keyId // ignore: cast_nullable_to_non_nullable
as String?,
tags: freezed == tags
? _value._tags
: tags // ignore: cast_nullable_to_non_nullable
as List<String>?,
alterUrl: freezed == alterUrl
? _value.alterUrl
: alterUrl // ignore: cast_nullable_to_non_nullable
as String?,
autoConnect: null == autoConnect
? _value.autoConnect
: autoConnect // ignore: cast_nullable_to_non_nullable
as bool,
jumpId: freezed == jumpId
? _value.jumpId
: jumpId // ignore: cast_nullable_to_non_nullable
as String?,
custom: freezed == custom
? _value.custom
: custom // ignore: cast_nullable_to_non_nullable
as ServerCustom?,
wolCfg: freezed == wolCfg
? _value.wolCfg
: wolCfg // ignore: cast_nullable_to_non_nullable
as WakeOnLanCfg?,
envs: freezed == envs
? _value._envs
: envs // ignore: cast_nullable_to_non_nullable
as Map<String, String>?,
id: null == id
? _value.id
: id // ignore: cast_nullable_to_non_nullable
as String,
),
);
}
}
/// @nodoc
@JsonSerializable(createFactory: false)
class _$SpiImpl extends _Spi {
const _$SpiImpl({
required this.name,
required this.ip,
required this.port,
required this.user,
this.pwd,
@JsonKey(name: 'pubKeyId') this.keyId,
final List<String>? tags,
this.alterUrl,
@JsonKey(defaultValue: true) this.autoConnect = true,
this.jumpId,
this.custom,
this.wolCfg,
final Map<String, String>? envs,
@JsonKey(fromJson: Spi.parseId)
@HiveField(13, defaultValue: '')
required this.id,
}) : _tags = tags,
_envs = envs,
super._();
@override
final String name;
@override
final String ip;
@override
final int port;
@override
final String user;
@override
final String? pwd;
/// [id] of private key
@override
@JsonKey(name: 'pubKeyId')
final String? keyId;
final List<String>? _tags;
@override
List<String>? get tags {
final value = _tags;
if (value == null) return null;
if (_tags is EqualUnmodifiableListView) return _tags;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(value);
}
@override
final String? alterUrl;
@override
@JsonKey(defaultValue: true)
final bool autoConnect;
/// [id] of the jump server
@override
final String? jumpId;
@override
final ServerCustom? custom;
@override
final WakeOnLanCfg? wolCfg;
/// It only applies to SSH terminal.
final Map<String, String>? _envs;
/// It only applies to SSH terminal.
@override
Map<String, String>? get envs {
final value = _envs;
if (value == null) return null;
if (_envs is EqualUnmodifiableMapView) return _envs;
// ignore: implicit_dynamic_type
return EqualUnmodifiableMapView(value);
}
@override
@JsonKey(fromJson: Spi.parseId)
@HiveField(13, defaultValue: '')
final String id;
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$SpiImpl &&
(identical(other.name, name) || other.name == name) &&
(identical(other.ip, ip) || other.ip == ip) &&
(identical(other.port, port) || other.port == port) &&
(identical(other.user, user) || other.user == user) &&
(identical(other.pwd, pwd) || other.pwd == pwd) &&
(identical(other.keyId, keyId) || other.keyId == keyId) &&
const DeepCollectionEquality().equals(other._tags, _tags) &&
(identical(other.alterUrl, alterUrl) ||
other.alterUrl == alterUrl) &&
(identical(other.autoConnect, autoConnect) ||
other.autoConnect == autoConnect) &&
(identical(other.jumpId, jumpId) || other.jumpId == jumpId) &&
(identical(other.custom, custom) || other.custom == custom) &&
(identical(other.wolCfg, wolCfg) || other.wolCfg == wolCfg) &&
const DeepCollectionEquality().equals(other._envs, _envs) &&
(identical(other.id, id) || other.id == id));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode => Object.hash(
runtimeType,
name,
ip,
port,
user,
pwd,
keyId,
const DeepCollectionEquality().hash(_tags),
alterUrl,
autoConnect,
jumpId,
custom,
wolCfg,
const DeepCollectionEquality().hash(_envs),
id,
);
/// Create a copy of Spi
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$SpiImplCopyWith<_$SpiImpl> get copyWith =>
__$$SpiImplCopyWithImpl<_$SpiImpl>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$$SpiImplToJson(this);
}
}
abstract class _Spi extends Spi {
const factory _Spi({
required final String name,
required final String ip,
required final int port,
required final String user,
final String? pwd,
@JsonKey(name: 'pubKeyId') final String? keyId,
final List<String>? tags,
final String? alterUrl,
@JsonKey(defaultValue: true) final bool autoConnect,
final String? jumpId,
final ServerCustom? custom,
final WakeOnLanCfg? wolCfg,
final Map<String, String>? envs,
@JsonKey(fromJson: Spi.parseId)
@HiveField(13, defaultValue: '')
required final String id,
}) = _$SpiImpl;
const _Spi._() : super._();
@override
String get name;
@override
String get ip;
@override
int get port;
@override
String get user;
@override
String? get pwd;
/// [id] of private key
@override
@JsonKey(name: 'pubKeyId')
String? get keyId;
@override
List<String>? get tags;
@override
String? get alterUrl;
@override
@JsonKey(defaultValue: true)
bool get autoConnect;
/// [id] of the jump server
@override
String? get jumpId;
@override
ServerCustom? get custom;
@override
WakeOnLanCfg? get wolCfg;
/// It only applies to SSH terminal.
@override
Map<String, String>? get envs;
@override
@JsonKey(fromJson: Spi.parseId)
@HiveField(13, defaultValue: '')
String get id;
/// Create a copy of Spi
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
_$$SpiImplCopyWith<_$SpiImpl> get copyWith =>
throw _privateConstructorUsedError;
}

View File

@@ -2,118 +2,63 @@
part of 'server_private_info.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class SpiAdapter extends TypeAdapter<Spi> {
@override
final int typeId = 3;
@override
Spi read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return Spi(
name: fields[0] as String,
ip: fields[1] as String,
port: fields[2] as int,
user: fields[3] as String,
pwd: fields[4] as String?,
keyId: fields[5] as String?,
tags: (fields[6] as List?)?.cast<String>(),
alterUrl: fields[7] as String?,
autoConnect: fields[8] == null ? true : fields[8] as bool,
jumpId: fields[9] as String?,
custom: fields[10] as ServerCustom?,
wolCfg: fields[11] as WakeOnLanCfg?,
envs: (fields[12] as Map?)?.cast<String, String>(),
);
}
@override
void write(BinaryWriter writer, Spi obj) {
writer
..writeByte(13)
..writeByte(0)
..write(obj.name)
..writeByte(1)
..write(obj.ip)
..writeByte(2)
..write(obj.port)
..writeByte(3)
..write(obj.user)
..writeByte(4)
..write(obj.pwd)
..writeByte(5)
..write(obj.keyId)
..writeByte(6)
..write(obj.tags)
..writeByte(7)
..write(obj.alterUrl)
..writeByte(8)
..write(obj.autoConnect)
..writeByte(9)
..write(obj.jumpId)
..writeByte(10)
..write(obj.custom)
..writeByte(11)
..write(obj.wolCfg)
..writeByte(12)
..write(obj.envs);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is SpiAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Spi _$SpiFromJson(Map<String, dynamic> json) => Spi(
name: json['name'] as String,
ip: json['ip'] as String,
port: (json['port'] as num).toInt(),
user: json['user'] as String,
pwd: json['pwd'] as String?,
keyId: json['pubKeyId'] as String?,
tags: (json['tags'] as List<dynamic>?)?.map((e) => e as String).toList(),
alterUrl: json['alterUrl'] as String?,
autoConnect: json['autoConnect'] as bool? ?? true,
jumpId: json['jumpId'] as String?,
custom: json['custom'] == null
? null
: ServerCustom.fromJson(json['custom'] as Map<String, dynamic>),
wolCfg: json['wolCfg'] == null
? null
: WakeOnLanCfg.fromJson(json['wolCfg'] as Map<String, dynamic>),
envs: (json['envs'] as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
),
);
name: json['name'] as String,
ip: json['ip'] as String,
port: (json['port'] as num).toInt(),
user: json['user'] as String,
pwd: json['pwd'] as String?,
keyId: json['pubKeyId'] as String?,
tags: (json['tags'] as List<dynamic>?)?.map((e) => e as String).toList(),
alterUrl: json['alterUrl'] as String?,
autoConnect: json['autoConnect'] as bool? ?? true,
jumpId: json['jumpId'] as String?,
custom: json['custom'] == null
? null
: ServerCustom.fromJson(json['custom'] as Map<String, dynamic>),
wolCfg: json['wolCfg'] == null
? null
: WakeOnLanCfg.fromJson(json['wolCfg'] as Map<String, dynamic>),
envs: (json['envs'] as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
),
id: Spi.parseId(json['id']),
);
Map<String, dynamic> _$SpiToJson(Spi instance) => <String, dynamic>{
'name': instance.name,
'ip': instance.ip,
'port': instance.port,
'user': instance.user,
'pwd': instance.pwd,
'pubKeyId': instance.keyId,
'tags': instance.tags,
'alterUrl': instance.alterUrl,
'autoConnect': instance.autoConnect,
'jumpId': instance.jumpId,
'custom': instance.custom,
'wolCfg': instance.wolCfg,
'envs': instance.envs,
};
'name': instance.name,
'ip': instance.ip,
'port': instance.port,
'user': instance.user,
if (instance.pwd case final value?) 'pwd': value,
if (instance.keyId case final value?) 'pubKeyId': value,
if (instance.tags case final value?) 'tags': value,
if (instance.alterUrl case final value?) 'alterUrl': value,
'autoConnect': instance.autoConnect,
if (instance.jumpId case final value?) 'jumpId': value,
if (instance.custom case final value?) 'custom': value,
if (instance.wolCfg case final value?) 'wolCfg': value,
if (instance.envs case final value?) 'envs': value,
'id': instance.id,
};
Map<String, dynamic> _$$SpiImplToJson(_$SpiImpl instance) => <String, dynamic>{
'name': instance.name,
'ip': instance.ip,
'port': instance.port,
'user': instance.user,
'pwd': instance.pwd,
'pubKeyId': instance.keyId,
'tags': instance.tags,
'alterUrl': instance.alterUrl,
'autoConnect': instance.autoConnect,
'jumpId': instance.jumpId,
'custom': instance.custom,
'wolCfg': instance.wolCfg,
'envs': instance.envs,
'id': instance.id,
};

View File

@@ -1,17 +1,17 @@
import 'package:fl_lib/fl_lib.dart';
import 'package:server_box/data/model/app/shell_func.dart';
import 'package:server_box/data/model/server/battery.dart';
import 'package:server_box/data/model/server/conn.dart';
import 'package:server_box/data/model/server/cpu.dart';
import 'package:server_box/data/model/server/disk.dart';
import 'package:server_box/data/model/server/disk_smart.dart';
import 'package:server_box/data/model/server/memory.dart';
import 'package:server_box/data/model/server/net_speed.dart';
import 'package:server_box/data/model/server/nvdia.dart';
import 'package:server_box/data/model/server/sensors.dart';
import 'package:server_box/data/model/server/server.dart';
import 'package:server_box/data/model/server/system.dart';
import 'package:server_box/data/model/app/shell_func.dart';
import 'package:server_box/data/model/server/cpu.dart';
import 'package:server_box/data/model/server/disk.dart';
import 'package:server_box/data/model/server/memory.dart';
import 'package:server_box/data/model/server/net_speed.dart';
import 'package:server_box/data/model/server/conn.dart';
class ServerStatusUpdateReq {
final ServerStatus ss;
final List<String> segments;
@@ -38,7 +38,8 @@ Future<ServerStatus> getStatus(ServerStatusUpdateReq req) async {
Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
final segments = req.segments;
final time = int.tryParse(StatusCmdType.time.find(segments)) ??
final time =
int.tryParse(StatusCmdType.time.find(segments)) ??
DateTime.now().millisecondsSinceEpoch ~/ 1000;
try {
@@ -49,9 +50,7 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
}
try {
final sys = _parseSysVer(
StatusCmdType.sys.find(segments),
);
final sys = _parseSysVer(StatusCmdType.sys.find(segments));
if (sys != null) {
req.ss.more[StatusCmdType.sys] = sys;
}
@@ -131,6 +130,13 @@ Future<ServerStatus> _getLinuxStatus(ServerStatusUpdateReq req) async {
Loggers.app.warning(e, s);
}
try {
final smarts = DiskSmart.parse(StatusCmdType.diskSmart.find(segments));
req.ss.diskSmart = smarts;
} catch (e, s) {
Loggers.app.warning(e, s);
}
try {
req.ss.nvidia = NvidiaSmi.fromXml(StatusCmdType.nvidia.find(segments));
} catch (e, s) {

View File

@@ -1,42 +1,37 @@
import 'dart:async';
import 'package:fl_lib/fl_lib.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:server_box/data/model/server/server_private_info.dart';
import 'package:xterm/core.dart';
part 'snippet.g.dart';
part 'snippet.freezed.dart';
@JsonSerializable()
@HiveType(typeId: 2)
class Snippet {
@HiveField(0)
final String name;
@HiveField(1)
final String script;
@HiveField(2)
final List<String>? tags;
@HiveField(3)
final String? note;
@freezed
class Snippet with _$Snippet {
const factory Snippet({
required String name,
required String script,
List<String>? tags,
String? note,
/// List of server id that this snippet should be auto run on
@HiveField(4)
final List<String>? autoRunOn;
/// List of server id that this snippet should be auto run on
List<String>? autoRunOn,
}) = _Snippet;
const Snippet({
required this.name,
required this.script,
this.tags,
this.note,
this.autoRunOn,
});
factory Snippet.fromJson(Map<String, dynamic> json) => _$SnippetFromJson(json);
factory Snippet.fromJson(Map<String, dynamic> json) =>
_$SnippetFromJson(json);
Map<String, dynamic> toJson() => _$SnippetToJson(this);
static const example = Snippet(
name: 'example',
script: 'echo hello',
tags: ['tag'],
note: 'note',
autoRunOn: ['server_id'],
);
}
extension SnippetX on Snippet {
static final fmtFinder = RegExp(r'\$\{[^{}]+\}');
String fmtWithSpi(Spi spi) {
@@ -175,14 +170,6 @@ class Snippet {
r'${ctrl': TerminalKey.control,
r'${alt': TerminalKey.alt,
};
static const example = Snippet(
name: 'example',
script: 'echo hello',
tags: ['tag'],
note: 'note',
autoRunOn: ['server_id'],
);
}
class SnippetResult {

View File

@@ -0,0 +1,288 @@
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'snippet.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
T _$identity<T>(T value) => value;
final _privateConstructorUsedError = UnsupportedError(
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models',
);
Snippet _$SnippetFromJson(Map<String, dynamic> json) {
return _Snippet.fromJson(json);
}
/// @nodoc
mixin _$Snippet {
String get name => throw _privateConstructorUsedError;
String get script => throw _privateConstructorUsedError;
List<String>? get tags => throw _privateConstructorUsedError;
String? get note => throw _privateConstructorUsedError;
/// List of server id that this snippet should be auto run on
List<String>? get autoRunOn => throw _privateConstructorUsedError;
/// Serializes this Snippet to a JSON map.
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
/// Create a copy of Snippet
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$SnippetCopyWith<Snippet> get copyWith => throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $SnippetCopyWith<$Res> {
factory $SnippetCopyWith(Snippet value, $Res Function(Snippet) then) =
_$SnippetCopyWithImpl<$Res, Snippet>;
@useResult
$Res call({
String name,
String script,
List<String>? tags,
String? note,
List<String>? autoRunOn,
});
}
/// @nodoc
class _$SnippetCopyWithImpl<$Res, $Val extends Snippet>
implements $SnippetCopyWith<$Res> {
_$SnippetCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of Snippet
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? name = null,
Object? script = null,
Object? tags = freezed,
Object? note = freezed,
Object? autoRunOn = freezed,
}) {
return _then(
_value.copyWith(
name: null == name
? _value.name
: name // ignore: cast_nullable_to_non_nullable
as String,
script: null == script
? _value.script
: script // ignore: cast_nullable_to_non_nullable
as String,
tags: freezed == tags
? _value.tags
: tags // ignore: cast_nullable_to_non_nullable
as List<String>?,
note: freezed == note
? _value.note
: note // ignore: cast_nullable_to_non_nullable
as String?,
autoRunOn: freezed == autoRunOn
? _value.autoRunOn
: autoRunOn // ignore: cast_nullable_to_non_nullable
as List<String>?,
)
as $Val,
);
}
}
/// @nodoc
abstract class _$$SnippetImplCopyWith<$Res> implements $SnippetCopyWith<$Res> {
factory _$$SnippetImplCopyWith(
_$SnippetImpl value,
$Res Function(_$SnippetImpl) then,
) = __$$SnippetImplCopyWithImpl<$Res>;
@override
@useResult
$Res call({
String name,
String script,
List<String>? tags,
String? note,
List<String>? autoRunOn,
});
}
/// @nodoc
class __$$SnippetImplCopyWithImpl<$Res>
extends _$SnippetCopyWithImpl<$Res, _$SnippetImpl>
implements _$$SnippetImplCopyWith<$Res> {
__$$SnippetImplCopyWithImpl(
_$SnippetImpl _value,
$Res Function(_$SnippetImpl) _then,
) : super(_value, _then);
/// Create a copy of Snippet
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? name = null,
Object? script = null,
Object? tags = freezed,
Object? note = freezed,
Object? autoRunOn = freezed,
}) {
return _then(
_$SnippetImpl(
name: null == name
? _value.name
: name // ignore: cast_nullable_to_non_nullable
as String,
script: null == script
? _value.script
: script // ignore: cast_nullable_to_non_nullable
as String,
tags: freezed == tags
? _value._tags
: tags // ignore: cast_nullable_to_non_nullable
as List<String>?,
note: freezed == note
? _value.note
: note // ignore: cast_nullable_to_non_nullable
as String?,
autoRunOn: freezed == autoRunOn
? _value._autoRunOn
: autoRunOn // ignore: cast_nullable_to_non_nullable
as List<String>?,
),
);
}
}
/// @nodoc
@JsonSerializable()
class _$SnippetImpl implements _Snippet {
const _$SnippetImpl({
required this.name,
required this.script,
final List<String>? tags,
this.note,
final List<String>? autoRunOn,
}) : _tags = tags,
_autoRunOn = autoRunOn;
factory _$SnippetImpl.fromJson(Map<String, dynamic> json) =>
_$$SnippetImplFromJson(json);
@override
final String name;
@override
final String script;
final List<String>? _tags;
@override
List<String>? get tags {
final value = _tags;
if (value == null) return null;
if (_tags is EqualUnmodifiableListView) return _tags;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(value);
}
@override
final String? note;
/// List of server id that this snippet should be auto run on
final List<String>? _autoRunOn;
/// List of server id that this snippet should be auto run on
@override
List<String>? get autoRunOn {
final value = _autoRunOn;
if (value == null) return null;
if (_autoRunOn is EqualUnmodifiableListView) return _autoRunOn;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(value);
}
@override
String toString() {
return 'Snippet(name: $name, script: $script, tags: $tags, note: $note, autoRunOn: $autoRunOn)';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$SnippetImpl &&
(identical(other.name, name) || other.name == name) &&
(identical(other.script, script) || other.script == script) &&
const DeepCollectionEquality().equals(other._tags, _tags) &&
(identical(other.note, note) || other.note == note) &&
const DeepCollectionEquality().equals(
other._autoRunOn,
_autoRunOn,
));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode => Object.hash(
runtimeType,
name,
script,
const DeepCollectionEquality().hash(_tags),
note,
const DeepCollectionEquality().hash(_autoRunOn),
);
/// Create a copy of Snippet
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$SnippetImplCopyWith<_$SnippetImpl> get copyWith =>
__$$SnippetImplCopyWithImpl<_$SnippetImpl>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$$SnippetImplToJson(this);
}
}
abstract class _Snippet implements Snippet {
const factory _Snippet({
required final String name,
required final String script,
final List<String>? tags,
final String? note,
final List<String>? autoRunOn,
}) = _$SnippetImpl;
factory _Snippet.fromJson(Map<String, dynamic> json) = _$SnippetImpl.fromJson;
@override
String get name;
@override
String get script;
@override
List<String>? get tags;
@override
String? get note;
/// List of server id that this snippet should be auto run on
@override
List<String>? get autoRunOn;
/// Create a copy of Snippet
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
_$$SnippetImplCopyWith<_$SnippetImpl> get copyWith =>
throw _privateConstructorUsedError;
}

View File

@@ -2,61 +2,12 @@
part of 'snippet.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class SnippetAdapter extends TypeAdapter<Snippet> {
@override
final int typeId = 2;
@override
Snippet read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return Snippet(
name: fields[0] as String,
script: fields[1] as String,
tags: (fields[2] as List?)?.cast<String>(),
note: fields[3] as String?,
autoRunOn: (fields[4] as List?)?.cast<String>(),
);
}
@override
void write(BinaryWriter writer, Snippet obj) {
writer
..writeByte(5)
..writeByte(0)
..write(obj.name)
..writeByte(1)
..write(obj.script)
..writeByte(2)
..write(obj.tags)
..writeByte(3)
..write(obj.note)
..writeByte(4)
..write(obj.autoRunOn);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is SnippetAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Snippet _$SnippetFromJson(Map<String, dynamic> json) => Snippet(
_$SnippetImpl _$$SnippetImplFromJson(Map<String, dynamic> json) =>
_$SnippetImpl(
name: json['name'] as String,
script: json['script'] as String,
tags: (json['tags'] as List<dynamic>?)?.map((e) => e as String).toList(),
@@ -66,7 +17,8 @@ Snippet _$SnippetFromJson(Map<String, dynamic> json) => Snippet(
.toList(),
);
Map<String, dynamic> _$SnippetToJson(Snippet instance) => <String, dynamic>{
Map<String, dynamic> _$$SnippetImplToJson(_$SnippetImpl instance) =>
<String, dynamic>{
'name': instance.name,
'script': instance.script,
'tags': instance.tags,

View File

@@ -1,19 +1,14 @@
import 'dart:io';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:wake_on_lan/wake_on_lan.dart';
part 'wol_cfg.g.dart';
@JsonSerializable()
@HiveType(typeId: 8)
@JsonSerializable(includeIfNull: false)
final class WakeOnLanCfg {
@HiveField(0)
final String mac;
@HiveField(1)
final String ip;
@HiveField(2)
final String? pwd;
const WakeOnLanCfg({
@@ -26,18 +21,12 @@ final class WakeOnLanCfg {
final macValidation = MACAddress.validate(mac);
final ipValidation = IPAddress.validate(
ip,
type: ip.contains(':')
? InternetAddressType.IPv6
: InternetAddressType.IPv4,
type: ip.contains(':') ? InternetAddressType.IPv6 : InternetAddressType.IPv4,
);
final pwdValidation = pwd != null
? SecureONPassword.validate(pwd)
: (state: true, error: null);
final pwdValidation = pwd != null ? SecureONPassword.validate(pwd) : (state: true, error: null);
final valid =
macValidation.state && ipValidation.state && pwdValidation.state;
final err =
macValidation.error ?? ipValidation.error ?? pwdValidation.error;
final valid = macValidation.state && ipValidation.state && pwdValidation.state;
final err = macValidation.error ?? ipValidation.error ?? pwdValidation.error;
return (err, valid);
}
@@ -56,8 +45,7 @@ final class WakeOnLanCfg {
);
}
factory WakeOnLanCfg.fromJson(Map<String, dynamic> json) =>
_$WakeOnLanCfgFromJson(json);
factory WakeOnLanCfg.fromJson(Map<String, dynamic> json) => _$WakeOnLanCfgFromJson(json);
Map<String, dynamic> toJson() => _$WakeOnLanCfgToJson(this);
}

View File

@@ -2,63 +2,19 @@
part of 'wol_cfg.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class WakeOnLanCfgAdapter extends TypeAdapter<WakeOnLanCfg> {
@override
final int typeId = 8;
@override
WakeOnLanCfg read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return WakeOnLanCfg(
mac: fields[0] as String,
ip: fields[1] as String,
pwd: fields[2] as String?,
);
}
@override
void write(BinaryWriter writer, WakeOnLanCfg obj) {
writer
..writeByte(3)
..writeByte(0)
..write(obj.mac)
..writeByte(1)
..write(obj.ip)
..writeByte(2)
..write(obj.pwd);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is WakeOnLanCfgAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
WakeOnLanCfg _$WakeOnLanCfgFromJson(Map<String, dynamic> json) => WakeOnLanCfg(
mac: json['mac'] as String,
ip: json['ip'] as String,
pwd: json['pwd'] as String?,
);
mac: json['mac'] as String,
ip: json['ip'] as String,
pwd: json['pwd'] as String?,
);
Map<String, dynamic> _$WakeOnLanCfgToJson(WakeOnLanCfg instance) =>
<String, dynamic>{
'mac': instance.mac,
'ip': instance.ip,
'pwd': instance.pwd,
if (instance.pwd case final value?) 'pwd': value,
};

View File

@@ -1,103 +1,55 @@
import 'package:fl_lib/fl_lib.dart';
import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:server_box/core/extension/context/locale.dart';
import 'package:server_box/data/res/store.dart';
import 'package:xterm/core.dart';
part 'virtual_key.g.dart';
enum VirtualKeyFunc { toggleIME, backspace, clipboard, snippet, file }
@HiveType(typeId: 4)
enum VirtKey {
@HiveField(0)
esc,
@HiveField(1)
alt,
@HiveField(2)
home,
@HiveField(3)
up,
@HiveField(4)
end,
@HiveField(5)
sftp,
@HiveField(6)
snippet,
@HiveField(7)
tab,
@HiveField(8)
ctrl,
@HiveField(9)
left,
@HiveField(10)
down,
@HiveField(11)
right,
@HiveField(12)
clipboard,
@HiveField(13)
ime,
@HiveField(14)
pgup,
@HiveField(15)
pgdn,
@HiveField(16)
slash,
@HiveField(17)
backSlash,
@HiveField(18)
underscore,
@HiveField(19)
plus,
@HiveField(20)
equal,
@HiveField(21)
minus,
@HiveField(22)
parenLeft,
@HiveField(23)
parenRight,
@HiveField(24)
bracketLeft,
@HiveField(25)
bracketRight,
@HiveField(26)
braceLeft,
@HiveField(27)
braceRight,
@HiveField(28)
chevronLeft,
@HiveField(29)
chevronRight,
@HiveField(30)
colon,
@HiveField(31)
semicolon,
@HiveField(32)
f1,
@HiveField(33)
f2,
@HiveField(34)
f3,
@HiveField(35)
f4,
@HiveField(36)
f5,
@HiveField(37)
f6,
@HiveField(38)
f7,
@HiveField(39)
f8,
@HiveField(40)
f9,
@HiveField(41)
f10,
@HiveField(42)
f11,
@HiveField(43)
f12;
}

View File

@@ -1,256 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'virtual_key.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class VirtKeyAdapter extends TypeAdapter<VirtKey> {
@override
final int typeId = 4;
@override
VirtKey read(BinaryReader reader) {
switch (reader.readByte()) {
case 0:
return VirtKey.esc;
case 1:
return VirtKey.alt;
case 2:
return VirtKey.home;
case 3:
return VirtKey.up;
case 4:
return VirtKey.end;
case 5:
return VirtKey.sftp;
case 6:
return VirtKey.snippet;
case 7:
return VirtKey.tab;
case 8:
return VirtKey.ctrl;
case 9:
return VirtKey.left;
case 10:
return VirtKey.down;
case 11:
return VirtKey.right;
case 12:
return VirtKey.clipboard;
case 13:
return VirtKey.ime;
case 14:
return VirtKey.pgup;
case 15:
return VirtKey.pgdn;
case 16:
return VirtKey.slash;
case 17:
return VirtKey.backSlash;
case 18:
return VirtKey.underscore;
case 19:
return VirtKey.plus;
case 20:
return VirtKey.equal;
case 21:
return VirtKey.minus;
case 22:
return VirtKey.parenLeft;
case 23:
return VirtKey.parenRight;
case 24:
return VirtKey.bracketLeft;
case 25:
return VirtKey.bracketRight;
case 26:
return VirtKey.braceLeft;
case 27:
return VirtKey.braceRight;
case 28:
return VirtKey.chevronLeft;
case 29:
return VirtKey.chevronRight;
case 30:
return VirtKey.colon;
case 31:
return VirtKey.semicolon;
case 32:
return VirtKey.f1;
case 33:
return VirtKey.f2;
case 34:
return VirtKey.f3;
case 35:
return VirtKey.f4;
case 36:
return VirtKey.f5;
case 37:
return VirtKey.f6;
case 38:
return VirtKey.f7;
case 39:
return VirtKey.f8;
case 40:
return VirtKey.f9;
case 41:
return VirtKey.f10;
case 42:
return VirtKey.f11;
case 43:
return VirtKey.f12;
default:
return VirtKey.esc;
}
}
@override
void write(BinaryWriter writer, VirtKey obj) {
switch (obj) {
case VirtKey.esc:
writer.writeByte(0);
break;
case VirtKey.alt:
writer.writeByte(1);
break;
case VirtKey.home:
writer.writeByte(2);
break;
case VirtKey.up:
writer.writeByte(3);
break;
case VirtKey.end:
writer.writeByte(4);
break;
case VirtKey.sftp:
writer.writeByte(5);
break;
case VirtKey.snippet:
writer.writeByte(6);
break;
case VirtKey.tab:
writer.writeByte(7);
break;
case VirtKey.ctrl:
writer.writeByte(8);
break;
case VirtKey.left:
writer.writeByte(9);
break;
case VirtKey.down:
writer.writeByte(10);
break;
case VirtKey.right:
writer.writeByte(11);
break;
case VirtKey.clipboard:
writer.writeByte(12);
break;
case VirtKey.ime:
writer.writeByte(13);
break;
case VirtKey.pgup:
writer.writeByte(14);
break;
case VirtKey.pgdn:
writer.writeByte(15);
break;
case VirtKey.slash:
writer.writeByte(16);
break;
case VirtKey.backSlash:
writer.writeByte(17);
break;
case VirtKey.underscore:
writer.writeByte(18);
break;
case VirtKey.plus:
writer.writeByte(19);
break;
case VirtKey.equal:
writer.writeByte(20);
break;
case VirtKey.minus:
writer.writeByte(21);
break;
case VirtKey.parenLeft:
writer.writeByte(22);
break;
case VirtKey.parenRight:
writer.writeByte(23);
break;
case VirtKey.bracketLeft:
writer.writeByte(24);
break;
case VirtKey.bracketRight:
writer.writeByte(25);
break;
case VirtKey.braceLeft:
writer.writeByte(26);
break;
case VirtKey.braceRight:
writer.writeByte(27);
break;
case VirtKey.chevronLeft:
writer.writeByte(28);
break;
case VirtKey.chevronRight:
writer.writeByte(29);
break;
case VirtKey.colon:
writer.writeByte(30);
break;
case VirtKey.semicolon:
writer.writeByte(31);
break;
case VirtKey.f1:
writer.writeByte(32);
break;
case VirtKey.f2:
writer.writeByte(33);
break;
case VirtKey.f3:
writer.writeByte(34);
break;
case VirtKey.f4:
writer.writeByte(35);
break;
case VirtKey.f5:
writer.writeByte(36);
break;
case VirtKey.f6:
writer.writeByte(37);
break;
case VirtKey.f7:
writer.writeByte(38);
break;
case VirtKey.f8:
writer.writeByte(39);
break;
case VirtKey.f9:
writer.writeByte(40);
break;
case VirtKey.f10:
writer.writeByte(41);
break;
case VirtKey.f11:
writer.writeByte(42);
break;
case VirtKey.f12:
writer.writeByte(43);
break;
}
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is VirtKeyAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

View File

@@ -1,7 +1,27 @@
import 'package:flutter/material.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
final class AppProvider {
const AppProvider._();
part 'app.g.dart';
part 'app.freezed.dart';
static BuildContext? ctx;
@freezed
class AppState with _$AppState {
const factory AppState({
@Default(false) bool desktopMode,
}) = _AppState;
}
@Riverpod(keepAlive: true)
class AppProvider extends _$AppProvider {
static BuildContext? ctx;
@override
AppState build() {
return const AppState();
}
void setDesktop(bool desktopMode) {
state = state.copyWith(desktopMode: desktopMode);
}
}

View File

@@ -0,0 +1,148 @@
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'app.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
T _$identity<T>(T value) => value;
final _privateConstructorUsedError = UnsupportedError(
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models',
);
/// @nodoc
mixin _$AppState {
bool get desktopMode => throw _privateConstructorUsedError;
/// Create a copy of AppState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$AppStateCopyWith<AppState> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $AppStateCopyWith<$Res> {
factory $AppStateCopyWith(AppState value, $Res Function(AppState) then) =
_$AppStateCopyWithImpl<$Res, AppState>;
@useResult
$Res call({bool desktopMode});
}
/// @nodoc
class _$AppStateCopyWithImpl<$Res, $Val extends AppState>
implements $AppStateCopyWith<$Res> {
_$AppStateCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of AppState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({Object? desktopMode = null}) {
return _then(
_value.copyWith(
desktopMode: null == desktopMode
? _value.desktopMode
: desktopMode // ignore: cast_nullable_to_non_nullable
as bool,
)
as $Val,
);
}
}
/// @nodoc
abstract class _$$AppStateImplCopyWith<$Res>
implements $AppStateCopyWith<$Res> {
factory _$$AppStateImplCopyWith(
_$AppStateImpl value,
$Res Function(_$AppStateImpl) then,
) = __$$AppStateImplCopyWithImpl<$Res>;
@override
@useResult
$Res call({bool desktopMode});
}
/// @nodoc
class __$$AppStateImplCopyWithImpl<$Res>
extends _$AppStateCopyWithImpl<$Res, _$AppStateImpl>
implements _$$AppStateImplCopyWith<$Res> {
__$$AppStateImplCopyWithImpl(
_$AppStateImpl _value,
$Res Function(_$AppStateImpl) _then,
) : super(_value, _then);
/// Create a copy of AppState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({Object? desktopMode = null}) {
return _then(
_$AppStateImpl(
desktopMode: null == desktopMode
? _value.desktopMode
: desktopMode // ignore: cast_nullable_to_non_nullable
as bool,
),
);
}
}
/// @nodoc
class _$AppStateImpl implements _AppState {
const _$AppStateImpl({this.desktopMode = false});
@override
@JsonKey()
final bool desktopMode;
@override
String toString() {
return 'AppState(desktopMode: $desktopMode)';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$AppStateImpl &&
(identical(other.desktopMode, desktopMode) ||
other.desktopMode == desktopMode));
}
@override
int get hashCode => Object.hash(runtimeType, desktopMode);
/// Create a copy of AppState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$AppStateImplCopyWith<_$AppStateImpl> get copyWith =>
__$$AppStateImplCopyWithImpl<_$AppStateImpl>(this, _$identity);
}
abstract class _AppState implements AppState {
const factory _AppState({final bool desktopMode}) = _$AppStateImpl;
@override
bool get desktopMode;
/// Create a copy of AppState
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
_$$AppStateImplCopyWith<_$AppStateImpl> get copyWith =>
throw _privateConstructorUsedError;
}

View File

@@ -0,0 +1,25 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'app.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$appProviderHash() => r'8378ec9d0a9c8d99cc05805047cd2d52ac4dbb56';
/// See also [AppProvider].
@ProviderFor(AppProvider)
final appProviderProvider = NotifierProvider<AppProvider, AppState>.internal(
AppProvider.new,
name: r'appProviderProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$appProviderHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$AppProvider = Notifier<AppState>;
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package

View File

@@ -5,10 +5,10 @@ import 'package:dartssh2/dartssh2.dart';
import 'package:fl_lib/fl_lib.dart';
import 'package:flutter/material.dart';
import 'package:server_box/core/extension/ssh_client.dart';
import 'package:server_box/data/model/app/error.dart';
import 'package:server_box/data/model/app/shell_func.dart';
import 'package:server_box/data/model/container/image.dart';
import 'package:server_box/data/model/container/ps.dart';
import 'package:server_box/data/model/app/error.dart';
import 'package:server_box/data/model/container/type.dart';
import 'package:server_box/data/res/store.dart';

View File

@@ -2,6 +2,7 @@ import 'dart:async';
import 'dart:io';
import 'package:computer/computer.dart';
import 'package:dartssh2/dartssh2.dart';
import 'package:dio/dio.dart';
import 'package:dio/io.dart';
import 'package:fl_lib/fl_lib.dart';
@@ -10,7 +11,6 @@ import 'package:server_box/core/extension/context/locale.dart';
import 'package:server_box/data/model/app/error.dart';
import 'package:server_box/data/model/server/pve.dart';
import 'package:server_box/data/model/server/server_private_info.dart';
import 'package:dartssh2/dartssh2.dart';
typedef PveCtrlFunc = Future<bool> Function(String node, String id);
@@ -47,11 +47,11 @@ final class PveProvider extends ChangeNotifier {
final client = HttpClient();
client.connectionFactory = cf;
if (_ignoreCert) {
client.badCertificateCallback = (_, __, ___) => true;
client.badCertificateCallback = (_, _, _) => true;
}
return client;
},
validateCertificate: _ignoreCert ? (_, __, ___) => true : null,
validateCertificate: _ignoreCert ? (_, _, _) => true : null,
);
final data = ValueNotifier<PveRes?>(null);

View File

@@ -1,4 +1,5 @@
import 'dart:async';
// import 'dart:io';
import 'package:computer/computer.dart';
@@ -6,18 +7,17 @@ import 'package:dartssh2/dartssh2.dart';
import 'package:fl_lib/fl_lib.dart';
import 'package:server_box/core/extension/ssh_client.dart';
import 'package:server_box/core/sync.dart';
import 'package:server_box/core/utils/server.dart';
import 'package:server_box/core/utils/ssh_auth.dart';
import 'package:server_box/data/model/app/error.dart';
import 'package:server_box/data/model/app/shell_func.dart';
import 'package:server_box/data/model/server/system.dart';
import 'package:server_box/data/res/store.dart';
import 'package:server_box/core/utils/server.dart';
import 'package:server_box/data/model/server/server.dart';
import 'package:server_box/data/model/server/server_private_info.dart';
import 'package:server_box/data/model/server/server_status_update_req.dart';
import 'package:server_box/data/model/server/system.dart';
import 'package:server_box/data/model/server/try_limiter.dart';
import 'package:server_box/data/res/status.dart';
import 'package:server_box/data/res/store.dart';
class ServerProvider extends Provider {
const ServerProvider._();
@@ -45,22 +45,20 @@ class ServerProvider extends Provider {
for (int idx = 0; idx < spis.length; idx++) {
final spi = spis[idx];
final originServer = oldServers[spi.id];
final newServer = genServer(spi);
/// #258
/// If not [shouldReconnect], then keep the old state.
if (originServer != null &&
!originServer.value.spi.shouldReconnect(spi)) {
newServer.conn = originServer.value.conn;
if (originServer != null && !originServer.value.spi.shouldReconnect(spi)) {
originServer.value.spi = spi;
servers[spi.id] = originServer;
} else {
final newServer = genServer(spi);
servers[spi.id] = newServer.vn;
}
servers[spi.id] = newServer.vn;
}
final serverOrder_ = Stores.setting.serverOrder.fetch();
if (serverOrder_.isNotEmpty) {
spis.reorder(
order: serverOrder_,
finder: (n, id) => n.id == id,
);
spis.reorder(order: serverOrder_, finder: (n, id) => n.id == id);
serverOrder.value.addAll(spis.map((e) => e.id));
} else {
serverOrder.value.addAll(servers.keys);
@@ -105,31 +103,30 @@ class ServerProvider extends Provider {
/// if [spi] is specificed then only refresh this server
/// [onlyFailed] only refresh failed servers
static Future<void> refresh({
Spi? spi,
bool onlyFailed = false,
}) async {
static Future<void> refresh({Spi? spi, bool onlyFailed = false}) async {
if (spi != null) {
_manualDisconnectedIds.remove(spi.id);
await _getData(spi);
return;
}
await Future.wait(servers.values.map((val) async {
final s = val.value;
if (onlyFailed) {
if (s.conn != ServerConn.failed) return;
TryLimiter.reset(s.spi.id);
}
await Future.wait(
servers.values.map((val) async {
final s = val.value;
if (onlyFailed) {
if (s.conn != ServerConn.failed) return;
TryLimiter.reset(s.spi.id);
}
if (_manualDisconnectedIds.contains(s.spi.id)) return;
if (_manualDisconnectedIds.contains(s.spi.id)) return;
if (s.conn == ServerConn.disconnected && !s.spi.autoConnect) {
return;
}
if (s.conn == ServerConn.disconnected && !s.spi.autoConnect) {
return;
}
return await _getData(s.spi);
}));
return await _getData(s.spi);
}),
);
}
static Future<void> startAutoRefresh() async {
@@ -174,12 +171,16 @@ class ServerProvider extends Provider {
static void _closeOneServer(String id) {
final s = servers[id];
final item = s?.value;
item?.client?.close();
item?.client = null;
item?.conn = ServerConn.disconnected;
if (s == null) {
Loggers.app.warning('Server with id $id not found');
return;
}
final item = s.value;
item.client?.close();
item.client = null;
item.conn = ServerConn.disconnected;
_manualDisconnectedIds.add(id);
s?.notify();
s.notify();
}
static void addServer(Spi spi) {
@@ -208,7 +209,7 @@ class ServerProvider extends Provider {
serverOrder.value.clear();
serverOrder.notify();
Stores.setting.serverOrder.put(serverOrder.value);
Stores.server.deleteAll();
Stores.server.clear();
_updateTags();
bakSync.sync(milliDelay: 1000);
}
@@ -304,14 +305,11 @@ class ServerProvider extends Provider {
_setServerState(s, ServerConn.connected);
try {
final (_, writeScriptResult) = await sv.client!.exec(
(session) async {
final scriptRaw = ShellFunc.allScript(spi.custom?.cmds).uint8List;
session.stdin.add(scriptRaw);
session.stdin.close();
},
entry: ShellFunc.getInstallShellCmd(spi.id),
);
final (_, writeScriptResult) = await sv.client!.exec((session) async {
final scriptRaw = ShellFunc.allScript(spi.custom?.cmds).uint8List;
session.stdin.add(scriptRaw);
session.stdin.close();
}, entry: ShellFunc.getInstallShellCmd(spi.id));
if (writeScriptResult.isNotEmpty) {
ShellFunc.switchScriptDir(spi.id);
throw writeScriptResult;
@@ -363,10 +361,7 @@ class ServerProvider extends Provider {
}
}
TryLimiter.inc(sid);
sv.status.err = SSHErr(
type: SSHErrType.segements,
message: 'Seperate segments failed, raw:\n$raw',
);
sv.status.err = SSHErr(type: SSHErrType.segements, message: 'Seperate segments failed, raw:\n$raw');
_setServerState(s, ServerConn.failed);
return;
}
@@ -405,17 +400,10 @@ class ServerProvider extends Provider {
system: systemType,
customCmds: spi.custom?.cmds ?? {},
);
sv.status = await Computer.shared.start(
getStatus,
req,
taskName: 'StatusUpdateReq<${sv.id}>',
);
sv.status = await Computer.shared.start(getStatus, req, taskName: 'StatusUpdateReq<${sv.id}>');
} catch (e, trace) {
TryLimiter.inc(sid);
sv.status.err = SSHErr(
type: SSHErrType.getStatus,
message: 'Parse failed: $e\n\n$raw',
);
sv.status.err = SSHErr(type: SSHErrType.getStatus, message: 'Parse failed: $e\n\n$raw');
_setServerState(s, ServerConn.failed);
Loggers.app.warning('Server status', e, trace);
return;

View File

@@ -14,11 +14,7 @@ class SftpProvider extends Provider {
}
static int add(SftpReq req, {Completer? completer}) {
final reqStat = SftpReqStatus(
notifyListeners: status.notify,
completer: completer,
req: req,
);
final reqStat = SftpReqStatus(notifyListeners: status.notify, completer: completer, req: req);
status.value.add(reqStat);
status.notify();
return reqStat.id;
@@ -34,6 +30,10 @@ class SftpProvider extends Provider {
static void cancel(int id) {
final idx = status.value.indexWhere((e) => e.id == id);
if (idx < 0 || idx >= status.value.length) {
dprint('SftpProvider.cancel: id $id not found');
return;
}
status.value[idx].dispose();
status.value.removeAt(idx);
status.notify();

View File

@@ -3,6 +3,6 @@
abstract class BuildData {
static const String name = "ServerBox";
static const int build = 1128;
static const int script = 59;
static const int build = 1185;
static const int script = 63;
}

View File

@@ -17,6 +17,11 @@ abstract final class GithubIds {
'dccif',
'mikropsoft',
'CakesTwix',
'dsvf',
'fei1025',
'MasedMSD',
'GitGitro',
'Shin-suechtig',
};
static const participants = <GhId>{
@@ -99,6 +104,20 @@ abstract final class GithubIds {
'88484396',
'honggeigei',
'likecreep',
'axlrose',
'immortal521',
'PRO-2684',
'Xiaobao-Yang',
'Mrhs121',
'Fudiautobi',
'papaj-na-wrotkach',
'kid1412621',
'smanx',
'xuanyue1024',
'RuofengX',
'rhwong',
'AstroEngineeer',
'mochasweet',
};
}

View File

@@ -1,6 +0,0 @@
import 'package:fl_lib/fl_lib.dart';
abstract final class RNodes {
static final app = RNode();
static final dark = false.vn;
}

View File

@@ -1,64 +1,40 @@
import 'package:server_box/data/model/server/server.dart';
import 'package:server_box/data/model/server/temp.dart';
import 'package:server_box/data/model/server/conn.dart';
import 'package:server_box/data/model/server/cpu.dart';
import 'package:server_box/data/model/server/disk.dart';
import 'package:server_box/data/model/server/memory.dart';
import 'package:server_box/data/model/server/net_speed.dart';
import 'package:server_box/data/model/server/conn.dart';
import 'package:server_box/data/model/server/server.dart';
import 'package:server_box/data/model/server/system.dart';
import 'package:server_box/data/model/server/temp.dart';
abstract final class InitStatus {
static SingleCpuCore get _initOneTimeCpuStatus => SingleCpuCore(
'cpu',
0,
0,
0,
0,
0,
0,
0,
);
static Cpus get cpus => Cpus(
[_initOneTimeCpuStatus],
[_initOneTimeCpuStatus],
);
static NetSpeedPart get _initNetSpeedPart => NetSpeedPart(
'',
BigInt.zero,
BigInt.zero,
0,
);
static NetSpeed get netSpeed => NetSpeed(
[_initNetSpeedPart],
[_initNetSpeedPart],
);
static SingleCpuCore get _initOneTimeCpuStatus =>
SingleCpuCore('cpu', 0, 0, 0, 0, 0, 0, 0);
static Cpus get cpus =>
Cpus([_initOneTimeCpuStatus], [_initOneTimeCpuStatus]);
static NetSpeedPart get _initNetSpeedPart =>
NetSpeedPart('', BigInt.zero, BigInt.zero, 0);
static NetSpeed get netSpeed =>
NetSpeed([_initNetSpeedPart], [_initNetSpeedPart]);
static ServerStatus get status => ServerStatus(
cpu: cpus,
mem: const Memory(
total: 1,
free: 1,
avail: 1,
),
disk: [
Disk(
fs: '/',
mount: '/',
usedPercent: 0,
used: BigInt.zero,
size: BigInt.one,
avail: BigInt.zero,
)
],
tcp: const Conn(maxConn: 0, active: 0, passive: 0, fail: 0),
netSpeed: netSpeed,
swap: const Swap(
total: 0,
free: 0,
cached: 0,
),
system: SystemType.linux,
temps: Temperatures(),
diskIO: DiskIO([], []),
);
cpu: cpus,
mem: const Memory(total: 1, free: 1, avail: 1),
disk: [
Disk(
path: '/',
mount: '/',
usedPercent: 0,
used: BigInt.zero,
size: BigInt.one,
avail: BigInt.zero,
),
],
tcp: const Conn(maxConn: 0, active: 0, passive: 0, fail: 0),
netSpeed: netSpeed,
swap: const Swap(total: 0, free: 0, cached: 0),
system: SystemType.linux,
temps: Temperatures(),
diskIO: DiskIO([], []),
diskSmart: const [],
);
}

View File

@@ -28,17 +28,22 @@ abstract final class Stores {
await Future.wait(_allBackup.map((store) => store.init()));
}
static DateTime? get lastModTime {
DateTime? lastModTime;
static int get lastModTime {
var lastModTime = 0;
for (final store in _allBackup) {
final last = store.lastUpdateTs;
if (last == null) {
continue;
}
if (lastModTime == null) {
lastModTime = last;
} else if (last.isAfter(lastModTime)) {
lastModTime = last;
var lastModTimeTs = 0;
for (final item in last.entries) {
final ts = item.value;
if (ts > lastModTimeTs) {
lastModTimeTs = ts;
}
}
if (lastModTimeTs > lastModTime) {
lastModTime = lastModTimeTs;
}
}
return lastModTime;

View File

@@ -14,8 +14,7 @@ class ContainerStore extends HiveStore {
}
void put(String id, String host) {
box.put(id, host);
updateLastUpdateTs();
set(id, host);
}
ContainerType getType([String id = '']) {
@@ -36,10 +35,11 @@ class ContainerStore extends HiveStore {
void setType(ContainerType type, [String id = '']) {
if (type == defaultType) {
box.delete(_keyConfig + id);
// box.delete(_keyConfig + id);
remove(_keyConfig + id);
} else {
box.put(_keyConfig + id, type.toString());
// box.put(_keyConfig + id, type.toString());
set(_keyConfig + id, type.toString());
}
updateLastUpdateTs();
}
}

View File

@@ -1,5 +1,5 @@
import 'package:fl_lib/fl_lib.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:hive_ce_flutter/hive_flutter.dart';
/// index from 0 -> n : latest -> oldest
class _ListHistory {

View File

@@ -12,11 +12,27 @@ class PrivateKeyStore extends HiveStore {
}
List<PrivateKeyInfo> fetch() {
final keys = box.keys;
final ps = <PrivateKeyInfo>[];
for (final key in keys) {
final s = box.get(key);
if (s != null && s is PrivateKeyInfo) {
for (final key in keys()) {
final s = get<PrivateKeyInfo>(
key,
fromObj: (val) {
if (val is PrivateKeyInfo) return val;
if (val is Map<dynamic, dynamic>) {
final map = val.toStrDynMap;
if (map == null) return null;
try {
final pki = PrivateKeyInfo.fromJson(map as Map<String, dynamic>);
put(pki);
return pki;
} catch (e) {
dprint('Parsing PrivateKeyInfo from JSON', e);
}
}
return null;
},
);
if (s != null) {
ps.add(s);
}
}

View File

@@ -1,6 +1,9 @@
import 'package:fl_lib/fl_lib.dart';
import 'package:server_box/data/model/server/server_private_info.dart';
import 'package:server_box/data/store/container.dart';
import 'package:server_box/data/store/setting.dart';
import 'package:server_box/data/store/snippet.dart';
class ServerStore extends HiveStore {
ServerStore._() : super('server');
@@ -8,17 +11,31 @@ class ServerStore extends HiveStore {
static final instance = ServerStore._();
void put(Spi info) {
// box.put(info.id, info);
// box.updateLastModified();
set(info.id, info);
}
List<Spi> fetch() {
final ids = box.keys;
final List<Spi> ss = [];
for (final id in ids) {
final s = box.get(id);
if (s != null && s is Spi) {
for (final id in keys()) {
final s = get<Spi>(
id,
fromObj: (val) {
if (val is Spi) return val;
if (val is Map<dynamic, dynamic>) {
final map = val.toStrDynMap;
if (map == null) return null;
try {
final spi = Spi.fromJson(map as Map<String, dynamic>);
put(spi);
return spi;
} catch (e) {
dprint('Parsing Spi from JSON', e);
}
}
return null;
},
);
if (s != null) {
ss.add(s);
}
}
@@ -29,10 +46,6 @@ class ServerStore extends HiveStore {
remove(id);
}
void deleteAll() {
clear();
}
void update(Spi old, Spi newInfo) {
if (!have(old)) {
throw Exception('Old spi: $old not found');
@@ -41,5 +54,74 @@ class ServerStore extends HiveStore {
put(newInfo);
}
bool have(Spi s) => box.get(s.id) != null;
bool have(Spi s) => get(s.id) != null;
void migrateIds() {
final ss = fetch();
final idMap = <String, String>{};
// Collect all old to new ID mappings
for (final s in ss) {
final newId = s.migrateId();
if (newId == null) continue;
// Use s.oldId as the key, because s.id would be empty for a server being migrated.
// s.oldId represents the identifier used before migration.
idMap[s.oldId] = newId;
}
final srvOrder = SettingStore.instance.serverOrder.fetch();
final snippets = SnippetStore.instance.fetch();
final container = ContainerStore.instance;
bool srvOrderChanged = false;
// Update all references to the servers
for (final e in idMap.entries) {
final oldId = e.key;
final newId = e.value;
// Replace ids in ordering settings.
final srvIdx = srvOrder.indexOf(oldId);
if (srvIdx != -1) {
srvOrder[srvIdx] = newId;
srvOrderChanged = true;
}
// Replace ids in jump server settings.
final spi = get<Spi>(newId);
if (spi != null) {
final jumpId = spi.jumpId; // This could be an oldId.
// Check if this jumpId corresponds to a server that was also migrated.
if (jumpId != null && idMap.containsKey(jumpId)) {
final newJumpId = idMap[jumpId];
if (spi.jumpId != newJumpId) {
final newSpi = spi.copyWith(jumpId: newJumpId);
update(spi, newSpi);
}
}
}
// Replace ids in [Snippet]
for (final snippet in snippets) {
final autoRunsOn = snippet.autoRunOn;
final idx = autoRunsOn?.indexOf(oldId);
if (idx != null && idx != -1) {
final newAutoRunsOn = List<String>.from(autoRunsOn ?? []);
newAutoRunsOn[idx] = newId;
final newSnippet = snippet.copyWith(autoRunOn: newAutoRunsOn);
SnippetStore.instance.update(snippet, newSnippet);
}
}
// Replace ids in [Container]
final dockerHost = container.fetch(oldId);
if (dockerHost != null) {
container.remove(oldId);
container.set(newId, dockerHost);
}
}
if (srvOrderChanged) {
SettingStore.instance.serverOrder.put(srvOrder);
}
}
}

View File

@@ -1,9 +1,10 @@
import 'dart:convert';
import 'package:fl_lib/fl_lib.dart';
import 'package:server_box/data/model/app/menu/server_func.dart';
import 'package:server_box/data/model/app/net_view.dart';
import 'package:server_box/data/model/app/server_detail_card.dart';
import 'package:server_box/data/model/ssh/virtual_key.dart';
import 'package:server_box/data/model/app/net_view.dart';
import 'package:server_box/data/res/default.dart';
class SettingStore extends HiveStore {
@@ -11,15 +12,6 @@ class SettingStore extends HiveStore {
static final instance = SettingStore._();
// ------BEGIN------
//
// These settings are not displayed in the settings page
// You can edit them in the settings json editor (by long press the settings
// item in the drawer of the home page)
/// Discussion #146
late final serverTabUseOldUI = propertyDefault('serverTabUseOldUI', false);
/// Time out for server connect and more...
late final timeout = propertyDefault('timeOut', 5);
@@ -35,8 +27,6 @@ class SettingStore extends HiveStore {
false,
);
// ------END------
/// Bigger for bigger font size
/// 1.0 means 100%
/// Warning: This may cause some UI issues
@@ -63,14 +53,14 @@ class SettingStore extends HiveStore {
late final bgRun = propertyDefault('bgRun', isAndroid);
// Server order
late final serverOrder = propertyDefault<List<String>>('serverOrder', []);
late final serverOrder = listProperty<String>('serverOrder');
late final snippetOrder = propertyDefault<List<String>>('snippetOrder', []);
late final snippetOrder = listProperty<String>('snippetOrder');
// Server details page cards order
late final detailCardOrder = propertyDefault(
late final detailCardOrder = listProperty(
'detailCardOrder',
ServerDetailCards.values.map((e) => e.name).toList(),
defaultValue: ServerDetailCards.values.map((e) => e.name).toList(),
);
// SSH term font size
@@ -80,16 +70,20 @@ class SettingStore extends HiveStore {
late final locale = propertyDefault('locale', '');
// SSH virtual key (ctrl | alt) auto turn off
late final sshVirtualKeyAutoOff =
propertyDefault('sshVirtualKeyAutoOff', true);
late final sshVirtualKeyAutoOff = propertyDefault(
'sshVirtualKeyAutoOff',
true,
);
late final editorFontSize = propertyDefault('editorFontSize', 12.5);
// Editor theme
late final editorTheme = propertyDefault('editorTheme', Defaults.editorTheme);
late final editorDarkTheme =
propertyDefault('editorDarkTheme', Defaults.editorDarkTheme);
late final editorDarkTheme = propertyDefault(
'editorDarkTheme',
Defaults.editorDarkTheme,
);
late final fullScreen = propertyDefault('fullScreen', false);
@@ -105,31 +99,43 @@ class SettingStore extends HiveStore {
// TextInputType.text.index,
// );
late final sshVirtKeys = propertyDefault(
late final sshVirtKeys = listProperty<int>(
'sshVirtKeys',
VirtKeyX.defaultOrder.map((e) => e.index).toList(),
defaultValue: VirtKeyX.defaultOrder.map((e) => e.index).toList(),
fromObj: (val) => List<int>.from(val as List),
);
late final netViewType = propertyDefault('netViewType', NetViewType.speed);
late final netViewType = propertyDefault(
'netViewType',
NetViewType.speed,
fromObj: (val) => NetViewType.values.firstWhereOrNull((e) => e.name == val),
toObj: (type) => type?.name,
);
// Only valid on iOS
late final autoUpdateHomeWidget =
propertyDefault('autoUpdateHomeWidget', isIOS);
late final autoUpdateHomeWidget = propertyDefault(
'autoUpdateHomeWidget',
isIOS,
);
late final autoCheckAppUpdate = propertyDefault('autoCheckAppUpdate', true);
/// Display server tab function buttons on the bottom of each server card if [true]
///
/// Otherwise, display them on the top of server detail page
late final moveServerFuncs =
propertyDefault('moveOutServerTabFuncBtns', false);
late final moveServerFuncs = propertyDefault(
'moveOutServerTabFuncBtns',
false,
);
/// Whether use `rm -r` to delete directory on SFTP
late final sftpRmrDir = propertyDefault('sftpRmrDir', false);
/// Whether use system's primary color as the app's primary color
late final useSystemPrimaryColor =
propertyDefault('useSystemPrimaryColor', false);
late final useSystemPrimaryColor = propertyDefault(
'useSystemPrimaryColor',
false,
);
/// Only valid on iOS / Android / Windows
late final useBioAuth = propertyDefault('useBioAuth', false);
@@ -141,8 +147,10 @@ class SettingStore extends HiveStore {
late final sftpOpenLastPath = propertyDefault('sftpOpenLastPath', true);
/// Show folders first in SFTP file browser
late final sftpShowFoldersFirst =
propertyDefault('sftpShowFoldersFirst', true);
late final sftpShowFoldersFirst = propertyDefault(
'sftpShowFoldersFirst',
true,
);
/// Show tip of suspend
late final showSuspendTip = propertyDefault('showSuspendTip', true);
@@ -150,9 +158,9 @@ class SettingStore extends HiveStore {
/// Whether collapse UI items by default
late final collapseUIDefault = propertyDefault('collapseUIDefault', true);
late final serverFuncBtns = propertyDefault(
late final serverFuncBtns = listProperty(
'serverBtns',
ServerFuncBtn.defaultIdxs,
defaultValue: ServerFuncBtn.defaultIdxs,
);
/// Docker is more popular than podman, set to `false` to use docker
@@ -168,8 +176,10 @@ class SettingStore extends HiveStore {
late final containerParseStat = propertyDefault('containerParseStat', true);
/// Auto refresh container status
late final contaienrAutoRefresh =
propertyDefault('contaienrAutoRefresh', true);
late final contaienrAutoRefresh = propertyDefault(
'contaienrAutoRefresh',
true,
);
/// Use double column servers page on Desktop
late final doubleColumnServersPage = propertyDefault(
@@ -217,15 +227,23 @@ class SettingStore extends HiveStore {
/// ssh page
late final sshWakeLock = propertyDefault('sshWakeLock', true);
late final sshBgImage = propertyDefault('sshBgImage', '');
late final sshBgOpacity = propertyDefault('sshBgOpacity', 0.3);
late final sshBlurRadius = propertyDefault('sshBlurRadius', 0.0);
/// fmt: https://example.com/{DIST}-{BRIGHT}.png
late final serverLogoUrl = propertyDefault('serverLogoUrl', '');
late final betaTest = propertyDefault('betaTest', false);
/// If it's empty, skip change window size.
/// Format: {width}x{height}
late final windowSize = propertyDefault('windowSize', '');
/// For desktop only.
/// Record the position and size of the window.
late final windowState = property<WindowState>(
'windowState',
fromObj: (raw) =>
WindowState.fromJson(jsonDecode(raw as String) as Map<String, dynamic>),
toObj: (state) => state == null ? null : jsonEncode(state.toJson()),
);
late final introVer = propertyDefault('introVer', 0);
@@ -235,21 +253,21 @@ class SettingStore extends HiveStore {
/// Set it empty to use local editor GUI.
late final sftpEditor = propertyDefault('sftpEditor', '');
/// Preferred terminal emulator command on desktop
late final desktopTerminal = propertyDefault(
'desktopTerminal',
'x-terminal-emulator',
);
/// Run foreground service on Android, if the SSH terminal is running
late final fgService = propertyDefault('fgService', false);
/// Close the editor after saving
late final closeAfterSave = propertyDefault('closeAfterSave', false);
// Never show these settings for users
//
// ------BEGIN------
/// Version of store db
late final storeVersion = propertyDefault('storeVersion', 0);
/// Have notified user for notificaiton permission or not
late final noNotiPerm = propertyDefault('noNotiPerm', false);
// ------END------
}

View File

@@ -8,26 +8,48 @@ class SnippetStore extends HiveStore {
static final instance = SnippetStore._();
void put(Snippet snippet) {
// box.put(snippet.name, snippet);
// box.updateLastModified();
set(snippet.name, snippet);
}
List<Snippet> fetch() {
final keys = box.keys;
final ss = <Snippet>[];
for (final key in keys) {
final s = box.get(key);
if (s != null && s is Snippet) {
final ss = <Snippet>{};
for (final key in keys()) {
final s = get<Snippet>(
key,
fromObj: (val) {
if (val is Snippet) return val;
if (val is Map<dynamic, dynamic>) {
final map = val.toStrDynMap;
if (map == null) return null;
try {
final snippet = Snippet.fromJson(map as Map<String, dynamic>);
put(snippet);
return snippet;
} catch (e) {
dprint('Parsing Snippet from JSON', e);
}
}
return null;
},
);
if (s != null) {
ss.add(s);
}
}
return ss;
return ss.toList();
}
void delete(Snippet s) {
// box.delete(s.name);
// box.updateLastModified();
remove(s.name);
}
void update(Snippet old, Snippet newInfo) {
if (!have(old)) {
throw Exception('Old snippet: $old not found');
}
delete(old);
put(newInfo);
}
bool have(Snippet s) => get(s.name) != null;
}

View File

@@ -72,7 +72,8 @@ import 'l10n_zh.dart';
/// be consistent with the languages listed in the AppLocalizations.supportedLocales
/// property.
abstract class AppLocalizations {
AppLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString());
AppLocalizations(String locale)
: localeName = intl.Intl.canonicalizedLocale(locale.toString());
final String localeName;
@@ -80,7 +81,8 @@ abstract class AppLocalizations {
return Localizations.of<AppLocalizations>(context, AppLocalizations);
}
static const LocalizationsDelegate<AppLocalizations> delegate = _AppLocalizationsDelegate();
static const LocalizationsDelegate<AppLocalizations> delegate =
_AppLocalizationsDelegate();
/// A list of this localizations delegate along with the default localizations
/// delegates.
@@ -92,12 +94,13 @@ abstract class AppLocalizations {
/// Additional delegates can be added by appending to this list in
/// MaterialApp. This list does not have to be used at all if a custom list
/// of delegates is preferred or required.
static const List<LocalizationsDelegate<dynamic>> localizationsDelegates = <LocalizationsDelegate<dynamic>>[
delegate,
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
];
static const List<LocalizationsDelegate<dynamic>> localizationsDelegates =
<LocalizationsDelegate<dynamic>>[
delegate,
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
];
/// A list of this localizations delegate's supported locales.
static const List<Locale> supportedLocales = <Locale>[
@@ -113,7 +116,7 @@ abstract class AppLocalizations {
Locale('tr'),
Locale('uk'),
Locale('zh'),
Locale('zh', 'TW')
Locale('zh', 'TW'),
];
/// No description provided for @aboutThanks.
@@ -308,6 +311,12 @@ abstract class AppLocalizations {
/// **'Batch delete servers'**
String get deleteServers;
/// No description provided for @desktopTerminalTip.
///
/// In en, this message translates to:
/// **'Command used to open the terminal emulator when launching SSH sessions.'**
String get desktopTerminalTip;
/// No description provided for @dirEmpty.
///
/// In en, this message translates to:
@@ -326,6 +335,12 @@ abstract class AppLocalizations {
/// **'Disk'**
String get disk;
/// No description provided for @diskHealth.
///
/// In en, this message translates to:
/// **'Disk Health'**
String get diskHealth;
/// No description provided for @diskIgnorePath.
///
/// In en, this message translates to:
@@ -366,7 +381,10 @@ abstract class AppLocalizations {
///
/// In en, this message translates to:
/// **'{runningCount} running, {stoppedCount} container stopped.'**
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount);
String dockerStatusRunningAndStoppedFmt(
Object runningCount,
Object stoppedCount,
);
/// No description provided for @dockerStatusRunningFmt.
///
@@ -404,6 +422,12 @@ abstract class AppLocalizations {
/// **'The current code highlighting performance is not ideal and can be optionally turned off to improve.'**
String get editorHighlightTip;
/// No description provided for @emulator.
///
/// In en, this message translates to:
/// **'Emulator'**
String get emulator;
/// No description provided for @encode.
///
/// In en, this message translates to:
@@ -866,6 +890,12 @@ abstract class AppLocalizations {
/// **'Port'**
String get port;
/// No description provided for @preferDiskAmount.
///
/// In en, this message translates to:
/// **'Prioritize displaying disk capacity'**
String get preferDiskAmount;
/// No description provided for @preview.
///
/// In en, this message translates to:
@@ -1473,7 +1503,8 @@ abstract class AppLocalizations {
String get writeScriptTip;
}
class _AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> {
class _AppLocalizationsDelegate
extends LocalizationsDelegate<AppLocalizations> {
const _AppLocalizationsDelegate();
@override
@@ -1482,44 +1513,70 @@ class _AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations>
}
@override
bool isSupported(Locale locale) => <String>['de', 'en', 'es', 'fr', 'id', 'ja', 'nl', 'pt', 'ru', 'tr', 'uk', 'zh'].contains(locale.languageCode);
bool isSupported(Locale locale) => <String>[
'de',
'en',
'es',
'fr',
'id',
'ja',
'nl',
'pt',
'ru',
'tr',
'uk',
'zh',
].contains(locale.languageCode);
@override
bool shouldReload(_AppLocalizationsDelegate old) => false;
}
AppLocalizations lookupAppLocalizations(Locale locale) {
// Lookup logic when language+country codes are specified.
switch (locale.languageCode) {
case 'zh': {
switch (locale.countryCode) {
case 'TW': return AppLocalizationsZhTw();
}
break;
}
case 'zh':
{
switch (locale.countryCode) {
case 'TW':
return AppLocalizationsZhTw();
}
break;
}
}
// Lookup logic when only language code is specified.
switch (locale.languageCode) {
case 'de': return AppLocalizationsDe();
case 'en': return AppLocalizationsEn();
case 'es': return AppLocalizationsEs();
case 'fr': return AppLocalizationsFr();
case 'id': return AppLocalizationsId();
case 'ja': return AppLocalizationsJa();
case 'nl': return AppLocalizationsNl();
case 'pt': return AppLocalizationsPt();
case 'ru': return AppLocalizationsRu();
case 'tr': return AppLocalizationsTr();
case 'uk': return AppLocalizationsUk();
case 'zh': return AppLocalizationsZh();
case 'de':
return AppLocalizationsDe();
case 'en':
return AppLocalizationsEn();
case 'es':
return AppLocalizationsEs();
case 'fr':
return AppLocalizationsFr();
case 'id':
return AppLocalizationsId();
case 'ja':
return AppLocalizationsJa();
case 'nl':
return AppLocalizationsNl();
case 'pt':
return AppLocalizationsPt();
case 'ru':
return AppLocalizationsRu();
case 'tr':
return AppLocalizationsTr();
case 'uk':
return AppLocalizationsUk();
case 'zh':
return AppLocalizationsZh();
}
throw FlutterError(
'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely '
'an issue with the localizations generation tool. Please file an issue '
'on GitHub with a reproducible sample app and the gen-l10n configuration '
'that was used.'
'that was used.',
);
}

View File

@@ -1,3 +1,5 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'l10n.dart';
// ignore_for_file: type=lint
@@ -7,13 +9,15 @@ class AppLocalizationsDe extends AppLocalizations {
AppLocalizationsDe([String locale = 'de']) : super(locale);
@override
String get aboutThanks => 'Vielen Dank an die folgenden Personen, die daran teilgenommen haben.\n';
String get aboutThanks =>
'Vielen Dank an die folgenden Personen, die daran teilgenommen haben.\n';
@override
String get acceptBeta => 'Akzeptieren Sie Testversion-Updates';
@override
String get addSystemPrivateKeyTip => 'Derzeit haben Sie keinen privaten Schlüssel, fügen Sie den Schlüssel hinzu, der mit dem System geliefert wird (~/.ssh/id_rsa)?';
String get addSystemPrivateKeyTip =>
'Derzeit haben Sie keinen privaten Schlüssel, fügen Sie den Schlüssel hinzu, der mit dem System geliefert wird (~/.ssh/id_rsa)?';
@override
String get added2List => 'Zur Aufgabenliste hinzugefügt';
@@ -25,10 +29,12 @@ class AppLocalizationsDe extends AppLocalizations {
String get alreadyLastDir => 'Bereits im letzten Verzeichnis.';
@override
String get authFailTip => 'Authentifizierung fehlgeschlagen, bitte überprüfen Sie, ob das Passwort/Schlüssel/Host/Benutzer usw. falsch sind.';
String get authFailTip =>
'Authentifizierung fehlgeschlagen, bitte überprüfen Sie, ob das Passwort/Schlüssel/Host/Benutzer usw. falsch sind.';
@override
String get autoBackupConflict => 'Es kann nur eine automatische Sicherung gleichzeitig aktiviert werden.';
String get autoBackupConflict =>
'Es kann nur eine automatische Sicherung gleichzeitig aktiviert werden.';
@override
String get autoConnect => 'Automatisch verbinden';
@@ -40,10 +46,12 @@ class AppLocalizationsDe extends AppLocalizations {
String get autoUpdateHomeWidget => 'Home-Widget automatisch aktualisieren';
@override
String get backupTip => 'Das Backup wird nur einfach verschlüsselt.\nBitte bewahre die Datei sicher auf.';
String get backupTip =>
'Das Backup wird nur einfach verschlüsselt.\nBitte bewahre die Datei sicher auf.';
@override
String get backupVersionNotMatch => 'Die Backup-Version stimmt nicht überein.';
String get backupVersionNotMatch =>
'Die Backup-Version stimmt nicht überein.';
@override
String get battery => 'Batterie';
@@ -52,7 +60,8 @@ class AppLocalizationsDe extends AppLocalizations {
String get bgRun => 'Hintergrundaktualisierung';
@override
String get bgRunTip => 'Dieser Schalter bedeutet nur, dass die App versuchen wird, im Hintergrund zu laufen. Ob sie im Hintergrund laufen kann, hängt davon ab, ob die Berechtigungen aktiviert sind oder nicht. Bei nativem Android deaktivieren Sie bitte \"Batterieoptimierung\" in dieser App, und bei miui ändern Sie bitte die Energiesparrichtlinie auf \"Unbegrenzt\".';
String get bgRunTip =>
'Dieser Schalter bedeutet nur, dass die App versuchen wird, im Hintergrund zu laufen. Ob sie im Hintergrund laufen kann, hängt davon ab, ob die Berechtigungen aktiviert sind oder nicht. Bei nativem Android deaktivieren Sie bitte \"Batterieoptimierung\" in dieser App, und bei miui ändern Sie bitte die Energiesparrichtlinie auf \"Unbegrenzt\".';
@override
String get closeAfterSave => 'Speichern und schließen';
@@ -61,7 +70,8 @@ class AppLocalizationsDe extends AppLocalizations {
String get cmd => 'Command';
@override
String get collapseUITip => 'Ob lange Listen in der Benutzeroberfläche standardmäßig eingeklappt werden sollen oder nicht';
String get collapseUITip =>
'Ob lange Listen in der Benutzeroberfläche standardmäßig eingeklappt werden sollen oder nicht';
@override
String get conn => 'Verbindung';
@@ -70,7 +80,8 @@ class AppLocalizationsDe extends AppLocalizations {
String get container => 'Container';
@override
String get containerTrySudoTip => 'Zum Beispiel: In der App ist der Benutzer auf aaa eingestellt, aber Docker ist unter dem Root-Benutzer installiert. In diesem Fall müssen Sie diese Option aktivieren';
String get containerTrySudoTip =>
'Zum Beispiel: In der App ist der Benutzer auf aaa eingestellt, aber Docker ist unter dem Root-Benutzer installiert. In diesem Fall müssen Sie diese Option aktivieren';
@override
String get convert => 'Konvertieren';
@@ -79,7 +90,8 @@ class AppLocalizationsDe extends AppLocalizations {
String get copyPath => 'Pfad kopieren';
@override
String get cpuViewAsProgressTip => 'Zeigen Sie die Auslastung jedes CPUs in einem Fortschrittsbalken-Stil an (alter Stil)';
String get cpuViewAsProgressTip =>
'Zeigen Sie die Auslastung jedes CPUs in einem Fortschrittsbalken-Stil an (alter Stil)';
@override
String get cursorType => 'Cursor-Typ';
@@ -88,7 +100,8 @@ class AppLocalizationsDe extends AppLocalizations {
String get customCmd => 'Benutzerdefinierte Befehle';
@override
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
String get customCmdDocUrl =>
'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
@override
String get customCmdHint => '\"Befehlsname\": \"Befehl\"';
@@ -102,6 +115,10 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get deleteServers => 'Batch-Löschung von Servern';
@override
String get desktopTerminalTip =>
'Befehl zum Öffnen des Terminal-Emulators beim Starten von SSH-Sitzungen.';
@override
String get dirEmpty => 'Stelle sicher, dass der Ordner leer ist.';
@@ -111,6 +128,9 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get disk => 'Festplatte';
@override
String get diskHealth => 'Festplattengesundheit';
@override
String get diskIgnorePath => 'Pfad für Datenträger ignorieren';
@@ -123,7 +143,8 @@ class AppLocalizationsDe extends AppLocalizations {
}
@override
String get dockerEmptyRunningItems => 'Es gibt keine laufenden Container.\nDas könnte daran liegen:\n- Der Docker-Installationsbenutzer ist nicht mit dem in der App konfigurierten Benutzernamen identisch.\n- Die Umgebungsvariable DOCKER_HOST wurde nicht korrekt gelesen. Sie können sie ermitteln, indem Sie `echo \$DOCKER_HOST` im Terminal ausführen.';
String get dockerEmptyRunningItems =>
'Es gibt keine laufenden Container.\nDas könnte daran liegen:\n- Der Docker-Installationsbenutzer ist nicht mit dem in der App konfigurierten Benutzernamen identisch.\n- Die Umgebungsvariable DOCKER_HOST wurde nicht korrekt gelesen. Sie können sie ermitteln, indem Sie `echo \$DOCKER_HOST` im Terminal ausführen.';
@override
String dockerImagesFmt(Object count) {
@@ -134,7 +155,10 @@ class AppLocalizationsDe extends AppLocalizations {
String get dockerNotInstalled => 'Docker ist nicht installiert';
@override
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
String dockerStatusRunningAndStoppedFmt(
Object runningCount,
Object stoppedCount,
) {
return '$runningCount aktiv, $stoppedCount container gestoppt.';
}
@@ -147,7 +171,8 @@ class AppLocalizationsDe extends AppLocalizations {
String get doubleColumnMode => 'Doppelspaltiger Modus';
@override
String get doubleColumnTip => 'Diese Option aktiviert nur die Funktion, ob sie tatsächlich aktiviert werden kann, hängt auch von der Breite des Geräts ab';
String get doubleColumnTip =>
'Diese Option aktiviert nur die Funktion, ob sie tatsächlich aktiviert werden kann, hängt auch von der Breite des Geräts ab';
@override
String get editVirtKeys => 'Virtuelle Tasten bearbeiten';
@@ -156,7 +181,11 @@ class AppLocalizationsDe extends AppLocalizations {
String get editor => 'Editor';
@override
String get editorHighlightTip => 'Die Leistung der aktuellen Codehervorhebung ist schlechter und kann zur Verbesserung optional ausgeschaltet werden.';
String get editorHighlightTip =>
'Die Leistung der aktuellen Codehervorhebung ist schlechter und kann zur Verbesserung optional ausgeschaltet werden.';
@override
String get emulator => 'Emulator';
@override
String get encode => 'Encode';
@@ -174,13 +203,15 @@ class AppLocalizationsDe extends AppLocalizations {
String get fallbackSshDest => 'SSH-Fallback-Ziel';
@override
String get fdroidReleaseTip => 'Wenn Sie diese App von F-Droid heruntergeladen haben, wird empfohlen, diese Option zu deaktivieren.';
String get fdroidReleaseTip =>
'Wenn Sie diese App von F-Droid heruntergeladen haben, wird empfohlen, diese Option zu deaktivieren.';
@override
String get fgService => 'Vordergrund-Dienst';
@override
String get fgServiceTip => 'Nach dem Einschalten kann es bei einigen Gerätemodellen zu Abstürzen kommen. Das Ausschalten kann bei einigen Modellen dazu führen, dass SSH-Verbindungen im Hintergrund nicht aufrechterhalten werden können. Bitte erlauben Sie ServerBox in den Systemeinstellungen Benachrichtigungsrechte, Hintergrundausführung und Selbstaktivierung.';
String get fgServiceTip =>
'Nach dem Einschalten kann es bei einigen Gerätemodellen zu Abstürzen kommen. Das Ausschalten kann bei einigen Modellen dazu führen, dass SSH-Verbindungen im Hintergrund nicht aufrechterhalten werden können. Bitte erlauben Sie ServerBox in den Systemeinstellungen Benachrichtigungsrechte, Hintergrundausführung und Selbstaktivierung.';
@override
String fileTooLarge(Object file, Object size, Object sizeMax) {
@@ -209,7 +240,8 @@ class AppLocalizationsDe extends AppLocalizations {
String get fullScreenJitterHelp => 'Einbrennen des Bildschirms verhindern';
@override
String get fullScreenTip => 'Soll der Vollbildmodus aktiviert werden, wenn das Gerät in den Quermodus gedreht wird? Diese Option gilt nur für die Server-Registerkarte.';
String get fullScreenTip =>
'Soll der Vollbildmodus aktiviert werden, wenn das Gerät in den Quermodus gedreht wird? Diese Option gilt nur für die Server-Registerkarte.';
@override
String get goBackQ => 'Zurückkommen?';
@@ -253,7 +285,8 @@ class AppLocalizationsDe extends AppLocalizations {
String get install => 'install';
@override
String get installDockerWithUrl => 'Bitte installiere docker zuerst. https://docs.docker.com/engine/install';
String get installDockerWithUrl =>
'Bitte installiere docker zuerst. https://docs.docker.com/engine/install';
@override
String get invalid => 'Ungültig';
@@ -268,7 +301,8 @@ class AppLocalizationsDe extends AppLocalizations {
String get keepStatusWhenErr => 'Den letzten Serverstatus beibehalten';
@override
String get keepStatusWhenErrTip => 'Nur im Fehlerfall während der Ausführung des Skripts';
String get keepStatusWhenErrTip =>
'Nur im Fehlerfall während der Ausführung des Skripts';
@override
String get keyAuth => 'Schlüsselauthentifzierung';
@@ -277,7 +311,8 @@ class AppLocalizationsDe extends AppLocalizations {
String get letterCache => 'Buchstaben-Caching';
@override
String get letterCacheTip => 'Empfohlen, zu deaktivieren, aber nach dem Deaktivieren können keine CJK-Zeichen eingegeben werden.';
String get letterCacheTip =>
'Empfohlen, zu deaktivieren, aber nach dem Deaktivieren können keine CJK-Zeichen eingegeben werden.';
@override
String get license => 'Lizenzen';
@@ -303,7 +338,8 @@ class AppLocalizationsDe extends AppLocalizations {
String get maxRetryCount => 'Anzahl an Verbindungsversuchen';
@override
String get maxRetryCountEqual0 => 'Unbegrenzte Verbindungsversuche zum Server';
String get maxRetryCountEqual0 =>
'Unbegrenzte Verbindungsversuche zum Server';
@override
String get min => 'min';
@@ -315,13 +351,15 @@ class AppLocalizationsDe extends AppLocalizations {
String get more => 'Mehr';
@override
String get moveOutServerFuncBtnsHelp => 'Ein: kann unter jeder Karte auf der Registerkarte \"Server\" angezeigt werden. Aus: kann oben auf der Seite \"Serverdetails\" angezeigt werden.';
String get moveOutServerFuncBtnsHelp =>
'Ein: kann unter jeder Karte auf der Registerkarte \"Server\" angezeigt werden. Aus: kann oben auf der Seite \"Serverdetails\" angezeigt werden.';
@override
String get ms => 'ms';
@override
String get needHomeDir => 'Wenn Sie ein Synology-Benutzer sind, [sehen Sie hier](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Benutzer anderer Systeme müssen suchen, wie man ein Home-Verzeichnis erstellt.';
String get needHomeDir =>
'Wenn Sie ein Synology-Benutzer sind, [sehen Sie hier](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Benutzer anderer Systeme müssen suchen, wie man ein Home-Verzeichnis erstellt.';
@override
String get needRestart => 'App muss neugestartet werden';
@@ -342,7 +380,8 @@ class AppLocalizationsDe extends AppLocalizations {
String get noLineChartForCpu => 'Verwenden Sie keine Liniendiagramme für CPU';
@override
String get noPrivateKeyTip => 'Der private Schlüssel existiert nicht, möglicherweise wurde er gelöscht oder es liegt ein Konfigurationsfehler vor.';
String get noPrivateKeyTip =>
'Der private Schlüssel existiert nicht, möglicherweise wurde er gelöscht oder es liegt ein Konfigurationsfehler vor.';
@override
String get noPromptAgain => 'Nicht mehr nachfragen';
@@ -360,16 +399,19 @@ class AppLocalizationsDe extends AppLocalizations {
String get onlyOneLine => 'Nur als eine Zeile anzeigen (scrollbar)';
@override
String get onlyWhenCoreBiggerThan8 => 'Wirksam nur, wenn die Anzahl der Kerne > 8 ist.';
String get onlyWhenCoreBiggerThan8 =>
'Wirksam nur, wenn die Anzahl der Kerne > 8 ist.';
@override
String get openLastPath => 'Öffnen Sie den letzten Pfad';
@override
String get openLastPathTip => 'Verschiedene Server haben unterschiedliche Einträge, und der Eintrag ist der Pfad zum Ausgang';
String get openLastPathTip =>
'Verschiedene Server haben unterschiedliche Einträge, und der Eintrag ist der Pfad zum Ausgang';
@override
String get parseContainerStatsTip => 'Das Analysieren des Belegungsstatus durch Docker ist relativ langsam';
String get parseContainerStatsTip =>
'Das Analysieren des Belegungsstatus durch Docker ist relativ langsam';
@override
String percentOfSize(Object percent, Object size) {
@@ -386,7 +428,8 @@ class AppLocalizationsDe extends AppLocalizations {
String get pingInputIP => 'Bitte gib eine Ziel-IP/Domain ein.';
@override
String get pingNoServer => 'Kein Server zum Anpingen.\nBitte füge einen Server hinzu.';
String get pingNoServer =>
'Kein Server zum Anpingen.\nBitte füge einen Server hinzu.';
@override
String get pkg => 'Pkg';
@@ -397,6 +440,9 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get port => 'Port';
@override
String get preferDiskAmount => 'Festplattenkapazität vorrangig anzeigen';
@override
String get preview => 'Vorschau';
@@ -410,13 +456,16 @@ class AppLocalizationsDe extends AppLocalizations {
String get pushToken => 'Push Token';
@override
String get pveIgnoreCertTip => 'Nicht empfohlen, Achten Sie auf Sicherheitsrisiken! Wenn Sie das Standardzertifikat von PVE verwenden, müssen Sie diese Option aktivieren.';
String get pveIgnoreCertTip =>
'Nicht empfohlen, Achten Sie auf Sicherheitsrisiken! Wenn Sie das Standardzertifikat von PVE verwenden, müssen Sie diese Option aktivieren.';
@override
String get pveLoginFailed => 'Anmeldung fehlgeschlagen. Kann nicht mit Benutzername/Passwort aus der Serverkonfiguration angemeldet werden, um sich über Linux PAM anzumelden.';
String get pveLoginFailed =>
'Anmeldung fehlgeschlagen. Kann nicht mit Benutzername/Passwort aus der Serverkonfiguration angemeldet werden, um sich über Linux PAM anzumelden.';
@override
String get pveVersionLow => 'Diese Funktion befindet sich derzeit in der Testphase und wurde nur auf PVE 8+ getestet. Bitte verwenden Sie sie mit Vorsicht.';
String get pveVersionLow =>
'Diese Funktion befindet sich derzeit in der Testphase und wurde nur auf PVE 8+ getestet. Bitte verwenden Sie sie mit Vorsicht.';
@override
String get pwd => 'Passwort';
@@ -458,7 +507,8 @@ class AppLocalizationsDe extends AppLocalizations {
String get running => 'läuft';
@override
String get sameIdServerExist => 'Ein Server mit derselben ID existiert bereits';
String get sameIdServerExist =>
'Ein Server mit derselben ID existiert bereits';
@override
String get save => 'Speichern';
@@ -491,10 +541,12 @@ class AppLocalizationsDe extends AppLocalizations {
String get sftpDlPrepare => 'Verbindung vorbereiten...';
@override
String get sftpEditorTip => 'Wenn leer, verwenden Sie den im App integrierten Dateieditor. Wenn ein Wert vorhanden ist, wird der Editor des Remote-Servers verwendet, z.B. `vim` (es wird empfohlen, automatisch gemäß `EDITOR` zu ermitteln).';
String get sftpEditorTip =>
'Wenn leer, verwenden Sie den im App integrierten Dateieditor. Wenn ein Wert vorhanden ist, wird der Editor des Remote-Servers verwendet, z.B. `vim` (es wird empfohlen, automatisch gemäß `EDITOR` zu ermitteln).';
@override
String get sftpRmrDirSummary => 'Verwenden Sie \"rm -r\", um das Verzeichnis in SFTP zu löschen.';
String get sftpRmrDirSummary =>
'Verwenden Sie \"rm -r\", um das Verzeichnis in SFTP zu löschen.';
@override
String get sftpSSHConnected => 'SFTP Verbunden';
@@ -521,7 +573,8 @@ class AppLocalizationsDe extends AppLocalizations {
String get specifyDev => 'Gerät angeben';
@override
String get specifyDevTip => 'Zum Beispiel bezieht sich die Standard-Netzwerkverkehrsstatistik auf alle Geräte. Hier können Sie ein bestimmtes Gerät angeben.';
String get specifyDevTip =>
'Zum Beispiel bezieht sich die Standard-Netzwerkverkehrsstatistik auf alle Geräte. Hier können Sie ein bestimmtes Gerät angeben.';
@override
String get speed => 'Tempo';
@@ -532,7 +585,8 @@ class AppLocalizationsDe extends AppLocalizations {
}
@override
String get sshTermHelp => 'Wenn das Terminal scrollbar ist, kann durch horizontales Ziehen Text ausgewählt werden. Durch Klicken auf die Tastentaste wird die Tastatur ein- oder ausgeschaltet. Das Dateisymbol öffnet den aktuellen Pfad SFTP. Die Zwischenablage-Schaltfläche kopiert den Inhalt, wenn Text ausgewählt ist, und fügt Inhalte aus der Zwischenablage in das Terminal ein, wenn kein Text ausgewählt ist und Inhalte in der Zwischenablage vorhanden sind. Das Codesymbol fügt Code-Schnipsel ins Terminal ein und führt sie aus.';
String get sshTermHelp =>
'Wenn das Terminal scrollbar ist, kann durch horizontales Ziehen Text ausgewählt werden. Durch Klicken auf die Tastentaste wird die Tastatur ein- oder ausgeschaltet. Das Dateisymbol öffnet den aktuellen Pfad SFTP. Die Zwischenablage-Schaltfläche kopiert den Inhalt, wenn Text ausgewählt ist, und fügt Inhalte aus der Zwischenablage in das Terminal ein, wenn kein Text ausgewählt ist und Inhalte in der Zwischenablage vorhanden sind. Das Codesymbol fügt Code-Schnipsel ins Terminal ein und führt sie aus.';
@override
String sshTip(Object url) {
@@ -540,7 +594,8 @@ class AppLocalizationsDe extends AppLocalizations {
}
@override
String get sshVirtualKeyAutoOff => 'Automatische Umschaltung der virtuellen Tasten';
String get sshVirtualKeyAutoOff =>
'Automatische Umschaltung der virtuellen Tasten';
@override
String get start => 'Start';
@@ -561,13 +616,15 @@ class AppLocalizationsDe extends AppLocalizations {
String get storage => 'Speicher';
@override
String get supportFmtArgs => 'Die folgenden Formatierungsparameter werden unterstützt:';
String get supportFmtArgs =>
'Die folgenden Formatierungsparameter werden unterstützt:';
@override
String get suspend => 'Suspend';
@override
String get suspendTip => 'Die Suspend-Funktion erfordert Root-Rechte und systemd-Unterstützung.';
String get suspendTip =>
'Die Suspend-Funktion erfordert Root-Rechte und systemd-Unterstützung.';
@override
String switchTo(Object val) {
@@ -578,7 +635,8 @@ class AppLocalizationsDe extends AppLocalizations {
String get sync => 'Sync';
@override
String get syncTip => 'Damit einige Änderungen wirksam werden, kann ein Neustart erforderlich sein.';
String get syncTip =>
'Damit einige Änderungen wirksam werden, kann ein Neustart erforderlich sein.';
@override
String get system => 'Systeme';
@@ -590,7 +648,8 @@ class AppLocalizationsDe extends AppLocalizations {
String get temperature => 'Temperatur';
@override
String get termFontSizeTip => 'Diese Einstellung beeinflusst die Größe des Terminals (Breite und Höhe). Sie können die Terminalseite zoomen, um die Schriftgröße der aktuellen Sitzung anzupassen.';
String get termFontSizeTip =>
'Diese Einstellung beeinflusst die Größe des Terminals (Breite und Höhe). Sie können die Terminalseite zoomen, um die Schriftgröße der aktuellen Sitzung anzupassen.';
@override
String get terminal => 'Terminal';
@@ -602,7 +661,8 @@ class AppLocalizationsDe extends AppLocalizations {
String get textScaler => 'Skalierung der Schriftart';
@override
String get textScalerTip => '1.0 => 100% (Originalgröße), funktioniert nur auf der Serverseite Teil der Schrift, nicht empfohlen zu ändern.';
String get textScalerTip =>
'1.0 => 100% (Originalgröße), funktioniert nur auf der Serverseite Teil der Schrift, nicht empfohlen zu ändern.';
@override
String get theme => 'Themen';
@@ -635,10 +695,12 @@ class AppLocalizationsDe extends AppLocalizations {
String get update => 'Update';
@override
String get updateIntervalEqual0 => 'Wenn du den Wert 0 einstellst, wird nicht automatisch aktualisiert.\nDer CPU-Status kann nicht berechnet werden.';
String get updateIntervalEqual0 =>
'Wenn du den Wert 0 einstellst, wird nicht automatisch aktualisiert.\nDer CPU-Status kann nicht berechnet werden.';
@override
String get updateServerStatusInterval => 'Aktualisierungsintervall des Serverstatus';
String get updateServerStatusInterval =>
'Aktualisierungsintervall des Serverstatus';
@override
String get upload => 'Hochladen';
@@ -653,7 +715,8 @@ class AppLocalizationsDe extends AppLocalizations {
String get useCdn => 'Verwenden von CDN';
@override
String get useCdnTip => 'Nicht-chinesischen Benutzern wird die Verwendung eines CDN empfohlen. Möchten Sie es verwenden?';
String get useCdnTip =>
'Nicht-chinesischen Benutzern wird die Verwendung eines CDN empfohlen. Möchten Sie es verwenden?';
@override
String get useNoPwd => 'Es wird kein Passwort verwendet';
@@ -671,7 +734,8 @@ class AppLocalizationsDe extends AppLocalizations {
String get viewErr => 'Fehler anzeigen';
@override
String get virtKeyHelpClipboard => 'In die Zwischenablage kopieren, wenn das ausgewählte Terminal nicht leer ist, andernfalls den Inhalt der Zwischenablage in das Terminal einfügen.';
String get virtKeyHelpClipboard =>
'In die Zwischenablage kopieren, wenn das ausgewählte Terminal nicht leer ist, andernfalls den Inhalt der Zwischenablage in das Terminal einfügen.';
@override
String get virtKeyHelpIME => 'Tastatur ein-/ausschalten';
@@ -680,7 +744,8 @@ class AppLocalizationsDe extends AppLocalizations {
String get virtKeyHelpSFTP => 'Aktuelles Verzeichnis in SFTP öffnen.';
@override
String get waitConnection => 'Bitte warte, bis die Verbindung hergestellt wurde.';
String get waitConnection =>
'Bitte warte, bis die Verbindung hergestellt wurde.';
@override
String get wakeLock => 'Wach halten';
@@ -695,14 +760,17 @@ class AppLocalizationsDe extends AppLocalizations {
String get whenOpenApp => 'Beim Öffnen der App';
@override
String get wolTip => 'Nach der Konfiguration von WOL (Wake-on-LAN) wird jedes Mal, wenn der Server verbunden wird, eine WOL-Anfrage gesendet.';
String get wolTip =>
'Nach der Konfiguration von WOL (Wake-on-LAN) wird jedes Mal, wenn der Server verbunden wird, eine WOL-Anfrage gesendet.';
@override
String get write => 'Schreiben';
@override
String get writeScriptFailTip => 'Das Schreiben des Skripts ist fehlgeschlagen, möglicherweise aufgrund fehlender Berechtigungen oder das Verzeichnis existiert nicht.';
String get writeScriptFailTip =>
'Das Schreiben des Skripts ist fehlgeschlagen, möglicherweise aufgrund fehlender Berechtigungen oder das Verzeichnis existiert nicht.';
@override
String get writeScriptTip => 'Nach der Verbindung mit dem Server wird ein Skript in ~/.config/server_box geschrieben, um den Systemstatus zu überwachen. Sie können den Skriptinhalt überprüfen.';
String get writeScriptTip =>
'Nach der Verbindung mit dem Server wird ein Skript in ~/.config/server_box geschrieben, um den Systemstatus zu überwachen. Sie können den Skriptinhalt überprüfen.';
}

View File

@@ -1,3 +1,5 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'l10n.dart';
// ignore_for_file: type=lint
@@ -7,13 +9,15 @@ class AppLocalizationsEn extends AppLocalizations {
AppLocalizationsEn([String locale = 'en']) : super(locale);
@override
String get aboutThanks => 'Thanks to the following people who participated in.';
String get aboutThanks =>
'Thanks to the following people who participated in.';
@override
String get acceptBeta => 'Accept beta version updates';
@override
String get addSystemPrivateKeyTip => 'Currently private keys don\'t exist, do you want to add the one that comes with the system (~/.ssh/id_rsa)?';
String get addSystemPrivateKeyTip =>
'Currently private keys don\'t exist, do you want to add the one that comes with the system (~/.ssh/id_rsa)?';
@override
String get added2List => 'Added to task list';
@@ -25,10 +29,12 @@ class AppLocalizationsEn extends AppLocalizations {
String get alreadyLastDir => 'Already in last directory.';
@override
String get authFailTip => 'Authentication failed, please check whether credentials are correct';
String get authFailTip =>
'Authentication failed, please check whether credentials are correct';
@override
String get autoBackupConflict => 'Only one automatic backup can be turned on at the same time.';
String get autoBackupConflict =>
'Only one automatic backup can be turned on at the same time.';
@override
String get autoConnect => 'Auto connect';
@@ -40,7 +46,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get autoUpdateHomeWidget => 'Automatic home widget update';
@override
String get backupTip => 'The exported data is weakly encrypted. \nPlease keep it safe.';
String get backupTip =>
'The exported data is weakly encrypted. \nPlease keep it safe.';
@override
String get backupVersionNotMatch => 'Backup version is not match.';
@@ -52,7 +59,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get bgRun => 'Run in background';
@override
String get bgRunTip => 'This switch only means the program will try to run in the background. Whether it can run in the background depends on whether the permission is enabled or not. For AOSP-based Android ROMs, please disable \"Battery Optimization\" in this app. For MIUI / HyperOS, please change the power saving policy to \"Unlimited\".';
String get bgRunTip =>
'This switch only means the program will try to run in the background. Whether it can run in the background depends on whether the permission is enabled or not. For AOSP-based Android ROMs, please disable \"Battery Optimization\" in this app. For MIUI / HyperOS, please change the power saving policy to \"Unlimited\".';
@override
String get closeAfterSave => 'Save and close';
@@ -61,7 +69,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get cmd => 'Command';
@override
String get collapseUITip => 'Whether to collapse long lists present in the UI by default';
String get collapseUITip =>
'Whether to collapse long lists present in the UI by default';
@override
String get conn => 'Connection';
@@ -70,7 +79,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get container => 'Container';
@override
String get containerTrySudoTip => 'For example: In the app, the user is set to aaa, but Docker is installed under the root user. In this case, you need to enable this option.';
String get containerTrySudoTip =>
'For example: In the app, the user is set to aaa, but Docker is installed under the root user. In this case, you need to enable this option.';
@override
String get convert => 'Convert';
@@ -79,7 +89,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get copyPath => 'Copy path';
@override
String get cpuViewAsProgressTip => 'Display the usage of each CPU in a progress bar style (old style)';
String get cpuViewAsProgressTip =>
'Display the usage of each CPU in a progress bar style (old style)';
@override
String get cursorType => 'Cursor type';
@@ -88,7 +99,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get customCmd => 'Custom commands';
@override
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
String get customCmdDocUrl =>
'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
@override
String get customCmdHint => '\"Command Name\": \"Command\"';
@@ -102,6 +114,10 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get deleteServers => 'Batch delete servers';
@override
String get desktopTerminalTip =>
'Command used to open the terminal emulator when launching SSH sessions.';
@override
String get dirEmpty => 'Make sure the folder is empty.';
@@ -111,6 +127,9 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get disk => 'Disk';
@override
String get diskHealth => 'Disk Health';
@override
String get diskIgnorePath => 'Ignore path for disk';
@@ -123,7 +142,8 @@ class AppLocalizationsEn extends AppLocalizations {
}
@override
String get dockerEmptyRunningItems => 'There are no running containers.\nThis could be because:\n- The Docker installation user is not the same as the username configured within the App.\n- The environment variable DOCKER_HOST was not read correctly. You can get it by running `echo \$DOCKER_HOST` in the terminal.';
String get dockerEmptyRunningItems =>
'There are no running containers.\nThis could be because:\n- The Docker installation user is not the same as the username configured within the App.\n- The environment variable DOCKER_HOST was not read correctly. You can get it by running `echo \$DOCKER_HOST` in the terminal.';
@override
String dockerImagesFmt(Object count) {
@@ -134,7 +154,10 @@ class AppLocalizationsEn extends AppLocalizations {
String get dockerNotInstalled => 'Docker not installed';
@override
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
String dockerStatusRunningAndStoppedFmt(
Object runningCount,
Object stoppedCount,
) {
return '$runningCount running, $stoppedCount container stopped.';
}
@@ -147,7 +170,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get doubleColumnMode => 'Double column mode';
@override
String get doubleColumnTip => 'This option only enables the feature, whether it can actually be enabled depends on the width of the device';
String get doubleColumnTip =>
'This option only enables the feature, whether it can actually be enabled depends on the width of the device';
@override
String get editVirtKeys => 'Edit virtual keys';
@@ -156,7 +180,11 @@ class AppLocalizationsEn extends AppLocalizations {
String get editor => 'Editor';
@override
String get editorHighlightTip => 'The current code highlighting performance is not ideal and can be optionally turned off to improve.';
String get editorHighlightTip =>
'The current code highlighting performance is not ideal and can be optionally turned off to improve.';
@override
String get emulator => 'Emulator';
@override
String get encode => 'Encode';
@@ -174,13 +202,15 @@ class AppLocalizationsEn extends AppLocalizations {
String get fallbackSshDest => 'Fallback SSH destination';
@override
String get fdroidReleaseTip => 'If you downloaded this app from F-Droid, it is recommended to turn off this option.';
String get fdroidReleaseTip =>
'If you downloaded this app from F-Droid, it is recommended to turn off this option.';
@override
String get fgService => 'Foreground Service';
@override
String get fgServiceTip => 'After enabling, some device models may crash. Disabling it may cause some models to be unable to maintain SSH connections in the background. Please allow ServerBox notification permissions, background running, and self-wake-up in system settings.';
String get fgServiceTip =>
'After enabling, some device models may crash. Disabling it may cause some models to be unable to maintain SSH connections in the background. Please allow ServerBox notification permissions, background running, and self-wake-up in system settings.';
@override
String fileTooLarge(Object file, Object size, Object sizeMax) {
@@ -209,7 +239,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get fullScreenJitterHelp => 'To avoid screen burn-in';
@override
String get fullScreenTip => 'Should full-screen mode be enabled when the device is rotated to landscape mode? This option only applies to the server tab.';
String get fullScreenTip =>
'Should full-screen mode be enabled when the device is rotated to landscape mode? This option only applies to the server tab.';
@override
String get goBackQ => 'Go back?';
@@ -253,7 +284,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get install => 'install';
@override
String get installDockerWithUrl => 'Please https://docs.docker.com/engine/install docker first.';
String get installDockerWithUrl =>
'Please https://docs.docker.com/engine/install docker first.';
@override
String get invalid => 'Invalid';
@@ -268,7 +300,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get keepStatusWhenErr => 'Preserve the last server state';
@override
String get keepStatusWhenErrTip => 'Only in the event of an error during script execution';
String get keepStatusWhenErrTip =>
'Only in the event of an error during script execution';
@override
String get keyAuth => 'Key Auth';
@@ -277,7 +310,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get letterCache => 'Letter caching';
@override
String get letterCacheTip => 'Recommended to disable, but after disabling, it will be impossible to input CJK characters.';
String get letterCacheTip =>
'Recommended to disable, but after disabling, it will be impossible to input CJK characters.';
@override
String get license => 'License';
@@ -315,13 +349,15 @@ class AppLocalizationsEn extends AppLocalizations {
String get more => 'More';
@override
String get moveOutServerFuncBtnsHelp => 'On: can be displayed below each card on the Server Tab page. Off: can be displayed at the top of the Server Details page.';
String get moveOutServerFuncBtnsHelp =>
'On: can be displayed below each card on the Server Tab page. Off: can be displayed at the top of the Server Details page.';
@override
String get ms => 'ms';
@override
String get needHomeDir => 'If you are a Synology user, [see here](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Users of other systems need to search for how to create a home directory.';
String get needHomeDir =>
'If you are a Synology user, [see here](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Users of other systems need to search for how to create a home directory.';
@override
String get needRestart => 'App needs to be restarted';
@@ -342,7 +378,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get noLineChartForCpu => 'Do not use line charts for CPU';
@override
String get noPrivateKeyTip => 'The private key does not exist, it may have been deleted or there is a configuration error.';
String get noPrivateKeyTip =>
'The private key does not exist, it may have been deleted or there is a configuration error.';
@override
String get noPromptAgain => 'Do not prompt again';
@@ -360,16 +397,19 @@ class AppLocalizationsEn extends AppLocalizations {
String get onlyOneLine => 'Only display as one line (scrollable)';
@override
String get onlyWhenCoreBiggerThan8 => 'Works only when the number of cores is greater than 8';
String get onlyWhenCoreBiggerThan8 =>
'Works only when the number of cores is greater than 8';
@override
String get openLastPath => 'Open the last path';
@override
String get openLastPathTip => 'Different servers will have different logs, and the log is the path to the exit';
String get openLastPathTip =>
'Different servers will have different logs, and the log is the path to the exit';
@override
String get parseContainerStatsTip => 'Parsing the occupancy status of Docker is relatively slow.';
String get parseContainerStatsTip =>
'Parsing the occupancy status of Docker is relatively slow.';
@override
String percentOfSize(Object percent, Object size) {
@@ -386,7 +426,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get pingInputIP => 'Please input a target IP / domain.';
@override
String get pingNoServer => 'No server to ping.\nPlease add a server in server tab.';
String get pingNoServer =>
'No server to ping.\nPlease add a server in server tab.';
@override
String get pkg => 'Pkg';
@@ -397,6 +438,9 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get port => 'Port';
@override
String get preferDiskAmount => 'Prioritize displaying disk capacity';
@override
String get preview => 'Preview';
@@ -410,13 +454,16 @@ class AppLocalizationsEn extends AppLocalizations {
String get pushToken => 'Push token';
@override
String get pveIgnoreCertTip => 'Not recommended to enable, beware of security risks! If you are using the default certificate from PVE, you need to enable this option.';
String get pveIgnoreCertTip =>
'Not recommended to enable, beware of security risks! If you are using the default certificate from PVE, you need to enable this option.';
@override
String get pveLoginFailed => 'Login failed. Unable to authenticate with username/password from server configuration for Linux PAM login.';
String get pveLoginFailed =>
'Login failed. Unable to authenticate with username/password from server configuration for Linux PAM login.';
@override
String get pveVersionLow => 'This feature is currently in the testing phase and has only been tested on PVE 8+. Please use it with caution.';
String get pveVersionLow =>
'This feature is currently in the testing phase and has only been tested on PVE 8+. Please use it with caution.';
@override
String get pwd => 'Password';
@@ -491,7 +538,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get sftpDlPrepare => 'Preparing to connect...';
@override
String get sftpEditorTip => 'If empty, use the built-in file editor of the app. If a value is present, use the remote servers editor, e.g., `vim` (recommended to automatically detect according to `EDITOR`).';
String get sftpEditorTip =>
'If empty, use the built-in file editor of the app. If a value is present, use the remote servers editor, e.g., `vim` (recommended to automatically detect according to `EDITOR`).';
@override
String get sftpRmrDirSummary => 'Use `rm -r` to delete a folder in SFTP.';
@@ -521,7 +569,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get specifyDev => 'Specify device';
@override
String get specifyDevTip => 'For example, network traffic statistics are by default for all devices. You can specify a particular device here.';
String get specifyDevTip =>
'For example, network traffic statistics are by default for all devices. You can specify a particular device here.';
@override
String get speed => 'Speed';
@@ -532,7 +581,8 @@ class AppLocalizationsEn extends AppLocalizations {
}
@override
String get sshTermHelp => 'When the terminal is scrollable, dragging horizontally can select text. Clicking the keyboard button turns the keyboard on/off. The file icon opens the current path SFTP. The clipboard button copies the content when text is selected, and pastes content from the clipboard into the terminal when no text is selected and there is content on the clipboard. The code icon pastes code snippets into the terminal and executes them.';
String get sshTermHelp =>
'When the terminal is scrollable, dragging horizontally can select text. Clicking the keyboard button turns the keyboard on/off. The file icon opens the current path SFTP. The clipboard button copies the content when text is selected, and pastes content from the clipboard into the terminal when no text is selected and there is content on the clipboard. The code icon pastes code snippets into the terminal and executes them.';
@override
String sshTip(Object url) {
@@ -561,13 +611,15 @@ class AppLocalizationsEn extends AppLocalizations {
String get storage => 'Storage';
@override
String get supportFmtArgs => 'The following formatting parameters are supported:';
String get supportFmtArgs =>
'The following formatting parameters are supported:';
@override
String get suspend => 'Suspend';
@override
String get suspendTip => 'The suspend function requires root permission and systemd support.';
String get suspendTip =>
'The suspend function requires root permission and systemd support.';
@override
String switchTo(Object val) {
@@ -578,7 +630,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get sync => 'Sync';
@override
String get syncTip => 'A restart may be required for some changes to take effect.';
String get syncTip =>
'A restart may be required for some changes to take effect.';
@override
String get system => 'System';
@@ -590,7 +643,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get temperature => 'Temperature';
@override
String get termFontSizeTip => 'This setting will affect the terminal size (width and height). You can zoom in on the terminal page to adjust the font size of the current session.';
String get termFontSizeTip =>
'This setting will affect the terminal size (width and height). You can zoom in on the terminal page to adjust the font size of the current session.';
@override
String get terminal => 'Terminal';
@@ -602,7 +656,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get textScaler => 'Text scaler';
@override
String get textScalerTip => '1.0 => 100% (original size), only works on server page part of the font, not recommended to change.';
String get textScalerTip =>
'1.0 => 100% (original size), only works on server page part of the font, not recommended to change.';
@override
String get theme => 'Theme';
@@ -635,7 +690,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get update => 'Update';
@override
String get updateIntervalEqual0 => 'You set to 0, will not update automatically.\nCan\'t calculate CPU status.';
String get updateIntervalEqual0 =>
'You set to 0, will not update automatically.\nCan\'t calculate CPU status.';
@override
String get updateServerStatusInterval => 'Server status update interval';
@@ -653,7 +709,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get useCdn => 'Using CDN';
@override
String get useCdnTip => 'Non-Chinese users are recommended to use CDN. Would you like to use it?';
String get useCdnTip =>
'Non-Chinese users are recommended to use CDN. Would you like to use it?';
@override
String get useNoPwd => 'No password will be used';
@@ -671,7 +728,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get viewErr => 'See error';
@override
String get virtKeyHelpClipboard => 'Copy to the clipboard if the selected terminal is not empty, otherwise paste the content of the clipboard to the terminal.';
String get virtKeyHelpClipboard =>
'Copy to the clipboard if the selected terminal is not empty, otherwise paste the content of the clipboard to the terminal.';
@override
String get virtKeyHelpIME => 'Turn on/off the keyboard';
@@ -680,7 +738,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get virtKeyHelpSFTP => 'Open current directory in SFTP.';
@override
String get waitConnection => 'Please wait for the connection to be established.';
String get waitConnection =>
'Please wait for the connection to be established.';
@override
String get wakeLock => 'Keep awake';
@@ -695,14 +754,17 @@ class AppLocalizationsEn extends AppLocalizations {
String get whenOpenApp => 'When opening the app';
@override
String get wolTip => 'After configuring WOL (Wake-on-LAN), a WOL request is sent each time the server is connected.';
String get wolTip =>
'After configuring WOL (Wake-on-LAN), a WOL request is sent each time the server is connected.';
@override
String get write => 'Write';
@override
String get writeScriptFailTip => 'Writing to the script failed, possibly due to lack of permissions or the directory does not exist.';
String get writeScriptFailTip =>
'Writing to the script failed, possibly due to lack of permissions or the directory does not exist.';
@override
String get writeScriptTip => 'After connecting to the server, a script will be written to ~/.config/server_box to monitor the system status. You can review the script content.';
String get writeScriptTip =>
'After connecting to the server, a script will be written to ~/.config/server_box to monitor the system status. You can review the script content.';
}

View File

@@ -1,3 +1,5 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'l10n.dart';
// ignore_for_file: type=lint
@@ -13,7 +15,8 @@ class AppLocalizationsEs extends AppLocalizations {
String get acceptBeta => 'Aceptar actualizaciones de la versión de prueba';
@override
String get addSystemPrivateKeyTip => 'Actualmente no hay ninguna llave privada, ¿quieres agregar la que viene por defecto en el sistema (~/.ssh/id_rsa)?';
String get addSystemPrivateKeyTip =>
'Actualmente no hay ninguna llave privada, ¿quieres agregar la que viene por defecto en el sistema (~/.ssh/id_rsa)?';
@override
String get added2List => 'Añadido a la lista de tareas';
@@ -25,10 +28,12 @@ class AppLocalizationsEs extends AppLocalizations {
String get alreadyLastDir => 'Ya estás en el directorio superior';
@override
String get authFailTip => 'La autenticación ha fallado, por favor verifica si la contraseña/llave/host/usuario, etc., son incorrectos.';
String get authFailTip =>
'La autenticación ha fallado, por favor verifica si la contraseña/llave/host/usuario, etc., son incorrectos.';
@override
String get autoBackupConflict => 'Solo se puede activar una copia de seguridad automática a la vez';
String get autoBackupConflict =>
'Solo se puede activar una copia de seguridad automática a la vez';
@override
String get autoConnect => 'Conexión automática';
@@ -37,13 +42,16 @@ class AppLocalizationsEs extends AppLocalizations {
String get autoRun => 'Ejecución automática';
@override
String get autoUpdateHomeWidget => 'Actualizar automáticamente el widget del escritorio';
String get autoUpdateHomeWidget =>
'Actualizar automáticamente el widget del escritorio';
@override
String get backupTip => 'Los datos exportados solo están encriptados de manera básica, por favor guárdalos en un lugar seguro.';
String get backupTip =>
'Los datos exportados solo están encriptados de manera básica, por favor guárdalos en un lugar seguro.';
@override
String get backupVersionNotMatch => 'La versión de la copia de seguridad no coincide, no se puede restaurar';
String get backupVersionNotMatch =>
'La versión de la copia de seguridad no coincide, no se puede restaurar';
@override
String get battery => 'Batería';
@@ -52,7 +60,8 @@ class AppLocalizationsEs extends AppLocalizations {
String get bgRun => 'Ejecución en segundo plano';
@override
String get bgRunTip => 'Este interruptor solo indica que la aplicación intentará correr en segundo plano, si puede hacerlo o no depende de si tiene el permiso correspondiente. En Android puro, por favor desactiva la “optimización de batería” para esta app, en MIUI por favor cambia la estrategia de ahorro de energía a “Sin restricciones”.';
String get bgRunTip =>
'Este interruptor solo indica que la aplicación intentará correr en segundo plano, si puede hacerlo o no depende de si tiene el permiso correspondiente. En Android puro, por favor desactiva la “optimización de batería” para esta app, en MIUI por favor cambia la estrategia de ahorro de energía a “Sin restricciones”.';
@override
String get closeAfterSave => 'Guardar y cerrar';
@@ -61,7 +70,8 @@ class AppLocalizationsEs extends AppLocalizations {
String get cmd => 'Comando';
@override
String get collapseUITip => '¿Colapsar por defecto las listas largas en la UI?';
String get collapseUITip =>
'¿Colapsar por defecto las listas largas en la UI?';
@override
String get conn => 'Conectar';
@@ -70,7 +80,8 @@ class AppLocalizationsEs extends AppLocalizations {
String get container => 'Contenedor';
@override
String get containerTrySudoTip => 'Por ejemplo: si configuras el usuario dentro de la app como aaa, pero Docker está instalado bajo el usuario root, entonces necesitarás habilitar esta opción';
String get containerTrySudoTip =>
'Por ejemplo: si configuras el usuario dentro de la app como aaa, pero Docker está instalado bajo el usuario root, entonces necesitarás habilitar esta opción';
@override
String get convert => 'Convertir';
@@ -79,7 +90,8 @@ class AppLocalizationsEs extends AppLocalizations {
String get copyPath => 'Copiar ruta';
@override
String get cpuViewAsProgressTip => 'Muestre la tasa de uso de cada CPU en estilo de barra de progreso (estilo antiguo)';
String get cpuViewAsProgressTip =>
'Muestre la tasa de uso de cada CPU en estilo de barra de progreso (estilo antiguo)';
@override
String get cursorType => 'Tipo de cursor';
@@ -88,7 +100,8 @@ class AppLocalizationsEs extends AppLocalizations {
String get customCmd => 'Comandos personalizados';
@override
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
String get customCmdDocUrl =>
'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
@override
String get customCmdHint => '\"Nombre del comando\": \"Comando\"';
@@ -102,6 +115,10 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get deleteServers => 'Eliminar servidores en lote';
@override
String get desktopTerminalTip =>
'Comando utilizado para abrir el emulador de terminal al iniciar sesiones SSH.';
@override
String get dirEmpty => 'Asegúrate de que el directorio esté vacío';
@@ -111,6 +128,9 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get disk => 'Disco';
@override
String get diskHealth => 'Salud del disco';
@override
String get diskIgnorePath => 'Rutas de disco ignoradas';
@@ -123,7 +143,8 @@ class AppLocalizationsEs extends AppLocalizations {
}
@override
String get dockerEmptyRunningItems => 'No hay contenedores en ejecución.\nEsto podría deberse a que:\n- El usuario con el que se instaló Docker es diferente al configurado en la app\n- La variable de entorno DOCKER_HOST no se ha leído correctamente. Puedes obtenerla ejecutando `echo \$DOCKER_HOST` en el terminal.';
String get dockerEmptyRunningItems =>
'No hay contenedores en ejecución.\nEsto podría deberse a que:\n- El usuario con el que se instaló Docker es diferente al configurado en la app\n- La variable de entorno DOCKER_HOST no se ha leído correctamente. Puedes obtenerla ejecutando `echo \$DOCKER_HOST` en el terminal.';
@override
String dockerImagesFmt(Object count) {
@@ -134,7 +155,10 @@ class AppLocalizationsEs extends AppLocalizations {
String get dockerNotInstalled => 'Docker no está instalado';
@override
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
String dockerStatusRunningAndStoppedFmt(
Object runningCount,
Object stoppedCount,
) {
return '$runningCount en ejecución, $stoppedCount detenidos';
}
@@ -147,7 +171,8 @@ class AppLocalizationsEs extends AppLocalizations {
String get doubleColumnMode => 'Modo de doble columna';
@override
String get doubleColumnTip => 'Esta opción solo habilita la función, si se puede activar o no depende del ancho del dispositivo';
String get doubleColumnTip =>
'Esta opción solo habilita la función, si se puede activar o no depende del ancho del dispositivo';
@override
String get editVirtKeys => 'Editar teclas virtuales';
@@ -156,7 +181,11 @@ class AppLocalizationsEs extends AppLocalizations {
String get editor => 'Editor';
@override
String get editorHighlightTip => 'El rendimiento del resaltado de código es bastante pobre actualmente, puedes elegir desactivarlo para mejorar.';
String get editorHighlightTip =>
'El rendimiento del resaltado de código es bastante pobre actualmente, puedes elegir desactivarlo para mejorar.';
@override
String get emulator => 'Emulador';
@override
String get encode => 'Codificar';
@@ -174,13 +203,15 @@ class AppLocalizationsEs extends AppLocalizations {
String get fallbackSshDest => 'Destino SSH alternativo';
@override
String get fdroidReleaseTip => 'Si descargaste esta aplicación desde F-Droid, se recomienda desactivar esta opción.';
String get fdroidReleaseTip =>
'Si descargaste esta aplicación desde F-Droid, se recomienda desactivar esta opción.';
@override
String get fgService => 'Servicio en primer plano';
@override
String get fgServiceTip => 'Después de activarlo, algunos modelos de dispositivos pueden bloquearse. Desactivarlo puede hacer que algunos modelos no puedan mantener las conexiones SSH en segundo plano. Por favor, permita los permisos de notificación de ServerBox, la ejecución en segundo plano y el auto-despertar en la configuración del sistema.';
String get fgServiceTip =>
'Después de activarlo, algunos modelos de dispositivos pueden bloquearse. Desactivarlo puede hacer que algunos modelos no puedan mantener las conexiones SSH en segundo plano. Por favor, permita los permisos de notificación de ServerBox, la ejecución en segundo plano y el auto-despertar en la configuración del sistema.';
@override
String fileTooLarge(Object file, Object size, Object sizeMax) {
@@ -209,7 +240,8 @@ class AppLocalizationsEs extends AppLocalizations {
String get fullScreenJitterHelp => 'Prevención de quemaduras de pantalla';
@override
String get fullScreenTip => '¿Debe habilitarse el modo de pantalla completa cuando el dispositivo se rote al modo horizontal? Esta opción solo se aplica a la pestaña del servidor.';
String get fullScreenTip =>
'¿Debe habilitarse el modo de pantalla completa cuando el dispositivo se rote al modo horizontal? Esta opción solo se aplica a la pestaña del servidor.';
@override
String get goBackQ => '¿Regresar?';
@@ -253,7 +285,8 @@ class AppLocalizationsEs extends AppLocalizations {
String get install => 'Instalar';
@override
String get installDockerWithUrl => 'Por favor instala Docker primero desde https://docs.docker.com/engine/install';
String get installDockerWithUrl =>
'Por favor instala Docker primero desde https://docs.docker.com/engine/install';
@override
String get invalid => 'Inválido';
@@ -268,7 +301,8 @@ class AppLocalizationsEs extends AppLocalizations {
String get keepStatusWhenErr => 'Mantener el estado anterior del servidor';
@override
String get keepStatusWhenErrTip => 'Solo aplica cuando hay errores al ejecutar scripts';
String get keepStatusWhenErrTip =>
'Solo aplica cuando hay errores al ejecutar scripts';
@override
String get keyAuth => 'Autenticación con llave';
@@ -277,7 +311,8 @@ class AppLocalizationsEs extends AppLocalizations {
String get letterCache => 'Caché de letras';
@override
String get letterCacheTip => 'Recomendado desactivar, pero después de desactivarlo, no se podrán ingresar caracteres CJK.';
String get letterCacheTip =>
'Recomendado desactivar, pero después de desactivarlo, no se podrán ingresar caracteres CJK.';
@override
String get license => 'Licencia de código abierto';
@@ -300,7 +335,8 @@ class AppLocalizationsEs extends AppLocalizations {
String get max => 'Máximo';
@override
String get maxRetryCount => 'Número máximo de reintentos de conexión al servidor';
String get maxRetryCount =>
'Número máximo de reintentos de conexión al servidor';
@override
String get maxRetryCountEqual0 => 'Reintentará infinitamente';
@@ -315,13 +351,15 @@ class AppLocalizationsEs extends AppLocalizations {
String get more => 'Más';
@override
String get moveOutServerFuncBtnsHelp => 'Activado: se mostrará debajo de cada tarjeta en la página de servidores. Desactivado: se mostrará en la parte superior de los detalles del servidor.';
String get moveOutServerFuncBtnsHelp =>
'Activado: se mostrará debajo de cada tarjeta en la página de servidores. Desactivado: se mostrará en la parte superior de los detalles del servidor.';
@override
String get ms => 'milisegundos';
@override
String get needHomeDir => 'Si eres usuario de Synology, [consulta aquí](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Los usuarios de otros sistemas deben buscar cómo crear un directorio home.';
String get needHomeDir =>
'Si eres usuario de Synology, [consulta aquí](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Los usuarios de otros sistemas deben buscar cómo crear un directorio home.';
@override
String get needRestart => 'Necesita reiniciar la app';
@@ -342,7 +380,8 @@ class AppLocalizationsEs extends AppLocalizations {
String get noLineChartForCpu => 'No utilice gráficos lineales para la CPU';
@override
String get noPrivateKeyTip => 'La clave privada no existe, puede haber sido eliminada o hay un error de configuración.';
String get noPrivateKeyTip =>
'La clave privada no existe, puede haber sido eliminada o hay un error de configuración.';
@override
String get noPromptAgain => 'No volver a preguntar';
@@ -360,16 +399,19 @@ class AppLocalizationsEs extends AppLocalizations {
String get onlyOneLine => 'Mostrar solo en una línea (desplazable)';
@override
String get onlyWhenCoreBiggerThan8 => 'Efectivo solo cuando el número de núcleos > 8';
String get onlyWhenCoreBiggerThan8 =>
'Efectivo solo cuando el número de núcleos > 8';
@override
String get openLastPath => 'Abrir el último camino';
@override
String get openLastPathTip => 'Los diferentes servidores tendrán diferentes registros, y lo que se registra es la ruta de salida';
String get openLastPathTip =>
'Los diferentes servidores tendrán diferentes registros, y lo que se registra es la ruta de salida';
@override
String get parseContainerStatsTip => 'El análisis del estado de uso de Docker es bastante lento';
String get parseContainerStatsTip =>
'El análisis del estado de uso de Docker es bastante lento';
@override
String percentOfSize(Object percent, Object size) {
@@ -383,10 +425,12 @@ class AppLocalizationsEs extends AppLocalizations {
String get pingAvg => 'Promedio:';
@override
String get pingInputIP => 'Por favor, introduce la IP de destino o el dominio';
String get pingInputIP =>
'Por favor, introduce la IP de destino o el dominio';
@override
String get pingNoServer => 'No hay servidores disponibles para hacer Ping\nPor favor, añade un servidor en la pestaña de servidores y vuelve a intentarlo';
String get pingNoServer =>
'No hay servidores disponibles para hacer Ping\nPor favor, añade un servidor en la pestaña de servidores y vuelve a intentarlo';
@override
String get pkg => 'Gestión de paquetes';
@@ -397,6 +441,10 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get port => 'Puerto';
@override
String get preferDiskAmount =>
'Priorizar la visualización de la capacidad del disco';
@override
String get preview => 'Vista previa';
@@ -410,13 +458,16 @@ class AppLocalizationsEs extends AppLocalizations {
String get pushToken => 'Token de notificaciones';
@override
String get pveIgnoreCertTip => 'No se recomienda activarlo, ¡tenga cuidado con los riesgos de seguridad! Si está utilizando el certificado predeterminado de PVE, debe habilitar esta opción.';
String get pveIgnoreCertTip =>
'No se recomienda activarlo, ¡tenga cuidado con los riesgos de seguridad! Si está utilizando el certificado predeterminado de PVE, debe habilitar esta opción.';
@override
String get pveLoginFailed => 'Fallo al iniciar sesión. No se puede autenticar con el nombre de usuario/contraseña de la configuración del servidor para el inicio de sesión de Linux PAM.';
String get pveLoginFailed =>
'Fallo al iniciar sesión. No se puede autenticar con el nombre de usuario/contraseña de la configuración del servidor para el inicio de sesión de Linux PAM.';
@override
String get pveVersionLow => 'Esta función está actualmente en fase de prueba y solo se ha probado en PVE 8+. Úsela con precaución.';
String get pveVersionLow =>
'Esta función está actualmente en fase de prueba y solo se ha probado en PVE 8+. Úsela con precaución.';
@override
String get pwd => 'Contraseña';
@@ -431,7 +482,8 @@ class AppLocalizationsEs extends AppLocalizations {
String get rememberPwdInMem => 'Recordar contraseña en la memoria';
@override
String get rememberPwdInMemTip => 'Utilizado para contenedores, suspensión, etc.';
String get rememberPwdInMemTip =>
'Utilizado para contenedores, suspensión, etc.';
@override
String get rememberWindowSize => 'Recordar el tamaño de la ventana';
@@ -479,7 +531,8 @@ class AppLocalizationsEs extends AppLocalizations {
String get server => 'Servidor';
@override
String get serverDetailOrder => 'Orden de los componentes en la página de detalles del servidor';
String get serverDetailOrder =>
'Orden de los componentes en la página de detalles del servidor';
@override
String get serverFuncBtns => 'Botones de función del servidor';
@@ -491,10 +544,12 @@ class AppLocalizationsEs extends AppLocalizations {
String get sftpDlPrepare => 'Preparando para conectar al servidor...';
@override
String get sftpEditorTip => 'Si está vacío, use el editor de archivos incorporado de la aplicación. Si hay un valor, use el editor del servidor remoto, por ejemplo, `vim` (se recomienda detectar automáticamente según `EDITOR`).';
String get sftpEditorTip =>
'Si está vacío, use el editor de archivos incorporado de la aplicación. Si hay un valor, use el editor del servidor remoto, por ejemplo, `vim` (se recomienda detectar automáticamente según `EDITOR`).';
@override
String get sftpRmrDirSummary => 'Usar `rm -r` en SFTP para eliminar directorios';
String get sftpRmrDirSummary =>
'Usar `rm -r` en SFTP para eliminar directorios';
@override
String get sftpSSHConnected => 'SFTP conectado...';
@@ -521,7 +576,8 @@ class AppLocalizationsEs extends AppLocalizations {
String get specifyDev => 'Especificar dispositivo';
@override
String get specifyDevTip => 'Por ejemplo, las estadísticas de tráfico de red son por defecto para todos los dispositivos. Aquí puede especificar un dispositivo en particular.';
String get specifyDevTip =>
'Por ejemplo, las estadísticas de tráfico de red son por defecto para todos los dispositivos. Aquí puede especificar un dispositivo en particular.';
@override
String get speed => 'Velocidad';
@@ -532,7 +588,8 @@ class AppLocalizationsEs extends AppLocalizations {
}
@override
String get sshTermHelp => 'Cuando el terminal es desplazable, arrastrar horizontalmente puede seleccionar texto. Hacer clic en el botón del teclado enciende/apaga el teclado. El icono de archivo abre el SFTP de la ruta actual. El botón del portapapeles copia el contenido cuando se selecciona texto y pega el contenido del portapapeles en el terminal cuando no se selecciona texto y hay contenido en el portapapeles. El icono de código pega fragmentos de código en el terminal y los ejecuta.';
String get sshTermHelp =>
'Cuando el terminal es desplazable, arrastrar horizontalmente puede seleccionar texto. Hacer clic en el botón del teclado enciende/apaga el teclado. El icono de archivo abre el SFTP de la ruta actual. El botón del portapapeles copia el contenido cuando se selecciona texto y pega el contenido del portapapeles en el terminal cuando no se selecciona texto y hay contenido en el portapapeles. El icono de código pega fragmentos de código en el terminal y los ejecuta.';
@override
String sshTip(Object url) {
@@ -540,7 +597,8 @@ class AppLocalizationsEs extends AppLocalizations {
}
@override
String get sshVirtualKeyAutoOff => 'Desactivación automática de teclas virtuales';
String get sshVirtualKeyAutoOff =>
'Desactivación automática de teclas virtuales';
@override
String get start => 'Iniciar';
@@ -567,7 +625,8 @@ class AppLocalizationsEs extends AppLocalizations {
String get suspend => 'Suspender';
@override
String get suspendTip => 'La función de suspender necesita permisos de root y soporte de systemd.';
String get suspendTip =>
'La función de suspender necesita permisos de root y soporte de systemd.';
@override
String switchTo(Object val) {
@@ -578,7 +637,8 @@ class AppLocalizationsEs extends AppLocalizations {
String get sync => 'Sincronizar';
@override
String get syncTip => 'Puede que necesites reiniciar para que algunos cambios tengan efecto.';
String get syncTip =>
'Puede que necesites reiniciar para que algunos cambios tengan efecto.';
@override
String get system => 'Sistema';
@@ -590,7 +650,8 @@ class AppLocalizationsEs extends AppLocalizations {
String get temperature => 'Temperatura';
@override
String get termFontSizeTip => 'Este ajuste afectará el tamaño del terminal (ancho y alto). Puedes hacer zoom en la página del terminal para ajustar el tamaño de fuente de la sesión actual.';
String get termFontSizeTip =>
'Este ajuste afectará el tamaño del terminal (ancho y alto). Puedes hacer zoom en la página del terminal para ajustar el tamaño de fuente de la sesión actual.';
@override
String get terminal => 'Terminal';
@@ -602,7 +663,8 @@ class AppLocalizationsEs extends AppLocalizations {
String get textScaler => 'Escalar texto';
@override
String get textScalerTip => '1.0 => 100% (tamaño original), solo afecta a ciertas fuentes en la página del servidor, no se recomienda modificar.';
String get textScalerTip =>
'1.0 => 100% (tamaño original), solo afecta a ciertas fuentes en la página del servidor, no se recomienda modificar.';
@override
String get theme => 'Tema';
@@ -635,10 +697,12 @@ class AppLocalizationsEs extends AppLocalizations {
String get update => 'Actualizar';
@override
String get updateIntervalEqual0 => 'Si configuras esto a 0, el estado del servidor no se refrescará automáticamente.\nY no se podrá calcular el uso de CPU.';
String get updateIntervalEqual0 =>
'Si configuras esto a 0, el estado del servidor no se refrescará automáticamente.\nY no se podrá calcular el uso de CPU.';
@override
String get updateServerStatusInterval => 'Intervalo de actualización del estado del servidor';
String get updateServerStatusInterval =>
'Intervalo de actualización del estado del servidor';
@override
String get upload => 'Subir';
@@ -653,7 +717,8 @@ class AppLocalizationsEs extends AppLocalizations {
String get useCdn => 'Usando CDN';
@override
String get useCdnTip => 'Se recomienda a los usuarios no chinos utilizar CDN. ¿Le gustaría utilizarlo?';
String get useCdnTip =>
'Se recomienda a los usuarios no chinos utilizar CDN. ¿Le gustaría utilizarlo?';
@override
String get useNoPwd => 'Se usará sin contraseña';
@@ -671,7 +736,8 @@ class AppLocalizationsEs extends AppLocalizations {
String get viewErr => 'Ver error';
@override
String get virtKeyHelpClipboard => 'Si el terminal tiene caracteres seleccionados, entonces copiará los caracteres seleccionados al portapapeles, de lo contrario, pegará el contenido del portapapeles al terminal.';
String get virtKeyHelpClipboard =>
'Si el terminal tiene caracteres seleccionados, entonces copiará los caracteres seleccionados al portapapeles, de lo contrario, pegará el contenido del portapapeles al terminal.';
@override
String get virtKeyHelpIME => 'Encender/apagar el teclado';
@@ -680,7 +746,8 @@ class AppLocalizationsEs extends AppLocalizations {
String get virtKeyHelpSFTP => 'Abrir la ruta actual en SFTP.';
@override
String get waitConnection => 'Por favor, espera a que la conexión se establezca';
String get waitConnection =>
'Por favor, espera a que la conexión se establezca';
@override
String get wakeLock => 'Mantener despierto';
@@ -695,14 +762,17 @@ class AppLocalizationsEs extends AppLocalizations {
String get whenOpenApp => 'Al abrir la App';
@override
String get wolTip => 'Después de configurar WOL (Wake-on-LAN), se envía una solicitud de WOL cada vez que se conecta el servidor.';
String get wolTip =>
'Después de configurar WOL (Wake-on-LAN), se envía una solicitud de WOL cada vez que se conecta el servidor.';
@override
String get write => 'Escribir';
@override
String get writeScriptFailTip => 'La escritura en el script falló, posiblemente por falta de permisos o porque el directorio no existe.';
String get writeScriptFailTip =>
'La escritura en el script falló, posiblemente por falta de permisos o porque el directorio no existe.';
@override
String get writeScriptTip => 'Después de conectarse al servidor, se escribirá un script en ~/.config/server_box para monitorear el estado del sistema. Puedes revisar el contenido del script.';
String get writeScriptTip =>
'Después de conectarse al servidor, se escribirá un script en ~/.config/server_box para monitorear el estado del sistema. Puedes revisar el contenido del script.';
}

View File

@@ -1,3 +1,5 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'l10n.dart';
// ignore_for_file: type=lint
@@ -13,7 +15,8 @@ class AppLocalizationsFr extends AppLocalizations {
String get acceptBeta => 'Accepter les mises à jour de la version de test';
@override
String get addSystemPrivateKeyTip => 'Actuellement, vous n\'avez aucune clé privée. Souhaitez-vous ajouter celle qui vient avec le système (~/.ssh/id_rsa) ?';
String get addSystemPrivateKeyTip =>
'Actuellement, vous n\'avez aucune clé privée. Souhaitez-vous ajouter celle qui vient avec le système (~/.ssh/id_rsa) ?';
@override
String get added2List => 'Ajouté à la liste des tâches';
@@ -25,10 +28,12 @@ class AppLocalizationsFr extends AppLocalizations {
String get alreadyLastDir => 'Déjà dans le dernier répertoire.';
@override
String get authFailTip => 'Échec de l\'authentification. Veuillez vérifier si le mot de passe/clé/hôte/utilisateur, etc., est incorrect.';
String get authFailTip =>
'Échec de l\'authentification. Veuillez vérifier si le mot de passe/clé/hôte/utilisateur, etc., est incorrect.';
@override
String get autoBackupConflict => 'Un seul sauvegarde automatique peut être activé en même temps.';
String get autoBackupConflict =>
'Un seul sauvegarde automatique peut être activé en même temps.';
@override
String get autoConnect => 'Connexion automatique';
@@ -37,13 +42,16 @@ class AppLocalizationsFr extends AppLocalizations {
String get autoRun => 'Exécution automatique';
@override
String get autoUpdateHomeWidget => 'Mise à jour automatique du widget d\'accueil';
String get autoUpdateHomeWidget =>
'Mise à jour automatique du widget d\'accueil';
@override
String get backupTip => 'Les données exportées sont simplement chiffrées. \nVeuillez les garder en sécurité.';
String get backupTip =>
'Les données exportées sont simplement chiffrées. \nVeuillez les garder en sécurité.';
@override
String get backupVersionNotMatch => 'La version de sauvegarde ne correspond pas.';
String get backupVersionNotMatch =>
'La version de sauvegarde ne correspond pas.';
@override
String get battery => 'Batterie';
@@ -52,7 +60,8 @@ class AppLocalizationsFr extends AppLocalizations {
String get bgRun => 'Exécution en arrière-plan';
@override
String get bgRunTip => 'Cette option signifie seulement que le programme essaiera de s\'exécuter en arrière-plan, que cela soit possible dépend de l\'autorisation activée ou non. Pour Android natif, veuillez désactiver l\'« Optimisation de la batterie » dans cette application, et pour MIUI, veuillez changer la politique d\'économie d\'énergie en « Illimité ».';
String get bgRunTip =>
'Cette option signifie seulement que le programme essaiera de s\'exécuter en arrière-plan, que cela soit possible dépend de l\'autorisation activée ou non. Pour Android natif, veuillez désactiver l\'« Optimisation de la batterie » dans cette application, et pour MIUI, veuillez changer la politique d\'économie d\'énergie en « Illimité ».';
@override
String get closeAfterSave => 'Enregistrer et fermer';
@@ -61,7 +70,8 @@ class AppLocalizationsFr extends AppLocalizations {
String get cmd => 'Commande';
@override
String get collapseUITip => 'Indique si les longues listes présentées dans l\'interface utilisateur doivent être réduites par défaut.';
String get collapseUITip =>
'Indique si les longues listes présentées dans l\'interface utilisateur doivent être réduites par défaut.';
@override
String get conn => 'Connexion';
@@ -70,7 +80,8 @@ class AppLocalizationsFr extends AppLocalizations {
String get container => 'Conteneur';
@override
String get containerTrySudoTip => 'Par exemple : Dans l\'application, l\'utilisateur est défini comme aaa, mais Docker est installé sous l\'utilisateur root. Dans ce cas, vous devez activer cette option.';
String get containerTrySudoTip =>
'Par exemple : Dans l\'application, l\'utilisateur est défini comme aaa, mais Docker est installé sous l\'utilisateur root. Dans ce cas, vous devez activer cette option.';
@override
String get convert => 'Convertir';
@@ -79,7 +90,8 @@ class AppLocalizationsFr extends AppLocalizations {
String get copyPath => 'Copier le chemin';
@override
String get cpuViewAsProgressTip => 'Afficher le taux d\'utilisation de chaque CPU sous forme de barre de progression (ancien style)';
String get cpuViewAsProgressTip =>
'Afficher le taux d\'utilisation de chaque CPU sous forme de barre de progression (ancien style)';
@override
String get cursorType => 'Type de curseur';
@@ -88,7 +100,8 @@ class AppLocalizationsFr extends AppLocalizations {
String get customCmd => 'Commandes personnalisées';
@override
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
String get customCmdDocUrl =>
'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
@override
String get customCmdHint => '\"Nom de la commande\": \"Commande\"';
@@ -102,6 +115,10 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get deleteServers => 'Supprimer des serveurs en lot';
@override
String get desktopTerminalTip =>
'Commande utilisée pour ouvrir lémulateur de terminal lors du lancement de sessions SSH.';
@override
String get dirEmpty => 'Assurez-vous que le répertoire est vide.';
@@ -111,6 +128,9 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get disk => 'Disque';
@override
String get diskHealth => 'Santé du disque';
@override
String get diskIgnorePath => 'Chemin à ignorer pour le disque';
@@ -123,7 +143,8 @@ class AppLocalizationsFr extends AppLocalizations {
}
@override
String get dockerEmptyRunningItems => 'Aucun conteneur en cours d\'exécution.\nCela peut être dû à :\n- L\'utilisateur d\'installation de Docker n\'est pas le même que celui configuré dans l\'application.\n- La variable d\'environnement DOCKER_HOST n\'a pas été lue correctement. Vous pouvez l\'obtenir en exécutant `echo \$DOCKER_HOST` dans le terminal.';
String get dockerEmptyRunningItems =>
'Aucun conteneur en cours d\'exécution.\nCela peut être dû à :\n- L\'utilisateur d\'installation de Docker n\'est pas le même que celui configuré dans l\'application.\n- La variable d\'environnement DOCKER_HOST n\'a pas été lue correctement. Vous pouvez l\'obtenir en exécutant `echo \$DOCKER_HOST` dans le terminal.';
@override
String dockerImagesFmt(Object count) {
@@ -134,7 +155,10 @@ class AppLocalizationsFr extends AppLocalizations {
String get dockerNotInstalled => 'Docker non installé';
@override
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
String dockerStatusRunningAndStoppedFmt(
Object runningCount,
Object stoppedCount,
) {
return '$runningCount en cours d\'exécution, $stoppedCount conteneur arrêté.';
}
@@ -147,7 +171,8 @@ class AppLocalizationsFr extends AppLocalizations {
String get doubleColumnMode => 'Mode double colonne';
@override
String get doubleColumnTip => 'Cette option n\'active que la fonctionnalité, qu\'elle puisse être activée dépend de la largeur de l\'appareil.';
String get doubleColumnTip =>
'Cette option n\'active que la fonctionnalité, qu\'elle puisse être activée dépend de la largeur de l\'appareil.';
@override
String get editVirtKeys => 'Modifier les touches virtuelles';
@@ -156,7 +181,11 @@ class AppLocalizationsFr extends AppLocalizations {
String get editor => 'Éditeur';
@override
String get editorHighlightTip => 'La performance actuelle de mise en surbrillance du code est pire et peut être désactivée en option pour s\'améliorer.';
String get editorHighlightTip =>
'La performance actuelle de mise en surbrillance du code est pire et peut être désactivée en option pour s\'améliorer.';
@override
String get emulator => 'Émulateur';
@override
String get encode => 'Encoder';
@@ -174,13 +203,15 @@ class AppLocalizationsFr extends AppLocalizations {
String get fallbackSshDest => 'Destino SSH alternativo';
@override
String get fdroidReleaseTip => 'Si vous avez téléchargé cette application depuis F-Droid, il est recommandé de désactiver cette option.';
String get fdroidReleaseTip =>
'Si vous avez téléchargé cette application depuis F-Droid, il est recommandé de désactiver cette option.';
@override
String get fgService => 'Service de premier plan';
@override
String get fgServiceTip => 'Après l\'activation, certains modèles d\'appareils peuvent planter. La désactivation peut empêcher certains modèles de maintenir les connexions SSH en arrière-plan. Veuillez autoriser les permissions de notification ServerBox, l\'exécution en arrière-plan et l\'auto-réveil dans les paramètres système.';
String get fgServiceTip =>
'Après l\'activation, certains modèles d\'appareils peuvent planter. La désactivation peut empêcher certains modèles de maintenir les connexions SSH en arrière-plan. Veuillez autoriser les permissions de notification ServerBox, l\'exécution en arrière-plan et l\'auto-réveil dans les paramètres système.';
@override
String fileTooLarge(Object file, Object size, Object sizeMax) {
@@ -209,7 +240,8 @@ class AppLocalizationsFr extends AppLocalizations {
String get fullScreenJitterHelp => 'Pour éviter les brûlures d\'écran';
@override
String get fullScreenTip => 'Le mode plein écran doit-il être activé lorsque l\'appareil est orienté en mode paysage ? Cette option s\'applique uniquement à l\'onglet serveur.';
String get fullScreenTip =>
'Le mode plein écran doit-il être activé lorsque l\'appareil est orienté en mode paysage ? Cette option s\'applique uniquement à l\'onglet serveur.';
@override
String get goBackQ => 'Revenir en arrière ?';
@@ -253,7 +285,8 @@ class AppLocalizationsFr extends AppLocalizations {
String get install => 'Installer';
@override
String get installDockerWithUrl => 'Veuillez d\'abord installer docker depuis https://docs.docker.com/engine/install.';
String get installDockerWithUrl =>
'Veuillez d\'abord installer docker depuis https://docs.docker.com/engine/install.';
@override
String get invalid => 'Invalide';
@@ -268,7 +301,8 @@ class AppLocalizationsFr extends AppLocalizations {
String get keepStatusWhenErr => 'Conserver l\'état du dernier serveur';
@override
String get keepStatusWhenErrTip => 'Uniquement en cas d\'erreur lors de l\'exécution du script';
String get keepStatusWhenErrTip =>
'Uniquement en cas d\'erreur lors de l\'exécution du script';
@override
String get keyAuth => 'Authentification par clé';
@@ -277,7 +311,8 @@ class AppLocalizationsFr extends AppLocalizations {
String get letterCache => 'Mise en cache des lettres';
@override
String get letterCacheTip => 'Recommandé de désactiver, mais après désactivation, il sera impossible de saisir des caractères CJK.';
String get letterCacheTip =>
'Recommandé de désactiver, mais après désactivation, il sera impossible de saisir des caractères CJK.';
@override
String get license => 'Licence';
@@ -315,13 +350,15 @@ class AppLocalizationsFr extends AppLocalizations {
String get more => 'Plus';
@override
String get moveOutServerFuncBtnsHelp => 'Activé : peut être affiché sous chaque carte sur la page de l\'onglet Serveur. Désactivé : peut être affiché en haut de la page de détails du serveur.';
String get moveOutServerFuncBtnsHelp =>
'Activé : peut être affiché sous chaque carte sur la page de l\'onglet Serveur. Désactivé : peut être affiché en haut de la page de détails du serveur.';
@override
String get ms => 'ms';
@override
String get needHomeDir => 'Si vous êtes utilisateur Synology, [consultez ici](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Les utilisateurs d\'autres systèmes doivent rechercher comment créer un répertoire personnel.';
String get needHomeDir =>
'Si vous êtes utilisateur Synology, [consultez ici](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Les utilisateurs d\'autres systèmes doivent rechercher comment créer un répertoire personnel.';
@override
String get needRestart => 'Nécessite un redémarrage de l\'application';
@@ -339,10 +376,12 @@ class AppLocalizationsFr extends AppLocalizations {
String get noLineChart => 'Ne pas utiliser de graphiques linéaires';
@override
String get noLineChartForCpu => 'Ne pas utiliser de graphiques linéaires pour l\'unité centrale';
String get noLineChartForCpu =>
'Ne pas utiliser de graphiques linéaires pour l\'unité centrale';
@override
String get noPrivateKeyTip => 'La clé privée n\'existe pas, elle a peut-être été supprimée ou il y a une erreur de configuration.';
String get noPrivateKeyTip =>
'La clé privée n\'existe pas, elle a peut-être été supprimée ou il y a une erreur de configuration.';
@override
String get noPromptAgain => 'Ne pas demander à nouveau';
@@ -357,19 +396,23 @@ class AppLocalizationsFr extends AppLocalizations {
String get onServerDetailPage => 'Sur la page de détails du serveur';
@override
String get onlyOneLine => 'Afficher uniquement en une seule ligne (défilement)';
String get onlyOneLine =>
'Afficher uniquement en une seule ligne (défilement)';
@override
String get onlyWhenCoreBiggerThan8 => 'Fonctionne uniquement lorsque le nombre de cœurs est > 8';
String get onlyWhenCoreBiggerThan8 =>
'Fonctionne uniquement lorsque le nombre de cœurs est > 8';
@override
String get openLastPath => 'Ouvrir le dernier chemin';
@override
String get openLastPathTip => 'Les différents serveurs auront des journaux différents, et le journal est le chemin vers la sortie';
String get openLastPathTip =>
'Les différents serveurs auront des journaux différents, et le journal est le chemin vers la sortie';
@override
String get parseContainerStatsTip => 'L\'analyse de l\'occupation des conteneurs Docker est relativement lente.';
String get parseContainerStatsTip =>
'L\'analyse de l\'occupation des conteneurs Docker est relativement lente.';
@override
String percentOfSize(Object percent, Object size) {
@@ -383,10 +426,12 @@ class AppLocalizationsFr extends AppLocalizations {
String get pingAvg => 'Moy.:';
@override
String get pingInputIP => 'Veuillez saisir une adresse IP / un domaine cible.';
String get pingInputIP =>
'Veuillez saisir une adresse IP / un domaine cible.';
@override
String get pingNoServer => 'Aucun serveur à pinger.\nVeuillez ajouter un serveur dans l\'onglet serveur.';
String get pingNoServer =>
'Aucun serveur à pinger.\nVeuillez ajouter un serveur dans l\'onglet serveur.';
@override
String get pkg => 'Pkg';
@@ -397,6 +442,10 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get port => 'Port';
@override
String get preferDiskAmount =>
'Prioriser laffichage de la capacité du disque';
@override
String get preview => 'Aperçu';
@@ -410,13 +459,16 @@ class AppLocalizationsFr extends AppLocalizations {
String get pushToken => 'Jeton d\'identification';
@override
String get pveIgnoreCertTip => 'Il n\'est pas recommandé de l\'activer, attention aux risques de sécurité ! Si vous utilisez le certificat par défaut de PVE, vous devez activer cette option.';
String get pveIgnoreCertTip =>
'Il n\'est pas recommandé de l\'activer, attention aux risques de sécurité ! Si vous utilisez le certificat par défaut de PVE, vous devez activer cette option.';
@override
String get pveLoginFailed => 'Échec de la connexion. Impossible d\'authentifier avec le nom d\'utilisateur / mot de passe de la configuration du serveur pour la connexion Linux PAM.';
String get pveLoginFailed =>
'Échec de la connexion. Impossible d\'authentifier avec le nom d\'utilisateur / mot de passe de la configuration du serveur pour la connexion Linux PAM.';
@override
String get pveVersionLow => 'Cette fonctionnalité est actuellement en phase de test et n\'a été testée que sur PVE 8+. Veuillez l\'utiliser avec prudence.';
String get pveVersionLow =>
'Cette fonctionnalité est actuellement en phase de test et n\'a été testée que sur PVE 8+. Veuillez l\'utiliser avec prudence.';
@override
String get pwd => 'Mot de passe';
@@ -431,7 +483,8 @@ class AppLocalizationsFr extends AppLocalizations {
String get rememberPwdInMem => 'Mémoriser le mot de passe en mémoire';
@override
String get rememberPwdInMemTip => 'Utilisé pour les conteneurs, la suspension, etc.';
String get rememberPwdInMemTip =>
'Utilisé pour les conteneurs, la suspension, etc.';
@override
String get rememberWindowSize => 'Se souvenir de la taille de la fenêtre';
@@ -479,7 +532,8 @@ class AppLocalizationsFr extends AppLocalizations {
String get server => 'Serveur';
@override
String get serverDetailOrder => 'Ordre des widgets de la page de détails du serveur';
String get serverDetailOrder =>
'Ordre des widgets de la page de détails du serveur';
@override
String get serverFuncBtns => 'Boutons de fonction du serveur';
@@ -491,10 +545,12 @@ class AppLocalizationsFr extends AppLocalizations {
String get sftpDlPrepare => 'Préparation de la connexion...';
@override
String get sftpEditorTip => 'Si vide, utilisez léditeur de fichiers intégré de lapplication. Si une valeur est présente, utilisez léditeur du serveur distant, par exemple `vim` (il est recommandé de détecter automatiquement selon `EDITOR`).';
String get sftpEditorTip =>
'Si vide, utilisez léditeur de fichiers intégré de lapplication. Si une valeur est présente, utilisez léditeur du serveur distant, par exemple `vim` (il est recommandé de détecter automatiquement selon `EDITOR`).';
@override
String get sftpRmrDirSummary => 'Utilisez `rm -r` pour supprimer un dossier en SFTP.';
String get sftpRmrDirSummary =>
'Utilisez `rm -r` pour supprimer un dossier en SFTP.';
@override
String get sftpSSHConnected => 'SFTP Connecté';
@@ -521,7 +577,8 @@ class AppLocalizationsFr extends AppLocalizations {
String get specifyDev => 'Spécifier l\'appareil';
@override
String get specifyDevTip => 'Par exemple, les statistiques de trafic réseau concernent par défaut tous les appareils. Vous pouvez spécifier ici un appareil particulier.';
String get specifyDevTip =>
'Par exemple, les statistiques de trafic réseau concernent par défaut tous les appareils. Vous pouvez spécifier ici un appareil particulier.';
@override
String get speed => 'Vitesse';
@@ -532,7 +589,8 @@ class AppLocalizationsFr extends AppLocalizations {
}
@override
String get sshTermHelp => 'Lorsque le terminal est défilable, faire glisser horizontalement permet de sélectionner du texte. En cliquant sur le bouton du clavier, vous activez/désactivez le clavier. L\'icône de fichier ouvre le chemin actuel SFTP. Le bouton du presse-papiers copie le contenu lorsque du texte est sélectionné, et colle le contenu du presse-papiers dans le terminal lorsqu\'aucun texte n\'est sélectionné et qu\'il y a du contenu dans le presse-papiers. L\'icône de code colle des extraits de code dans le terminal et les exécute.';
String get sshTermHelp =>
'Lorsque le terminal est défilable, faire glisser horizontalement permet de sélectionner du texte. En cliquant sur le bouton du clavier, vous activez/désactivez le clavier. L\'icône de fichier ouvre le chemin actuel SFTP. Le bouton du presse-papiers copie le contenu lorsque du texte est sélectionné, et colle le contenu du presse-papiers dans le terminal lorsqu\'aucun texte n\'est sélectionné et qu\'il y a du contenu dans le presse-papiers. L\'icône de code colle des extraits de code dans le terminal et les exécute.';
@override
String sshTip(Object url) {
@@ -540,7 +598,8 @@ class AppLocalizationsFr extends AppLocalizations {
}
@override
String get sshVirtualKeyAutoOff => 'Activation automatique des touches virtuelles';
String get sshVirtualKeyAutoOff =>
'Activation automatique des touches virtuelles';
@override
String get start => 'Démarrer';
@@ -561,13 +620,15 @@ class AppLocalizationsFr extends AppLocalizations {
String get storage => 'Stockage';
@override
String get supportFmtArgs => 'Les paramètres de mise en forme suivants sont pris en charge :';
String get supportFmtArgs =>
'Les paramètres de mise en forme suivants sont pris en charge :';
@override
String get suspend => 'Suspendre';
@override
String get suspendTip => 'La fonction de suspension nécessite des privilèges root et le support de systemd.';
String get suspendTip =>
'La fonction de suspension nécessite des privilèges root et le support de systemd.';
@override
String switchTo(Object val) {
@@ -578,7 +639,8 @@ class AppLocalizationsFr extends AppLocalizations {
String get sync => 'Sync';
@override
String get syncTip => 'Un redémarrage peut être nécessaire pour que certains changements prennent effet.';
String get syncTip =>
'Un redémarrage peut être nécessaire pour que certains changements prennent effet.';
@override
String get system => 'Système';
@@ -590,7 +652,8 @@ class AppLocalizationsFr extends AppLocalizations {
String get temperature => 'Température';
@override
String get termFontSizeTip => 'Ce paramètre affectera la taille du terminal (largeur et hauteur). Vous pouvez zoomer sur la page du terminal pour ajuster la taille de la police de la session en cours.';
String get termFontSizeTip =>
'Ce paramètre affectera la taille du terminal (largeur et hauteur). Vous pouvez zoomer sur la page du terminal pour ajuster la taille de la police de la session en cours.';
@override
String get terminal => 'Terminal';
@@ -602,7 +665,8 @@ class AppLocalizationsFr extends AppLocalizations {
String get textScaler => 'Mise à l\'échelle du texte';
@override
String get textScalerTip => '1.0 => 100% (taille originale), fonctionne uniquement sur la partie de la police de la page du serveur, il est déconseillé de la modifier.';
String get textScalerTip =>
'1.0 => 100% (taille originale), fonctionne uniquement sur la partie de la police de la page du serveur, il est déconseillé de la modifier.';
@override
String get theme => 'Thème';
@@ -635,10 +699,12 @@ class AppLocalizationsFr extends AppLocalizations {
String get update => 'Mettre à jour';
@override
String get updateIntervalEqual0 => 'Vous avez défini à 0, la mise à jour ne se fera pas automatiquement.\nImpossible de calculer l\'état du CPU.';
String get updateIntervalEqual0 =>
'Vous avez défini à 0, la mise à jour ne se fera pas automatiquement.\nImpossible de calculer l\'état du CPU.';
@override
String get updateServerStatusInterval => 'Intervalle de mise à jour de l\'état du serveur';
String get updateServerStatusInterval =>
'Intervalle de mise à jour de l\'état du serveur';
@override
String get upload => 'Télécharger';
@@ -653,7 +719,8 @@ class AppLocalizationsFr extends AppLocalizations {
String get useCdn => 'Utiliser CDN';
@override
String get useCdnTip => 'Il est recommandé aux utilisateurs non chinois d\'utiliser le CDN. Souhaitez-vous l\'utiliser ?';
String get useCdnTip =>
'Il est recommandé aux utilisateurs non chinois d\'utiliser le CDN. Souhaitez-vous l\'utiliser ?';
@override
String get useNoPwd => 'Aucun mot de passe ne sera utilisé';
@@ -671,7 +738,8 @@ class AppLocalizationsFr extends AppLocalizations {
String get viewErr => 'Voir erreur';
@override
String get virtKeyHelpClipboard => 'Copiez dans le presse-papiers si le terminal sélectionné n\'est pas vide, sinon collez le contenu du presse-papiers dans le terminal.';
String get virtKeyHelpClipboard =>
'Copiez dans le presse-papiers si le terminal sélectionné n\'est pas vide, sinon collez le contenu du presse-papiers dans le terminal.';
@override
String get virtKeyHelpIME => 'Activer/désactiver le clavier';
@@ -680,7 +748,8 @@ class AppLocalizationsFr extends AppLocalizations {
String get virtKeyHelpSFTP => 'Ouvrir le répertoire actuel en SFTP.';
@override
String get waitConnection => 'Veuillez attendre que la connexion soit établie.';
String get waitConnection =>
'Veuillez attendre que la connexion soit établie.';
@override
String get wakeLock => 'Maintenir éveillé';
@@ -695,14 +764,17 @@ class AppLocalizationsFr extends AppLocalizations {
String get whenOpenApp => 'À l\'ouverture de l\'application';
@override
String get wolTip => 'Après avoir configuré le WOL (Wake-on-LAN), une requête WOL est envoyée chaque fois que le serveur est connecté.';
String get wolTip =>
'Après avoir configuré le WOL (Wake-on-LAN), une requête WOL est envoyée chaque fois que le serveur est connecté.';
@override
String get write => 'Écrire';
@override
String get writeScriptFailTip => 'Échec de l\'écriture dans le script, probablement en raison d\'un manque de permissions ou que le répertoire n\'existe pas.';
String get writeScriptFailTip =>
'Échec de l\'écriture dans le script, probablement en raison d\'un manque de permissions ou que le répertoire n\'existe pas.';
@override
String get writeScriptTip => 'Après la connexion au serveur, un script sera écrit dans ~/.config/server_box pour surveiller létat du système. Vous pouvez examiner le contenu du script.';
String get writeScriptTip =>
'Après la connexion au serveur, un script sera écrit dans ~/.config/server_box pour surveiller létat du système. Vous pouvez examiner le contenu du script.';
}

View File

@@ -1,3 +1,5 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'l10n.dart';
// ignore_for_file: type=lint
@@ -7,13 +9,15 @@ class AppLocalizationsId extends AppLocalizations {
AppLocalizationsId([String locale = 'id']) : super(locale);
@override
String get aboutThanks => 'Terima kasih kepada orang -orang berikut yang berpartisipasi.';
String get aboutThanks =>
'Terima kasih kepada orang -orang berikut yang berpartisipasi.';
@override
String get acceptBeta => 'Terima pembaruan versi uji coba';
@override
String get addSystemPrivateKeyTip => 'Saat ini tidak memiliki kunci privat, apakah Anda menambahkan kunci yang disertakan dengan sistem (~/.ssh/id_rsa)?';
String get addSystemPrivateKeyTip =>
'Saat ini tidak memiliki kunci privat, apakah Anda menambahkan kunci yang disertakan dengan sistem (~/.ssh/id_rsa)?';
@override
String get added2List => 'Ditambahkan ke Daftar Tugas';
@@ -25,10 +29,12 @@ class AppLocalizationsId extends AppLocalizations {
String get alreadyLastDir => 'Sudah di direktori terakhir.';
@override
String get authFailTip => 'Otentikasi gagal, silakan periksa apakah kata sandi/kunci/host/pengguna, dll, salah.';
String get authFailTip =>
'Otentikasi gagal, silakan periksa apakah kata sandi/kunci/host/pengguna, dll, salah.';
@override
String get autoBackupConflict => 'Hanya satu pencadangan otomatis yang dapat diaktifkan pada saat yang bersamaan.';
String get autoBackupConflict =>
'Hanya satu pencadangan otomatis yang dapat diaktifkan pada saat yang bersamaan.';
@override
String get autoConnect => 'Hubungkan otomatis';
@@ -40,7 +46,8 @@ class AppLocalizationsId extends AppLocalizations {
String get autoUpdateHomeWidget => 'Widget Rumah Pembaruan Otomatis';
@override
String get backupTip => 'Data yang diekspor hanya dienkripsi.\nTolong jaga keamanannya.';
String get backupTip =>
'Data yang diekspor hanya dienkripsi.\nTolong jaga keamanannya.';
@override
String get backupVersionNotMatch => 'Versi cadangan tidak cocok.';
@@ -52,7 +59,8 @@ class AppLocalizationsId extends AppLocalizations {
String get bgRun => 'Jalankan di Backgroud';
@override
String get bgRunTip => 'Sakelar ini hanya berarti aplikasi akan mencoba berjalan di latar belakang, apakah aplikasi dapat berjalan di latar belakang tergantung pada apakah izin diaktifkan atau tidak. Untuk Android asli, nonaktifkan \"Pengoptimalan Baterai\" di aplikasi ini, dan untuk miui, ubah kebijakan penghematan daya ke \"Tidak Terbatas\".';
String get bgRunTip =>
'Sakelar ini hanya berarti aplikasi akan mencoba berjalan di latar belakang, apakah aplikasi dapat berjalan di latar belakang tergantung pada apakah izin diaktifkan atau tidak. Untuk Android asli, nonaktifkan \"Pengoptimalan Baterai\" di aplikasi ini, dan untuk miui, ubah kebijakan penghematan daya ke \"Tidak Terbatas\".';
@override
String get closeAfterSave => 'Simpan dan tutup';
@@ -61,7 +69,8 @@ class AppLocalizationsId extends AppLocalizations {
String get cmd => 'Memerintah';
@override
String get collapseUITip => 'Apakah akan menciutkan daftar panjang yang ada di UI secara default atau tidak';
String get collapseUITip =>
'Apakah akan menciutkan daftar panjang yang ada di UI secara default atau tidak';
@override
String get conn => 'Koneksi';
@@ -70,7 +79,8 @@ class AppLocalizationsId extends AppLocalizations {
String get container => 'Wadah';
@override
String get containerTrySudoTip => 'Contohnya: Di dalam aplikasi, pengguna diatur sebagai aaa, tetapi Docker diinstal di bawah pengguna root. Dalam kasus ini, Anda perlu mengaktifkan opsi ini.';
String get containerTrySudoTip =>
'Contohnya: Di dalam aplikasi, pengguna diatur sebagai aaa, tetapi Docker diinstal di bawah pengguna root. Dalam kasus ini, Anda perlu mengaktifkan opsi ini.';
@override
String get convert => 'Mengubah';
@@ -79,7 +89,8 @@ class AppLocalizationsId extends AppLocalizations {
String get copyPath => 'Path Copy';
@override
String get cpuViewAsProgressTip => 'Tampilkan tingkat penggunaan setiap CPU dalam gaya bilah kemajuan (gaya lama)';
String get cpuViewAsProgressTip =>
'Tampilkan tingkat penggunaan setiap CPU dalam gaya bilah kemajuan (gaya lama)';
@override
String get cursorType => 'Jenis kursor';
@@ -88,7 +99,8 @@ class AppLocalizationsId extends AppLocalizations {
String get customCmd => 'Perintah kustom';
@override
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
String get customCmdDocUrl =>
'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
@override
String get customCmdHint => '\"Nama Perintah\": \"Perintah\"';
@@ -102,6 +114,10 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get deleteServers => 'Penghapusan server secara batch';
@override
String get desktopTerminalTip =>
'Perintah yang digunakan untuk membuka emulator terminal saat memulai sesi SSH.';
@override
String get dirEmpty => 'Pastikan dir kosong.';
@@ -111,6 +127,9 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get disk => 'Disk';
@override
String get diskHealth => 'Kesehatan disk';
@override
String get diskIgnorePath => 'Abaikan jalan untuk disk';
@@ -123,7 +142,8 @@ class AppLocalizationsId extends AppLocalizations {
}
@override
String get dockerEmptyRunningItems => 'Tidak ada wadah yang sedang berjalan.\nHal ini dapat terjadi karena:\n- Pengguna instalasi Docker tidak sama dengan nama pengguna yang dikonfigurasi di dalam Aplikasi.\n- Variabel lingkungan DOCKER_HOST tidak terbaca dengan benar. Anda bisa mendapatkannya dengan menjalankan `echo \$DOCKER_HOST` di terminal.';
String get dockerEmptyRunningItems =>
'Tidak ada wadah yang sedang berjalan.\nHal ini dapat terjadi karena:\n- Pengguna instalasi Docker tidak sama dengan nama pengguna yang dikonfigurasi di dalam Aplikasi.\n- Variabel lingkungan DOCKER_HOST tidak terbaca dengan benar. Anda bisa mendapatkannya dengan menjalankan `echo \$DOCKER_HOST` di terminal.';
@override
String dockerImagesFmt(Object count) {
@@ -134,7 +154,10 @@ class AppLocalizationsId extends AppLocalizations {
String get dockerNotInstalled => 'Docker tidak terpasang';
@override
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
String dockerStatusRunningAndStoppedFmt(
Object runningCount,
Object stoppedCount,
) {
return '$runningCount running, $stoppedCount container stopped.';
}
@@ -147,7 +170,8 @@ class AppLocalizationsId extends AppLocalizations {
String get doubleColumnMode => 'Mode kolom ganda';
@override
String get doubleColumnTip => 'Opsi ini hanya mengaktifkan fitur, apakah itu benar-benar dapat diaktifkan tergantung pada lebar perangkat';
String get doubleColumnTip =>
'Opsi ini hanya mengaktifkan fitur, apakah itu benar-benar dapat diaktifkan tergantung pada lebar perangkat';
@override
String get editVirtKeys => 'Edit kunci virtual';
@@ -156,7 +180,11 @@ class AppLocalizationsId extends AppLocalizations {
String get editor => 'Editor';
@override
String get editorHighlightTip => 'Performa penyorotan kode saat ini lebih buruk, dan dapat dimatikan secara opsional untuk perbaikan.';
String get editorHighlightTip =>
'Performa penyorotan kode saat ini lebih buruk, dan dapat dimatikan secara opsional untuk perbaikan.';
@override
String get emulator => 'Emulator';
@override
String get encode => 'Menyandi';
@@ -174,13 +202,15 @@ class AppLocalizationsId extends AppLocalizations {
String get fallbackSshDest => 'Tujuan SSH mundur';
@override
String get fdroidReleaseTip => 'Jika Anda mengunduh aplikasi ini dari F-Droid, disarankan untuk mematikan opsi ini.';
String get fdroidReleaseTip =>
'Jika Anda mengunduh aplikasi ini dari F-Droid, disarankan untuk mematikan opsi ini.';
@override
String get fgService => 'Layanan Latar Depan';
@override
String get fgServiceTip => 'Setelah diaktifkan, beberapa model perangkat mungkin crash. Menonaktifkannya dapat menyebabkan beberapa model tidak dapat mempertahankan koneksi SSH di latar belakang. Harap izinkan perizinan notifikasi ServerBox, menjalankan di latar belakang, dan bangun mandiri di pengaturan sistem.';
String get fgServiceTip =>
'Setelah diaktifkan, beberapa model perangkat mungkin crash. Menonaktifkannya dapat menyebabkan beberapa model tidak dapat mempertahankan koneksi SSH di latar belakang. Harap izinkan perizinan notifikasi ServerBox, menjalankan di latar belakang, dan bangun mandiri di pengaturan sistem.';
@override
String fileTooLarge(Object file, Object size, Object sizeMax) {
@@ -209,7 +239,8 @@ class AppLocalizationsId extends AppLocalizations {
String get fullScreenJitterHelp => 'Untuk menghindari pembakaran layar';
@override
String get fullScreenTip => 'Apakah mode layar penuh diaktifkan ketika perangkat diputar ke modus lanskap? Opsi ini hanya berlaku untuk tab server.';
String get fullScreenTip =>
'Apakah mode layar penuh diaktifkan ketika perangkat diputar ke modus lanskap? Opsi ini hanya berlaku untuk tab server.';
@override
String get goBackQ => 'Datang kembali?';
@@ -253,7 +284,8 @@ class AppLocalizationsId extends AppLocalizations {
String get install => 'Install';
@override
String get installDockerWithUrl => 'Silakan https://docs.docker.com/engine/install Docker pertama.';
String get installDockerWithUrl =>
'Silakan https://docs.docker.com/engine/install Docker pertama.';
@override
String get invalid => 'Tidak valid';
@@ -268,7 +300,8 @@ class AppLocalizationsId extends AppLocalizations {
String get keepStatusWhenErr => 'Menyimpan status server terakhir';
@override
String get keepStatusWhenErrTip => 'Hanya ketika terjadi kesalahan saat menjalankan skrip';
String get keepStatusWhenErrTip =>
'Hanya ketika terjadi kesalahan saat menjalankan skrip';
@override
String get keyAuth => 'Auth kunci';
@@ -277,7 +310,8 @@ class AppLocalizationsId extends AppLocalizations {
String get letterCache => 'Caching huruf';
@override
String get letterCacheTip => 'Direkomendasikan untuk menonaktifkan, tetapi setelah dinonaktifkan, tidak mungkin untuk memasukkan karakter CJK.';
String get letterCacheTip =>
'Direkomendasikan untuk menonaktifkan, tetapi setelah dinonaktifkan, tidak mungkin untuk memasukkan karakter CJK.';
@override
String get license => 'Lisensi';
@@ -315,13 +349,15 @@ class AppLocalizationsId extends AppLocalizations {
String get more => 'Lebih Banyak';
@override
String get moveOutServerFuncBtnsHelp => 'Aktif: dapat ditampilkan di bawah setiap kartu pada halaman Tab Server. Nonaktif: dapat ditampilkan di bagian atas halaman Rincian Server.';
String get moveOutServerFuncBtnsHelp =>
'Aktif: dapat ditampilkan di bawah setiap kartu pada halaman Tab Server. Nonaktif: dapat ditampilkan di bagian atas halaman Rincian Server.';
@override
String get ms => 'MS';
@override
String get needHomeDir => 'Jika Anda pengguna Synology, [lihat di sini](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Pengguna sistem lain perlu mencari cara membuat direktori home.';
String get needHomeDir =>
'Jika Anda pengguna Synology, [lihat di sini](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Pengguna sistem lain perlu mencari cara membuat direktori home.';
@override
String get needRestart => 'Perlu memulai ulang aplikasi';
@@ -342,7 +378,8 @@ class AppLocalizationsId extends AppLocalizations {
String get noLineChartForCpu => 'Jangan gunakan diagram garis untuk CPU';
@override
String get noPrivateKeyTip => 'Kunci privat tidak ada, mungkin telah dihapus atau ada kesalahan konfigurasi.';
String get noPrivateKeyTip =>
'Kunci privat tidak ada, mungkin telah dihapus atau ada kesalahan konfigurasi.';
@override
String get noPromptAgain => 'Jangan tanya lagi';
@@ -357,7 +394,8 @@ class AppLocalizationsId extends AppLocalizations {
String get onServerDetailPage => 'Di halaman detail server';
@override
String get onlyOneLine => 'Hanya tampilkan sebagai satu baris (dapat digulir)';
String get onlyOneLine =>
'Hanya tampilkan sebagai satu baris (dapat digulir)';
@override
String get onlyWhenCoreBiggerThan8 => 'Berlaku hanya ketika jumlah inti > 8';
@@ -366,10 +404,12 @@ class AppLocalizationsId extends AppLocalizations {
String get openLastPath => 'Buka jalur terakhir';
@override
String get openLastPathTip => 'Server yang berbeda akan memiliki catatan yang berbeda, dan catatan tersebut adalah jalur menuju pintu keluar';
String get openLastPathTip =>
'Server yang berbeda akan memiliki catatan yang berbeda, dan catatan tersebut adalah jalur menuju pintu keluar';
@override
String get parseContainerStatsTip => 'Parsing status okupansi oleh Docker agak lambat';
String get parseContainerStatsTip =>
'Parsing status okupansi oleh Docker agak lambat';
@override
String percentOfSize(Object percent, Object size) {
@@ -386,7 +426,8 @@ class AppLocalizationsId extends AppLocalizations {
String get pingInputIP => 'Harap masukkan IP / domain target.';
@override
String get pingNoServer => 'Tidak ada server untuk melakukan ping.\nHarap tambahkan server di tab Server.';
String get pingNoServer =>
'Tidak ada server untuk melakukan ping.\nHarap tambahkan server di tab Server.';
@override
String get pkg => 'Pkg';
@@ -397,6 +438,9 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get port => 'Port';
@override
String get preferDiskAmount => 'Prioritaskan tampilan kapasitas disk';
@override
String get preview => 'Pratinjau';
@@ -410,13 +454,16 @@ class AppLocalizationsId extends AppLocalizations {
String get pushToken => 'Dorong token';
@override
String get pveIgnoreCertTip => 'Tidak disarankan untuk diaktifkan, waspadai risiko keamanan! Jika Anda menggunakan sertifikat default dari PVE, Anda perlu mengaktifkan opsi ini.';
String get pveIgnoreCertTip =>
'Tidak disarankan untuk diaktifkan, waspadai risiko keamanan! Jika Anda menggunakan sertifikat default dari PVE, Anda perlu mengaktifkan opsi ini.';
@override
String get pveLoginFailed => 'Login gagal. Tidak dapat mengautentikasi dengan nama pengguna/kata sandi dari konfigurasi server untuk login Linux PAM.';
String get pveLoginFailed =>
'Login gagal. Tidak dapat mengautentikasi dengan nama pengguna/kata sandi dari konfigurasi server untuk login Linux PAM.';
@override
String get pveVersionLow => 'Fitur ini saat ini sedang dalam tahap pengujian dan hanya diuji pada PVE 8+. Gunakan dengan hati-hati.';
String get pveVersionLow =>
'Fitur ini saat ini sedang dalam tahap pengujian dan hanya diuji pada PVE 8+. Gunakan dengan hati-hati.';
@override
String get pwd => 'Kata sandi';
@@ -431,7 +478,8 @@ class AppLocalizationsId extends AppLocalizations {
String get rememberPwdInMem => 'Ingat kata sandi di dalam memori';
@override
String get rememberPwdInMemTip => 'Digunakan untuk kontainer, menangguhkan, dll.';
String get rememberPwdInMemTip =>
'Digunakan untuk kontainer, menangguhkan, dll.';
@override
String get rememberWindowSize => 'Ingat ukuran jendela';
@@ -491,7 +539,8 @@ class AppLocalizationsId extends AppLocalizations {
String get sftpDlPrepare => 'Bersiap untuk terhubung ...';
@override
String get sftpEditorTip => 'Jika kosong, gunakan editor file bawaan aplikasi. Jika ada nilai, gunakan editor server jarak jauh, misalnya `vim` (disarankan untuk mendeteksi secara otomatis sesuai `EDITOR`).';
String get sftpEditorTip =>
'Jika kosong, gunakan editor file bawaan aplikasi. Jika ada nilai, gunakan editor server jarak jauh, misalnya `vim` (disarankan untuk mendeteksi secara otomatis sesuai `EDITOR`).';
@override
String get sftpRmrDirSummary => 'Gunakan `rm -r` untuk menghapus dir di SFTP';
@@ -521,7 +570,8 @@ class AppLocalizationsId extends AppLocalizations {
String get specifyDev => 'Tentukan perangkat';
@override
String get specifyDevTip => 'Misalnya, statistik lalu lintas jaringan secara default adalah untuk semua perangkat. Anda dapat menentukan perangkat tertentu di sini.';
String get specifyDevTip =>
'Misalnya, statistik lalu lintas jaringan secara default adalah untuk semua perangkat. Anda dapat menentukan perangkat tertentu di sini.';
@override
String get speed => 'Kecepatan';
@@ -532,7 +582,8 @@ class AppLocalizationsId extends AppLocalizations {
}
@override
String get sshTermHelp => 'Ketika terminal dapat digulirkan, menggeser secara horizontal dapat memilih teks. Mengklik tombol keyboard mengaktifkan/menonaktifkan keyboard. Ikon file membuka SFTP jalur saat ini. Tombol papan klip menyalin konten saat teks dipilih, dan menempelkan konten dari papan klip ke terminal saat tidak ada teks yang dipilih dan ada konten di papan klip. Ikon kode menempelkan potongan kode ke terminal dan mengeksekusinya.';
String get sshTermHelp =>
'Ketika terminal dapat digulirkan, menggeser secara horizontal dapat memilih teks. Mengklik tombol keyboard mengaktifkan/menonaktifkan keyboard. Ikon file membuka SFTP jalur saat ini. Tombol papan klip menyalin konten saat teks dipilih, dan menempelkan konten dari papan klip ke terminal saat tidak ada teks yang dipilih dan ada konten di papan klip. Ikon kode menempelkan potongan kode ke terminal dan mengeksekusinya.';
@override
String sshTip(Object url) {
@@ -567,7 +618,8 @@ class AppLocalizationsId extends AppLocalizations {
String get suspend => 'Suspend';
@override
String get suspendTip => 'Fungsi penangguhan memerlukan hak akses root dan dukungan systemd.';
String get suspendTip =>
'Fungsi penangguhan memerlukan hak akses root dan dukungan systemd.';
@override
String switchTo(Object val) {
@@ -578,7 +630,8 @@ class AppLocalizationsId extends AppLocalizations {
String get sync => 'Sinkronisasi';
@override
String get syncTip => 'Pengaktifan ulang mungkin diperlukan agar beberapa perubahan dapat diterapkan.';
String get syncTip =>
'Pengaktifan ulang mungkin diperlukan agar beberapa perubahan dapat diterapkan.';
@override
String get system => 'Sistem';
@@ -590,7 +643,8 @@ class AppLocalizationsId extends AppLocalizations {
String get temperature => 'Suhu';
@override
String get termFontSizeTip => 'Pengaturan ini akan memengaruhi ukuran terminal (lebar dan tinggi). Anda dapat melakukan zoom pada halaman terminal untuk menyesuaikan ukuran font sesi saat ini.';
String get termFontSizeTip =>
'Pengaturan ini akan memengaruhi ukuran terminal (lebar dan tinggi). Anda dapat melakukan zoom pada halaman terminal untuk menyesuaikan ukuran font sesi saat ini.';
@override
String get terminal => 'Terminal';
@@ -602,7 +656,8 @@ class AppLocalizationsId extends AppLocalizations {
String get textScaler => 'Penskalaan font';
@override
String get textScalerTip => '1.0 => 100% (ukuran asli), hanya berfungsi pada bagian halaman server font, tidak disarankan untuk diubah.';
String get textScalerTip =>
'1.0 => 100% (ukuran asli), hanya berfungsi pada bagian halaman server font, tidak disarankan untuk diubah.';
@override
String get theme => ' Tema';
@@ -635,7 +690,8 @@ class AppLocalizationsId extends AppLocalizations {
String get update => 'Memperbarui';
@override
String get updateIntervalEqual0 => 'Anda mengatur ke 0, tidak akan memperbarui secara otomatis.\nTidak dapat menghitung status CPU.';
String get updateIntervalEqual0 =>
'Anda mengatur ke 0, tidak akan memperbarui secara otomatis.\nTidak dapat menghitung status CPU.';
@override
String get updateServerStatusInterval => 'Interval Pembaruan Status Server';
@@ -653,7 +709,8 @@ class AppLocalizationsId extends AppLocalizations {
String get useCdn => 'Menggunakan CDN';
@override
String get useCdnTip => 'Pengguna non-Cina disarankan menggunakan CDN. Apakah Anda ingin menggunakannya?';
String get useCdnTip =>
'Pengguna non-Cina disarankan menggunakan CDN. Apakah Anda ingin menggunakannya?';
@override
String get useNoPwd => 'Tidak ada kata sandi yang akan digunakan';
@@ -671,7 +728,8 @@ class AppLocalizationsId extends AppLocalizations {
String get viewErr => 'Lihat kesalahan';
@override
String get virtKeyHelpClipboard => 'Salin ke clipboard jika terminal yang dipilih tidak kosong, jika tidak, tempel isi clipboard ke terminal.';
String get virtKeyHelpClipboard =>
'Salin ke clipboard jika terminal yang dipilih tidak kosong, jika tidak, tempel isi clipboard ke terminal.';
@override
String get virtKeyHelpIME => 'Menyalakan/mematikan keyboard';
@@ -695,14 +753,17 @@ class AppLocalizationsId extends AppLocalizations {
String get whenOpenApp => 'Saat membuka aplikasi';
@override
String get wolTip => 'Setelah mengonfigurasi WOL (Wake-on-LAN), permintaan WOL dikirim setiap kali server terhubung.';
String get wolTip =>
'Setelah mengonfigurasi WOL (Wake-on-LAN), permintaan WOL dikirim setiap kali server terhubung.';
@override
String get write => 'Tulis';
@override
String get writeScriptFailTip => 'Penulisan ke skrip gagal, mungkin karena tidak ada izin atau direktori tidak ada.';
String get writeScriptFailTip =>
'Penulisan ke skrip gagal, mungkin karena tidak ada izin atau direktori tidak ada.';
@override
String get writeScriptTip => 'Setelah terhubung ke server, sebuah skrip akan ditulis ke ~/.config/server_box untuk memantau status sistem. Anda dapat meninjau konten skrip tersebut.';
String get writeScriptTip =>
'Setelah terhubung ke server, sebuah skrip akan ditulis ke ~/.config/server_box untuk memantau status sistem. Anda dapat meninjau konten skrip tersebut.';
}

View File

@@ -1,3 +1,5 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'l10n.dart';
// ignore_for_file: type=lint
@@ -13,7 +15,8 @@ class AppLocalizationsJa extends AppLocalizations {
String get acceptBeta => 'テストバージョンの更新を受け入れる';
@override
String get addSystemPrivateKeyTip => '現在秘密鍵がありません。システムのデフォルト(~/.ssh/id_rsa)を追加しますか?';
String get addSystemPrivateKeyTip =>
'現在秘密鍵がありません。システムのデフォルト(~/.ssh/id_rsa)を追加しますか?';
@override
String get added2List => 'タスクリストに追加されました';
@@ -52,7 +55,8 @@ class AppLocalizationsJa extends AppLocalizations {
String get bgRun => 'バックグラウンド実行';
@override
String get bgRunTip => 'このスイッチはプログラムがバックグラウンドで実行を試みることを意味しますが、実際にバックグラウンドで実行できるかどうかは、権限が有効になっているかに依存します。AOSPベースのAndroid ROMでは、このアプリの「バッテリー最適化」をオフにしてください。MIUIでは、省エネモードを「無制限」に変更してください。';
String get bgRunTip =>
'このスイッチはプログラムがバックグラウンドで実行を試みることを意味しますが、実際にバックグラウンドで実行できるかどうかは、権限が有効になっているかに依存します。AOSPベースのAndroid ROMでは、このアプリの「バッテリー最適化」をオフにしてください。MIUIでは、省エネモードを「無制限」に変更してください。';
@override
String get closeAfterSave => '保存して閉じる';
@@ -70,7 +74,8 @@ class AppLocalizationsJa extends AppLocalizations {
String get container => 'コンテナ';
@override
String get containerTrySudoTip => 'アプリ内でユーザーをaaaに設定しているが、Dockerがrootユーザーでインストールされている場合、このオプションを有効にする必要があります';
String get containerTrySudoTip =>
'アプリ内でユーザーをaaaに設定しているが、Dockerがrootユーザーでインストールされている場合、このオプションを有効にする必要があります';
@override
String get convert => '変換';
@@ -88,7 +93,8 @@ class AppLocalizationsJa extends AppLocalizations {
String get customCmd => 'カスタムコマンド';
@override
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
String get customCmdDocUrl =>
'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
@override
String get customCmdHint => '\"コマンド名\": \"コマンド\"';
@@ -102,6 +108,9 @@ class AppLocalizationsJa extends AppLocalizations {
@override
String get deleteServers => 'サーバーを一括削除';
@override
String get desktopTerminalTip => 'SSHセッションを起動する際に使用されるターミナルエミュレーターを開くコマンド。';
@override
String get dirEmpty => 'フォルダーが空であることを確認してください';
@@ -111,6 +120,9 @@ class AppLocalizationsJa extends AppLocalizations {
@override
String get disk => 'ディスク';
@override
String get diskHealth => 'ディスクの健康状態';
@override
String get diskIgnorePath => '無視されたディスクパス';
@@ -123,7 +135,8 @@ class AppLocalizationsJa extends AppLocalizations {
}
@override
String get dockerEmptyRunningItems => '実行中のコンテナがありません。\nこれは次の理由による可能性があります:\n- Dockerのインストールユーザーとアプリ内の設定されたユーザー名が異なる\n- 環境変数DOCKER_HOSTが正しく読み込まれていない。ターミナルで`echo \$DOCKER_HOST`を実行して取得できます。';
String get dockerEmptyRunningItems =>
'実行中のコンテナがありません。\nこれは次の理由による可能性があります:\n- Dockerのインストールユーザーとアプリ内の設定されたユーザー名が異なる\n- 環境変数DOCKER_HOSTが正しく読み込まれていない。ターミナルで`echo \$DOCKER_HOST`を実行して取得できます。';
@override
String dockerImagesFmt(Object count) {
@@ -134,7 +147,10 @@ class AppLocalizationsJa extends AppLocalizations {
String get dockerNotInstalled => 'Dockerがインストールされていません';
@override
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
String dockerStatusRunningAndStoppedFmt(
Object runningCount,
Object stoppedCount,
) {
return '$runningCount個が実行中$stoppedCount個が停止中';
}
@@ -147,7 +163,8 @@ class AppLocalizationsJa extends AppLocalizations {
String get doubleColumnMode => 'ダブルカラムモード';
@override
String get doubleColumnTip => 'このオプションは機能を有効にするだけで、実際に有効にできるかどうかはデバイスの幅に依存します';
String get doubleColumnTip =>
'このオプションは機能を有効にするだけで、実際に有効にできるかどうかはデバイスの幅に依存します';
@override
String get editVirtKeys => '仮想キーを編集';
@@ -156,7 +173,11 @@ class AppLocalizationsJa extends AppLocalizations {
String get editor => 'エディター';
@override
String get editorHighlightTip => '現在のコードハイライトのパフォーマンスはかなり悪いため、改善するために無効にすることを選択できます。';
String get editorHighlightTip =>
'現在のコードハイライトのパフォーマンスはかなり悪いため、改善するために無効にすることを選択できます。';
@override
String get emulator => 'エミュレーター';
@override
String get encode => 'エンコード';
@@ -174,13 +195,15 @@ class AppLocalizationsJa extends AppLocalizations {
String get fallbackSshDest => 'フォールバックSSH宛先';
@override
String get fdroidReleaseTip => 'このアプリをF-Droidからダウンロードした場合、このオプションをオフにすることをお勧めします。';
String get fdroidReleaseTip =>
'このアプリをF-Droidからダウンロードした場合、このオプションをオフにすることをお勧めします。';
@override
String get fgService => 'フォアグラウンドサービス';
@override
String get fgServiceTip => '有効にすると、一部の機種でクラッシュする可能性があります。無効にすると、一部の機種でバックグラウンドでのSSH接続を維持できなくなる可能性があります。システム設定でServerBoxの通知権限、バックグラウンド実行、自己起動を許可してください。';
String get fgServiceTip =>
'有効にすると、一部の機種でクラッシュする可能性があります。無効にすると、一部の機種でバックグラウンドでのSSH接続を維持できなくなる可能性があります。システム設定でServerBoxの通知権限、バックグラウンド実行、自己起動を許可してください。';
@override
String fileTooLarge(Object file, Object size, Object sizeMax) {
@@ -209,7 +232,8 @@ class AppLocalizationsJa extends AppLocalizations {
String get fullScreenJitterHelp => '焼き付き防止';
@override
String get fullScreenTip => 'デバイスが横向きに回転したときにフルスクリーンモードを有効にしますか?このオプションはサーバータブにのみ適用されます。';
String get fullScreenTip =>
'デバイスが横向きに回転したときにフルスクリーンモードを有効にしますか?このオプションはサーバータブにのみ適用されます。';
@override
String get goBackQ => '戻りますか?';
@@ -253,7 +277,8 @@ class AppLocalizationsJa extends AppLocalizations {
String get install => 'インストール';
@override
String get installDockerWithUrl => '最初に https://docs.docker.com/engine/install dockerをインストールしてください';
String get installDockerWithUrl =>
'最初に https://docs.docker.com/engine/install dockerをインストールしてください';
@override
String get invalid => '無効';
@@ -315,13 +340,15 @@ class AppLocalizationsJa extends AppLocalizations {
String get more => 'もっと';
@override
String get moveOutServerFuncBtnsHelp => '有効にする:サーバータブの各カードの下に表示されます。無効にする:サーバーの詳細ページの上部に表示されます。';
String get moveOutServerFuncBtnsHelp =>
'有効にする:サーバータブの各カードの下に表示されます。無効にする:サーバーの詳細ページの上部に表示されます。';
@override
String get ms => 'ミリ秒';
@override
String get needHomeDir => 'Synologyユーザーの場合は、[こちらをご覧ください](https://kb.synology.com/DSM/tutorial/user_enable_home_service)。他のシステムのユーザーは、ホームディレクトリの作成方法を検索する必要があります。';
String get needHomeDir =>
'Synologyユーザーの場合は、[こちらをご覧ください](https://kb.synology.com/DSM/tutorial/user_enable_home_service)。他のシステムのユーザーは、ホームディレクトリの作成方法を検索する必要があります。';
@override
String get needRestart => 'アプリを再起動する必要があります';
@@ -397,6 +424,9 @@ class AppLocalizationsJa extends AppLocalizations {
@override
String get port => 'ポート';
@override
String get preferDiskAmount => 'ディスク容量を優先的に表示';
@override
String get preview => 'プレビュー';
@@ -410,10 +440,12 @@ class AppLocalizationsJa extends AppLocalizations {
String get pushToken => 'プッシュトークン';
@override
String get pveIgnoreCertTip => 'オプションを有効にすることは推奨されません、セキュリティリスクに注意してくださいPVEのデフォルト証明書を使用している場合は、このオプションを有効にする必要があります。';
String get pveIgnoreCertTip =>
'オプションを有効にすることは推奨されません、セキュリティリスクに注意してくださいPVEのデフォルト証明書を使用している場合は、このオプションを有効にする必要があります。';
@override
String get pveLoginFailed => 'ログインに失敗しました。Linux PAMログインのためにサーバー構成からのユーザー名/パスワードで認証できません。';
String get pveLoginFailed =>
'ログインに失敗しました。Linux PAMログインのためにサーバー構成からのユーザー名/パスワードで認証できません。';
@override
String get pveVersionLow => 'この機能は現在テスト段階にあり、PVE 8+でのみテストされています。ご利用の際は慎重に。';
@@ -491,7 +523,8 @@ class AppLocalizationsJa extends AppLocalizations {
String get sftpDlPrepare => 'サーバーへの接続を準備中...';
@override
String get sftpEditorTip => '空の場合は、アプリ内蔵のファイルエディタを使用します。値がある場合は、リモートサーバーのエディタ(例:`vim`)を使用します(`EDITOR` に従って自動検出することをお勧めします)。';
String get sftpEditorTip =>
'空の場合は、アプリ内蔵のファイルエディタを使用します。値がある場合は、リモートサーバーのエディタ(例:`vim`)を使用します(`EDITOR` に従って自動検出することをお勧めします)。';
@override
String get sftpRmrDirSummary => 'SFTPで`rm -r`を使用してフォルダーを削除';
@@ -521,7 +554,8 @@ class AppLocalizationsJa extends AppLocalizations {
String get specifyDev => 'デバイスを指定';
@override
String get specifyDevTip => '例えば、ネットワークトラフィック統計はデフォルトですべてのデバイスに対するものです。ここで特定のデバイスを指定できます。';
String get specifyDevTip =>
'例えば、ネットワークトラフィック統計はデフォルトですべてのデバイスに対するものです。ここで特定のデバイスを指定できます。';
@override
String get speed => '速度';
@@ -532,7 +566,8 @@ class AppLocalizationsJa extends AppLocalizations {
}
@override
String get sshTermHelp => 'ターミナルがスクロール可能な場合、横にドラッグするとテキストを選択できます。キーボードボタンをクリックするとキーボードのオン/オフが切り替わります。ファイルアイコンは現在のパスSFTPを開きます。クリップボードボタンは、テキストが選択されているときに内容をコピーし、テキストが選択されておらずクリップボードに内容がある場合には、その内容をターミナルに貼り付けます。コードアイコンは、コードスニペットをターミナルに貼り付けて実行します。';
String get sshTermHelp =>
'ターミナルがスクロール可能な場合、横にドラッグするとテキストを選択できます。キーボードボタンをクリックするとキーボードのオン/オフが切り替わります。ファイルアイコンは現在のパスSFTPを開きます。クリップボードボタンは、テキストが選択されているときに内容をコピーし、テキストが選択されておらずクリップボードに内容がある場合には、その内容をターミナルに貼り付けます。コードアイコンは、コードスニペットをターミナルに貼り付けて実行します。';
@override
String sshTip(Object url) {
@@ -590,7 +625,8 @@ class AppLocalizationsJa extends AppLocalizations {
String get temperature => '温度';
@override
String get termFontSizeTip => 'この設定は端末のサイズ(幅と高さ)に影響します。現在のセッションのフォントサイズを調整するために、端末ページを拡大縮小できます。';
String get termFontSizeTip =>
'この設定は端末のサイズ(幅と高さ)に影響します。現在のセッションのフォントサイズを調整するために、端末ページを拡大縮小できます。';
@override
String get terminal => 'ターミナル';
@@ -602,7 +638,8 @@ class AppLocalizationsJa extends AppLocalizations {
String get textScaler => 'テキストスケーラー';
@override
String get textScalerTip => '1.0 => 100%(デフォルトサイズ)。サーバーページの一部のテキストにのみ適用されます。変更をお勧めしません。';
String get textScalerTip =>
'1.0 => 100%(デフォルトサイズ)。サーバーページの一部のテキストにのみ適用されます。変更をお勧めしません。';
@override
String get theme => 'テーマ';
@@ -635,7 +672,8 @@ class AppLocalizationsJa extends AppLocalizations {
String get update => '更新';
@override
String get updateIntervalEqual0 => '0に設定すると、サーバーの状態は自動的に更新されず、CPU使用率も計算できません。';
String get updateIntervalEqual0 =>
'0に設定すると、サーバーの状態は自動的に更新されず、CPU使用率も計算できません。';
@override
String get updateServerStatusInterval => 'サーバー状態の更新間隔';
@@ -671,7 +709,8 @@ class AppLocalizationsJa extends AppLocalizations {
String get viewErr => 'エラーを表示';
@override
String get virtKeyHelpClipboard => '端末に選択された文字がある場合は、選択された文字をクリップボードにコピーします。そうでない場合は、クリップボードの内容を端末に貼り付けます。';
String get virtKeyHelpClipboard =>
'端末に選択された文字がある場合は、選択された文字をクリップボードにコピーします。そうでない場合は、クリップボードの内容を端末に貼り付けます。';
@override
String get virtKeyHelpIME => 'キーボードのオン/オフ';
@@ -701,8 +740,10 @@ class AppLocalizationsJa extends AppLocalizations {
String get write => '書き込み';
@override
String get writeScriptFailTip => 'スクリプトの書き込みに失敗しました。権限がないかディレクトリが存在しない可能性があります。';
String get writeScriptFailTip =>
'スクリプトの書き込みに失敗しました。権限がないかディレクトリが存在しない可能性があります。';
@override
String get writeScriptTip => 'サーバーに接続すると、システムの状態を監視するためのスクリプトが ~/.config/server_box に書き込まれます。スクリプトの内容を確認できます。';
String get writeScriptTip =>
'サーバーに接続すると、システムの状態を監視するためのスクリプトが ~/.config/server_box に書き込まれます。スクリプトの内容を確認できます。';
}

View File

@@ -1,3 +1,5 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'l10n.dart';
// ignore_for_file: type=lint
@@ -7,13 +9,15 @@ class AppLocalizationsNl extends AppLocalizations {
AppLocalizationsNl([String locale = 'nl']) : super(locale);
@override
String get aboutThanks => 'Met dank aan de volgende mensen die hebben deelgenomen aan.';
String get aboutThanks =>
'Met dank aan de volgende mensen die hebben deelgenomen aan.';
@override
String get acceptBeta => 'Accepteer testversie-updates';
@override
String get addSystemPrivateKeyTip => 'Er is momenteel geen privésleutel, wilt u degene toevoegen die bij het systeem wordt geleverd (~/.ssh/id_rsa)?';
String get addSystemPrivateKeyTip =>
'Er is momenteel geen privésleutel, wilt u degene toevoegen die bij het systeem wordt geleverd (~/.ssh/id_rsa)?';
@override
String get added2List => 'Toegevoegd aan takenlijst';
@@ -25,10 +29,12 @@ class AppLocalizationsNl extends AppLocalizations {
String get alreadyLastDir => 'Al in de laatst gebruikte map.';
@override
String get authFailTip => 'Authenticatie mislukt, controleer of het wachtwoord/sleutel/host/gebruiker, enz., incorrect zijn.';
String get authFailTip =>
'Authenticatie mislukt, controleer of het wachtwoord/sleutel/host/gebruiker, enz., incorrect zijn.';
@override
String get autoBackupConflict => 'Er kan slechts één automatische back-up tegelijk worden ingeschakeld.';
String get autoBackupConflict =>
'Er kan slechts één automatische back-up tegelijk worden ingeschakeld.';
@override
String get autoConnect => 'Automatisch verbinden';
@@ -40,7 +46,8 @@ class AppLocalizationsNl extends AppLocalizations {
String get autoUpdateHomeWidget => 'Automatische update van home-widget';
@override
String get backupTip => 'De geëxporteerde gegevens zijn simpelweg versleuteld. \nBewaar deze aub veilig.';
String get backupTip =>
'De geëxporteerde gegevens zijn simpelweg versleuteld. \nBewaar deze aub veilig.';
@override
String get backupVersionNotMatch => 'Back-upversie komt niet overeen.';
@@ -52,7 +59,8 @@ class AppLocalizationsNl extends AppLocalizations {
String get bgRun => 'Uitvoeren op de achtergrond';
@override
String get bgRunTip => 'Deze schakelaar betekent alleen dat het programma zal proberen op de achtergrond uit te voeren, of het in de achtergrond kan worden uitgevoerd, hangt af van of de toestemming is ingeschakeld of niet. Voor native Android, schakel \"Batterijoptimalisatie\" uit in deze app, en voor miui, wijzig de energiebesparingsbeleid naar \"Onbeperkt\".';
String get bgRunTip =>
'Deze schakelaar betekent alleen dat het programma zal proberen op de achtergrond uit te voeren, of het in de achtergrond kan worden uitgevoerd, hangt af van of de toestemming is ingeschakeld of niet. Voor native Android, schakel \"Batterijoptimalisatie\" uit in deze app, en voor miui, wijzig de energiebesparingsbeleid naar \"Onbeperkt\".';
@override
String get closeAfterSave => 'Opslaan en sluiten';
@@ -61,7 +69,8 @@ class AppLocalizationsNl extends AppLocalizations {
String get cmd => 'Opdracht';
@override
String get collapseUITip => 'Of lange lijsten in de UI standaard moeten worden ingeklapt';
String get collapseUITip =>
'Of lange lijsten in de UI standaard moeten worden ingeklapt';
@override
String get conn => 'Verbinding';
@@ -70,7 +79,8 @@ class AppLocalizationsNl extends AppLocalizations {
String get container => 'Container';
@override
String get containerTrySudoTip => 'Bijvoorbeeld: in de app is de gebruiker ingesteld op aaa, maar Docker is geïnstalleerd onder de rootgebruiker. In dit geval moet u deze optie inschakelen.';
String get containerTrySudoTip =>
'Bijvoorbeeld: in de app is de gebruiker ingesteld op aaa, maar Docker is geïnstalleerd onder de rootgebruiker. In dit geval moet u deze optie inschakelen.';
@override
String get convert => 'Converteren';
@@ -79,7 +89,8 @@ class AppLocalizationsNl extends AppLocalizations {
String get copyPath => 'Pad kopiëren';
@override
String get cpuViewAsProgressTip => 'Toon het gebruik van elke CPU in een voortgangsbalkstijl (oude stijl)';
String get cpuViewAsProgressTip =>
'Toon het gebruik van elke CPU in een voortgangsbalkstijl (oude stijl)';
@override
String get cursorType => 'Cursortype';
@@ -88,7 +99,8 @@ class AppLocalizationsNl extends AppLocalizations {
String get customCmd => 'Aangepaste opdrachten';
@override
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
String get customCmdDocUrl =>
'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
@override
String get customCmdHint => '\"Opdrachtnaam\": \"Opdracht\"';
@@ -102,6 +114,10 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String get deleteServers => 'Servers batchgewijs verwijderen';
@override
String get desktopTerminalTip =>
'Opdracht die wordt gebruikt om de terminalemulator te openen bij het starten van SSH-sessies.';
@override
String get dirEmpty => 'Zorg ervoor dat de map leeg is.';
@@ -111,6 +127,9 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String get disk => 'Schijf';
@override
String get diskHealth => 'Schijfgezondheid';
@override
String get diskIgnorePath => 'Pad negeren voor schijf';
@@ -123,7 +142,8 @@ class AppLocalizationsNl extends AppLocalizations {
}
@override
String get dockerEmptyRunningItems => 'Er zijn geen actieve containers.\nDit kan komen doordat:\n- De Docker-installatiegebruiker niet overeenkomt met de gebruikersnaam die is geconfigureerd binnen de app.\n- De omgevingsvariabele DOCKER_HOST is niet correct gelezen. U kunt deze krijgen door `echo \$DOCKER_HOST` in de terminal uit te voeren.';
String get dockerEmptyRunningItems =>
'Er zijn geen actieve containers.\nDit kan komen doordat:\n- De Docker-installatiegebruiker niet overeenkomt met de gebruikersnaam die is geconfigureerd binnen de app.\n- De omgevingsvariabele DOCKER_HOST is niet correct gelezen. U kunt deze krijgen door `echo \$DOCKER_HOST` in de terminal uit te voeren.';
@override
String dockerImagesFmt(Object count) {
@@ -134,7 +154,10 @@ class AppLocalizationsNl extends AppLocalizations {
String get dockerNotInstalled => 'Docker niet geïnstalleerd';
@override
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
String dockerStatusRunningAndStoppedFmt(
Object runningCount,
Object stoppedCount,
) {
return '$runningCount actief, $stoppedCount container gestopt.';
}
@@ -147,7 +170,8 @@ class AppLocalizationsNl extends AppLocalizations {
String get doubleColumnMode => 'Dubbele kolommodus';
@override
String get doubleColumnTip => 'Deze optie schakelt alleen de functie in, of deze daadwerkelijk kan worden ingeschakeld, hangt af van de breedte van het apparaat';
String get doubleColumnTip =>
'Deze optie schakelt alleen de functie in, of deze daadwerkelijk kan worden ingeschakeld, hangt af van de breedte van het apparaat';
@override
String get editVirtKeys => 'Virtuele toetsen bewerken';
@@ -156,7 +180,11 @@ class AppLocalizationsNl extends AppLocalizations {
String get editor => 'Editor';
@override
String get editorHighlightTip => 'De huidige codehighlighting-prestaties zijn slechter en kunnen optioneel worden uitgeschakeld om te verbeteren.';
String get editorHighlightTip =>
'De huidige codehighlighting-prestaties zijn slechter en kunnen optioneel worden uitgeschakeld om te verbeteren.';
@override
String get emulator => 'Emulator';
@override
String get encode => 'Coderen';
@@ -174,13 +202,15 @@ class AppLocalizationsNl extends AppLocalizations {
String get fallbackSshDest => 'Fallback SSH-bestemming';
@override
String get fdroidReleaseTip => 'Als u deze app van F-Droid heeft gedownload, wordt aanbevolen deze optie uit te schakelen.';
String get fdroidReleaseTip =>
'Als u deze app van F-Droid heeft gedownload, wordt aanbevolen deze optie uit te schakelen.';
@override
String get fgService => 'Voorgrondservice';
@override
String get fgServiceTip => 'Na het inschakelen kunnen sommige apparaatmodellen crashen. Uitschakelen kan ertoe leiden dat sommige modellen SSH-verbindingen niet op de achtergrond kunnen behouden. Sta ServerBox notificatierechten, achtergronduitvoering en zelf-ontwaken toe in systeeminstellingen.';
String get fgServiceTip =>
'Na het inschakelen kunnen sommige apparaatmodellen crashen. Uitschakelen kan ertoe leiden dat sommige modellen SSH-verbindingen niet op de achtergrond kunnen behouden. Sta ServerBox notificatierechten, achtergronduitvoering en zelf-ontwaken toe in systeeminstellingen.';
@override
String fileTooLarge(Object file, Object size, Object sizeMax) {
@@ -209,7 +239,8 @@ class AppLocalizationsNl extends AppLocalizations {
String get fullScreenJitterHelp => 'Om inbranden van het scherm te voorkomen';
@override
String get fullScreenTip => 'Moet de volledig schermmodus worden ingeschakeld wanneer het apparaat naar de liggende modus wordt gedraaid? Deze optie is alleen van toepassing op het servertabblad.';
String get fullScreenTip =>
'Moet de volledig schermmodus worden ingeschakeld wanneer het apparaat naar de liggende modus wordt gedraaid? Deze optie is alleen van toepassing op het servertabblad.';
@override
String get goBackQ => 'Terug gaan?';
@@ -253,7 +284,8 @@ class AppLocalizationsNl extends AppLocalizations {
String get install => 'Installeren';
@override
String get installDockerWithUrl => 'Installeer eerst docker via https://docs.docker.com/engine/install.';
String get installDockerWithUrl =>
'Installeer eerst docker via https://docs.docker.com/engine/install.';
@override
String get invalid => 'Ongeldig';
@@ -268,7 +300,8 @@ class AppLocalizationsNl extends AppLocalizations {
String get keepStatusWhenErr => 'Behoud de laatste serverstatus';
@override
String get keepStatusWhenErrTip => 'Alleen in geval van een fout tijdens de scriptuitvoering';
String get keepStatusWhenErrTip =>
'Alleen in geval van een fout tijdens de scriptuitvoering';
@override
String get keyAuth => 'Sleutelauthenticatie';
@@ -277,7 +310,8 @@ class AppLocalizationsNl extends AppLocalizations {
String get letterCache => 'Lettercaching';
@override
String get letterCacheTip => 'Aanbevolen om uit te schakelen, maar na het uitschakelen is het niet mogelijk om CJK-tekens in te voeren.';
String get letterCacheTip =>
'Aanbevolen om uit te schakelen, maar na het uitschakelen is het niet mogelijk om CJK-tekens in te voeren.';
@override
String get license => 'Licentie';
@@ -315,13 +349,15 @@ class AppLocalizationsNl extends AppLocalizations {
String get more => 'Meer';
@override
String get moveOutServerFuncBtnsHelp => 'Aan: kan worden weergegeven onder elke kaart op de Server-tabbladpagina. Uit: kan worden weergegeven bovenaan de Serverdetails-pagina.';
String get moveOutServerFuncBtnsHelp =>
'Aan: kan worden weergegeven onder elke kaart op de Server-tabbladpagina. Uit: kan worden weergegeven bovenaan de Serverdetails-pagina.';
@override
String get ms => 'ms';
@override
String get needHomeDir => 'Als u een Synology-gebruiker bent, [zie hier](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Gebruikers van andere systemen moeten zoeken hoe ze een home directory kunnen creëren.';
String get needHomeDir =>
'Als u een Synology-gebruiker bent, [zie hier](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Gebruikers van andere systemen moeten zoeken hoe ze een home directory kunnen creëren.';
@override
String get needRestart => 'App moet opnieuw worden gestart';
@@ -342,7 +378,8 @@ class AppLocalizationsNl extends AppLocalizations {
String get noLineChartForCpu => 'Gebruik geen lijndiagrammen voor CPU';
@override
String get noPrivateKeyTip => 'De privésleutel bestaat niet, deze is mogelijk verwijderd of er is een configuratiefout.';
String get noPrivateKeyTip =>
'De privésleutel bestaat niet, deze is mogelijk verwijderd of er is een configuratiefout.';
@override
String get noPromptAgain => 'Niet meer vragen';
@@ -360,16 +397,19 @@ class AppLocalizationsNl extends AppLocalizations {
String get onlyOneLine => 'Alleen als één regel weergeven (scrollbaar)';
@override
String get onlyWhenCoreBiggerThan8 => 'Alleen effectief wanneer het aantal cores > 8';
String get onlyWhenCoreBiggerThan8 =>
'Alleen effectief wanneer het aantal cores > 8';
@override
String get openLastPath => 'Open het laatste pad';
@override
String get openLastPathTip => 'Verschillende servers hebben verschillende logs, en de log is het pad naar de uitgang';
String get openLastPathTip =>
'Verschillende servers hebben verschillende logs, en de log is het pad naar de uitgang';
@override
String get parseContainerStatsTip => 'Het parsen van de bezettingsstatus van Docker is relatief langzaam.';
String get parseContainerStatsTip =>
'Het parsen van de bezettingsstatus van Docker is relatief langzaam.';
@override
String percentOfSize(Object percent, Object size) {
@@ -386,7 +426,8 @@ class AppLocalizationsNl extends AppLocalizations {
String get pingInputIP => 'Voer een doel-IP / domein in.';
@override
String get pingNoServer => 'Geen server om te pingen.\nVoeg een server toe in het servertabblad.';
String get pingNoServer =>
'Geen server om te pingen.\nVoeg een server toe in het servertabblad.';
@override
String get pkg => 'Pkg';
@@ -397,6 +438,10 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String get port => 'Poort';
@override
String get preferDiskAmount =>
'Geef de schijfcapaciteit prioriteit bij weergave';
@override
String get preview => 'Voorbeeld';
@@ -410,13 +455,16 @@ class AppLocalizationsNl extends AppLocalizations {
String get pushToken => 'Push-token';
@override
String get pveIgnoreCertTip => 'Niet aanbevolen om in te schakelen, let op beveiligingsrisico\'s! Als u de standaardcertificaat van PVE gebruikt, moet u deze optie inschakelen.';
String get pveIgnoreCertTip =>
'Niet aanbevolen om in te schakelen, let op beveiligingsrisico\'s! Als u de standaardcertificaat van PVE gebruikt, moet u deze optie inschakelen.';
@override
String get pveLoginFailed => 'Aanmelden mislukt. Kan niet authenticeren met gebruikersnaam/wachtwoord van serverconfiguratie voor Linux PAM-login.';
String get pveLoginFailed =>
'Aanmelden mislukt. Kan niet authenticeren met gebruikersnaam/wachtwoord van serverconfiguratie voor Linux PAM-login.';
@override
String get pveVersionLow => 'Deze functie bevindt zich momenteel in de testfase en is alleen getest op PVE 8+. Gebruik het met voorzichtigheid.';
String get pveVersionLow =>
'Deze functie bevindt zich momenteel in de testfase en is alleen getest op PVE 8+. Gebruik het met voorzichtigheid.';
@override
String get pwd => 'Wachtwoord';
@@ -431,7 +479,8 @@ class AppLocalizationsNl extends AppLocalizations {
String get rememberPwdInMem => 'Wachtwoord onthouden in geheugen';
@override
String get rememberPwdInMemTip => 'Gebruikt voor containers, opschorting, enz.';
String get rememberPwdInMemTip =>
'Gebruikt voor containers, opschorting, enz.';
@override
String get rememberWindowSize => 'Venstergrootte onthouden';
@@ -491,10 +540,12 @@ class AppLocalizationsNl extends AppLocalizations {
String get sftpDlPrepare => 'Voorbereiden om verbinding te maken...';
@override
String get sftpEditorTip => 'Indien leeg, gebruik de ingebouwde bestandseditor van de app. Indien een waarde aanwezig is, gebruik de editor van de externe server, bijvoorbeeld `vim` (aanbevolen om automatisch te detecteren volgens `EDITOR`).';
String get sftpEditorTip =>
'Indien leeg, gebruik de ingebouwde bestandseditor van de app. Indien een waarde aanwezig is, gebruik de editor van de externe server, bijvoorbeeld `vim` (aanbevolen om automatisch te detecteren volgens `EDITOR`).';
@override
String get sftpRmrDirSummary => 'Gebruik `rm -r` om een map te verwijderen in SFTP.';
String get sftpRmrDirSummary =>
'Gebruik `rm -r` om een map te verwijderen in SFTP.';
@override
String get sftpSSHConnected => 'SFTP Verbonden';
@@ -521,7 +572,8 @@ class AppLocalizationsNl extends AppLocalizations {
String get specifyDev => 'Apparaat specificeren';
@override
String get specifyDevTip => 'Bijvoorbeeld, netwerkverkeersstatistieken zijn standaard voor alle apparaten. Hier kunt u een specifiek apparaat opgeven.';
String get specifyDevTip =>
'Bijvoorbeeld, netwerkverkeersstatistieken zijn standaard voor alle apparaten. Hier kunt u een specifiek apparaat opgeven.';
@override
String get speed => 'Snelheid';
@@ -532,7 +584,8 @@ class AppLocalizationsNl extends AppLocalizations {
}
@override
String get sshTermHelp => 'Wanneer het terminal scrollbaar is, kan horizontaal slepen tekst selecteren. Klikken op de toetsenbordknop schakelt het toetsenbord aan/uit. Het bestandsicoon opent de huidige pad SFTP. De klembordknop kopieert de inhoud wanneer tekst is geselecteerd en plakt inhoud van het klembord in de terminal wanneer geen tekst is geselecteerd en er inhoud op het klembord staat. Het code-icoon plakt codefragmenten in de terminal en voert ze uit.';
String get sshTermHelp =>
'Wanneer het terminal scrollbaar is, kan horizontaal slepen tekst selecteren. Klikken op de toetsenbordknop schakelt het toetsenbord aan/uit. Het bestandsicoon opent de huidige pad SFTP. De klembordknop kopieert de inhoud wanneer tekst is geselecteerd en plakt inhoud van het klembord in de terminal wanneer geen tekst is geselecteerd en er inhoud op het klembord staat. Het code-icoon plakt codefragmenten in de terminal en voert ze uit.';
@override
String sshTip(Object url) {
@@ -540,7 +593,8 @@ class AppLocalizationsNl extends AppLocalizations {
}
@override
String get sshVirtualKeyAutoOff => 'Automatisch schakelen van virtuele toetsen';
String get sshVirtualKeyAutoOff =>
'Automatisch schakelen van virtuele toetsen';
@override
String get start => 'Starten';
@@ -561,13 +615,15 @@ class AppLocalizationsNl extends AppLocalizations {
String get storage => 'Opslag';
@override
String get supportFmtArgs => 'De volgende opmaakparameters worden ondersteund:';
String get supportFmtArgs =>
'De volgende opmaakparameters worden ondersteund:';
@override
String get suspend => 'Ophangen';
@override
String get suspendTip => 'De opschortfunctie vereist rootrechten en systemd-ondersteuning.';
String get suspendTip =>
'De opschortfunctie vereist rootrechten en systemd-ondersteuning.';
@override
String switchTo(Object val) {
@@ -578,7 +634,8 @@ class AppLocalizationsNl extends AppLocalizations {
String get sync => 'Sync';
@override
String get syncTip => 'Een herstart kan nodig zijn voor sommige wijzigingen om van kracht te worden.';
String get syncTip =>
'Een herstart kan nodig zijn voor sommige wijzigingen om van kracht te worden.';
@override
String get system => 'Systeem';
@@ -590,7 +647,8 @@ class AppLocalizationsNl extends AppLocalizations {
String get temperature => 'Temperatuur';
@override
String get termFontSizeTip => 'Deze instelling heeft invloed op de terminalgrootte (breedte en hoogte). U kunt inzoomen op de terminalpagina om de lettergrootte van de huidige sessie aan te passen.';
String get termFontSizeTip =>
'Deze instelling heeft invloed op de terminalgrootte (breedte en hoogte). U kunt inzoomen op de terminalpagina om de lettergrootte van de huidige sessie aan te passen.';
@override
String get terminal => 'Terminal';
@@ -602,7 +660,8 @@ class AppLocalizationsNl extends AppLocalizations {
String get textScaler => 'Tekstschaler';
@override
String get textScalerTip => '1.0 => 100% (oorspronkelijke grootte), werkt alleen op het gedeelte van de serverpagina van het lettertype, niet aanbevolen om te wijzigen.';
String get textScalerTip =>
'1.0 => 100% (oorspronkelijke grootte), werkt alleen op het gedeelte van de serverpagina van het lettertype, niet aanbevolen om te wijzigen.';
@override
String get theme => 'Thema';
@@ -635,10 +694,12 @@ class AppLocalizationsNl extends AppLocalizations {
String get update => 'Bijwerken';
@override
String get updateIntervalEqual0 => 'Het staat op 0, het zal niet automatisch bijwerken\nCPU status kan niet berekend worden.';
String get updateIntervalEqual0 =>
'Het staat op 0, het zal niet automatisch bijwerken\nCPU status kan niet berekend worden.';
@override
String get updateServerStatusInterval => 'Interne server status bijwerking interval';
String get updateServerStatusInterval =>
'Interne server status bijwerking interval';
@override
String get upload => 'Upload';
@@ -653,7 +714,8 @@ class AppLocalizationsNl extends AppLocalizations {
String get useCdn => 'Gebruikt CDN';
@override
String get useCdnTip => 'Niet-chinese gebruikers worden aangeraden om deze CDN te gebruiken. Wil je dat?';
String get useCdnTip =>
'Niet-chinese gebruikers worden aangeraden om deze CDN te gebruiken. Wil je dat?';
@override
String get useNoPwd => 'Er zal geen wachtwoord gebruikt worden';
@@ -671,7 +733,8 @@ class AppLocalizationsNl extends AppLocalizations {
String get viewErr => 'Zie foutmelding';
@override
String get virtKeyHelpClipboard => 'Kopiëren naar het klembord als de geselecteerde terminal niet leeg is, anders de inhoud van het klembord plakken in de terminal.';
String get virtKeyHelpClipboard =>
'Kopiëren naar het klembord als de geselecteerde terminal niet leeg is, anders de inhoud van het klembord plakken in de terminal.';
@override
String get virtKeyHelpIME => 'Toetsenbord aan/uit zetten';
@@ -680,7 +743,8 @@ class AppLocalizationsNl extends AppLocalizations {
String get virtKeyHelpSFTP => 'Huidige map openen in SFTP.';
@override
String get waitConnection => 'Wacht alstublieft tot de verbinding tot stand is gebracht.';
String get waitConnection =>
'Wacht alstublieft tot de verbinding tot stand is gebracht.';
@override
String get wakeLock => 'Wakker houden';
@@ -695,14 +759,17 @@ class AppLocalizationsNl extends AppLocalizations {
String get whenOpenApp => 'Bij het openen van de app';
@override
String get wolTip => 'Na het configureren van WOL (Wake-on-LAN), wordt elke keer dat de server wordt verbonden een WOL-verzoek verzonden.';
String get wolTip =>
'Na het configureren van WOL (Wake-on-LAN), wordt elke keer dat de server wordt verbonden een WOL-verzoek verzonden.';
@override
String get write => 'Schrijven';
@override
String get writeScriptFailTip => 'Het schrijven naar het script is mislukt, mogelijk door gebrek aan rechten of omdat de map niet bestaat.';
String get writeScriptFailTip =>
'Het schrijven naar het script is mislukt, mogelijk door gebrek aan rechten of omdat de map niet bestaat.';
@override
String get writeScriptTip => 'Na het verbinden met de server wordt een script geschreven naar ~/.config/server_box om de systeemstatus te monitoren. U kunt de inhoud van het script controleren.';
String get writeScriptTip =>
'Na het verbinden met de server wordt een script geschreven naar ~/.config/server_box om de systeemstatus te monitoren. U kunt de inhoud van het script controleren.';
}

View File

@@ -1,3 +1,5 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'l10n.dart';
// ignore_for_file: type=lint
@@ -13,7 +15,8 @@ class AppLocalizationsPt extends AppLocalizations {
String get acceptBeta => 'Aceitar atualizações da versão de teste';
@override
String get addSystemPrivateKeyTip => 'Atualmente, não há nenhuma chave privada. Gostaria de adicionar a chave do sistema (~/.ssh/id_rsa)?';
String get addSystemPrivateKeyTip =>
'Atualmente, não há nenhuma chave privada. Gostaria de adicionar a chave do sistema (~/.ssh/id_rsa)?';
@override
String get added2List => 'Adicionado à lista de tarefas';
@@ -25,10 +28,12 @@ class AppLocalizationsPt extends AppLocalizations {
String get alreadyLastDir => 'Já é o diretório mais alto';
@override
String get authFailTip => 'Autenticação falhou, por favor verifique se a senha/chave/host/usuário, etc., estão incorretos.';
String get authFailTip =>
'Autenticação falhou, por favor verifique se a senha/chave/host/usuário, etc., estão incorretos.';
@override
String get autoBackupConflict => 'Apenas um backup automático pode ser ativado por vez';
String get autoBackupConflict =>
'Apenas um backup automático pode ser ativado por vez';
@override
String get autoConnect => 'Conexão automática';
@@ -37,13 +42,16 @@ class AppLocalizationsPt extends AppLocalizations {
String get autoRun => 'Execução automática';
@override
String get autoUpdateHomeWidget => 'Atualização automática do widget da tela inicial';
String get autoUpdateHomeWidget =>
'Atualização automática do widget da tela inicial';
@override
String get backupTip => 'Os dados exportados são criptografados de forma simples, por favor, guarde-os com segurança.';
String get backupTip =>
'Os dados exportados são criptografados de forma simples, por favor, guarde-os com segurança.';
@override
String get backupVersionNotMatch => 'Versão de backup não compatível, não é possível restaurar';
String get backupVersionNotMatch =>
'Versão de backup não compatível, não é possível restaurar';
@override
String get battery => 'Bateria';
@@ -52,7 +60,8 @@ class AppLocalizationsPt extends AppLocalizations {
String get bgRun => 'Execução em segundo plano';
@override
String get bgRunTip => 'Este interruptor indica que o programa tentará rodar em segundo plano, mas a capacidade de fazer isso depende das permissões concedidas. No Android nativo, desative a \'Otimização de bateria\' para este app, no MIUI, altere a estratégia de economia de energia para \'Sem restrições\'.';
String get bgRunTip =>
'Este interruptor indica que o programa tentará rodar em segundo plano, mas a capacidade de fazer isso depende das permissões concedidas. No Android nativo, desative a \'Otimização de bateria\' para este app, no MIUI, altere a estratégia de economia de energia para \'Sem restrições\'.';
@override
String get closeAfterSave => 'Salvar e fechar';
@@ -70,7 +79,8 @@ class AppLocalizationsPt extends AppLocalizations {
String get container => 'Contêiner';
@override
String get containerTrySudoTip => 'Por exemplo: se o usuário for definido como aaa dentro do app, mas o Docker estiver instalado sob o usuário root, esta opção precisará ser ativada';
String get containerTrySudoTip =>
'Por exemplo: se o usuário for definido como aaa dentro do app, mas o Docker estiver instalado sob o usuário root, esta opção precisará ser ativada';
@override
String get convert => 'Converter';
@@ -79,7 +89,8 @@ class AppLocalizationsPt extends AppLocalizations {
String get copyPath => 'Copiar caminho';
@override
String get cpuViewAsProgressTip => 'Exiba a taxa de uso de cada CPU em estilo de barra de progresso (estilo antigo)';
String get cpuViewAsProgressTip =>
'Exiba a taxa de uso de cada CPU em estilo de barra de progresso (estilo antigo)';
@override
String get cursorType => 'Tipo de cursor';
@@ -88,7 +99,8 @@ class AppLocalizationsPt extends AppLocalizations {
String get customCmd => 'Comandos personalizados';
@override
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
String get customCmdDocUrl =>
'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
@override
String get customCmdHint => '\"Nome do comando\": \"Comando\"';
@@ -102,6 +114,10 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get deleteServers => 'Excluir servidores em lote';
@override
String get desktopTerminalTip =>
'Comando usado para abrir o emulador de terminal ao iniciar sessões SSH.';
@override
String get dirEmpty => 'Certifique-se de que a pasta está vazia';
@@ -111,6 +127,9 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get disk => 'Disco';
@override
String get diskHealth => 'Saúde do disco';
@override
String get diskIgnorePath => 'Caminhos de disco ignorados';
@@ -123,7 +142,8 @@ class AppLocalizationsPt extends AppLocalizations {
}
@override
String get dockerEmptyRunningItems => 'Não há contêineres em execução.\nIsso pode ser porque:\n- O usuário que instalou o Docker difere do usuário configurado no app\n- A variável de ambiente DOCKER_HOST não foi lida corretamente. Você pode verificar isso executando `echo \$DOCKER_HOST` no terminal.';
String get dockerEmptyRunningItems =>
'Não há contêineres em execução.\nIsso pode ser porque:\n- O usuário que instalou o Docker difere do usuário configurado no app\n- A variável de ambiente DOCKER_HOST não foi lida corretamente. Você pode verificar isso executando `echo \$DOCKER_HOST` no terminal.';
@override
String dockerImagesFmt(Object count) {
@@ -134,7 +154,10 @@ class AppLocalizationsPt extends AppLocalizations {
String get dockerNotInstalled => 'Docker não instalado';
@override
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
String dockerStatusRunningAndStoppedFmt(
Object runningCount,
Object stoppedCount,
) {
return '$runningCount em execução, $stoppedCount parados';
}
@@ -147,7 +170,8 @@ class AppLocalizationsPt extends AppLocalizations {
String get doubleColumnMode => 'Modo de coluna dupla';
@override
String get doubleColumnTip => 'Esta opção apenas ativa a funcionalidade, se ela será ativada depende também da largura do dispositivo';
String get doubleColumnTip =>
'Esta opção apenas ativa a funcionalidade, se ela será ativada depende também da largura do dispositivo';
@override
String get editVirtKeys => 'Editar teclas virtuais';
@@ -156,7 +180,11 @@ class AppLocalizationsPt extends AppLocalizations {
String get editor => 'Editor';
@override
String get editorHighlightTip => 'O desempenho do destaque de código atualmente é ruim, pode optar por desativá-lo para melhorar.';
String get editorHighlightTip =>
'O desempenho do destaque de código atualmente é ruim, pode optar por desativá-lo para melhorar.';
@override
String get emulator => 'Emulador';
@override
String get encode => 'Codificar';
@@ -174,13 +202,15 @@ class AppLocalizationsPt extends AppLocalizations {
String get fallbackSshDest => 'Destino SSH de fallback';
@override
String get fdroidReleaseTip => 'Se você baixou este aplicativo do F-Droid, é recomendado desativar esta opção.';
String get fdroidReleaseTip =>
'Se você baixou este aplicativo do F-Droid, é recomendado desativar esta opção.';
@override
String get fgService => 'Serviço em primeiro plano';
@override
String get fgServiceTip => 'Após ativar, alguns modelos de dispositivos podem travar. Desativar pode fazer com que alguns modelos não consigam manter conexões SSH em segundo plano. Por favor, permita as permissões de notificação do ServerBox, execução em segundo plano e auto-despertar nas configurações do sistema.';
String get fgServiceTip =>
'Após ativar, alguns modelos de dispositivos podem travar. Desativar pode fazer com que alguns modelos não consigam manter conexões SSH em segundo plano. Por favor, permita as permissões de notificação do ServerBox, execução em segundo plano e auto-despertar nas configurações do sistema.';
@override
String fileTooLarge(Object file, Object size, Object sizeMax) {
@@ -209,7 +239,8 @@ class AppLocalizationsPt extends AppLocalizations {
String get fullScreenJitterHelp => 'Prevenir burn-in de tela';
@override
String get fullScreenTip => 'Deve ser ativado o modo de tela cheia quando o dispositivo é girado para o modo paisagem? Esta opção aplica-se apenas à aba do servidor.';
String get fullScreenTip =>
'Deve ser ativado o modo de tela cheia quando o dispositivo é girado para o modo paisagem? Esta opção aplica-se apenas à aba do servidor.';
@override
String get goBackQ => 'Voltar?';
@@ -224,7 +255,8 @@ class AppLocalizationsPt extends AppLocalizations {
String get highlight => 'Destaque de código';
@override
String get homeWidgetUrlConfig => 'Configuração de URL do widget da tela inicial';
String get homeWidgetUrlConfig =>
'Configuração de URL do widget da tela inicial';
@override
String get host => 'Host';
@@ -253,7 +285,8 @@ class AppLocalizationsPt extends AppLocalizations {
String get install => 'Instalar';
@override
String get installDockerWithUrl => 'Por favor, instale o Docker primeiro em https://docs.docker.com/engine/install';
String get installDockerWithUrl =>
'Por favor, instale o Docker primeiro em https://docs.docker.com/engine/install';
@override
String get invalid => 'Inválido';
@@ -277,7 +310,8 @@ class AppLocalizationsPt extends AppLocalizations {
String get letterCache => 'Cache de letras';
@override
String get letterCacheTip => 'Recomendado desativar, mas após desativar, será impossível inserir caracteres CJK.';
String get letterCacheTip =>
'Recomendado desativar, mas após desativar, será impossível inserir caracteres CJK.';
@override
String get license => 'Licença de código aberto';
@@ -300,7 +334,8 @@ class AppLocalizationsPt extends AppLocalizations {
String get max => 'Máximo';
@override
String get maxRetryCount => 'Número de tentativas de reconexão com o servidor';
String get maxRetryCount =>
'Número de tentativas de reconexão com o servidor';
@override
String get maxRetryCountEqual0 => 'Irá tentar indefinidamente';
@@ -315,13 +350,15 @@ class AppLocalizationsPt extends AppLocalizations {
String get more => 'Mais';
@override
String get moveOutServerFuncBtnsHelp => 'Ativado: Mostra abaixo de cada cartão na aba do servidor. Desativado: Mostra no topo da página de detalhes do servidor.';
String get moveOutServerFuncBtnsHelp =>
'Ativado: Mostra abaixo de cada cartão na aba do servidor. Desativado: Mostra no topo da página de detalhes do servidor.';
@override
String get ms => 'ms';
@override
String get needHomeDir => 'Se você é usuário de Synology, [veja aqui](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Usuários de outros sistemas precisam pesquisar como criar um diretório home.';
String get needHomeDir =>
'Se você é usuário de Synology, [veja aqui](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Usuários de outros sistemas precisam pesquisar como criar um diretório home.';
@override
String get needRestart => 'Necessita reiniciar o app';
@@ -342,7 +379,8 @@ class AppLocalizationsPt extends AppLocalizations {
String get noLineChartForCpu => 'Não utilizar gráficos de linhas para a CPU';
@override
String get noPrivateKeyTip => 'A chave privada não existe, pode ter sido deletada ou há um erro de configuração.';
String get noPrivateKeyTip =>
'A chave privada não existe, pode ter sido deletada ou há um erro de configuração.';
@override
String get noPromptAgain => 'Não perguntar novamente';
@@ -360,16 +398,19 @@ class AppLocalizationsPt extends AppLocalizations {
String get onlyOneLine => 'Exibir apenas como uma linha (rolável)';
@override
String get onlyWhenCoreBiggerThan8 => 'Efetivo apenas quando o número de núcleos > 8';
String get onlyWhenCoreBiggerThan8 =>
'Efetivo apenas quando o número de núcleos > 8';
@override
String get openLastPath => 'Abrir o último caminho';
@override
String get openLastPathTip => 'Registros diferentes para servidores diferentes, e registra o caminho ao sair';
String get openLastPathTip =>
'Registros diferentes para servidores diferentes, e registra o caminho ao sair';
@override
String get parseContainerStatsTip => 'Análise de status do Docker pode ser lenta';
String get parseContainerStatsTip =>
'Análise de status do Docker pode ser lenta';
@override
String percentOfSize(Object percent, Object size) {
@@ -386,7 +427,8 @@ class AppLocalizationsPt extends AppLocalizations {
String get pingInputIP => 'Por favor, insira o IP ou domínio alvo';
@override
String get pingNoServer => 'Nenhum servidor disponível para Ping\nPor favor, adicione um servidor na aba de servidores e tente novamente';
String get pingNoServer =>
'Nenhum servidor disponível para Ping\nPor favor, adicione um servidor na aba de servidores e tente novamente';
@override
String get pkg => 'Gerenciamento de pacotes';
@@ -397,6 +439,9 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get port => 'Porta';
@override
String get preferDiskAmount => 'Priorizar a exibição da capacidade do disco';
@override
String get preview => 'Pré-visualização';
@@ -410,13 +455,16 @@ class AppLocalizationsPt extends AppLocalizations {
String get pushToken => 'Token de notificação push';
@override
String get pveIgnoreCertTip => 'Não recomendado para ativar, cuidado com os riscos de segurança! Se estiver usando o certificado padrão do PVE, você precisa habilitar esta opção.';
String get pveIgnoreCertTip =>
'Não recomendado para ativar, cuidado com os riscos de segurança! Se estiver usando o certificado padrão do PVE, você precisa habilitar esta opção.';
@override
String get pveLoginFailed => 'Falha no login. Não é possível autenticar com o nome de usuário/senha da configuração do servidor para login no Linux PAM.';
String get pveLoginFailed =>
'Falha no login. Não é possível autenticar com o nome de usuário/senha da configuração do servidor para login no Linux PAM.';
@override
String get pveVersionLow => 'Esta funcionalidade está atualmente em fase de teste e foi testada apenas no PVE 8+. Por favor, use com cautela.';
String get pveVersionLow =>
'Esta funcionalidade está atualmente em fase de teste e foi testada apenas no PVE 8+. Por favor, use com cautela.';
@override
String get pwd => 'Senha';
@@ -479,7 +527,8 @@ class AppLocalizationsPt extends AppLocalizations {
String get server => 'Servidor';
@override
String get serverDetailOrder => 'Ordem dos componentes na página de detalhes do servidor';
String get serverDetailOrder =>
'Ordem dos componentes na página de detalhes do servidor';
@override
String get serverFuncBtns => 'Botões de função do servidor';
@@ -491,7 +540,8 @@ class AppLocalizationsPt extends AppLocalizations {
String get sftpDlPrepare => 'Preparando para conectar ao servidor...';
@override
String get sftpEditorTip => 'Se vazio, use o editor de arquivos integrado do aplicativo. Se houver um valor, use o editor do servidor remoto, por exemplo, `vim` (recomendado detectar automaticamente de acordo com `EDITOR`).';
String get sftpEditorTip =>
'Se vazio, use o editor de arquivos integrado do aplicativo. Se houver um valor, use o editor do servidor remoto, por exemplo, `vim` (recomendado detectar automaticamente de acordo com `EDITOR`).';
@override
String get sftpRmrDirSummary => 'Usar `rm -r` em SFTP para excluir pastas';
@@ -521,7 +571,8 @@ class AppLocalizationsPt extends AppLocalizations {
String get specifyDev => 'Especificar dispositivo';
@override
String get specifyDevTip => 'Por exemplo, as estatísticas de tráfego de rede são por padrão para todos os dispositivos. Você pode especificar um dispositivo específico aqui.';
String get specifyDevTip =>
'Por exemplo, as estatísticas de tráfego de rede são por padrão para todos os dispositivos. Você pode especificar um dispositivo específico aqui.';
@override
String get speed => 'Velocidade';
@@ -532,7 +583,8 @@ class AppLocalizationsPt extends AppLocalizations {
}
@override
String get sshTermHelp => 'Quando o terminal é rolável, arrastar horizontalmente pode selecionar texto. Clicar no botão do teclado ativa/desativa o teclado. O ícone de arquivo abre o SFTP do caminho atual. O botão da área de transferência copia o conteúdo quando o texto é selecionado e cola o conteúdo da área de transferência no terminal quando nenhum texto é selecionado e há conteúdo na área de transferência. O ícone de código cola trechos de código no terminal e os executa.';
String get sshTermHelp =>
'Quando o terminal é rolável, arrastar horizontalmente pode selecionar texto. Clicar no botão do teclado ativa/desativa o teclado. O ícone de arquivo abre o SFTP do caminho atual. O botão da área de transferência copia o conteúdo quando o texto é selecionado e cola o conteúdo da área de transferência no terminal quando nenhum texto é selecionado e há conteúdo na área de transferência. O ícone de código cola trechos de código no terminal e os executa.';
@override
String sshTip(Object url) {
@@ -540,7 +592,8 @@ class AppLocalizationsPt extends AppLocalizations {
}
@override
String get sshVirtualKeyAutoOff => 'Desativação automática das teclas virtuais';
String get sshVirtualKeyAutoOff =>
'Desativação automática das teclas virtuais';
@override
String get start => 'Iniciar';
@@ -567,7 +620,8 @@ class AppLocalizationsPt extends AppLocalizations {
String get suspend => 'Suspender';
@override
String get suspendTip => 'A função de suspensão requer permissões de root e suporte do systemd.';
String get suspendTip =>
'A função de suspensão requer permissões de root e suporte do systemd.';
@override
String switchTo(Object val) {
@@ -578,7 +632,8 @@ class AppLocalizationsPt extends AppLocalizations {
String get sync => 'Sincronizar';
@override
String get syncTip => 'Pode ser necessário reiniciar para algumas mudanças surtirem efeito.';
String get syncTip =>
'Pode ser necessário reiniciar para algumas mudanças surtirem efeito.';
@override
String get system => 'Sistema';
@@ -590,7 +645,8 @@ class AppLocalizationsPt extends AppLocalizations {
String get temperature => 'Temperatura';
@override
String get termFontSizeTip => 'Esta configuração afetará o tamanho do terminal (largura e altura). Você pode dar zoom na página do terminal para ajustar o tamanho da fonte da sessão atual.';
String get termFontSizeTip =>
'Esta configuração afetará o tamanho do terminal (largura e altura). Você pode dar zoom na página do terminal para ajustar o tamanho da fonte da sessão atual.';
@override
String get terminal => 'Terminal';
@@ -602,7 +658,8 @@ class AppLocalizationsPt extends AppLocalizations {
String get textScaler => 'Escala de texto';
@override
String get textScalerTip => '1.0 => 100% (tamanho original), afeta apenas algumas fontes na página do servidor, não é recomendado alterar.';
String get textScalerTip =>
'1.0 => 100% (tamanho original), afeta apenas algumas fontes na página do servidor, não é recomendado alterar.';
@override
String get theme => 'Tema';
@@ -635,10 +692,12 @@ class AppLocalizationsPt extends AppLocalizations {
String get update => 'Atualizar';
@override
String get updateIntervalEqual0 => 'Se definido como 0, o estado do servidor não será atualizado automaticamente.\nE o uso da CPU não poderá ser calculado.';
String get updateIntervalEqual0 =>
'Se definido como 0, o estado do servidor não será atualizado automaticamente.\nE o uso da CPU não poderá ser calculado.';
@override
String get updateServerStatusInterval => 'Intervalo de atualização do estado do servidor';
String get updateServerStatusInterval =>
'Intervalo de atualização do estado do servidor';
@override
String get upload => 'Upload';
@@ -653,7 +712,8 @@ class AppLocalizationsPt extends AppLocalizations {
String get useCdn => 'Utilizando CDN';
@override
String get useCdnTip => 'Recomenda-se que usuários não chineses usem CDN. Gostaria de usá-lo?';
String get useCdnTip =>
'Recomenda-se que usuários não chineses usem CDN. Gostaria de usá-lo?';
@override
String get useNoPwd => 'Será usado sem senha';
@@ -671,7 +731,8 @@ class AppLocalizationsPt extends AppLocalizations {
String get viewErr => 'Ver erro';
@override
String get virtKeyHelpClipboard => 'Se houver texto selecionado no terminal, copia para a área de transferência, caso contrário, cola o conteúdo da área de transferência no terminal.';
String get virtKeyHelpClipboard =>
'Se houver texto selecionado no terminal, copia para a área de transferência, caso contrário, cola o conteúdo da área de transferência no terminal.';
@override
String get virtKeyHelpIME => 'Ligar/desligar o teclado';
@@ -695,14 +756,17 @@ class AppLocalizationsPt extends AppLocalizations {
String get whenOpenApp => 'Ao abrir o app';
@override
String get wolTip => 'Após configurar o WOL (Wake-on-LAN), um pedido de WOL é enviado cada vez que o servidor é conectado.';
String get wolTip =>
'Após configurar o WOL (Wake-on-LAN), um pedido de WOL é enviado cada vez que o servidor é conectado.';
@override
String get write => 'Escrita';
@override
String get writeScriptFailTip => 'Falha ao escrever no script, possivelmente devido à falta de permissões ou o diretório não existe.';
String get writeScriptFailTip =>
'Falha ao escrever no script, possivelmente devido à falta de permissões ou o diretório não existe.';
@override
String get writeScriptTip => 'Após conectar ao servidor, um script será escrito em ~/.config/server_box para monitorar o status do sistema. Você pode revisar o conteúdo do script.';
String get writeScriptTip =>
'Após conectar ao servidor, um script será escrito em ~/.config/server_box para monitorar o status do sistema. Você pode revisar o conteúdo do script.';
}

View File

@@ -1,3 +1,5 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'l10n.dart';
// ignore_for_file: type=lint
@@ -13,7 +15,8 @@ class AppLocalizationsRu extends AppLocalizations {
String get acceptBeta => 'Принять обновления тестовой версии';
@override
String get addSystemPrivateKeyTip => 'В данный момент приватные ключи отсутствуют. Добавить системный приватный ключ (~/.ssh/id_rsa)?';
String get addSystemPrivateKeyTip =>
'В данный момент приватные ключи отсутствуют. Добавить системный приватный ключ (~/.ssh/id_rsa)?';
@override
String get added2List => 'Добавлено в список задач';
@@ -25,10 +28,12 @@ class AppLocalizationsRu extends AppLocalizations {
String get alreadyLastDir => 'Уже в корневом каталоге';
@override
String get authFailTip => 'Аутентификация не удалась, пожалуйста, проверьте, правильны ли пароль/ключ/хост/пользователь и т.д.';
String get authFailTip =>
'Аутентификация не удалась, пожалуйста, проверьте, правильны ли пароль/ключ/хост/пользователь и т.д.';
@override
String get autoBackupConflict => 'Может быть включено только одно автоматическое резервное копирование';
String get autoBackupConflict =>
'Может быть включено только одно автоматическое резервное копирование';
@override
String get autoConnect => 'Автоматическое подключение';
@@ -37,13 +42,16 @@ class AppLocalizationsRu extends AppLocalizations {
String get autoRun => 'Автозапуск';
@override
String get autoUpdateHomeWidget => 'Автоматическое обновление виджета на главном экране';
String get autoUpdateHomeWidget =>
'Автоматическое обновление виджета на главном экране';
@override
String get backupTip => 'Экспортированные данные зашифрованы простым способом \nПожалуйста, храните их в безопасности.';
String get backupTip =>
'Экспортированные данные зашифрованы простым способом \nПожалуйста, храните их в безопасности.';
@override
String get backupVersionNotMatch => 'Версия резервной копии не совпадает, восстановление невозможно';
String get backupVersionNotMatch =>
'Версия резервной копии не совпадает, восстановление невозможно';
@override
String get battery => 'Батарея';
@@ -52,7 +60,8 @@ class AppLocalizationsRu extends AppLocalizations {
String get bgRun => 'Работа в фоновом режиме';
@override
String get bgRunTip => 'Этот переключатель означает, что программа будет пытаться работать в фоновом режиме, но фактическое выполнение зависит от того, включено ли разрешение. Для нативного Android отключите «Оптимизацию батареи» для этого приложения, для MIUI измените контроль активности на «Нет ограничений».';
String get bgRunTip =>
'Этот переключатель означает, что программа будет пытаться работать в фоновом режиме, но фактическое выполнение зависит от того, включено ли разрешение. Для нативного Android отключите «Оптимизацию батареи» для этого приложения, для MIUI измените контроль активности на «Нет ограничений».';
@override
String get closeAfterSave => 'Сохранить и закрыть';
@@ -70,7 +79,8 @@ class AppLocalizationsRu extends AppLocalizations {
String get container => 'Контейнер';
@override
String get containerTrySudoTip => 'Например: если пользователь в приложении установлен как aaa, но Docker установлен под пользователем root, тогда нужно включить эту опцию';
String get containerTrySudoTip =>
'Например: если пользователь в приложении установлен как aaa, но Docker установлен под пользователем root, тогда нужно включить эту опцию';
@override
String get convert => 'Конвертировать';
@@ -79,7 +89,8 @@ class AppLocalizationsRu extends AppLocalizations {
String get copyPath => 'Копировать путь';
@override
String get cpuViewAsProgressTip => 'Отобразите уровень использования каждого процессора в виде индикатора выполнения (старый стиль)';
String get cpuViewAsProgressTip =>
'Отобразите уровень использования каждого процессора в виде индикатора выполнения (старый стиль)';
@override
String get cursorType => 'Тип курсора';
@@ -88,7 +99,8 @@ class AppLocalizationsRu extends AppLocalizations {
String get customCmd => 'Пользовательские команды';
@override
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
String get customCmdDocUrl =>
'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
@override
String get customCmdHint => '\"Имя команды\": \"Команда\"';
@@ -102,6 +114,10 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get deleteServers => 'Удалить серверы пакетно';
@override
String get desktopTerminalTip =>
'Команда для открытия эмулятора терминала при запуске SSH-сеансов.';
@override
String get dirEmpty => 'Пожалуйста, убедитесь, что папка пуста';
@@ -111,6 +127,9 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get disk => 'Диск';
@override
String get diskHealth => 'Состояние диска';
@override
String get diskIgnorePath => 'Игнорировать путь к диску';
@@ -123,7 +142,8 @@ class AppLocalizationsRu extends AppLocalizations {
}
@override
String get dockerEmptyRunningItems => 'Нет запущенных контейнеров.\nЭто может быть из-за:\n- пользователя Docker, отличного от пользователя, настроенного в приложении\n- переменной окружения DOCKER_HOST, которая не была правильно считана. Вы можете выполнить `echo \$DOCKER_HOST` в терминале, чтобы увидеть ее значение.';
String get dockerEmptyRunningItems =>
'Нет запущенных контейнеров.\nЭто может быть из-за:\n- пользователя Docker, отличного от пользователя, настроенного в приложении\n- переменной окружения DOCKER_HOST, которая не была правильно считана. Вы можете выполнить `echo \$DOCKER_HOST` в терминале, чтобы увидеть ее значение.';
@override
String dockerImagesFmt(Object count) {
@@ -134,7 +154,10 @@ class AppLocalizationsRu extends AppLocalizations {
String get dockerNotInstalled => 'Docker не установлен';
@override
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
String dockerStatusRunningAndStoppedFmt(
Object runningCount,
Object stoppedCount,
) {
return '$runningCount запущено, $stoppedCount остановлено';
}
@@ -147,7 +170,8 @@ class AppLocalizationsRu extends AppLocalizations {
String get doubleColumnMode => 'Режим двойной колонки';
@override
String get doubleColumnTip => 'Эта опция лишь включает функцию; фактическое применение зависит от ширины устройства';
String get doubleColumnTip =>
'Эта опция лишь включает функцию; фактическое применение зависит от ширины устройства';
@override
String get editVirtKeys => 'Редактировать виртуальные клавиши';
@@ -156,7 +180,11 @@ class AppLocalizationsRu extends AppLocalizations {
String get editor => 'Редактор';
@override
String get editorHighlightTip => 'Текущая производительность подсветки кода неудовлетворительна, можно отключить для улучшения.';
String get editorHighlightTip =>
'Текущая производительность подсветки кода неудовлетворительна, можно отключить для улучшения.';
@override
String get emulator => 'Эмулятор';
@override
String get encode => 'Кодировать';
@@ -174,13 +202,15 @@ class AppLocalizationsRu extends AppLocalizations {
String get fallbackSshDest => 'Резервное место назначения SSH';
@override
String get fdroidReleaseTip => 'Если вы скачали это приложение с F-Droid, рекомендуется отключить эту опцию.';
String get fdroidReleaseTip =>
'Если вы скачали это приложение с F-Droid, рекомендуется отключить эту опцию.';
@override
String get fgService => 'Сервис переднего плана';
@override
String get fgServiceTip => 'После включения некоторые модели устройств могут вылетать. Отключение может привести к тому, что некоторые модели не смогут поддерживать SSH-соединения в фоновом режиме. Пожалуйста, разрешите ServerBox права на уведомления, фоновую работу и самопробуждение в системных настройках.';
String get fgServiceTip =>
'После включения некоторые модели устройств могут вылетать. Отключение может привести к тому, что некоторые модели не смогут поддерживать SSH-соединения в фоновом режиме. Пожалуйста, разрешите ServerBox права на уведомления, фоновую работу и самопробуждение в системных настройках.';
@override
String fileTooLarge(Object file, Object size, Object sizeMax) {
@@ -209,7 +239,8 @@ class AppLocalizationsRu extends AppLocalizations {
String get fullScreenJitterHelp => 'Предотвращение выгорания экрана';
@override
String get fullScreenTip => 'Следует ли включить полноэкранный режим, когда устройство поворачивается в альбомный режим? Эта опция применяется только к вкладке сервера.';
String get fullScreenTip =>
'Следует ли включить полноэкранный режим, когда устройство поворачивается в альбомный режим? Эта опция применяется только к вкладке сервера.';
@override
String get goBackQ => 'Вернуться?';
@@ -253,7 +284,8 @@ class AppLocalizationsRu extends AppLocalizations {
String get install => 'установить';
@override
String get installDockerWithUrl => 'Пожалуйста, сначала установите Docker по адресу https://docs.docker.com/engine/install';
String get installDockerWithUrl =>
'Пожалуйста, сначала установите Docker по адресу https://docs.docker.com/engine/install';
@override
String get invalid => 'Недействительный';
@@ -268,7 +300,8 @@ class AppLocalizationsRu extends AppLocalizations {
String get keepStatusWhenErr => 'Сохранять статус сервера при ошибке';
@override
String get keepStatusWhenErrTip => 'Применимо только в случае ошибки выполнения скрипта';
String get keepStatusWhenErrTip =>
'Применимо только в случае ошибки выполнения скрипта';
@override
String get keyAuth => 'Аутентификация по ключу';
@@ -277,7 +310,8 @@ class AppLocalizationsRu extends AppLocalizations {
String get letterCache => 'Кэширование букв';
@override
String get letterCacheTip => 'Рекомендуется отключить, но после отключения будет невозможно вводить символы CJK.';
String get letterCacheTip =>
'Рекомендуется отключить, но после отключения будет невозможно вводить символы CJK.';
@override
String get license => 'Лицензия';
@@ -300,10 +334,12 @@ class AppLocalizationsRu extends AppLocalizations {
String get max => 'максимум';
@override
String get maxRetryCount => 'Максимальное количество попыток переподключения к серверу';
String get maxRetryCount =>
'Максимальное количество попыток переподключения к серверу';
@override
String get maxRetryCountEqual0 => 'Будет бесконечно пытаться переподключиться';
String get maxRetryCountEqual0 =>
'Будет бесконечно пытаться переподключиться';
@override
String get min => 'минимум';
@@ -315,13 +351,15 @@ class AppLocalizationsRu extends AppLocalizations {
String get more => 'Больше';
@override
String get moveOutServerFuncBtnsHelp => 'Включено: кнопки функций сервера отображаются под каждой карточкой на вкладке сервера. Выключено: отображается в верхней части страницы деталей сервера.';
String get moveOutServerFuncBtnsHelp =>
'Включено: кнопки функций сервера отображаются под каждой карточкой на вкладке сервера. Выключено: отображается в верхней части страницы деталей сервера.';
@override
String get ms => 'мс';
@override
String get needHomeDir => 'Если вы пользователь Synology, [смотрите здесь](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Пользователям других систем нужно искать, как создать домашний каталог.';
String get needHomeDir =>
'Если вы пользователь Synology, [смотрите здесь](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Пользователям других систем нужно искать, как создать домашний каталог.';
@override
String get needRestart => 'Требуется перезапуск приложения';
@@ -342,7 +380,8 @@ class AppLocalizationsRu extends AppLocalizations {
String get noLineChartForCpu => 'Не используйте линейные графики для ЦП';
@override
String get noPrivateKeyTip => 'Приватный ключ не существует, возможно, он был удален или есть ошибка в настройках.';
String get noPrivateKeyTip =>
'Приватный ключ не существует, возможно, он был удален или есть ошибка в настройках.';
@override
String get noPromptAgain => 'Больше не спрашивать';
@@ -360,16 +399,19 @@ class AppLocalizationsRu extends AppLocalizations {
String get onlyOneLine => 'Отображать только в одной строке (прокручивается)';
@override
String get onlyWhenCoreBiggerThan8 => 'Действует только при количестве ядер больше 8';
String get onlyWhenCoreBiggerThan8 =>
'Действует только при количестве ядер больше 8';
@override
String get openLastPath => 'Открыть последний путь';
@override
String get openLastPathTip => 'Для разных серверов будут сохранены разные записи, записывается путь при выходе';
String get openLastPathTip =>
'Для разных серверов будут сохранены разные записи, записывается путь при выходе';
@override
String get parseContainerStatsTip => 'Анализ статуса использования Docker может быть медленным';
String get parseContainerStatsTip =>
'Анализ статуса использования Docker может быть медленным';
@override
String percentOfSize(Object percent, Object size) {
@@ -386,7 +428,8 @@ class AppLocalizationsRu extends AppLocalizations {
String get pingInputIP => 'Пожалуйста, введите целевой IP или домен';
@override
String get pingNoServer => 'Нет доступных серверов для Ping\nПожалуйста, добавьте их на вкладке «Сервер» и попробуйте снова';
String get pingNoServer =>
'Нет доступных серверов для Ping\nПожалуйста, добавьте их на вкладке «Сервер» и попробуйте снова';
@override
String get pkg => 'Менеджер пакетов';
@@ -397,6 +440,9 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get port => 'Порт';
@override
String get preferDiskAmount => 'Приоритетное отображение объёма диска';
@override
String get preview => 'Предпросмотр';
@@ -410,13 +456,16 @@ class AppLocalizationsRu extends AppLocalizations {
String get pushToken => 'Токен уведомлений';
@override
String get pveIgnoreCertTip => 'Не рекомендуется включать, обратите внимание на риски безопасности! Если вы используете стандартный сертификат от PVE, вам нужно включить эту опцию.';
String get pveIgnoreCertTip =>
'Не рекомендуется включать, обратите внимание на риски безопасности! Если вы используете стандартный сертификат от PVE, вам нужно включить эту опцию.';
@override
String get pveLoginFailed => 'Ошибка входа. Невозможно аутентифицироваться с помощью имени пользователя/пароля из конфигурации сервера для входа в Linux PAM.';
String get pveLoginFailed =>
'Ошибка входа. Невозможно аутентифицироваться с помощью имени пользователя/пароля из конфигурации сервера для входа в Linux PAM.';
@override
String get pveVersionLow => 'Эта функция в настоящее время находится на стадии тестирования и была протестирована только на PVE 8+. Используйте ее с осторожностью.';
String get pveVersionLow =>
'Эта функция в настоящее время находится на стадии тестирования и была протестирована только на PVE 8+. Используйте ее с осторожностью.';
@override
String get pwd => 'Пароль';
@@ -431,7 +480,8 @@ class AppLocalizationsRu extends AppLocalizations {
String get rememberPwdInMem => 'Запомнить пароль в памяти';
@override
String get rememberPwdInMemTip => 'Используется для контейнеров, приостановки и т. д.';
String get rememberPwdInMemTip =>
'Используется для контейнеров, приостановки и т. д.';
@override
String get rememberWindowSize => 'Запомнить размер окна';
@@ -479,7 +529,8 @@ class AppLocalizationsRu extends AppLocalizations {
String get server => 'Сервер';
@override
String get serverDetailOrder => 'Порядок элементов на странице деталей сервера';
String get serverDetailOrder =>
'Порядок элементов на странице деталей сервера';
@override
String get serverFuncBtns => 'Кнопки функций сервера';
@@ -491,10 +542,12 @@ class AppLocalizationsRu extends AppLocalizations {
String get sftpDlPrepare => 'Подготовка подключения...';
@override
String get sftpEditorTip => 'Если пусто, используйте встроенный редактор файлов приложения. Если значение указано, используйте редактор удаленного сервера, например, `vim` (рекомендуется автоматически определять согласно `EDITOR`).';
String get sftpEditorTip =>
'Если пусто, используйте встроенный редактор файлов приложения. Если значение указано, используйте редактор удаленного сервера, например, `vim` (рекомендуется автоматически определять согласно `EDITOR`).';
@override
String get sftpRmrDirSummary => 'Использовать `rm -r` в SFTP для удаления папок';
String get sftpRmrDirSummary =>
'Использовать `rm -r` в SFTP для удаления папок';
@override
String get sftpSSHConnected => 'SFTP подключен...';
@@ -521,7 +574,8 @@ class AppLocalizationsRu extends AppLocalizations {
String get specifyDev => 'Указать устройство';
@override
String get specifyDevTip => 'Например, статистика сетевого трафика по умолчанию относится ко всем устройствам. Здесь вы можете указать конкретное устройство.';
String get specifyDevTip =>
'Например, статистика сетевого трафика по умолчанию относится ко всем устройствам. Здесь вы можете указать конкретное устройство.';
@override
String get speed => 'Скорость';
@@ -532,7 +586,8 @@ class AppLocalizationsRu extends AppLocalizations {
}
@override
String get sshTermHelp => 'Когда терминал можно прокручивать, горизонтальное перетаскивание позволяет выделить текст. Нажатие на кнопку клавиатуры включает/выключает клавиатуру. Иконка файла открывает текущий путь SFTP. Кнопка буфера обмена копирует содержимое, когда текст выделен, и вставляет содержимое из буфера обмена в терминал, когда текст не выделен, а в буфере есть содержимое. Иконка кода вставляет фрагменты кода в терминал и выполняет их.';
String get sshTermHelp =>
'Когда терминал можно прокручивать, горизонтальное перетаскивание позволяет выделить текст. Нажатие на кнопку клавиатуры включает/выключает клавиатуру. Иконка файла открывает текущий путь SFTP. Кнопка буфера обмена копирует содержимое, когда текст выделен, и вставляет содержимое из буфера обмена в терминал, когда текст не выделен, а в буфере есть содержимое. Иконка кода вставляет фрагменты кода в терминал и выполняет их.';
@override
String sshTip(Object url) {
@@ -540,7 +595,8 @@ class AppLocalizationsRu extends AppLocalizations {
}
@override
String get sshVirtualKeyAutoOff => 'Автоматическое переключение виртуальных клавиш';
String get sshVirtualKeyAutoOff =>
'Автоматическое переключение виртуальных клавиш';
@override
String get start => 'Старт';
@@ -567,7 +623,8 @@ class AppLocalizationsRu extends AppLocalizations {
String get suspend => 'Приостановить';
@override
String get suspendTip => 'Функция приостановки требует прав root и поддержки systemd.';
String get suspendTip =>
'Функция приостановки требует прав root и поддержки systemd.';
@override
String switchTo(Object val) {
@@ -578,7 +635,8 @@ class AppLocalizationsRu extends AppLocalizations {
String get sync => 'Синхронизировать';
@override
String get syncTip => 'Возможно, потребуется перезагрузка, чтобы некоторые изменения вступили в силу.';
String get syncTip =>
'Возможно, потребуется перезагрузка, чтобы некоторые изменения вступили в силу.';
@override
String get system => 'Система';
@@ -590,7 +648,8 @@ class AppLocalizationsRu extends AppLocalizations {
String get temperature => 'Температура';
@override
String get termFontSizeTip => 'Эта настройка повлияет на размер терминала (ширина и высота). Вы можете масштабировать страницу терминала, чтобы调整 размер шрифта текущей сессии.';
String get termFontSizeTip =>
'Эта настройка повлияет на размер терминала (ширина и высота). Вы можете масштабировать страницу терминала, чтобы调整 размер шрифта текущей сессии.';
@override
String get terminal => 'Терминал';
@@ -602,7 +661,8 @@ class AppLocalizationsRu extends AppLocalizations {
String get textScaler => 'Масштабирование текста';
@override
String get textScalerTip => '1.0 => 100% (исходный размер), применяется только к части шрифтов на странице сервера, изменение не рекомендуется.';
String get textScalerTip =>
'1.0 => 100% (исходный размер), применяется только к части шрифтов на странице сервера, изменение не рекомендуется.';
@override
String get theme => 'Тема';
@@ -635,10 +695,12 @@ class AppLocalizationsRu extends AppLocalizations {
String get update => 'Обновление';
@override
String get updateIntervalEqual0 => 'Если установлено 0, статус сервера не будет автоматически обновляться.\nТакже не будет рассчитано использование ЦП.';
String get updateIntervalEqual0 =>
'Если установлено 0, статус сервера не будет автоматически обновляться.\nТакже не будет рассчитано использование ЦП.';
@override
String get updateServerStatusInterval => 'Интервал обновления статуса сервера';
String get updateServerStatusInterval =>
'Интервал обновления статуса сервера';
@override
String get upload => 'Загрузить';
@@ -653,7 +715,8 @@ class AppLocalizationsRu extends AppLocalizations {
String get useCdn => 'Использование CDN';
@override
String get useCdnTip => 'Не китайским пользователям рекомендуется использовать CDN. Хотели бы вы его использовать?';
String get useCdnTip =>
'Не китайским пользователям рекомендуется использовать CDN. Хотели бы вы его использовать?';
@override
String get useNoPwd => 'Будет использоваться без пароля';
@@ -671,7 +734,8 @@ class AppLocalizationsRu extends AppLocalizations {
String get viewErr => 'Просмотр ошибок';
@override
String get virtKeyHelpClipboard => 'Если в терминале выделен текст, то он копируется в буфер обмена, в противном случае содержимое буфера вставляется в терминал.';
String get virtKeyHelpClipboard =>
'Если в терминале выделен текст, то он копируется в буфер обмена, в противном случае содержимое буфера вставляется в терминал.';
@override
String get virtKeyHelpIME => 'Включить/выключить клавиатуру';
@@ -695,14 +759,17 @@ class AppLocalizationsRu extends AppLocalizations {
String get whenOpenApp => 'При открытии приложения';
@override
String get wolTip => 'После настройки WOL (Wake-on-LAN) при каждом подключении к серверу отправляется запрос WOL.';
String get wolTip =>
'После настройки WOL (Wake-on-LAN) при каждом подключении к серверу отправляется запрос WOL.';
@override
String get write => 'Запись';
@override
String get writeScriptFailTip => 'Запись скрипта не удалась, возможно, из-за отсутствия прав или потому что, директории не существует.';
String get writeScriptFailTip =>
'Запись скрипта не удалась, возможно, из-за отсутствия прав или потому что, директории не существует.';
@override
String get writeScriptTip => 'После подключения к серверу скрипт будет записан в ~/.config/server_box для мониторинга состояния системы. Вы можете проверить содержимое скрипта.';
String get writeScriptTip =>
'После подключения к серверу скрипт будет записан в ~/.config/server_box для мониторинга состояния системы. Вы можете проверить содержимое скрипта.';
}

View File

@@ -1,3 +1,5 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'l10n.dart';
// ignore_for_file: type=lint
@@ -7,13 +9,14 @@ class AppLocalizationsTr extends AppLocalizations {
AppLocalizationsTr([String locale = 'tr']) : super(locale);
@override
String get aboutThanks => 'Katılım gösteren aşağıdaki kişilere teşekkür ederiz.';
String get aboutThanks => 'Aşağıdaki katılımcılara teşekkürler.';
@override
String get acceptBeta => 'Beta sürüm güncellemelerini kabul et';
@override
String get addSystemPrivateKeyTip => 'Şu anda özel anahtar yok, sistemle geleni (~/.ssh/id_rsa) eklemek ister misiniz?';
String get addSystemPrivateKeyTip =>
'Şu anda özel anahtarlar mevcut değil, sistemle birlikte gelen anahtarı (~/.ssh/id_rsa) eklemek ister misiniz?';
@override
String get added2List => 'Görev listesine eklendi';
@@ -22,13 +25,15 @@ class AppLocalizationsTr extends AppLocalizations {
String get addr => 'Adres';
@override
String get alreadyLastDir => 'Zaten son klasörde.';
String get alreadyLastDir => 'Zaten son dizindesiniz.';
@override
String get authFailTip => 'Kimlik doğrulama başarısız, kimlik bilgilerinin doğru olup olmadığını kontrol edin';
String get authFailTip =>
'Kimlik doğrulama başarısız oldu, lütfen kimlik bilgilerinin doğru olup olmadığını kontrol edin';
@override
String get autoBackupConflict => 'Aynı anda yalnızca bir otomatik yedekleme etkinleştirilebilir.';
String get autoBackupConflict =>
'Aynı anda yalnızca bir otomatik yedekleme açık olabilir.';
@override
String get autoConnect => 'Otomatik bağlan';
@@ -37,13 +42,14 @@ class AppLocalizationsTr extends AppLocalizations {
String get autoRun => 'Otomatik çalıştır';
@override
String get autoUpdateHomeWidget => 'Ana widget\'ı otomatik güncelle';
String get autoUpdateHomeWidget => 'Ana ekran bileşenini otomatik güncelle';
@override
String get backupTip => 'Dışa aktarılan veriler zayıf bir şekilde şifrelenmiştir. \nLütfen güvenli bir yerde saklayın.';
String get backupTip =>
'Dışa aktarılan veriler zayıf bir şekilde şifrelenmiştir. \nLütfen güvenli bir şekilde saklayın.';
@override
String get backupVersionNotMatch => 'Yedekleme sürümü uyumlu değil.';
String get backupVersionNotMatch => 'Yedekleme sürümü eşleşmiyor.';
@override
String get battery => 'Pil';
@@ -52,7 +58,8 @@ class AppLocalizationsTr extends AppLocalizations {
String get bgRun => 'Arka planda çalıştır';
@override
String get bgRunTip => 'Bu anahtar yalnızca programın arka planda çalışmayı deneyeceğini ifade eder. Arka planda çalışıp çalışamayacağı, iznin etkinleştirilip etkinleştirilmediğine bağlıdır. AOSP tabanlı Android ROM\'larda, bu uygulamada \"Pil Optimizasyonunu\" devre dışı bırakın. MIUI / HyperOS için, güç tasarrufu politikasını \"Sınırsız\" olarak değiştirin.';
String get bgRunTip =>
'Bu anahtar yalnızca programın arka planda çalışmayı deneyeceği anlamına gelir. Arka planda çalışıp çalışamayacağı, iznin etkinleştirilip etkinleştirilmediğine bağlıdır. AOSP tabanlı Android ROM\'lar için lütfen bu uygulamada \"Pil Optimizasyonu\"nu devre dışı bırakın. MIUI / HyperOS için lütfen güç tasarrufu politikasını \"Sınırsız\" olarak değiştirin.';
@override
String get closeAfterSave => 'Kaydet ve kapat';
@@ -61,7 +68,8 @@ class AppLocalizationsTr extends AppLocalizations {
String get cmd => 'Komut';
@override
String get collapseUITip => 'UI\'daki uzun listeleri varsayılan olarak gizleyip gizlememeyi belirler';
String get collapseUITip =>
'Arayüzde uzun listelerin varsayılan olarak daraltılıp daraltılmayacağı';
@override
String get conn => 'Bağlantı';
@@ -70,7 +78,8 @@ class AppLocalizationsTr extends AppLocalizations {
String get container => 'Konteyner';
@override
String get containerTrySudoTip => 'Örneğin: Uygulamada kullanıcı aaa olarak ayarlanmış, ancak Docker root kullanıcısı altında kurulmuş. Bu durumda, bu seçeneği etkinleştirmeniz gerekir.';
String get containerTrySudoTip =>
'Örneğin: Uygulamada kullanıcı aaa olarak ayarlanmış, ancak Docker root kullanıcısı altında kurulmuş. Bu durumda bu seçeneği etkinleştirmeniz gerekir.';
@override
String get convert => 'Dönüştür';
@@ -79,7 +88,8 @@ class AppLocalizationsTr extends AppLocalizations {
String get copyPath => 'Yolu kopyala';
@override
String get cpuViewAsProgressTip => 'Her CPU\'nun kullanımını bir ilerleme çubuğu tarzında görüntüle (eski tarz)';
String get cpuViewAsProgressTip =>
'Her CPU\'nun kullanımını ilerleme çubuğu tarzında göster (eski tarz)';
@override
String get cursorType => 'İmleç türü';
@@ -88,7 +98,8 @@ class AppLocalizationsTr extends AppLocalizations {
String get customCmd => 'Özel komutlar';
@override
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
String get customCmdDocUrl =>
'https://github.com/lollipopkit/flutter_server_box/wiki#özel-komutlar';
@override
String get customCmdHint => '\"Komut Adı\": \"Komut\"';
@@ -100,7 +111,11 @@ class AppLocalizationsTr extends AppLocalizations {
String get decompress => 'Sıkıştırmayı';
@override
String get deleteServers => 'Toplu sunucu silme';
String get deleteServers => 'Sunucuları toplu sil';
@override
String get desktopTerminalTip =>
'SSH oturumları başlatılırken terminal öykünücüsünü açmak için kullanılan komut.';
@override
String get dirEmpty => 'Klasörün boş olduğundan emin olun.';
@@ -112,18 +127,22 @@ class AppLocalizationsTr extends AppLocalizations {
String get disk => 'Disk';
@override
String get diskIgnorePath => 'Disk için göz ardı edilen yol';
String get diskHealth => 'Disk sağlığı';
@override
String get displayCpuIndex => 'CPU dizinini görüntüle';
String get diskIgnorePath => 'Disk için yok sayılan yol';
@override
String get displayCpuIndex => 'CPU indeksini göster';
@override
String dl2Local(Object fileName) {
return '$fileName dosyasını yerel olarak indirmek istiyor musunuz?';
return '$fileName dosyasını yerel cihaza indir?';
}
@override
String get dockerEmptyRunningItems => 'Çalışan konteyner yok.\nBu şu sebeplerden kaynaklanabilir:\n- Docker kurulumu kullanıcı adı, uygulamada yapılandırılan kullanıcı adıyla aynı değil.\n- DOCKER_HOST ortam değişkeni doğru okunmadı. Terminalde `echo \$DOCKER_HOST` komutunu çalıştırarak elde edebilirsiniz.';
String get dockerEmptyRunningItems =>
'Çalışan konteyner yok.\nBunun nedeni şunlar olabilir:\n- Docker kurulum kullanıcısı, uygulamada yapılandırılan kullanıcı adıyla aynı değil.\n- DOCKER_HOST ortam değişkeni doğru okunmadı. Terminalde `echo \$DOCKER_HOST` komutunu çalıştırarak kontrol edebilirsiniz.';
@override
String dockerImagesFmt(Object count) {
@@ -131,11 +150,14 @@ class AppLocalizationsTr extends AppLocalizations {
}
@override
String get dockerNotInstalled => 'Docker kurulu değil';
String get dockerNotInstalled => 'Docker kurulmamış';
@override
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
return '$runningCount çalışıyor, $stoppedCount konteyner durduruldu.';
String dockerStatusRunningAndStoppedFmt(
Object runningCount,
Object stoppedCount,
) {
return '$runningCount çalışıyor, $stoppedCount konteyner durdurulmuş.';
}
@override
@@ -147,16 +169,21 @@ class AppLocalizationsTr extends AppLocalizations {
String get doubleColumnMode => 'Çift sütun modu';
@override
String get doubleColumnTip => 'Bu seçenek yalnızca özelliği etkinleştirir, gerçekten etkinleştirilebilir olup olmadığını cihazın genişliği belirler';
String get doubleColumnTip =>
'Bu seçenek yalnızca özelliği etkinleştirir, gerçekten etkinleşip etkinleşmeyeceği cihazın genişliğine bağlıdır';
@override
String get editVirtKeys => 'Sanal tuşları düzenle';
@override
String get editor => 'Editör';
String get editor => 'Düzenleyici';
@override
String get editorHighlightTip => 'Mevcut kod vurgulama performansı ideal değil ve isteğe bağlı olarak kapatılabilir.';
String get editorHighlightTip =>
'Mevcut kod vurgulama performansı ideal değil ve isteğe bağlı olarak kapatılabilir.';
@override
String get emulator => 'Emülatör';
@override
String get encode => 'Kodla';
@@ -174,13 +201,15 @@ class AppLocalizationsTr extends AppLocalizations {
String get fallbackSshDest => 'Yedek SSH hedefi';
@override
String get fdroidReleaseTip => 'Bu uygulamayı F-Droid\'den indirdiyseniz, bu seçeneği kapatmanız önerilir.';
String get fdroidReleaseTip =>
'Bu uygulamayı F-Droid\'den indirdiyseniz, bu seçeneği kapatmanız önerilir.';
@override
String get fgService => 'Ön plan hizmeti';
String get fgService => 'Ön Plan Servisi';
@override
String get fgServiceTip => 'Etkinleştirdikten sonra, bazı cihaz modellerinde çökme olabilir. Devre dışı bırakmak, bazı modellerin SSH bağlantılarını arka planda sürdürememesine neden olabilir. Lütfen sistem ayarlarında ServerBox bildirim izinlerine, arka planda çalışmaya ve kendiliğinden uyanmaya izin verin.';
String get fgServiceTip =>
'Etkinleştirildikten sonra bazı cihaz modellerinde çökme olabilir. Devre dışı bırakmak, bazı modellerde SSH bağlantılarının arka planda sürdürülememesine neden olabilir. Lütfen sistem ayarlarında ServerBox bildirim izinlerini, arka planda çalışmayı ve otomatik uyanmayı etkinleştirin.';
@override
String fileTooLarge(Object file, Object size, Object sizeMax) {
@@ -203,13 +232,14 @@ class AppLocalizationsTr extends AppLocalizations {
String get fullScreen => 'Tam ekran modu';
@override
String get fullScreenJitter => 'Tam ekran titremesi';
String get fullScreenJitter => 'Tam ekran titreşim';
@override
String get fullScreenJitterHelp => 'Ekran yanıklarını önlemek için';
String get fullScreenJitterHelp => 'Ekran yanmasını önlemek için';
@override
String get fullScreenTip => 'Cihaz yatay moda döndürüldüğünde tam ekran modu etkinleştirilsin mi? Bu seçenek yalnızca sunucu sekmesi için geçerlidir.';
String get fullScreenTip =>
'Cihaz yatay moda döndürüldüğünde tam ekran modu etkinleştirilsin mi? Bu seçenek yalnızca sunucu sekmesi için geçerlidir.';
@override
String get goBackQ => 'Geri dön?';
@@ -224,10 +254,10 @@ class AppLocalizationsTr extends AppLocalizations {
String get highlight => 'Kod vurgulama';
@override
String get homeWidgetUrlConfig => 'Ana sayfa widget URL\'sini yapılandır';
String get homeWidgetUrlConfig => 'Ana ekran bileşeni URL\'sini yapılandır';
@override
String get host => 'Sunucu';
String get host => 'Ana bilgisayar';
@override
String httpFailedWithCode(Object code) {
@@ -235,13 +265,13 @@ class AppLocalizationsTr extends AppLocalizations {
}
@override
String get ignoreCert => 'Sertifikayı yoksay';
String get ignoreCert => 'Sertifikayı yok say';
@override
String get image => 'Resim';
String get image => 'Görüntü';
@override
String get imagesList => 'Resim listesi';
String get imagesList => 'Görüntü listesi';
@override
String get init => 'Başlat';
@@ -253,7 +283,8 @@ class AppLocalizationsTr extends AppLocalizations {
String get install => 'Kur';
@override
String get installDockerWithUrl => 'Lütfen önce Docker\'ı https://docs.docker.com/engine/install adresinden kurun.';
String get installDockerWithUrl =>
'Lütfen önce https://docs.docker.com/engine/install adresinden Docker\'ı kurun.';
@override
String get invalid => 'Geçersiz';
@@ -262,22 +293,24 @@ class AppLocalizationsTr extends AppLocalizations {
String get jumpServer => 'Atlama sunucusu';
@override
String get keepForeground => 'Uygulama ön planda kalsın!';
String get keepForeground => 'Uygulamayı ön planda tut!';
@override
String get keepStatusWhenErr => 'Son sunucu durumunu koru';
@override
String get keepStatusWhenErrTip => 'Yalnızca betik yürütme sırasında bir hata oluştuğunda';
String get keepStatusWhenErrTip =>
'Yalnızca betik yürütülmesi sırasında bir hata olduğunda';
@override
String get keyAuth => 'Anahtar Doğrulama';
String get keyAuth => 'Anahtar Kimlik Doğrulama';
@override
String get letterCache => 'Harf önbelleği';
@override
String get letterCacheTip => 'Devre dışı bırakılması önerilir, ancak devre dışı bırakıldıktan sonra CJK karakterleri girilemez.';
String get letterCacheTip =>
'Devre dışı bırakılması önerilir, ancak devre dışı bırakıldığında CJK karakterlerini girmek mümkün olmayacaktır.';
@override
String get license => 'Lisans';
@@ -286,7 +319,7 @@ class AppLocalizationsTr extends AppLocalizations {
String get location => 'Konum';
@override
String get loss => 'kayıp';
String get loss => 'Kayıp';
@override
String madeWithLove(Object myGithub) {
@@ -294,16 +327,16 @@ class AppLocalizationsTr extends AppLocalizations {
}
@override
String get manual => 'Kılavuz';
String get manual => 'Manuel';
@override
String get max => 'maks';
@override
String get maxRetryCount => 'Sunucu yeniden bağlanma sayısı';
String get maxRetryCount => 'Sunucu yeniden bağlantı sayısı';
@override
String get maxRetryCountEqual0 => 'Sürekli olarak tekrar denenecek.';
String get maxRetryCountEqual0 => 'Tekrar tekrar deneyecek.';
@override
String get min => 'min';
@@ -315,13 +348,15 @@ class AppLocalizationsTr extends AppLocalizations {
String get more => 'Daha fazla';
@override
String get moveOutServerFuncBtnsHelp => 'ık: Sunucu sekmesi sayfasındaki her kartın altında görüntülenebilir. Kapalı: Sunucu Detayları sayfasının üst kısmında görüntülenebilir.';
String get moveOutServerFuncBtnsHelp =>
'ık: Sunucu Sekmesi sayfasındaki her kartın altında görüntülenebilir. Kapalı: Sunucu Ayrıntıları sayfasının üstünde görüntülenebilir.';
@override
String get ms => 'ms';
@override
String get needHomeDir => 'Synology kullanıcısıysanız, [buraya bakın](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Diğer sistem kullanıcılarının bir ana dizin oluşturmayı öğrenmeleri gerekir.';
String get needHomeDir =>
'Synology kullanıcısıysanız, [buraya bakın](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Diğer sistem kullanıcılarının bir ana dizin oluşturma yöntemini araması gerekir.';
@override
String get needRestart => 'Uygulamanın yeniden başlatılması gerekiyor';
@@ -330,22 +365,23 @@ class AppLocalizationsTr extends AppLocalizations {
String get net => '';
@override
String get netViewType => 'Ağ görünümü türü';
String get netViewType => 'Ağ görüntüleme türü';
@override
String get newContainer => 'Yeni konteyner';
@override
String get noLineChart => 'Çizgi grafik kullanma';
String get noLineChart => 'Çizgi grafikleri kullanma';
@override
String get noLineChartForCpu => 'CPU için çizgi grafik kullanma';
String get noLineChartForCpu => 'CPU için çizgi grafikleri kullanma';
@override
String get noPrivateKeyTip => 'Özel anahtar mevcut değil, silinmiş olabilir veya bir yapılandırma hatası vardır.';
String get noPrivateKeyTip =>
'Özel anahtar mevcut değil, silinmiş olabilir veya yapılandırma hatası vardır.';
@override
String get noPromptAgain => 'Tekrar hatırlatma';
String get noPromptAgain => 'Tekrar sorma';
@override
String get node => 'Düğüm';
@@ -354,49 +390,56 @@ class AppLocalizationsTr extends AppLocalizations {
String get notAvailable => 'Kullanılamaz';
@override
String get onServerDetailPage => 'Sunucu detay sayfasında';
String get onServerDetailPage => 'Sunucu ayrıntı sayfasında';
@override
String get onlyOneLine => 'Yalnızca bir satır olarak göster (kaydırılabilir)';
String get onlyOneLine => 'Yalnızca tek satır olarak göster (kaydırılabilir)';
@override
String get onlyWhenCoreBiggerThan8 => 'Yalnızca çekirdek sayısı 8\'den fazla olduğunda çalışır';
String get onlyWhenCoreBiggerThan8 =>
'Çekirdek sayısı 8\'den büyük olduğunda çalışır';
@override
String get openLastPath => 'Son yolu aç';
@override
String get openLastPathTip => 'Farklı sunucuların farklı günlükleri olacaktır ve çıkış yolu log dosyasıdır';
String get openLastPathTip =>
'Farklı sunucular farklı günlükler tutar ve günlük, çıkış yoludur';
@override
String get parseContainerStatsTip => 'Docker\'ın işgal durumunu analiz etmek nispeten yavaştır.';
String get parseContainerStatsTip =>
'Docker\'ın doluluk durumunu ayrıştırmak oldukça yavaş.';
@override
String percentOfSize(Object percent, Object size) {
return '$size\'nin %$percent\'i';
return '$size\'ın $percent%\'i';
}
@override
String get permission => 'İzinler';
@override
String get pingAvg => 'Ortalama:';
String get pingAvg => 'Ort:';
@override
String get pingInputIP => 'Lütfen bir hedef IP / etki alanı girin.';
String get pingInputIP => 'Lütfen bir hedef IP / alan adı girin.';
@override
String get pingNoServer => 'Ping yapılacak sunucu yok.\nLütfen sunucu sekmesine bir sunucu ekleyin.';
String get pingNoServer =>
'Ping yapılacak sunucu yok.\nLütfen sunucu sekmesinde bir sunucu ekleyin.';
@override
String get pkg => 'Paket';
@override
String get plugInType => 'Takma Türü';
String get plugInType => 'Eklenti Türü';
@override
String get port => 'Port';
@override
String get preferDiskAmount => 'Disk kapasitesini öncelikli olarak göster';
@override
String get preview => 'Önizleme';
@@ -404,19 +447,22 @@ class AppLocalizationsTr extends AppLocalizations {
String get privateKey => 'Özel Anahtar';
@override
String get process => 'Süreç';
String get process => 'İşlem';
@override
String get pushToken => 'Push token';
String get pushToken => 'Push belirteci';
@override
String get pveIgnoreCertTip => 'Etkinleştirilmesi önerilmez, güvenlik risklerine dikkat edin! PVE\'nin varsayılan sertifikasını kullanıyorsanız, bu seçeneği etkinleştirmeniz gerekir.';
String get pveIgnoreCertTip =>
'Etkinleştirilmesi önerilmez, güvenlik risklerine dikkat edin! PVE\'den varsayılan sertifikayı kullanıyorsanız, bu seçeneği etkinleştirmeniz gerekir.';
@override
String get pveLoginFailed => 'Giriş başarısız. Linux PAM girişi için sunucu yapılandırmasındaki kullanıcı adı/şifre ile kimlik doğrulaması yapılamadı.';
String get pveLoginFailed =>
'Giriş başarısız. Linux PAM girişi için sunucu yapılandırmasındaki kullanıcı adı/şifre ile kimlik doğrulama yapılamadı.';
@override
String get pveVersionLow => 'Bu özellik şu anda test aşamasında ve sadece PVE 8+ üzerinde test edilmiştir. Lütfen dikkatli kullanın.';
String get pveVersionLow =>
'Bu özellik şu anda test aşamasında ve yalnızca PVE 8+ üzerinde test edildi. Lütfen dikkatli kullanın.';
@override
String get pwd => 'Şifre';
@@ -428,10 +474,11 @@ class AppLocalizationsTr extends AppLocalizations {
String get reboot => 'Yeniden başlat';
@override
String get rememberPwdInMem => 'Şifreyi bellekte sakla';
String get rememberPwdInMem => 'Şifreyi bellekte hatırla';
@override
String get rememberPwdInMemTip => 'Konteynerler, askıya alma vb. için kullanılır.';
String get rememberPwdInMemTip =>
'Konteynerler, askıya alma vb. için kullanılır.';
@override
String get rememberWindowSize => 'Pencere boyutunu hatırla';
@@ -446,7 +493,7 @@ class AppLocalizationsTr extends AppLocalizations {
String get result => 'Sonuç';
@override
String get rotateAngel => 'Dönmeısı';
String get rotateAngel => 'Dönüşısı';
@override
String get route => 'Yönlendirme';
@@ -458,7 +505,7 @@ class AppLocalizationsTr extends AppLocalizations {
String get running => 'Çalışıyor';
@override
String get sameIdServerExist => 'Aynı kimliğe sahip bir sunucu zaten var';
String get sameIdServerExist => 'Aynı kimliğe sahip bir sunucu zaten mevcut';
@override
String get save => 'Kaydet';
@@ -473,13 +520,13 @@ class AppLocalizationsTr extends AppLocalizations {
String get sensors => 'Sensör';
@override
String get sequence => 'Dizi';
String get sequence => 'Sıra';
@override
String get server => 'Sunucu';
@override
String get serverDetailOrder => 'Ayrıntı sayfası widget sırası';
String get serverDetailOrder => 'Ayrıntı sayfası bileşen sırası';
@override
String get serverFuncBtns => 'Sunucu işlev düğmeleri';
@@ -488,16 +535,18 @@ class AppLocalizationsTr extends AppLocalizations {
String get serverOrder => 'Sunucu sırası';
@override
String get sftpDlPrepare => 'Bağlantı hazırlığı yapılıyor...';
String get sftpDlPrepare => 'Bağlantı hazırlanıyor...';
@override
String get sftpEditorTip => 'Boşsa, uygulamanın yerleşik dosya düzenleyicisini kullanın. Bir değer varsa, uzak sunucunun düzenleyicisini kullanın, örneğin, `vim` (otomatik olarak `EDITOR`\'a göre algılamanız önerilir).';
String get sftpEditorTip =>
'Boşsa, uygulamanın yerleşik dosya düzenleyicisi kullanılır. Bir değer varsa, uzak sunucunun düzenleyicisi kullanılır, örn. `vim` (otomatik olarak `EDITOR`\'a göre algılanması önerilir).';
@override
String get sftpRmrDirSummary => 'SFTP\'de bir klasörü silmek için `rm -r` kullanın.';
String get sftpRmrDirSummary =>
'SFTP\'de bir klasörü silmek için `rm -r` kullan.';
@override
String get sftpSSHConnected => 'SFTP Bağlantısı';
String get sftpSSHConnected => 'SFTP Bağlandı';
@override
String get sftpShowFoldersFirst => 'Önce klasörleri göster';
@@ -512,31 +561,33 @@ class AppLocalizationsTr extends AppLocalizations {
String get size => 'Boyut';
@override
String get snippet => 'Parça';
String get snippet => 'Kod parçacığı';
@override
String get softWrap => 'Yumuşak kaydırma';
@override
String get specifyDev => 'Cihazı belirle';
String get specifyDev => 'Cihazı belirt';
@override
String get specifyDevTip => 'Örneğin, ağ trafiği istatistikleri varsayılan olarak tüm cihazlar içindir. Burada belirli bir cihazı belirtebilirsiniz.';
String get specifyDevTip =>
'Örneğin, ağ trafiği istatistikleri varsayılan olarak tüm cihazlar içindir. Burada belirli bir cihaz belirtebilirsiniz.';
@override
String get speed => 'Hız';
@override
String spentTime(Object time) {
return 'Harcanan zaman: $time';
return 'Harcanan süre: $time';
}
@override
String get sshTermHelp => 'Terminal kaydırılabilir olduğunda, yatay sürükleme metni seçebilir. Klavye düğmesine tıklamak klavyeyi açar/kapatır. Dosya simgesi mevcut yolu SFTP\'de açar. Pano düğmesi metin seçildiğinde içeriği kopyalar ve metin seçilmediğinde ve panoda içerik olduğunda panodaki içeriği terminale yapıştırır. Kod simgesi kod parçacıklarını terminale yapıştırır ve çalıştırır.';
String get sshTermHelp =>
'Terminal kaydırılabilir olduğunda, yatay olarak sürüklemek metni seçebilir. Klavye düğmesine tıklamak klavyeyi açar/kapar. Dosya simgesi mevcut yolu SFTP\'de açar. Pano düğmesi, metin seçiliyken içeriği kopyalar ve metin seçili değilken panoda içerik varsa terminale yapıştırır. Kod simgesi, kod parçacıklarını terminale yapıştırır ve yürütür.';
@override
String sshTip(Object url) {
return 'Bu işlev şu anda deneme aşamasındadır.\n\nLütfen hataları $url adresine bildirin veya geliştirmemize katılın.';
return 'Bu işlev şu anda deneysel aşamada.\n\nLütfen hataları $url adresinde bildirin veya geliştirmemize katılın.';
}
@override
@@ -561,24 +612,27 @@ class AppLocalizationsTr extends AppLocalizations {
String get storage => 'Depolama';
@override
String get supportFmtArgs => 'Aşağıdaki biçimlendirme parametreleri desteklenir:';
String get supportFmtArgs =>
'Aşağıdaki biçimlendirme parametreleri desteklenir:';
@override
String get suspend => 'Askıya al';
@override
String get suspendTip => 'Askıya alma işlevi kök izinleri ve systemd desteği gerektirir.';
String get suspendTip =>
'Askıya alma işlevi, root izni ve systemd desteği gerektirir.';
@override
String switchTo(Object val) {
return '$val öğesine geç';
return '$val\'a geç';
}
@override
String get sync => 'Senkronize et';
@override
String get syncTip => 'Bazı değişikliklerin etkili olması için yeniden başlatma gerekebilir.';
String get syncTip =>
'Bazı değişikliklerin etkili olması için yeniden başlatma gerekebilir.';
@override
String get system => 'Sistem';
@@ -590,7 +644,8 @@ class AppLocalizationsTr extends AppLocalizations {
String get temperature => 'Sıcaklık';
@override
String get termFontSizeTip => 'Bu ayar terminal boyutunu (genişlik ve yükseklik) etkileyecektir. Terminal sayfasında yakınlaştırarak mevcut oturumun yazı tipi boyutunu ayarlayabilirsiniz.';
String get termFontSizeTip =>
'Bu ayar terminal boyutunu (genişlik ve yükseklik) etkiler. Terminal sayfasında yakınlaştırarak mevcut oturumun yazı tipi boyutunu ayarlayabilirsiniz.';
@override
String get terminal => 'Terminal';
@@ -602,7 +657,8 @@ class AppLocalizationsTr extends AppLocalizations {
String get textScaler => 'Metin ölçekleyici';
@override
String get textScalerTip => '1.0 => %100 (orijinal boyut), yalnızca sunucu sayfası kısmındaki yazı tipine çalışır, değiştirilmesi önerilmez.';
String get textScalerTip =>
'1.0 => %100 (orijinal boyut), yalnızca sunucu sayfasındaki yazı tipinin bir kısmı üzerinde çalışır, değiştirilmesi önerilmez.';
@override
String get theme => 'Tema';
@@ -611,7 +667,7 @@ class AppLocalizationsTr extends AppLocalizations {
String get time => 'Zaman';
@override
String get times => 'Zamanlar';
String get times => 'Kez';
@override
String get total => 'Toplam';
@@ -620,7 +676,7 @@ class AppLocalizationsTr extends AppLocalizations {
String get traffic => 'Trafik';
@override
String get trySudo => 'Sudo kullanmayı deneyin';
String get trySudo => 'Sudo ile dene';
@override
String get ttl => 'TTL';
@@ -629,13 +685,14 @@ class AppLocalizationsTr extends AppLocalizations {
String get unknown => 'Bilinmeyen';
@override
String get unkownConvertMode => 'Bilinmeyen dönüştürme modu';
String get unkownConvertMode => 'Bilinmeyen dönüşüm modu';
@override
String get update => 'Güncelle';
@override
String get updateIntervalEqual0 => '0 olarak ayarladınız, otomatik olarak güncellenmeyecek.\nCPU durumunu hesaplayamıyor.';
String get updateIntervalEqual0 =>
'0 olarak ayarladınız, otomatik güncelleme yapılmayacak.\nCPU durumu hesaplanamaz.';
@override
String get updateServerStatusInterval => 'Sunucu durumu güncelleme aralığı';
@@ -644,16 +701,17 @@ class AppLocalizationsTr extends AppLocalizations {
String get upload => 'Yükle';
@override
String get upsideDown => 'Ters';
String get upsideDown => 'Başaşağı';
@override
String get uptime => 'Çalışma süresi';
@override
String get useCdn => 'CDN kullanılıyor';
String get useCdn => 'CDN kullan';
@override
String get useCdnTip => 'Çin dışındaki kullanıcıların CDN kullanması önerilir. Kullanmak ister misiniz?';
String get useCdnTip =>
'Çinli olmayan kullanıcıların CDN kullanması önerilir. Kullanmak ister misiniz?';
@override
String get useNoPwd => 'Şifre kullanılmayacak';
@@ -662,22 +720,23 @@ class AppLocalizationsTr extends AppLocalizations {
String get usePodmanByDefault => 'Varsayılan olarak Podman kullan';
@override
String get used => 'Kullanıldı';
String get used => 'Kullanılan';
@override
String get view => 'Görünüm';
@override
String get viewErr => 'Hataya bakın';
String get viewErr => 'Hatayı gör';
@override
String get virtKeyHelpClipboard => 'Seçilen terminal boş değilse panoya kopyalayın, aksi takdirde panodaki içeriği terminale yapıştırın.';
String get virtKeyHelpClipboard =>
'Seçili terminal boş değilse panoya kopyala, aksi takdirde panodaki içeriği terminale yapıştır.';
@override
String get virtKeyHelpIME => 'Klavye aç/kapat';
String get virtKeyHelpIME => 'Klavyeyi aç/kapat';
@override
String get virtKeyHelpSFTP => 'Geçerli dizini SFTP\'de açın.';
String get virtKeyHelpSFTP => 'Mevcut dizini SFTP\'de aç.';
@override
String get waitConnection => 'Lütfen bağlantının kurulmasını bekleyin.';
@@ -686,23 +745,26 @@ class AppLocalizationsTr extends AppLocalizations {
String get wakeLock => 'Uyanık tut';
@override
String get watchNotPaired => 'Eşlenmiş Apple Watch yok';
String get watchNotPaired => 'Eşleştirilmiş Apple Watch yok';
@override
String get webdavSettingEmpty => 'WebDav ayarı boş';
@override
String get whenOpenApp => 'Uygulamayıarken';
String get whenOpenApp => 'Uygulama açıldığında';
@override
String get wolTip => 'WOL (Wake-on-LAN) yapılandırıldıktan sonra, her sunucuya bağlandığınızda bir WOL isteği gönderilir.';
String get wolTip =>
'WOL (Wake-on-LAN) yapılandırıldıktan sonra, sunucuya her bağlanıldığında bir WOL isteği gönderilir.';
@override
String get write => 'Yaz';
@override
String get writeScriptFailTip => 'Komut dosyasına yazma başarısız oldu, muhtemelen izin eksikliğinden veya dizin mevcut olmadığından kaynaklanıyor olabilir.';
String get writeScriptFailTip =>
'Betik yazma başarısız oldu, muhtemelen izin eksikliği veya dizin mevcut değil.';
@override
String get writeScriptTip => 'Sunucuya bağlandıktan sonra, sistem durumunu izlemek için ~/.config/server_box\'a bir komut dosyası yazılacaktır. Komut dosyası içeriğini inceleyebilirsiniz.';
String get writeScriptTip =>
'Sunucuya bağlandıktan sonra, sistem durumunu izlemek için ~/.config/server_box dizinine bir betik yazılacak. Betik içeriğini inceleyebilirsiniz.';
}

View File

@@ -1,3 +1,5 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'l10n.dart';
// ignore_for_file: type=lint
@@ -13,7 +15,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get acceptBeta => 'Прийняти оновлення бета-версії';
@override
String get addSystemPrivateKeyTip => 'Наразі приватних ключів нема, хочете додати той, що йде з системою (~/.ssh/id_rsa)?';
String get addSystemPrivateKeyTip =>
'Наразі приватних ключів нема, хочете додати той, що йде з системою (~/.ssh/id_rsa)?';
@override
String get added2List => 'Додано до списку завдань';
@@ -25,10 +28,12 @@ class AppLocalizationsUk extends AppLocalizations {
String get alreadyLastDir => 'Вже в останньому каталозі.';
@override
String get authFailTip => 'Авторизація не вдалася, будь ласка, перевірте правильність облікових даних';
String get authFailTip =>
'Авторизація не вдалася, будь ласка, перевірте правильність облікових даних';
@override
String get autoBackupConflict => 'Тільки одне автоматичне резервне копіювання може бути активне одночасно.';
String get autoBackupConflict =>
'Тільки одне автоматичне резервне копіювання може бути активне одночасно.';
@override
String get autoConnect => 'Авто підключення';
@@ -37,13 +42,16 @@ class AppLocalizationsUk extends AppLocalizations {
String get autoRun => 'Авто запуск';
@override
String get autoUpdateHomeWidget => 'Автоматичне оновлення віджетів на головному екрані';
String get autoUpdateHomeWidget =>
'Автоматичне оновлення віджетів на головному екрані';
@override
String get backupTip => 'Експортовані дані слабо зашифровані. \nБудь ласка, зберігайте їх у безпеці.';
String get backupTip =>
'Експортовані дані слабо зашифровані. \nБудь ласка, зберігайте їх у безпеці.';
@override
String get backupVersionNotMatch => 'Версія резервного копіювання не збіглася.';
String get backupVersionNotMatch =>
'Версія резервного копіювання не збіглася.';
@override
String get battery => 'Акумулятор';
@@ -52,7 +60,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get bgRun => 'Запуск у фоновому режимі';
@override
String get bgRunTip => 'Цей перемикач лише вказує на те, що програма намагатиметься працювати у фоновому режимі. Чи може вона працювати у фоновому режимі, залежить від прав доступу. Для AOSP-орієнтованих Android ROM, будь ласка, вимкніть \"Оптимізацію акумулятора\" в цьому додатку. Для MIUI / HyperOS, будь ласка, змініть політику економії енергії на \"Нескінченна\".';
String get bgRunTip =>
'Цей перемикач лише вказує на те, що програма намагатиметься працювати у фоновому режимі. Чи може вона працювати у фоновому режимі, залежить від прав доступу. Для AOSP-орієнтованих Android ROM, будь ласка, вимкніть \"Оптимізацію акумулятора\" в цьому додатку. Для MIUI / HyperOS, будь ласка, змініть політику економії енергії на \"Нескінченна\".';
@override
String get closeAfterSave => 'Зберегти та закрити';
@@ -61,7 +70,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get cmd => 'Команда';
@override
String get collapseUITip => 'Сховати довгі списки, що є у UI за замовчуванням';
String get collapseUITip =>
'Сховати довгі списки, що є у UI за замовчуванням';
@override
String get conn => 'З\'єднання';
@@ -70,7 +80,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get container => 'Контейнер';
@override
String get containerTrySudoTip => 'Наприклад: У застосунку користувач це aaa, але Docker встановлений під користувачем root. У цьому випадку вам потрібно активувати цю опцію.';
String get containerTrySudoTip =>
'Наприклад: У застосунку користувач це aaa, але Docker встановлений під користувачем root. У цьому випадку вам потрібно активувати цю опцію.';
@override
String get convert => 'Конвертувати';
@@ -79,7 +90,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get copyPath => 'Скопіювати шлях';
@override
String get cpuViewAsProgressTip => 'Відобразити використання кожного процесора у вигляді стовпчикової діаграми (старий стиль)';
String get cpuViewAsProgressTip =>
'Відобразити використання кожного процесора у вигляді стовпчикової діаграми (старий стиль)';
@override
String get cursorType => 'Тип курсора';
@@ -88,7 +100,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get customCmd => 'Користувацькі команди';
@override
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
String get customCmdDocUrl =>
'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
@override
String get customCmdHint => '\"Ім\'я Команди\": \"Команда\"';
@@ -102,6 +115,10 @@ class AppLocalizationsUk extends AppLocalizations {
@override
String get deleteServers => 'Масове видалення серверів';
@override
String get desktopTerminalTip =>
'Команда для відкриття емулятора термінала під час запуску SSH-сеансів.';
@override
String get dirEmpty => 'Переконайтеся, що директорія пуста.';
@@ -111,6 +128,9 @@ class AppLocalizationsUk extends AppLocalizations {
@override
String get disk => 'Диск';
@override
String get diskHealth => 'Стан диска';
@override
String get diskIgnorePath => 'Ігнорувати шлях для диска';
@@ -123,7 +143,8 @@ class AppLocalizationsUk extends AppLocalizations {
}
@override
String get dockerEmptyRunningItems => 'Немає запущених контейнерів.\nЦе може бути через:\n- Користувача Docker, відмінного від користувача, налаштованого в додатку\n- змінну оточення DOCKER_HOST, яка не була правильно зчитана. Ви можете виконати `echo \$DOCKER_HOST` у терміналі, щоб побачити її значення.';
String get dockerEmptyRunningItems =>
'Немає запущених контейнерів.\nЦе може бути через:\n- Користувача Docker, відмінного від користувача, налаштованого в додатку\n- змінну оточення DOCKER_HOST, яка не була правильно зчитана. Ви можете виконати `echo \$DOCKER_HOST` у терміналі, щоб побачити її значення.';
@override
String dockerImagesFmt(Object count) {
@@ -134,7 +155,10 @@ class AppLocalizationsUk extends AppLocalizations {
String get dockerNotInstalled => 'Docker не встановлено';
@override
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
String dockerStatusRunningAndStoppedFmt(
Object runningCount,
Object stoppedCount,
) {
return '$runningCount запущено, $stoppedCount контейнерів зупинено.';
}
@@ -147,7 +171,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get doubleColumnMode => 'Режим подвійної колонки';
@override
String get doubleColumnTip => 'Ця опція лише активує функцію, чи можна її насправді включити, залежить від ширини пристрою';
String get doubleColumnTip =>
'Ця опція лише активує функцію, чи можна її насправді включити, залежить від ширини пристрою';
@override
String get editVirtKeys => 'Редагувати віртуальні клавіші';
@@ -156,7 +181,11 @@ class AppLocalizationsUk extends AppLocalizations {
String get editor => 'Редактор';
@override
String get editorHighlightTip => 'Поточна підсвітка коду не ідеальна і може бути вимкнена для покращення.';
String get editorHighlightTip =>
'Поточна підсвітка коду не ідеальна і може бути вимкнена для покращення.';
@override
String get emulator => 'Емулятор';
@override
String get encode => 'Кодувати';
@@ -174,13 +203,15 @@ class AppLocalizationsUk extends AppLocalizations {
String get fallbackSshDest => 'Резервна SSH адреса';
@override
String get fdroidReleaseTip => 'Якщо ви завантажили цей застосунок з F-Droid, рекомендується відключити цю опцію.';
String get fdroidReleaseTip =>
'Якщо ви завантажили цей застосунок з F-Droid, рекомендується відключити цю опцію.';
@override
String get fgService => 'Служба переднього плану';
@override
String get fgServiceTip => 'Після увімкнення деякі моделі пристроїв можуть вилітати. Вимкнення може призвести до того, що деякі моделі не зможуть підтримувати SSH-з\'єднання у фоновому режимі. Будь ласка, дозвольте ServerBox права на сповіщення, фонову роботу та самопробудження в системних налаштуваннях.';
String get fgServiceTip =>
'Після увімкнення деякі моделі пристроїв можуть вилітати. Вимкнення може призвести до того, що деякі моделі не зможуть підтримувати SSH-з\'єднання у фоновому режимі. Будь ласка, дозвольте ServerBox права на сповіщення, фонову роботу та самопробудження в системних налаштуваннях.';
@override
String fileTooLarge(Object file, Object size, Object sizeMax) {
@@ -209,7 +240,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get fullScreenJitterHelp => 'Щоб уникнути вигоряння екрану';
@override
String get fullScreenTip => 'Чи слід увімкнути повноекранний режим під час повороту пристрою в горизонтальне положення? Ця опція стосується лише вкладки сервера.';
String get fullScreenTip =>
'Чи слід увімкнути повноекранний режим під час повороту пристрою в горизонтальне положення? Ця опція стосується лише вкладки сервера.';
@override
String get goBackQ => 'Повернутися назад?';
@@ -224,7 +256,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get highlight => 'Підсвітка коду';
@override
String get homeWidgetUrlConfig => 'Налаштувати URL віджета на головному екрані';
String get homeWidgetUrlConfig =>
'Налаштувати URL віджета на головному екрані';
@override
String get host => 'Хост';
@@ -253,7 +286,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get install => 'Встановити';
@override
String get installDockerWithUrl => 'Будь ласка, спочатку встановіть Docker. (https://docs.docker.com/engine/install)';
String get installDockerWithUrl =>
'Будь ласка, спочатку встановіть Docker. (https://docs.docker.com/engine/install)';
@override
String get invalid => 'Недійсний';
@@ -268,7 +302,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get keepStatusWhenErr => 'Зберегати останній стан сервера';
@override
String get keepStatusWhenErrTip => 'Тільки в разі виникнення помилки під час виконання скрипту';
String get keepStatusWhenErrTip =>
'Тільки в разі виникнення помилки під час виконання скрипту';
@override
String get keyAuth => 'Аутентифікація ключем';
@@ -277,7 +312,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get letterCache => 'Кешування букв';
@override
String get letterCacheTip => 'Рекомендується відключити, але після вимкнення стане неможливим введення CJK (китайських, японських, корейських) символів.';
String get letterCacheTip =>
'Рекомендується відключити, але після вимкнення стане неможливим введення CJK (китайських, японських, корейських) символів.';
@override
String get license => 'Ліцензія';
@@ -300,10 +336,12 @@ class AppLocalizationsUk extends AppLocalizations {
String get max => 'макс.';
@override
String get maxRetryCount => 'Кількість повторних спроб підключення до сервера';
String get maxRetryCount =>
'Кількість повторних спроб підключення до сервера';
@override
String get maxRetryCountEqual0 => 'Знову і знову буде намагатися повторно підключитися.';
String get maxRetryCountEqual0 =>
'Знову і знову буде намагатися повторно підключитися.';
@override
String get min => 'мін.';
@@ -315,13 +353,15 @@ class AppLocalizationsUk extends AppLocalizations {
String get more => 'Більше';
@override
String get moveOutServerFuncBtnsHelp => 'Включено: може відображатися під кожною карткою на вкладці Сервер. Вимкнено: може відображатися вгорі на сторінці деталей сервера.';
String get moveOutServerFuncBtnsHelp =>
'Включено: може відображатися під кожною карткою на вкладці Сервер. Вимкнено: може відображатися вгорі на сторінці деталей сервера.';
@override
String get ms => 'мс.';
@override
String get needHomeDir => 'Якщо ви користувач Synology, [дивіться тут](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Користувачі інших систем повинні знайти інформацію про те, як створити домашній каталог.';
String get needHomeDir =>
'Якщо ви користувач Synology, [дивіться тут](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Користувачі інших систем повинні знайти інформацію про те, як створити домашній каталог.';
@override
String get needRestart => 'Необхідно перезапустити застосунок';
@@ -342,7 +382,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get noLineChartForCpu => 'Не використовувати лінійні діаграми для ЦП';
@override
String get noPrivateKeyTip => 'Приватного ключа немає, можливо, він був видалений або сталася помилка конфігурації.';
String get noPrivateKeyTip =>
'Приватного ключа немає, можливо, він був видалений або сталася помилка конфігурації.';
@override
String get noPromptAgain => 'Більше не запитувати';
@@ -360,16 +401,19 @@ class AppLocalizationsUk extends AppLocalizations {
String get onlyOneLine => 'Відображати лише в один рядок (прокрутка)';
@override
String get onlyWhenCoreBiggerThan8 => 'Працює лише тоді, коли кількість ядер перевищує 8';
String get onlyWhenCoreBiggerThan8 =>
'Працює лише тоді, коли кількість ядер перевищує 8';
@override
String get openLastPath => 'Відкрити останній шлях';
@override
String get openLastPathTip => 'Для різних серверів будуть збережені різні логи. Записується шлях при виході';
String get openLastPathTip =>
'Для різних серверів будуть збережені різні логи. Записується шлях при виході';
@override
String get parseContainerStatsTip => 'Парсинг статусу зайнятості Docker є відносно повільним.';
String get parseContainerStatsTip =>
'Парсинг статусу зайнятості Docker є відносно повільним.';
@override
String percentOfSize(Object percent, Object size) {
@@ -386,7 +430,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get pingInputIP => 'Будь ласка, введіть цільовий IP / Домен.';
@override
String get pingNoServer => 'Немає сервера для пінгування.\nБудь ласка, додайте сервер у вкладці `Сервер`.';
String get pingNoServer =>
'Немає сервера для пінгування.\nБудь ласка, додайте сервер у вкладці `Сервер`.';
@override
String get pkg => 'Пакет';
@@ -397,6 +442,9 @@ class AppLocalizationsUk extends AppLocalizations {
@override
String get port => 'Порт';
@override
String get preferDiskAmount => 'Пріоритетно показувати ємність диска';
@override
String get preview => 'Попередній перегляд';
@@ -410,13 +458,16 @@ class AppLocalizationsUk extends AppLocalizations {
String get pushToken => 'Надіслати токен';
@override
String get pveIgnoreCertTip => 'Не рекомендується включати, будьте обережні з ризиками безпеки! Якщо ви використовуєте стандартний сертифікат від PVE, вам потрібно увімкнути цю опцію.';
String get pveIgnoreCertTip =>
'Не рекомендується включати, будьте обережні з ризиками безпеки! Якщо ви використовуєте стандартний сертифікат від PVE, вам потрібно увімкнути цю опцію.';
@override
String get pveLoginFailed => 'Не вдалося увійти. Неможливо пройти аутентифікацію за допомогою імені користувача/пароля з конфігурації сервера для входу Linux PAM.';
String get pveLoginFailed =>
'Не вдалося увійти. Неможливо пройти аутентифікацію за допомогою імені користувача/пароля з конфігурації сервера для входу Linux PAM.';
@override
String get pveVersionLow => 'Ця функція наразі перебуває на стадії тестування та випробувалася лише на PVE 8+. Будь ласка, використовуйте її з обережністю.';
String get pveVersionLow =>
'Ця функція наразі перебуває на стадії тестування та випробувалася лише на PVE 8+. Будь ласка, використовуйте її з обережністю.';
@override
String get pwd => 'Пароль';
@@ -431,7 +482,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get rememberPwdInMem => 'Запам\'ятати пароль у пам\'яті';
@override
String get rememberPwdInMemTip => 'Використовується для контейнерів, призупинення тощо.';
String get rememberPwdInMemTip =>
'Використовується для контейнерів, призупинення тощо.';
@override
String get rememberWindowSize => 'Запам\'ятати розмір вікна';
@@ -491,10 +543,12 @@ class AppLocalizationsUk extends AppLocalizations {
String get sftpDlPrepare => 'Підготовка до підключення...';
@override
String get sftpEditorTip => 'Якщо порожньо, використовуйте вбудований редактор файлів програми. Якщо є значення, використовуйте редактор віддаленого сервера, наприклад, `vim` (рекомендується автоматично визначити відповідно до `EDITOR`).';
String get sftpEditorTip =>
'Якщо порожньо, використовуйте вбудований редактор файлів програми. Якщо є значення, використовуйте редактор віддаленого сервера, наприклад, `vim` (рекомендується автоматично визначити відповідно до `EDITOR`).';
@override
String get sftpRmrDirSummary => 'Використовуйте `rm -r`, щоб видалити папку в SFTP.';
String get sftpRmrDirSummary =>
'Використовуйте `rm -r`, щоб видалити папку в SFTP.';
@override
String get sftpSSHConnected => 'SFTP підключено';
@@ -521,7 +575,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get specifyDev => 'Вказати пристрій';
@override
String get specifyDevTip => 'Наприклад, статистика мережевого трафіку за замовчуванням є для всіх пристроїв. Ви можете вказати певний пристрій тут.';
String get specifyDevTip =>
'Наприклад, статистика мережевого трафіку за замовчуванням є для всіх пристроїв. Ви можете вказати певний пристрій тут.';
@override
String get speed => 'Швидкість';
@@ -532,7 +587,8 @@ class AppLocalizationsUk extends AppLocalizations {
}
@override
String get sshTermHelp => 'Коли термінал прокрутний, горизонтальне проведення вибирає текст. Натискання кнопки клавіатури вмикає/вимикає клавіатуру. Іконка файлу відкриває поточний шлях SFTP. Кнопка буфера обміну копіює вміст, коли текст вибрано, і вставляє вміст з буфера обміну в термінал, коли текст не вибрано і є вміст у буфері обміну. Іконка коду вставляє фрагменти коду в термінал і виконує їх.';
String get sshTermHelp =>
'Коли термінал прокрутний, горизонтальне проведення вибирає текст. Натискання кнопки клавіатури вмикає/вимикає клавіатуру. Іконка файлу відкриває поточний шлях SFTP. Кнопка буфера обміну копіює вміст, коли текст вибрано, і вставляє вміст з буфера обміну в термінал, коли текст не вибрано і є вміст у буфері обміну. Іконка коду вставляє фрагменти коду в термінал і виконує їх.';
@override
String sshTip(Object url) {
@@ -540,7 +596,8 @@ class AppLocalizationsUk extends AppLocalizations {
}
@override
String get sshVirtualKeyAutoOff => 'Автоматичне переключення віртуальних клавіш';
String get sshVirtualKeyAutoOff =>
'Автоматичне переключення віртуальних клавіш';
@override
String get start => 'Старт';
@@ -567,7 +624,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get suspend => 'Призупинити';
@override
String get suspendTip => 'Функція призупинення потребує адміністративних прав та підтримки systemd.';
String get suspendTip =>
'Функція призупинення потребує адміністративних прав та підтримки systemd.';
@override
String switchTo(Object val) {
@@ -578,7 +636,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get sync => 'Синхронізація';
@override
String get syncTip => 'Може знадобитися перезапуск, щоб деякі зміни набрали чинності.';
String get syncTip =>
'Може знадобитися перезапуск, щоб деякі зміни набрали чинності.';
@override
String get system => 'Система';
@@ -590,7 +649,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get temperature => 'Температура';
@override
String get termFontSizeTip => 'Це налаштування вплине на розмір терміналу (ширину та висоту). Ви можете масштабувати на сторінці терміналу, щоб налаштувати розмір шрифту поточної сесії.';
String get termFontSizeTip =>
'Це налаштування вплине на розмір терміналу (ширину та висоту). Ви можете масштабувати на сторінці терміналу, щоб налаштувати розмір шрифту поточної сесії.';
@override
String get terminal => 'Термінал';
@@ -602,7 +662,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get textScaler => 'Масштабування тексту';
@override
String get textScalerTip => '1.0 => 100% (оригінальний розмір), працює лише на частині шрифта сторінки сервера, не рекомендується змінювати.';
String get textScalerTip =>
'1.0 => 100% (оригінальний розмір), працює лише на частині шрифта сторінки сервера, не рекомендується змінювати.';
@override
String get theme => 'Тема';
@@ -635,7 +696,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get update => 'Оновити';
@override
String get updateIntervalEqual0 => 'Ви встановили 0, автоматичне оновлення не відбудеться.\nНе можна розрахувати статус ЦП.';
String get updateIntervalEqual0 =>
'Ви встановили 0, автоматичне оновлення не відбудеться.\nНе можна розрахувати статус ЦП.';
@override
String get updateServerStatusInterval => 'Інтервал оновлення статусу сервера';
@@ -653,7 +715,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get useCdn => 'Використання CDN';
@override
String get useCdnTip => 'Нереспонсивним користувачам рекомендується використовувати CDN. Чи хочете ви його використовувати?';
String get useCdnTip =>
'Нереспонсивним користувачам рекомендується використовувати CDN. Чи хочете ви його використовувати?';
@override
String get useNoPwd => 'Пароль не буде використовуватися';
@@ -671,7 +734,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get viewErr => 'Переглянути помилку';
@override
String get virtKeyHelpClipboard => 'Копіювати в буфер обміну, якщо вибраний термінал не порожній, в іншому випадку вставити вміст буфера обміну в термінал.';
String get virtKeyHelpClipboard =>
'Копіювати в буфер обміну, якщо вибраний термінал не порожній, в іншому випадку вставити вміст буфера обміну в термінал.';
@override
String get virtKeyHelpIME => 'Увімкнути/вимкнути клавіатуру';
@@ -680,7 +744,8 @@ class AppLocalizationsUk extends AppLocalizations {
String get virtKeyHelpSFTP => 'Відкрити поточний каталог у SFTP.';
@override
String get waitConnection => 'Будь ласка, зачекайте, доки з\'єднання буде встановлено.';
String get waitConnection =>
'Будь ласка, зачекайте, доки з\'єднання буде встановлено.';
@override
String get wakeLock => 'Залишити активним';
@@ -695,14 +760,17 @@ class AppLocalizationsUk extends AppLocalizations {
String get whenOpenApp => 'При відкритті програми';
@override
String get wolTip => 'Після налаштування WOL (Wake-on-LAN), при кожному підключенні до сервера відправляється запит WOL.';
String get wolTip =>
'Після налаштування WOL (Wake-on-LAN), при кожному підключенні до сервера відправляється запит WOL.';
@override
String get write => 'Записати';
@override
String get writeScriptFailTip => 'Запис у скрипт не вдався, можливо, через брак дозволів або каталог не існує.';
String get writeScriptFailTip =>
'Запис у скрипт не вдався, можливо, через брак дозволів або каталог не існує.';
@override
String get writeScriptTip => 'Після підключення до сервера скрипт буде записано у ~/.config/server_box для моніторингу стану системи. Ви можете переглянути вміст скрипта.';
String get writeScriptTip =>
'Після підключення до сервера скрипт буде записано у ~/.config/server_box для моніторингу стану системи. Ви можете переглянути вміст скрипта.';
}

View File

@@ -1,3 +1,5 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'l10n.dart';
// ignore_for_file: type=lint
@@ -52,7 +54,8 @@ class AppLocalizationsZh extends AppLocalizations {
String get bgRun => '后台运行';
@override
String get bgRunTip => '此开关只代表程序会尝试在后台运行,具体能否后台运行取决于是否开启了权限。原生 Android 请关闭本 App 的“电池优化”MIUI / HyperOS 请修改省电策略为“无限制”。';
String get bgRunTip =>
'此开关只代表程序会尝试在后台运行,具体能否后台运行取决于是否开启了权限。原生 Android 请关闭本 App 的“电池优化”MIUI / HyperOS 请修改省电策略为“无限制”。';
@override
String get closeAfterSave => '保存后关闭';
@@ -70,7 +73,8 @@ class AppLocalizationsZh extends AppLocalizations {
String get container => '容器';
@override
String get containerTrySudoTip => '例如:在应用内将用户设置为 aaa但是 Docker 安装在root用户下这时就需要启用此选项';
String get containerTrySudoTip =>
'例如:在应用内将用户设置为 aaa但是 Docker 安装在root用户下这时就需要启用此选项';
@override
String get convert => '转换';
@@ -88,7 +92,8 @@ class AppLocalizationsZh extends AppLocalizations {
String get customCmd => '自定义命令';
@override
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki/主页#自定义命令';
String get customCmdDocUrl =>
'https://github.com/lollipopkit/flutter_server_box/wiki/主页#自定义命令';
@override
String get customCmdHint => '\"命令名称\": \"命令\"';
@@ -102,6 +107,9 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get deleteServers => '批量删除服务器';
@override
String get desktopTerminalTip => '启动 SSH 连接所用的终端模拟器命令';
@override
String get dirEmpty => '请确保文件夹为空';
@@ -111,6 +119,9 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get disk => '磁盘';
@override
String get diskHealth => '磁盘健康';
@override
String get diskIgnorePath => '忽略的磁盘路径';
@@ -123,7 +134,8 @@ class AppLocalizationsZh extends AppLocalizations {
}
@override
String get dockerEmptyRunningItems => '没有正在运行的容器。\n这可能是因为:\n- Docker 安装用户与 App 内配置的用户名不同\n- 环境变量 DOCKER_HOST 没有被正确读取。可以通过在终端内运行 `echo \$DOCKER_HOST` 来获取。';
String get dockerEmptyRunningItems =>
'没有正在运行的容器。\n这可能是因为:\n- Docker 安装用户与 App 内配置的用户名不同\n- 环境变量 DOCKER_HOST 没有被正确读取。可以通过在终端内运行 `echo \$DOCKER_HOST` 来获取。';
@override
String dockerImagesFmt(Object count) {
@@ -134,7 +146,10 @@ class AppLocalizationsZh extends AppLocalizations {
String get dockerNotInstalled => 'Docker 未安装';
@override
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
String dockerStatusRunningAndStoppedFmt(
Object runningCount,
Object stoppedCount,
) {
return '$runningCount 个正在运行, $stoppedCount 个已停止';
}
@@ -158,6 +173,9 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get editorHighlightTip => '目前的代码高亮性能较为糟糕,可以选择关闭以改善。';
@override
String get emulator => '模拟器';
@override
String get encode => '编码';
@@ -180,7 +198,8 @@ class AppLocalizationsZh extends AppLocalizations {
String get fgService => '前台服务';
@override
String get fgServiceTip => '开启后,可能会导致部分机型闪退。关闭可能导致部分机型无法后台保持 SSH 连接。请在系统设置内允许 ServerBox 通知权限、后台运行、自我唤醒。';
String get fgServiceTip =>
'开启后,可能会导致部分机型闪退。关闭可能导致部分机型无法后台保持 SSH 连接。请在系统设置内允许 ServerBox 通知权限、后台运行、自我唤醒。';
@override
String fileTooLarge(Object file, Object size, Object sizeMax) {
@@ -253,7 +272,8 @@ class AppLocalizationsZh extends AppLocalizations {
String get install => '安装';
@override
String get installDockerWithUrl => '请先 https://docs.docker.com/engine/install docker';
String get installDockerWithUrl =>
'请先 https://docs.docker.com/engine/install docker';
@override
String get invalid => '无效';
@@ -315,13 +335,15 @@ class AppLocalizationsZh extends AppLocalizations {
String get more => '更多';
@override
String get moveOutServerFuncBtnsHelp => '开启:可以在服务器 Tab 页的每个卡片下方显示。关闭:在服务器详情页顶部显示。';
String get moveOutServerFuncBtnsHelp =>
'开启:可以在服务器 Tab 页的每个卡片下方显示。关闭:在服务器详情页顶部显示。';
@override
String get ms => '毫秒';
@override
String get needHomeDir => '如果你是群晖用户,[看这里](https://kb.synology.cn/zh-cn/DSM/tutorial/ssh_could_not_chdir_to_home_directory)。其他系统用户需搜索如何创建家目录home directory.';
String get needHomeDir =>
'如果你是群晖用户,[看这里](https://kb.synology.cn/zh-cn/DSM/tutorial/ssh_could_not_chdir_to_home_directory)。其他系统用户需搜索如何创建家目录home directory.';
@override
String get needRestart => '需要重启 App';
@@ -397,6 +419,9 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get port => '端口';
@override
String get preferDiskAmount => '优先显示硬盘容量';
@override
String get preview => '预览';
@@ -491,7 +516,8 @@ class AppLocalizationsZh extends AppLocalizations {
String get sftpDlPrepare => '准备连接至服务器...';
@override
String get sftpEditorTip => '如果为空, 使用App内置的文件编辑器. 如果有值, 这是用远程服务器的编辑器, 例如 `vim` (建议根据 `EDITOR` 自动获取).';
String get sftpEditorTip =>
'如果为空, 使用App内置的文件编辑器. 如果有值, 这是用远程服务器的编辑器, 例如 `vim` (建议根据 `EDITOR` 自动获取).';
@override
String get sftpRmrDirSummary => '在 SFTP 中使用 `rm -r` 来删除文件夹';
@@ -532,7 +558,8 @@ class AppLocalizationsZh extends AppLocalizations {
}
@override
String get sshTermHelp => '在终端可滚动时,横向拖动可以选中文字。点击键盘按钮可以开启/关闭键盘。文件图标会打开当前路径 SFTP。剪切板按钮会在有选中文字时复制内容在未选中并且剪切板有内容时粘贴内容到终端。代码图标会粘贴代码片段到终端并执行。';
String get sshTermHelp =>
'在终端可滚动时,横向拖动可以选中文字。点击键盘按钮可以开启/关闭键盘。文件图标会打开当前路径 SFTP。剪切板按钮会在有选中文字时复制内容在未选中并且剪切板有内容时粘贴内容到终端。代码图标会粘贴代码片段到终端并执行。';
@override
String sshTip(Object url) {
@@ -704,12 +731,13 @@ class AppLocalizationsZh extends AppLocalizations {
String get writeScriptFailTip => '写入脚本失败,可能是没有权限/目录不存在等';
@override
String get writeScriptTip => '在连接服务器后,会向 ~/.config/server_box 写入脚本来监测系统状态,你可以审查脚本内容。';
String get writeScriptTip =>
'在连接服务器后,会向 ~/.config/server_box 写入脚本来监测系统状态,你可以审查脚本内容。';
}
/// The translations for Chinese, as used in Taiwan (`zh_TW`).
class AppLocalizationsZhTw extends AppLocalizationsZh {
AppLocalizationsZhTw(): super('zh_TW');
AppLocalizationsZhTw() : super('zh_TW');
@override
String get aboutThanks => '感謝以下參與的各位。';
@@ -757,7 +785,8 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
String get bgRun => '後台運行';
@override
String get bgRunTip => '此開關只代表程式會嘗試在後台運行,具體能否在後臺運行取決於是否開啟了權限。 原生 Android 請關閉本 App 的“電池優化”MIUI / HyperOS 請修改省電策略為“無限制”。';
String get bgRunTip =>
'此開關只代表程式會嘗試在後台運行,具體能否在後臺運行取決於是否開啟了權限。 原生 Android 請關閉本 App 的“電池優化”MIUI / HyperOS 請修改省電策略為“無限制”。';
@override
String get closeAfterSave => '儲存後關閉';
@@ -775,7 +804,8 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
String get container => '容器';
@override
String get containerTrySudoTip => '例如App 內設置使用者為 aaa但是 Docker 安裝在 root 使用者,這時就需要開啟此選項';
String get containerTrySudoTip =>
'例如App 內設置使用者為 aaa但是 Docker 安裝在 root 使用者,這時就需要開啟此選項';
@override
String get convert => '轉換';
@@ -793,7 +823,8 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
String get customCmd => '自訂命令';
@override
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki/主页#自定义命令';
String get customCmdDocUrl =>
'https://github.com/lollipopkit/flutter_server_box/wiki/主页#自定义命令';
@override
String get customCmdHint => '\"命令名稱\": \"命令\"';
@@ -807,6 +838,9 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
@override
String get deleteServers => '批量刪除伺服器';
@override
String get desktopTerminalTip => '啟動 SSH 連線時用於打開終端機模擬器的指令。';
@override
String get dirEmpty => '請確保資料夾為空';
@@ -816,6 +850,9 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
@override
String get disk => '磁碟';
@override
String get diskHealth => '磁碟健康';
@override
String get diskIgnorePath => '忽略的磁碟路徑';
@@ -828,7 +865,8 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
}
@override
String get dockerEmptyRunningItems => '沒有正在運行的容器。\n這可能是因為:\n- Docker 安裝使用者與 App 內配置的使用者名稱不同\n- 環境變量 DOCKER_HOST 沒有被正確讀取。你可以通過在終端內運行 `echo \$DOCKER_HOST` 來獲取。';
String get dockerEmptyRunningItems =>
'沒有正在運行的容器。\n這可能是因為:\n- Docker 安裝使用者與 App 內配置的使用者名稱不同\n- 環境變量 DOCKER_HOST 沒有被正確讀取。你可以通過在終端內運行 `echo \$DOCKER_HOST` 來獲取。';
@override
String dockerImagesFmt(Object count) {
@@ -839,7 +877,10 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
String get dockerNotInstalled => 'Docker 未安裝';
@override
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
String dockerStatusRunningAndStoppedFmt(
Object runningCount,
Object stoppedCount,
) {
return '$runningCount 個正在運行, $stoppedCount 個已停止';
}
@@ -863,6 +904,9 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
@override
String get editorHighlightTip => '目前的代碼高亮性能較為糟糕,可以選擇關閉以改善。';
@override
String get emulator => '模擬器';
@override
String get encode => '編碼';
@@ -885,7 +929,8 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
String get fgService => '前台服務';
@override
String get fgServiceTip => '開啟後,可能會導致部分機型閃退。關閉可能導致部分機型無法後台保持 SSH 連接。請在系統設置內允許 ServerBox 通知權限、後台運行、自我喚醒。';
String get fgServiceTip =>
'開啟後,可能會導致部分機型閃退。關閉可能導致部分機型無法後台保持 SSH 連接。請在系統設置內允許 ServerBox 通知權限、後台運行、自我喚醒。';
@override
String fileTooLarge(Object file, Object size, Object sizeMax) {
@@ -958,7 +1003,8 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
String get install => '安裝';
@override
String get installDockerWithUrl => '請先 https://docs.docker.com/engine/install docker';
String get installDockerWithUrl =>
'請先 https://docs.docker.com/engine/install docker';
@override
String get invalid => '無效';
@@ -1020,13 +1066,15 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
String get more => '更多';
@override
String get moveOutServerFuncBtnsHelp => '開啟:可以在伺服器 Tab 頁的每個卡片下方顯示。關閉:在伺服器詳情頁頂部顯示。';
String get moveOutServerFuncBtnsHelp =>
'開啟:可以在伺服器 Tab 頁的每個卡片下方顯示。關閉:在伺服器詳情頁頂部顯示。';
@override
String get ms => '毫秒';
@override
String get needHomeDir => '如果你是群暉用戶,[看這裡](https://kb.synology.com/DSM/tutorial/user_enable_home_service)。其他系統用戶需搜索如何創建家目錄home directory';
String get needHomeDir =>
'如果你是群暉用戶,[看這裡](https://kb.synology.com/DSM/tutorial/user_enable_home_service)。其他系統用戶需搜索如何創建家目錄home directory';
@override
String get needRestart => '需要重啓 App';
@@ -1102,6 +1150,9 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
@override
String get port => '';
@override
String get preferDiskAmount => '優先顯示硬碟容量';
@override
String get preview => '預覽';
@@ -1196,7 +1247,8 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
String get sftpDlPrepare => '準備連接至伺服器...';
@override
String get sftpEditorTip => '如果為空, 使用App內置的文件編輯器。如果有值, 則使用遠程伺服器的編輯器, 例如 `vim`(建議根據 `EDITOR` 自動獲取)。';
String get sftpEditorTip =>
'如果為空, 使用App內置的文件編輯器。如果有值, 則使用遠程伺服器的編輯器, 例如 `vim`(建議根據 `EDITOR` 自動獲取)。';
@override
String get sftpRmrDirSummary => '在 SFTP 中使用 `rm -r` 來刪除文件夾';
@@ -1237,7 +1289,8 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
}
@override
String get sshTermHelp => '在終端可滾動時,橫向拖動可以選中文字。點擊鍵盤按鈕可以開啟/關閉鍵盤。文件圖標會打開當前路徑 SFTP。剪貼簿按鈕會在有選中文字時複製內容在未選中並且剪貼簿有內容時貼上內容到終端。代碼圖標會貼上代碼片段到終端並執行。';
String get sshTermHelp =>
'在終端可滾動時,橫向拖動可以選中文字。點擊鍵盤按鈕可以開啟/關閉鍵盤。文件圖標會打開當前路徑 SFTP。剪貼簿按鈕會在有選中文字時複製內容在未選中並且剪貼簿有內容時貼上內容到終端。代碼圖標會貼上代碼片段到終端並執行。';
@override
String sshTip(Object url) {
@@ -1409,5 +1462,6 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
String get writeScriptFailTip => '寫入腳本失敗,可能是沒有權限/目錄不存在等。';
@override
String get writeScriptTip => '連接到伺服器後,將會在 ~/.config/server_box 中寫入一個腳本來監測系統狀態。你可以審查腳本內容。';
String get writeScriptTip =>
'連接到伺服器後,將會在 ~/.config/server_box 中寫入一個腳本來監測系統狀態。你可以審查腳本內容。';
}

View File

@@ -0,0 +1,21 @@
import 'package:hive_ce/hive.dart';
import 'package:server_box/data/model/app/menu/server_func.dart';
import 'package:server_box/data/model/app/net_view.dart';
import 'package:server_box/data/model/server/custom.dart';
import 'package:server_box/data/model/server/private_key_info.dart';
import 'package:server_box/data/model/server/server_private_info.dart';
import 'package:server_box/data/model/server/snippet.dart';
import 'package:server_box/data/model/server/wol_cfg.dart';
import 'package:server_box/data/model/ssh/virtual_key.dart';
@GenerateAdapters([
AdapterSpec<PrivateKeyInfo>(),
AdapterSpec<Snippet>(),
AdapterSpec<Spi>(),
AdapterSpec<VirtKey>(),
AdapterSpec<NetViewType>(),
AdapterSpec<ServerFuncBtn>(),
AdapterSpec<ServerCustom>(),
AdapterSpec<WakeOnLanCfg>(),
])
part 'hive_adapters.g.dart';

View File

@@ -0,0 +1,555 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'hive_adapters.dart';
// **************************************************************************
// AdaptersGenerator
// **************************************************************************
class PrivateKeyInfoAdapter extends TypeAdapter<PrivateKeyInfo> {
@override
final typeId = 1;
@override
PrivateKeyInfo read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return PrivateKeyInfo(id: fields[0] as String, key: fields[1] as String);
}
@override
void write(BinaryWriter writer, PrivateKeyInfo obj) {
writer
..writeByte(2)
..writeByte(0)
..write(obj.id)
..writeByte(1)
..write(obj.key);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is PrivateKeyInfoAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}
class SnippetAdapter extends TypeAdapter<Snippet> {
@override
final typeId = 2;
@override
Snippet read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return Snippet(
name: fields[0] as String,
script: fields[1] as String,
tags: (fields[2] as List?)?.cast<String>(),
note: fields[3] as String?,
autoRunOn: (fields[4] as List?)?.cast<String>(),
);
}
@override
void write(BinaryWriter writer, Snippet obj) {
writer
..writeByte(5)
..writeByte(0)
..write(obj.name)
..writeByte(1)
..write(obj.script)
..writeByte(2)
..write(obj.tags)
..writeByte(3)
..write(obj.note)
..writeByte(4)
..write(obj.autoRunOn);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is SnippetAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}
class SpiAdapter extends TypeAdapter<Spi> {
@override
final typeId = 3;
@override
Spi read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return Spi(
name: fields[0] as String,
ip: fields[1] as String,
port: (fields[2] as num).toInt(),
user: fields[3] as String,
pwd: fields[4] as String?,
keyId: fields[5] as String?,
tags: (fields[6] as List?)?.cast<String>(),
alterUrl: fields[7] as String?,
autoConnect: fields[8] == null ? true : fields[8] as bool,
jumpId: fields[9] as String?,
custom: fields[10] as ServerCustom?,
wolCfg: fields[11] as WakeOnLanCfg?,
envs: (fields[12] as Map?)?.cast<String, String>(),
id: fields[13] == null ? '' : fields[13] as String,
);
}
@override
void write(BinaryWriter writer, Spi obj) {
writer
..writeByte(14)
..writeByte(0)
..write(obj.name)
..writeByte(1)
..write(obj.ip)
..writeByte(2)
..write(obj.port)
..writeByte(3)
..write(obj.user)
..writeByte(4)
..write(obj.pwd)
..writeByte(5)
..write(obj.keyId)
..writeByte(6)
..write(obj.tags)
..writeByte(7)
..write(obj.alterUrl)
..writeByte(8)
..write(obj.autoConnect)
..writeByte(9)
..write(obj.jumpId)
..writeByte(10)
..write(obj.custom)
..writeByte(11)
..write(obj.wolCfg)
..writeByte(12)
..write(obj.envs)
..writeByte(13)
..write(obj.id);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is SpiAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}
class VirtKeyAdapter extends TypeAdapter<VirtKey> {
@override
final typeId = 4;
@override
VirtKey read(BinaryReader reader) {
switch (reader.readByte()) {
case 0:
return VirtKey.esc;
case 1:
return VirtKey.alt;
case 2:
return VirtKey.home;
case 3:
return VirtKey.up;
case 4:
return VirtKey.end;
case 5:
return VirtKey.sftp;
case 6:
return VirtKey.snippet;
case 7:
return VirtKey.tab;
case 8:
return VirtKey.ctrl;
case 9:
return VirtKey.left;
case 10:
return VirtKey.down;
case 11:
return VirtKey.right;
case 12:
return VirtKey.clipboard;
case 13:
return VirtKey.ime;
case 14:
return VirtKey.pgup;
case 15:
return VirtKey.pgdn;
case 16:
return VirtKey.slash;
case 17:
return VirtKey.backSlash;
case 18:
return VirtKey.underscore;
case 19:
return VirtKey.plus;
case 20:
return VirtKey.equal;
case 21:
return VirtKey.minus;
case 22:
return VirtKey.parenLeft;
case 23:
return VirtKey.parenRight;
case 24:
return VirtKey.bracketLeft;
case 25:
return VirtKey.bracketRight;
case 26:
return VirtKey.braceLeft;
case 27:
return VirtKey.braceRight;
case 28:
return VirtKey.chevronLeft;
case 29:
return VirtKey.chevronRight;
case 30:
return VirtKey.colon;
case 31:
return VirtKey.semicolon;
case 32:
return VirtKey.f1;
case 33:
return VirtKey.f2;
case 34:
return VirtKey.f3;
case 35:
return VirtKey.f4;
case 36:
return VirtKey.f5;
case 37:
return VirtKey.f6;
case 38:
return VirtKey.f7;
case 39:
return VirtKey.f8;
case 40:
return VirtKey.f9;
case 41:
return VirtKey.f10;
case 42:
return VirtKey.f11;
case 43:
return VirtKey.f12;
default:
return VirtKey.esc;
}
}
@override
void write(BinaryWriter writer, VirtKey obj) {
switch (obj) {
case VirtKey.esc:
writer.writeByte(0);
case VirtKey.alt:
writer.writeByte(1);
case VirtKey.home:
writer.writeByte(2);
case VirtKey.up:
writer.writeByte(3);
case VirtKey.end:
writer.writeByte(4);
case VirtKey.sftp:
writer.writeByte(5);
case VirtKey.snippet:
writer.writeByte(6);
case VirtKey.tab:
writer.writeByte(7);
case VirtKey.ctrl:
writer.writeByte(8);
case VirtKey.left:
writer.writeByte(9);
case VirtKey.down:
writer.writeByte(10);
case VirtKey.right:
writer.writeByte(11);
case VirtKey.clipboard:
writer.writeByte(12);
case VirtKey.ime:
writer.writeByte(13);
case VirtKey.pgup:
writer.writeByte(14);
case VirtKey.pgdn:
writer.writeByte(15);
case VirtKey.slash:
writer.writeByte(16);
case VirtKey.backSlash:
writer.writeByte(17);
case VirtKey.underscore:
writer.writeByte(18);
case VirtKey.plus:
writer.writeByte(19);
case VirtKey.equal:
writer.writeByte(20);
case VirtKey.minus:
writer.writeByte(21);
case VirtKey.parenLeft:
writer.writeByte(22);
case VirtKey.parenRight:
writer.writeByte(23);
case VirtKey.bracketLeft:
writer.writeByte(24);
case VirtKey.bracketRight:
writer.writeByte(25);
case VirtKey.braceLeft:
writer.writeByte(26);
case VirtKey.braceRight:
writer.writeByte(27);
case VirtKey.chevronLeft:
writer.writeByte(28);
case VirtKey.chevronRight:
writer.writeByte(29);
case VirtKey.colon:
writer.writeByte(30);
case VirtKey.semicolon:
writer.writeByte(31);
case VirtKey.f1:
writer.writeByte(32);
case VirtKey.f2:
writer.writeByte(33);
case VirtKey.f3:
writer.writeByte(34);
case VirtKey.f4:
writer.writeByte(35);
case VirtKey.f5:
writer.writeByte(36);
case VirtKey.f6:
writer.writeByte(37);
case VirtKey.f7:
writer.writeByte(38);
case VirtKey.f8:
writer.writeByte(39);
case VirtKey.f9:
writer.writeByte(40);
case VirtKey.f10:
writer.writeByte(41);
case VirtKey.f11:
writer.writeByte(42);
case VirtKey.f12:
writer.writeByte(43);
}
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is VirtKeyAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}
class NetViewTypeAdapter extends TypeAdapter<NetViewType> {
@override
final typeId = 5;
@override
NetViewType read(BinaryReader reader) {
switch (reader.readByte()) {
case 0:
return NetViewType.conn;
case 1:
return NetViewType.speed;
case 2:
return NetViewType.traffic;
default:
return NetViewType.conn;
}
}
@override
void write(BinaryWriter writer, NetViewType obj) {
switch (obj) {
case NetViewType.conn:
writer.writeByte(0);
case NetViewType.speed:
writer.writeByte(1);
case NetViewType.traffic:
writer.writeByte(2);
}
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is NetViewTypeAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}
class ServerFuncBtnAdapter extends TypeAdapter<ServerFuncBtn> {
@override
final typeId = 6;
@override
ServerFuncBtn read(BinaryReader reader) {
switch (reader.readByte()) {
case 0:
return ServerFuncBtn.terminal;
case 1:
return ServerFuncBtn.sftp;
case 2:
return ServerFuncBtn.container;
case 3:
return ServerFuncBtn.process;
case 5:
return ServerFuncBtn.snippet;
case 6:
return ServerFuncBtn.iperf;
case 8:
return ServerFuncBtn.systemd;
default:
return ServerFuncBtn.terminal;
}
}
@override
void write(BinaryWriter writer, ServerFuncBtn obj) {
switch (obj) {
case ServerFuncBtn.terminal:
writer.writeByte(0);
case ServerFuncBtn.sftp:
writer.writeByte(1);
case ServerFuncBtn.container:
writer.writeByte(2);
case ServerFuncBtn.process:
writer.writeByte(3);
case ServerFuncBtn.snippet:
writer.writeByte(5);
case ServerFuncBtn.iperf:
writer.writeByte(6);
case ServerFuncBtn.systemd:
writer.writeByte(8);
}
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is ServerFuncBtnAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}
class ServerCustomAdapter extends TypeAdapter<ServerCustom> {
@override
final typeId = 7;
@override
ServerCustom read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return ServerCustom(
pveAddr: fields[1] as String?,
pveIgnoreCert: fields[2] == null ? false : fields[2] as bool,
cmds: (fields[3] as Map?)?.cast<String, String>(),
preferTempDev: fields[4] as String?,
logoUrl: fields[5] as String?,
netDev: fields[6] as String?,
scriptDir: fields[7] as String?,
);
}
@override
void write(BinaryWriter writer, ServerCustom obj) {
writer
..writeByte(7)
..writeByte(1)
..write(obj.pveAddr)
..writeByte(2)
..write(obj.pveIgnoreCert)
..writeByte(3)
..write(obj.cmds)
..writeByte(4)
..write(obj.preferTempDev)
..writeByte(5)
..write(obj.logoUrl)
..writeByte(6)
..write(obj.netDev)
..writeByte(7)
..write(obj.scriptDir);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is ServerCustomAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}
class WakeOnLanCfgAdapter extends TypeAdapter<WakeOnLanCfg> {
@override
final typeId = 8;
@override
WakeOnLanCfg read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return WakeOnLanCfg(
mac: fields[0] as String,
ip: fields[1] as String,
pwd: fields[2] as String?,
);
}
@override
void write(BinaryWriter writer, WakeOnLanCfg obj) {
writer
..writeByte(3)
..writeByte(0)
..write(obj.mac)
..writeByte(1)
..write(obj.ip)
..writeByte(2)
..write(obj.pwd);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is WakeOnLanCfgAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

View File

@@ -0,0 +1,207 @@
# Generated by Hive CE
# Manual modifications may be necessary for certain migrations
# Check in to version control
nextTypeId: 9
types:
PrivateKeyInfo:
typeId: 1
nextIndex: 2
fields:
id:
index: 0
key:
index: 1
Snippet:
typeId: 2
nextIndex: 5
fields:
name:
index: 0
script:
index: 1
tags:
index: 2
note:
index: 3
autoRunOn:
index: 4
Spi:
typeId: 3
nextIndex: 14
fields:
name:
index: 0
ip:
index: 1
port:
index: 2
user:
index: 3
pwd:
index: 4
keyId:
index: 5
tags:
index: 6
alterUrl:
index: 7
autoConnect:
index: 8
jumpId:
index: 9
custom:
index: 10
wolCfg:
index: 11
envs:
index: 12
id:
index: 13
VirtKey:
typeId: 4
nextIndex: 44
fields:
esc:
index: 0
alt:
index: 1
home:
index: 2
up:
index: 3
end:
index: 4
sftp:
index: 5
snippet:
index: 6
tab:
index: 7
ctrl:
index: 8
left:
index: 9
down:
index: 10
right:
index: 11
clipboard:
index: 12
ime:
index: 13
pgup:
index: 14
pgdn:
index: 15
slash:
index: 16
backSlash:
index: 17
underscore:
index: 18
plus:
index: 19
equal:
index: 20
minus:
index: 21
parenLeft:
index: 22
parenRight:
index: 23
bracketLeft:
index: 24
bracketRight:
index: 25
braceLeft:
index: 26
braceRight:
index: 27
chevronLeft:
index: 28
chevronRight:
index: 29
colon:
index: 30
semicolon:
index: 31
f1:
index: 32
f2:
index: 33
f3:
index: 34
f4:
index: 35
f5:
index: 36
f6:
index: 37
f7:
index: 38
f8:
index: 39
f9:
index: 40
f10:
index: 41
f11:
index: 42
f12:
index: 43
NetViewType:
typeId: 5
nextIndex: 3
fields:
conn:
index: 0
speed:
index: 1
traffic:
index: 2
ServerFuncBtn:
typeId: 6
nextIndex: 9
fields:
terminal:
index: 0
sftp:
index: 1
container:
index: 2
process:
index: 3
snippet:
index: 5
iperf:
index: 6
systemd:
index: 8
ServerCustom:
typeId: 7
nextIndex: 8
fields:
pveAddr:
index: 1
pveIgnoreCert:
index: 2
cmds:
index: 3
preferTempDev:
index: 4
logoUrl:
index: 5
netDev:
index: 6
scriptDir:
index: 7
WakeOnLanCfg:
typeId: 8
nextIndex: 3
fields:
mac:
index: 0
ip:
index: 1
pwd:
index: 2

View File

@@ -0,0 +1,32 @@
// Generated by Hive CE
// Do not modify
// Check in to version control
import 'package:hive_ce/hive.dart';
import 'package:server_box/hive/hive_adapters.dart';
extension HiveRegistrar on HiveInterface {
void registerAdapters() {
registerAdapter(NetViewTypeAdapter());
registerAdapter(PrivateKeyInfoAdapter());
registerAdapter(ServerCustomAdapter());
registerAdapter(ServerFuncBtnAdapter());
registerAdapter(SnippetAdapter());
registerAdapter(SpiAdapter());
registerAdapter(VirtKeyAdapter());
registerAdapter(WakeOnLanCfgAdapter());
}
}
extension IsolatedHiveRegistrar on IsolatedHiveInterface {
void registerAdapters() {
registerAdapter(NetViewTypeAdapter());
registerAdapter(PrivateKeyInfoAdapter());
registerAdapter(ServerCustomAdapter());
registerAdapter(ServerFuncBtnAdapter());
registerAdapter(SnippetAdapter());
registerAdapter(SpiAdapter());
registerAdapter(VirtKeyAdapter());
registerAdapter(WakeOnLanCfgAdapter());
}
}

View File

@@ -32,9 +32,11 @@
"decode": "Decode",
"decompress": "Dekomprimieren",
"deleteServers": "Batch-Löschung von Servern",
"desktopTerminalTip": "Befehl zum Öffnen des Terminal-Emulators beim Starten von SSH-Sitzungen.",
"dirEmpty": "Stelle sicher, dass der Ordner leer ist.",
"disconnected": "Disconnected",
"disk": "Festplatte",
"diskHealth": "Festplattengesundheit",
"diskIgnorePath": "Pfad für Datenträger ignorieren",
"displayCpuIndex": "Zeigen Sie den CPU-Index an",
"dl2Local": "Datei \"{fileName}\" herunterladen?",
@@ -48,6 +50,7 @@
"editVirtKeys": "Virtuelle Tasten bearbeiten",
"editor": "Editor",
"editorHighlightTip": "Die Leistung der aktuellen Codehervorhebung ist schlechter und kann zur Verbesserung optional ausgeschaltet werden.",
"emulator": "Emulator",
"encode": "Encode",
"envVars": "Umgebungsvariable",
"experimentalFeature": "Experimentelles Feature",
@@ -125,6 +128,7 @@
"pkg": "Pkg",
"plugInType": "Einfügetyp",
"port": "Port",
"preferDiskAmount": "Festplattenkapazität vorrangig anzeigen",
"preview": "Vorschau",
"privateKey": "Private Key",
"process": "Prozess",

View File

@@ -32,9 +32,11 @@
"decode": "Decode",
"decompress": "Decompress",
"deleteServers": "Batch delete servers",
"desktopTerminalTip": "Command used to open the terminal emulator when launching SSH sessions.",
"dirEmpty": "Make sure the folder is empty.",
"disconnected": "Disconnected",
"disk": "Disk",
"diskHealth": "Disk Health",
"diskIgnorePath": "Ignore path for disk",
"displayCpuIndex": "Display CPU index",
"dl2Local": "Download {fileName} to local?",
@@ -48,6 +50,7 @@
"editVirtKeys": "Edit virtual keys",
"editor": "Editor",
"editorHighlightTip": "The current code highlighting performance is not ideal and can be optionally turned off to improve.",
"emulator": "Emulator",
"encode": "Encode",
"envVars": "Environment variable",
"experimentalFeature": "Experimental feature",
@@ -125,6 +128,7 @@
"pkg": "Pkg",
"plugInType": "Insertion Type",
"port": "Port",
"preferDiskAmount": "Prioritize displaying disk capacity",
"preview": "Preview",
"privateKey": "Private Key",
"process": "Process",

Some files were not shown because too many files have changed in this diff Show More