Compare commits
88 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2907ac74d4 | ||
|
|
ea678f37b0 | ||
|
|
076082c945 | ||
|
|
5ee98f90e8 | ||
|
|
c988dd88d7 | ||
|
|
f7d6c461dc | ||
|
|
14771ae946 | ||
|
|
7e9086b20e | ||
|
|
4b3c4870ba | ||
|
|
43cebd0c04 | ||
|
|
5ce13109b0 | ||
|
|
6e428c91d1 | ||
|
|
4430045550 | ||
|
|
282cb06091 | ||
|
|
772c2743b5 | ||
|
|
90199b89a5 | ||
|
|
e1d2e3f3e5 | ||
|
|
3f9fe1f2c6 | ||
|
|
c79bbc5756 | ||
|
|
63e1bec2b9 | ||
|
|
d26b7c6f75 | ||
|
|
da8dc4fa54 | ||
|
|
413b81c47f | ||
|
|
9ef419e3df | ||
|
|
39893912d9 | ||
|
|
49456ca6c3 | ||
|
|
6b9b8f0dbb | ||
|
|
5eb48b2717 | ||
|
|
5339cfca70 | ||
|
|
1462b2d0b8 | ||
|
|
3798a23183 | ||
|
|
ddaf916170 | ||
|
|
d6e37b058f | ||
|
|
2e9ad7d7cb | ||
|
|
190da74f66 | ||
|
|
f1315dda7f | ||
|
|
43e6105eb3 | ||
|
|
d785209eb6 | ||
|
|
da8b6a9010 | ||
|
|
1fd68722da | ||
|
|
c9a2c1d0e4 | ||
|
|
161f536a62 | ||
|
|
1a32e9944e | ||
|
|
6deb753198 | ||
|
|
4e33a98631 | ||
|
|
dcb9464d8f | ||
|
|
b94936b29f | ||
|
|
108d0a5a5b | ||
|
|
4814a2de28 | ||
|
|
5d8eeff502 | ||
|
|
0bc4087266 | ||
|
|
921209b901 | ||
|
|
fa9d754470 | ||
|
|
1f50a1f0f4 | ||
|
|
80e84c0421 | ||
|
|
5059872c3f | ||
|
|
8add244776 | ||
|
|
04e23fd7e4 | ||
|
|
336b11b808 | ||
|
|
8d9dba361c | ||
|
|
64ce3638cb | ||
|
|
f3ceb73f0e | ||
|
|
131dbe934c | ||
|
|
58288e89bd | ||
|
|
22c43c7124 | ||
|
|
2bf0b25ee5 | ||
|
|
3bc03c1364 | ||
|
|
490d71f8c9 | ||
|
|
edceb5900e | ||
|
|
e5ef28415b | ||
|
|
46b98df153 | ||
|
|
9f34021c90 | ||
|
|
8121eef839 | ||
|
|
da48d1f66c | ||
|
|
b167287c5b | ||
|
|
41f9da6bf8 | ||
|
|
e7c7fc8186 | ||
|
|
b950dd2d68 | ||
|
|
6d34de14d3 | ||
|
|
a5a84c0cdd | ||
|
|
701b1b811f | ||
|
|
97267cdfbf | ||
|
|
40ce37d230 | ||
|
|
8a9ade355c | ||
|
|
9bffec64b5 | ||
|
|
a03ee2ae0e | ||
|
|
ee889235fe | ||
|
|
94d6d80497 |
21
.github/workflows/release.yml
vendored
@@ -15,10 +15,11 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
|
||||||
fetch-depth: '0'
|
|
||||||
- name: Install Flutter
|
- name: Install Flutter
|
||||||
uses: subosito/flutter-action@v2
|
uses: subosito/flutter-action@v2
|
||||||
|
with:
|
||||||
|
channel: 'stable'
|
||||||
|
flutter-version: '3.22.2'
|
||||||
- uses: actions/setup-java@v4
|
- uses: actions/setup-java@v4
|
||||||
with:
|
with:
|
||||||
distribution: 'zulu'
|
distribution: 'zulu'
|
||||||
@@ -29,13 +30,18 @@ jobs:
|
|||||||
curl -u ${{ secrets.BASIC_AUTH }} -o android/key.properties ${{ secrets.URL_PREFIX }}key.properties
|
curl -u ${{ secrets.BASIC_AUTH }} -o android/key.properties ${{ secrets.URL_PREFIX }}key.properties
|
||||||
- name: Build
|
- name: Build
|
||||||
run: dart run fl_build -p android,linux
|
run: dart run fl_build -p android,linux
|
||||||
|
- name: Rename for fdroid
|
||||||
|
run: |
|
||||||
|
mv build/app/outputs/flutter-apk/${{ env.APP_NAME }}_${{ env.BUILD_NUMBER }}_arm64.apk build/app/outputs/flutter-apk/${{ env.APP_NAME }}_v1.0.${{ env.BUILD_NUMBER }}_arm64.apk
|
||||||
|
mv build/app/outputs/flutter-apk/${{ env.APP_NAME }}_${{ env.BUILD_NUMBER }}_arm.apk build/app/outputs/flutter-apk/${{ env.APP_NAME }}_v1.0.${{ env.BUILD_NUMBER }}_arm.apk
|
||||||
|
mv build/app/outputs/flutter-apk/${{ env.APP_NAME }}_${{ env.BUILD_NUMBER }}_amd64.apk build/app/outputs/flutter-apk/${{ env.APP_NAME }}_v1.0.${{ env.BUILD_NUMBER }}_amd64.apk
|
||||||
- name: Create Release
|
- name: Create Release
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v2
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
build/app/outputs/flutter-apk/${{ env.APP_NAME }}_${{ env.BUILD_NUMBER }}_arm64.apk
|
build/app/outputs/flutter-apk/${{ env.APP_NAME }}_v1.0.${{ env.BUILD_NUMBER }}_arm64.apk
|
||||||
build/app/outputs/flutter-apk/${{ env.APP_NAME }}_${{ env.BUILD_NUMBER }}_arm.apk
|
build/app/outputs/flutter-apk/${{ env.APP_NAME }}_v1.0.${{ env.BUILD_NUMBER }}_arm.apk
|
||||||
build/app/outputs/flutter-apk/${{ env.APP_NAME }}_${{ env.BUILD_NUMBER }}_amd64.apk
|
build/app/outputs/flutter-apk/${{ env.APP_NAME }}_v1.0.${{ env.BUILD_NUMBER }}_amd64.apk
|
||||||
${{ env.APP_NAME }}_${{ env.BUILD_NUMBER }}_amd64.AppImage
|
${{ env.APP_NAME }}_${{ env.BUILD_NUMBER }}_amd64.AppImage
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -46,8 +52,6 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
|
||||||
fetch-depth: '0'
|
|
||||||
- name: Install Flutter
|
- name: Install Flutter
|
||||||
uses: subosito/flutter-action@v2
|
uses: subosito/flutter-action@v2
|
||||||
- name: Build
|
- name: Build
|
||||||
@@ -68,6 +72,9 @@ jobs:
|
|||||||
# uses: actions/checkout@v4
|
# uses: actions/checkout@v4
|
||||||
# - name: Install Flutter
|
# - name: Install Flutter
|
||||||
# uses: subosito/flutter-action@v2
|
# uses: subosito/flutter-action@v2
|
||||||
|
# with:
|
||||||
|
# channel: 'stable'
|
||||||
|
# flutter-version: '3.22.2'
|
||||||
# - name: Build
|
# - name: Build
|
||||||
# run: dart run fl_build -p ios,mac
|
# run: dart run fl_build -p ios,mac
|
||||||
# - name: Create Release
|
# - name: Create Release
|
||||||
|
|||||||
3
.gitignore
vendored
@@ -57,9 +57,10 @@ test.dart
|
|||||||
|
|
||||||
# Linux release
|
# Linux release
|
||||||
linux.AppDir
|
linux.AppDir
|
||||||
ServerBox-x86_64.AppImage
|
**/*.AppImage
|
||||||
|
|
||||||
untranlated.json
|
untranlated.json
|
||||||
|
|
||||||
.vscode/settings.json
|
.vscode/settings.json
|
||||||
more_build_data.json
|
more_build_data.json
|
||||||
|
trans.txt
|
||||||
|
|||||||
30
.metadata
@@ -4,7 +4,7 @@
|
|||||||
# This file should be version controlled and should not be manually edited.
|
# This file should be version controlled and should not be manually edited.
|
||||||
|
|
||||||
version:
|
version:
|
||||||
revision: "bae5e49bc2a867403c43b2aae2de8f8c33b037e4"
|
revision: "761747bfc538b5af34aa0d3fac380f1bc331ec49"
|
||||||
channel: "stable"
|
channel: "stable"
|
||||||
|
|
||||||
project_type: app
|
project_type: app
|
||||||
@@ -13,26 +13,26 @@ project_type: app
|
|||||||
migration:
|
migration:
|
||||||
platforms:
|
platforms:
|
||||||
- platform: root
|
- platform: root
|
||||||
create_revision: bae5e49bc2a867403c43b2aae2de8f8c33b037e4
|
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||||
base_revision: bae5e49bc2a867403c43b2aae2de8f8c33b037e4
|
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||||
- platform: android
|
- platform: android
|
||||||
create_revision: bae5e49bc2a867403c43b2aae2de8f8c33b037e4
|
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||||
base_revision: bae5e49bc2a867403c43b2aae2de8f8c33b037e4
|
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||||
- platform: ios
|
- platform: ios
|
||||||
create_revision: bae5e49bc2a867403c43b2aae2de8f8c33b037e4
|
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||||
base_revision: bae5e49bc2a867403c43b2aae2de8f8c33b037e4
|
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||||
- platform: linux
|
- platform: linux
|
||||||
create_revision: bae5e49bc2a867403c43b2aae2de8f8c33b037e4
|
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||||
base_revision: bae5e49bc2a867403c43b2aae2de8f8c33b037e4
|
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||||
- platform: macos
|
- platform: macos
|
||||||
create_revision: bae5e49bc2a867403c43b2aae2de8f8c33b037e4
|
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||||
base_revision: bae5e49bc2a867403c43b2aae2de8f8c33b037e4
|
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||||
- platform: web
|
- platform: web
|
||||||
create_revision: bae5e49bc2a867403c43b2aae2de8f8c33b037e4
|
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||||
base_revision: bae5e49bc2a867403c43b2aae2de8f8c33b037e4
|
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||||
- platform: windows
|
- platform: windows
|
||||||
create_revision: bae5e49bc2a867403c43b2aae2de8f8c33b037e4
|
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||||
base_revision: bae5e49bc2a867403c43b2aae2de8f8c33b037e4
|
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
|
||||||
|
|
||||||
# User provided section
|
# User provided section
|
||||||
|
|
||||||
|
|||||||
4
.vscode/launch.json
vendored
@@ -8,6 +8,10 @@
|
|||||||
"name": "debug",
|
"name": "debug",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"type": "dart",
|
"type": "dart",
|
||||||
|
"env": {
|
||||||
|
// Comment this line to use the default display
|
||||||
|
"DISPLAY": ":1"
|
||||||
|
}
|
||||||
// "args": [
|
// "args": [
|
||||||
// "-v"
|
// "-v"
|
||||||
// ]
|
// ]
|
||||||
|
|||||||
30
README.md
@@ -4,7 +4,6 @@ English | [简体中文](README_zh.md)
|
|||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img alt="lang" src="https://img.shields.io/badge/lang-dart-pink">
|
<img alt="lang" src="https://img.shields.io/badge/lang-dart-pink">
|
||||||
<img alt="countly" src="https://img.shields.io/badge/analysis-countly-pink">
|
|
||||||
<img alt="license" src="https://img.shields.io/badge/license-GPLv3-pink">
|
<img alt="license" src="https://img.shields.io/badge/license-GPLv3-pink">
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@@ -14,31 +13,36 @@ A Flutter project which provide charts to display <a href="../../issues/43">Linu
|
|||||||
Especially thanks to <a href="https://github.com/TerminalStudio/dartssh2">dartssh2</a> & <a href="https://github.com/TerminalStudio/xterm.dart">xterm.dart</a>.
|
Especially thanks to <a href="https://github.com/TerminalStudio/dartssh2">dartssh2</a> & <a href="https://github.com/TerminalStudio/xterm.dart">xterm.dart</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
## ⬇️ Download
|
|
||||||
🎉 **The `Android / Linux / Windows` version are now built via GitHub Actions**
|
|
||||||
|
|
||||||
[iOS & macOS](https://apps.apple.com/app/id6476033062) / [Android & Linux & Windows](https://github.com/lollipopkit/flutter_gpt_box/releases)
|
## 📥 Install
|
||||||
|
|
||||||
|
Platform | From
|
||||||
|
--- | ---
|
||||||
|
iOS / macOS | [AppStore](https://apps.apple.com/app/id1586449703)
|
||||||
|
Android | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lolli.tech/serverbox/?sort=time&order=desc&layout=grid) / [F-Droid](https://f-droid.org/packages/tech.lolli.toolbox) / [OpenAPK](https://www.openapk.net/serverbox/tech.lolli.toolbox/)
|
||||||
|
Linux / Windows | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lolli.tech/serverbox/?sort=time&order=desc&layout=grid)
|
||||||
|
|
||||||
|
**Please only download pkgs from the source that you trust!**
|
||||||
|
- `AppStore` & `CDN` packages are built by myself
|
||||||
|
- Github releases are built by Github Actions
|
||||||
|
- Other sources are built by themselves
|
||||||
|
|
||||||
## 🔖 Feature
|
## 🔖 Feature
|
||||||
- `Status chart` (CPU, Sensors, GPU...), `SSH` Term, `SFTP`, `Docker & Pkg & Process`...
|
- `Status chart` (CPU, Sensors, GPU...), `SSH` Term, `SFTP`, `Docker & Pkg & Process`...
|
||||||
- Platform specific: `Bio auth`、`Msg push`、`Home widget`、`watchOS App`...
|
- 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); Español, Русский язык, Português, 日本語 (Generated by GPT)
|
- 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); Español, Русский язык, Português, 日本語 (Generated by GPT)
|
||||||
|
|
||||||
|
|
||||||
## 🏙️ ScreenShots
|
## 🏙️ ScreenShots
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td><img width="277px" src="imgs/server.png"></td>
|
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/1.png"></td>
|
||||||
<td><img width="277px" src="imgs/detail.png"></td>
|
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/2.png"></td>
|
||||||
<td><img width="277px" src="imgs/sftp.png"></td>
|
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/3.png"></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
|
||||||
<table>
|
|
||||||
<tr>
|
<tr>
|
||||||
<td><img width="277px" src="imgs/editor.png"> </td>
|
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/4.png"> </td>
|
||||||
<td><img width="277px" src="imgs/ssh.png"></td>
|
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/5.png"></td>
|
||||||
<td><img width="277px" src="imgs/docker.png"></td>
|
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/6.png"></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|||||||
29
README_zh.md
@@ -4,7 +4,6 @@
|
|||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img alt="lang" src="https://img.shields.io/badge/lang-dart-pink">
|
<img alt="lang" src="https://img.shields.io/badge/lang-dart-pink">
|
||||||
<img alt="countly" src="https://img.shields.io/badge/analysis-countly-pink">
|
|
||||||
<img alt="license" src="https://img.shields.io/badge/license-GPLv3-pink">
|
<img alt="license" src="https://img.shields.io/badge/license-GPLv3-pink">
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@@ -14,12 +13,18 @@
|
|||||||
特别感谢 <a href="https://github.com/TerminalStudio/dartssh2">dartssh2</a> & <a href="https://github.com/TerminalStudio/xterm.dart">xterm.dart</a>。
|
特别感谢 <a href="https://github.com/TerminalStudio/dartssh2">dartssh2</a> & <a href="https://github.com/TerminalStudio/xterm.dart">xterm.dart</a>。
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
## 📥 安装
|
||||||
|
|
||||||
## ⬇️ Download
|
平台 | 下载
|
||||||
🎉 **现在 `Android / Linux / Windows` 版本使用 GitHub Actions 构建**。
|
--- | ---
|
||||||
|
iOS / macOS | [AppStore](https://apps.apple.com/app/id1586449703)
|
||||||
[iOS & macOS](https://apps.apple.com/app/id1586449703) / [Android & Linux & Windows](https://github.com/lollipopkit/flutter_gpt_box/releases)
|
Android | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lolli.tech/serverbox/?sort=time&order=desc&layout=grid) / [F-Droid](https://f-droid.org/packages/tech.lolli.toolbox) / [OpenAPK](https://www.openapk.net/serverbox/tech.lolli.toolbox/)
|
||||||
|
Linux / Windows | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lolli.tech/serverbox/?sort=time&order=desc&layout=grid)
|
||||||
|
|
||||||
|
**请不要从不受信任的来源下载!**
|
||||||
|
- `AppStore` & `CDN` 的包由我构建
|
||||||
|
- Github 的包由 Github Actions 构建
|
||||||
|
- 其他来源由其所有者构建
|
||||||
|
|
||||||
## 🔖 特点
|
## 🔖 特点
|
||||||
- `状态图表`(CPU、传感器、GPU 等), `SSH` 终端, `SFTP`, `Docker & 包 & 进程` 管理器...
|
- `状态图表`(CPU、传感器、GPU 等), `SSH` 终端, `SFTP`, `Docker & 包 & 进程` 管理器...
|
||||||
@@ -33,16 +38,14 @@
|
|||||||
## 🏙️ 截屏
|
## 🏙️ 截屏
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td><img width="277px" src="imgs/server.png"></td>
|
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/1.png"></td>
|
||||||
<td><img width="277px" src="imgs/detail.png"></td>
|
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/2.png"></td>
|
||||||
<td><img width="277px" src="imgs/sftp.png"></td>
|
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/3.png"></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
|
||||||
<table>
|
|
||||||
<tr>
|
<tr>
|
||||||
<td><img width="277px" src="imgs/editor.png"> </td>
|
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/4.png"> </td>
|
||||||
<td><img width="277px" src="imgs/ssh.png"></td>
|
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/5.png"></td>
|
||||||
<td><img width="277px" src="imgs/docker.png"></td>
|
<td><img width="277px" src="https://cdn.lolli.tech/serverbox/screenshot/6.png"></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|||||||
@@ -100,3 +100,14 @@ flutter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {}
|
dependencies {}
|
||||||
|
|
||||||
|
ext.abiCodes = ["x86_64": 1, "armeabi-v7a": 2, "arm64-v8a": 3]
|
||||||
|
import com.android.build.OutputFile
|
||||||
|
android.applicationVariants.all { variant ->
|
||||||
|
variant.outputs.each { output ->
|
||||||
|
def abiVersionCode = project.ext.abiCodes.get(output.getFilter(OutputFile.ABI))
|
||||||
|
if (abiVersionCode != null) {
|
||||||
|
output.versionCodeOverride = variant.versionCode * 10 + abiVersionCode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
6
android/app/proguard-rules.pro
vendored
@@ -1,7 +1 @@
|
|||||||
-keep class io.flutter.app.** { *; }
|
|
||||||
-keep class io.flutter.plugin.** { *; }
|
|
||||||
-keep class io.flutter.util.** { *; }
|
|
||||||
-keep class io.flutter.view.** { *; }
|
|
||||||
-keep class io.flutter.** { *; }
|
|
||||||
-keep class io.flutter.plugins.** { *; }
|
|
||||||
-keep class com.jcraft.** { *; }
|
-keep class com.jcraft.** { *; }
|
||||||
|
|||||||
@@ -3,3 +3,4 @@ distributionPath=wrapper/dists
|
|||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip
|
||||||
|
distributionSha256Sum=6001aba9b2204d26fa25a5800bb9382cf3ee01ccb78fe77317b2872336eb2f80
|
||||||
|
|||||||
6
fastlane/metadata/android/en-US/full_description.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
A Flutter project which provide charts to display Linux server status and tools to manage server.
|
||||||
|
Especially thanks to dartssh2 & xterm.dart.
|
||||||
|
|
||||||
|
* Status chart (CPU, Sensors, GPU...), SSH Term, SFTP, Docker & Pkg & Process...
|
||||||
|
* Platform specific: Bio auth、Msg push、Home widget、watchOS App...
|
||||||
|
* English, 简体中文; Deutsch, 繁體中文, Indonesian, Français, Dutch; Español, Русский язык, Português, 日本語
|
||||||
BIN
fastlane/metadata/android/en-US/images/icon.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 135 KiB After Width: | Height: | Size: 135 KiB |
|
Before Width: | Height: | Size: 115 KiB After Width: | Height: | Size: 115 KiB |
|
Before Width: | Height: | Size: 173 KiB After Width: | Height: | Size: 173 KiB |
|
Before Width: | Height: | Size: 135 KiB After Width: | Height: | Size: 135 KiB |
|
Before Width: | Height: | Size: 135 KiB After Width: | Height: | Size: 135 KiB |
|
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 144 KiB |
1
fastlane/metadata/android/en-US/short_description.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
A server status & toolbox app using Flutter
|
||||||
1
fastlane/metadata/android/en-US/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
ServerBox
|
||||||
7
fastlane/metadata/android/zh-CN/full_description.txt
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
使用 Flutter 开发的 Linux 服务器工具箱,提供服务器状态图表和管理工具。
|
||||||
|
特别感谢 dartssh2 & xterm.dart。
|
||||||
|
|
||||||
|
特点:
|
||||||
|
* 状态图表(CPU、传感器、GPU 等), SSH 终端, SFTP, Docker & 包 & 进程管理器...
|
||||||
|
* 特殊支持:生物认证、推送、桌面小部件、watchOS App、跟随系统颜色...
|
||||||
|
* 本地化 (English, 简体中文, Español, Русский язык, Português, 日本語, Deutsch, 繁體中文, Indonesian, Français, Dutch
|
||||||
BIN
fastlane/metadata/android/zh-CN/images/icon.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
fastlane/metadata/android/zh-CN/images/phoneScreenshots/1.png
Normal file
|
After Width: | Height: | Size: 135 KiB |
BIN
fastlane/metadata/android/zh-CN/images/phoneScreenshots/2.png
Normal file
|
After Width: | Height: | Size: 115 KiB |
BIN
fastlane/metadata/android/zh-CN/images/phoneScreenshots/3.png
Normal file
|
After Width: | Height: | Size: 173 KiB |
BIN
fastlane/metadata/android/zh-CN/images/phoneScreenshots/4.png
Normal file
|
After Width: | Height: | Size: 135 KiB |
BIN
fastlane/metadata/android/zh-CN/images/phoneScreenshots/5.png
Normal file
|
After Width: | Height: | Size: 135 KiB |
BIN
fastlane/metadata/android/zh-CN/images/phoneScreenshots/6.png
Normal file
|
After Width: | Height: | Size: 144 KiB |
1
fastlane/metadata/android/zh-CN/short_description.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
使用 Flutter 开发的服务器状态和工具箱应用
|
||||||
1
fastlane/metadata/android/zh-CN/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
ServerBox
|
||||||
|
Before Width: | Height: | Size: 112 KiB |
@@ -1,6 +1,4 @@
|
|||||||
PODS:
|
PODS:
|
||||||
- countly_flutter (24.4.1):
|
|
||||||
- Flutter
|
|
||||||
- device_info_plus (0.0.1):
|
- device_info_plus (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- file_picker (0.0.1):
|
- file_picker (0.0.1):
|
||||||
@@ -36,7 +34,6 @@ PODS:
|
|||||||
- Flutter
|
- Flutter
|
||||||
|
|
||||||
DEPENDENCIES:
|
DEPENDENCIES:
|
||||||
- countly_flutter (from `.symlinks/plugins/countly_flutter/ios`)
|
|
||||||
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
|
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
|
||||||
- file_picker (from `.symlinks/plugins/file_picker/ios`)
|
- file_picker (from `.symlinks/plugins/file_picker/ios`)
|
||||||
- Flutter (from `Flutter`)
|
- Flutter (from `Flutter`)
|
||||||
@@ -55,8 +52,6 @@ DEPENDENCIES:
|
|||||||
- watch_connectivity (from `.symlinks/plugins/watch_connectivity/ios`)
|
- watch_connectivity (from `.symlinks/plugins/watch_connectivity/ios`)
|
||||||
|
|
||||||
EXTERNAL SOURCES:
|
EXTERNAL SOURCES:
|
||||||
countly_flutter:
|
|
||||||
:path: ".symlinks/plugins/countly_flutter/ios"
|
|
||||||
device_info_plus:
|
device_info_plus:
|
||||||
:path: ".symlinks/plugins/device_info_plus/ios"
|
:path: ".symlinks/plugins/device_info_plus/ios"
|
||||||
file_picker:
|
file_picker:
|
||||||
@@ -91,7 +86,6 @@ EXTERNAL SOURCES:
|
|||||||
:path: ".symlinks/plugins/watch_connectivity/ios"
|
:path: ".symlinks/plugins/watch_connectivity/ios"
|
||||||
|
|
||||||
SPEC CHECKSUMS:
|
SPEC CHECKSUMS:
|
||||||
countly_flutter: 56233d921c6b4e0a720774a39b8ee8110d6f8d91
|
|
||||||
device_info_plus: 97af1d7e84681a90d0693e63169a5d50e0839a0d
|
device_info_plus: 97af1d7e84681a90d0693e63169a5d50e0839a0d
|
||||||
file_picker: c79185e70b9b45728cde2a8d8da454e0cb43f287
|
file_picker: c79185e70b9b45728cde2a8d8da454e0cb43f287
|
||||||
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
|
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
|
||||||
|
|||||||
@@ -690,7 +690,7 @@
|
|||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||||
CURRENT_PROJECT_VERSION = 923;
|
CURRENT_PROJECT_VERSION = 1018;
|
||||||
DEVELOPMENT_TEAM = BA88US33G6;
|
DEVELOPMENT_TEAM = BA88US33G6;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
||||||
@@ -700,7 +700,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.923;
|
MARKETING_VERSION = 1.0.1018;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
@@ -826,7 +826,7 @@
|
|||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||||
CURRENT_PROJECT_VERSION = 923;
|
CURRENT_PROJECT_VERSION = 1018;
|
||||||
DEVELOPMENT_TEAM = BA88US33G6;
|
DEVELOPMENT_TEAM = BA88US33G6;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
||||||
@@ -836,7 +836,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.923;
|
MARKETING_VERSION = 1.0.1018;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
@@ -854,7 +854,7 @@
|
|||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||||
CURRENT_PROJECT_VERSION = 923;
|
CURRENT_PROJECT_VERSION = 1018;
|
||||||
DEVELOPMENT_TEAM = BA88US33G6;
|
DEVELOPMENT_TEAM = BA88US33G6;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
||||||
@@ -864,7 +864,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.923;
|
MARKETING_VERSION = 1.0.1018;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
@@ -885,7 +885,7 @@
|
|||||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 923;
|
CURRENT_PROJECT_VERSION = 1018;
|
||||||
DEVELOPMENT_TEAM = BA88US33G6;
|
DEVELOPMENT_TEAM = BA88US33G6;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
@@ -898,7 +898,7 @@
|
|||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
"@executable_path/../../Frameworks",
|
"@executable_path/../../Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.923;
|
MARKETING_VERSION = 1.0.1018;
|
||||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
||||||
@@ -924,7 +924,7 @@
|
|||||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 923;
|
CURRENT_PROJECT_VERSION = 1018;
|
||||||
DEVELOPMENT_TEAM = BA88US33G6;
|
DEVELOPMENT_TEAM = BA88US33G6;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
@@ -937,7 +937,7 @@
|
|||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
"@executable_path/../../Frameworks",
|
"@executable_path/../../Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.923;
|
MARKETING_VERSION = 1.0.1018;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
@@ -960,7 +960,7 @@
|
|||||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 923;
|
CURRENT_PROJECT_VERSION = 1018;
|
||||||
DEVELOPMENT_TEAM = BA88US33G6;
|
DEVELOPMENT_TEAM = BA88US33G6;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
@@ -973,7 +973,7 @@
|
|||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
"@executable_path/../../Frameworks",
|
"@executable_path/../../Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.923;
|
MARKETING_VERSION = 1.0.1018;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
@@ -996,7 +996,7 @@
|
|||||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 923;
|
CURRENT_PROJECT_VERSION = 1018;
|
||||||
DEVELOPMENT_ASSET_PATHS = "";
|
DEVELOPMENT_ASSET_PATHS = "";
|
||||||
DEVELOPMENT_TEAM = BA88US33G6;
|
DEVELOPMENT_TEAM = BA88US33G6;
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
@@ -1008,7 +1008,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.923;
|
MARKETING_VERSION = 1.0.1018;
|
||||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
|
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
|
||||||
@@ -1037,7 +1037,7 @@
|
|||||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 923;
|
CURRENT_PROJECT_VERSION = 1018;
|
||||||
DEVELOPMENT_ASSET_PATHS = "";
|
DEVELOPMENT_ASSET_PATHS = "";
|
||||||
DEVELOPMENT_TEAM = BA88US33G6;
|
DEVELOPMENT_TEAM = BA88US33G6;
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
@@ -1049,7 +1049,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.923;
|
MARKETING_VERSION = 1.0.1018;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
|
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
|
||||||
PRODUCT_NAME = ServerBox;
|
PRODUCT_NAME = ServerBox;
|
||||||
@@ -1075,7 +1075,7 @@
|
|||||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 923;
|
CURRENT_PROJECT_VERSION = 1018;
|
||||||
DEVELOPMENT_ASSET_PATHS = "";
|
DEVELOPMENT_ASSET_PATHS = "";
|
||||||
DEVELOPMENT_TEAM = BA88US33G6;
|
DEVELOPMENT_TEAM = BA88US33G6;
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
@@ -1087,7 +1087,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.923;
|
MARKETING_VERSION = 1.0.1018;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
|
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
|
||||||
PRODUCT_NAME = ServerBox;
|
PRODUCT_NAME = ServerBox;
|
||||||
|
|||||||
35
lib/app.dart
@@ -3,10 +3,14 @@ import 'package:fl_lib/fl_lib.dart';
|
|||||||
import 'package:fl_lib/l10n/gen_l10n/lib_l10n.dart';
|
import 'package:fl_lib/l10n/gen_l10n/lib_l10n.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||||
import 'package:toolbox/data/res/build_data.dart';
|
import 'package:server_box/core/extension/context/locale.dart';
|
||||||
import 'package:toolbox/data/res/rebuild.dart';
|
import 'package:server_box/data/res/build_data.dart';
|
||||||
import 'package:toolbox/data/res/store.dart';
|
import 'package:server_box/data/res/rebuild.dart';
|
||||||
import 'package:toolbox/view/page/home/home.dart';
|
import 'package:server_box/data/res/store.dart';
|
||||||
|
import 'package:server_box/view/page/home/home.dart';
|
||||||
|
import 'package:icons_plus/icons_plus.dart';
|
||||||
|
|
||||||
|
part 'intro.dart';
|
||||||
|
|
||||||
class MyApp extends StatelessWidget {
|
class MyApp extends StatelessWidget {
|
||||||
const MyApp({super.key});
|
const MyApp({super.key});
|
||||||
@@ -15,7 +19,7 @@ class MyApp extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
_setup(context);
|
_setup(context);
|
||||||
return ListenableBuilder(
|
return ListenableBuilder(
|
||||||
listenable: RebuildNodes.app,
|
listenable: RNodes.app,
|
||||||
builder: (context, _) {
|
builder: (context, _) {
|
||||||
if (!Stores.setting.useSystemPrimaryColor.fetch()) {
|
if (!Stores.setting.useSystemPrimaryColor.fetch()) {
|
||||||
UIs.colorSeed = Color(Stores.setting.primaryColor.fetch());
|
UIs.colorSeed = Color(Stores.setting.primaryColor.fetch());
|
||||||
@@ -71,17 +75,26 @@ class MyApp extends StatelessWidget {
|
|||||||
...AppLocalizations.localizationsDelegates,
|
...AppLocalizations.localizationsDelegates,
|
||||||
],
|
],
|
||||||
supportedLocales: AppLocalizations.supportedLocales,
|
supportedLocales: AppLocalizations.supportedLocales,
|
||||||
|
localeListResolutionCallback: LocaleUtil.resolve,
|
||||||
title: BuildData.name,
|
title: BuildData.name,
|
||||||
themeMode: themeMode,
|
themeMode: themeMode,
|
||||||
theme: light,
|
theme: light,
|
||||||
darkTheme: tMode < 3 ? dark : dark.toAmoled,
|
darkTheme: tMode < 3 ? dark : dark.toAmoled,
|
||||||
home: _buildAppContent(ctx),
|
home: Builder(
|
||||||
);
|
builder: (context) {
|
||||||
}
|
context.setLibL10n();
|
||||||
|
final appL10n = AppLocalizations.of(context);
|
||||||
|
if (appL10n != null) l10n = appL10n;
|
||||||
|
|
||||||
Widget _buildAppContent(BuildContext ctx) {
|
final intros = _IntroPage.builders;
|
||||||
//if (Pros.app.isWearOS) return const WearHome();
|
if (intros.isNotEmpty) {
|
||||||
return const HomePage();
|
return _IntroPage(intros);
|
||||||
|
}
|
||||||
|
|
||||||
|
return const HomePage();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:toolbox/data/res/misc.dart';
|
import 'package:server_box/data/res/misc.dart';
|
||||||
|
|
||||||
abstract final class BgRunMC {
|
abstract final class BgRunMC {
|
||||||
static const _channel = MethodChannel('${Miscs.pkgName}/app_retain');
|
static const _channel = MethodChannel('${Miscs.pkgName}/app_retain');
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:toolbox/data/res/misc.dart';
|
import 'package:server_box/data/res/misc.dart';
|
||||||
import 'package:toolbox/data/res/store.dart';
|
import 'package:server_box/data/res/store.dart';
|
||||||
|
|
||||||
abstract final class HomeWidgetMC {
|
abstract final class HomeWidgetMC {
|
||||||
static const _channel = MethodChannel('${Miscs.pkgName}/home_widget');
|
static const _channel = MethodChannel('${Miscs.pkgName}/home_widget');
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import 'package:toolbox/data/res/build_data.dart';
|
import 'package:server_box/data/res/build_data.dart';
|
||||||
|
|
||||||
extension BuildDataX on BuildData {
|
extension BuildDataX on BuildData {
|
||||||
static const versionStr = 'v1.0.${BuildData.build}';
|
static const versionStr = 'v1.0.${BuildData.build}';
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import 'package:dartssh2/dartssh2.dart';
|
import 'package:dartssh2/dartssh2.dart';
|
||||||
|
import 'package:server_box/view/widget/unix_perm.dart';
|
||||||
|
|
||||||
extension SftpFileX on SftpFileMode {
|
extension SftpFileX on SftpFileMode {
|
||||||
String get str {
|
String get str {
|
||||||
@@ -8,6 +9,26 @@ extension SftpFileX on SftpFileMode {
|
|||||||
|
|
||||||
return '$user$group$other';
|
return '$user$group$other';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UnixPerm toUnixPerm() {
|
||||||
|
return UnixPerm(
|
||||||
|
user: RWX(
|
||||||
|
r: userRead,
|
||||||
|
w: userWrite,
|
||||||
|
x: userExecute,
|
||||||
|
),
|
||||||
|
group: RWX(
|
||||||
|
r: groupRead,
|
||||||
|
w: groupWrite,
|
||||||
|
x: groupExecute,
|
||||||
|
),
|
||||||
|
other: RWX(
|
||||||
|
r: otherRead,
|
||||||
|
w: otherWrite,
|
||||||
|
x: otherExecute,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String _getRoleMode(bool r, bool w, bool x) {
|
String _getRoleMode(bool r, bool w, bool x) {
|
||||||
|
|||||||
@@ -1,27 +1,27 @@
|
|||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:toolbox/data/model/server/private_key_info.dart';
|
import 'package:server_box/data/model/server/private_key_info.dart';
|
||||||
import 'package:toolbox/data/model/server/server_private_info.dart';
|
import 'package:server_box/data/model/server/server_private_info.dart';
|
||||||
import 'package:toolbox/data/res/build_data.dart';
|
import 'package:server_box/data/res/build_data.dart';
|
||||||
import 'package:toolbox/data/res/provider.dart';
|
import 'package:server_box/data/res/provider.dart';
|
||||||
import 'package:toolbox/data/res/store.dart';
|
import 'package:server_box/data/res/store.dart';
|
||||||
import 'package:toolbox/view/page/backup.dart';
|
import 'package:server_box/view/page/backup.dart';
|
||||||
import 'package:toolbox/view/page/container.dart';
|
import 'package:server_box/view/page/container.dart';
|
||||||
import 'package:toolbox/view/page/home/home.dart';
|
import 'package:server_box/view/page/home/home.dart';
|
||||||
import 'package:toolbox/view/page/iperf.dart';
|
import 'package:server_box/view/page/iperf.dart';
|
||||||
import 'package:toolbox/view/page/ping.dart';
|
import 'package:server_box/view/page/ping.dart';
|
||||||
import 'package:toolbox/view/page/private_key/edit.dart';
|
import 'package:server_box/view/page/private_key/edit.dart';
|
||||||
import 'package:toolbox/view/page/private_key/list.dart';
|
import 'package:server_box/view/page/private_key/list.dart';
|
||||||
import 'package:toolbox/view/page/pve.dart';
|
import 'package:server_box/view/page/pve.dart';
|
||||||
import 'package:toolbox/view/page/server/detail/view.dart';
|
import 'package:server_box/view/page/server/detail/view.dart';
|
||||||
import 'package:toolbox/view/page/setting/platform/android.dart';
|
import 'package:server_box/view/page/setting/platform/android.dart';
|
||||||
import 'package:toolbox/view/page/setting/platform/ios.dart';
|
import 'package:server_box/view/page/setting/platform/ios.dart';
|
||||||
import 'package:toolbox/view/page/setting/seq/srv_func_seq.dart';
|
import 'package:server_box/view/page/setting/seq/srv_func_seq.dart';
|
||||||
import 'package:toolbox/view/page/snippet/result.dart';
|
import 'package:server_box/view/page/snippet/result.dart';
|
||||||
import 'package:toolbox/view/page/ssh/page.dart';
|
import 'package:server_box/view/page/ssh/page.dart';
|
||||||
import 'package:toolbox/view/page/setting/seq/virt_key.dart';
|
import 'package:server_box/view/page/setting/seq/virt_key.dart';
|
||||||
import 'package:toolbox/view/page/storage/local.dart';
|
import 'package:server_box/view/page/storage/local.dart';
|
||||||
|
|
||||||
import '../data/model/server/snippet.dart';
|
import '../data/model/server/snippet.dart';
|
||||||
import '../view/page/editor.dart';
|
import '../view/page/editor.dart';
|
||||||
@@ -102,12 +102,14 @@ class AppRoutes {
|
|||||||
Key? key,
|
Key? key,
|
||||||
required ServerPrivateInfo spi,
|
required ServerPrivateInfo spi,
|
||||||
String? initCmd,
|
String? initCmd,
|
||||||
|
Snippet? initSnippet,
|
||||||
}) {
|
}) {
|
||||||
return AppRoutes(
|
return AppRoutes(
|
||||||
SSHPage(
|
SSHPage(
|
||||||
key: key,
|
key: key,
|
||||||
spi: spi,
|
spi: spi,
|
||||||
initCmd: initCmd,
|
initCmd: initCmd,
|
||||||
|
initSnippet: initSnippet,
|
||||||
),
|
),
|
||||||
'ssh_term',
|
'ssh_term',
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -2,14 +2,9 @@ import 'package:fl_lib/fl_lib.dart';
|
|||||||
import 'package:plain_notification_token/plain_notification_token.dart';
|
import 'package:plain_notification_token/plain_notification_token.dart';
|
||||||
|
|
||||||
Future<String?> getToken() async {
|
Future<String?> getToken() async {
|
||||||
if (isIOS) {
|
if (!isIOS) return null;
|
||||||
final plainNotificationToken = PlainNotificationToken();
|
final instance = ApnsToken()..requestPermission();
|
||||||
plainNotificationToken.requestPermission();
|
// Wait until Permission dialog closed
|
||||||
|
await instance.onIosSettingsRegistered.first;
|
||||||
// If you want to wait until Permission dialog close,
|
return await instance.getToken();
|
||||||
// you need wait changing setting registered.
|
|
||||||
await plainNotificationToken.onIosSettingsRegistered.first;
|
|
||||||
return await plainNotificationToken.getToken();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ import 'dart:async';
|
|||||||
|
|
||||||
import 'package:dartssh2/dartssh2.dart';
|
import 'package:dartssh2/dartssh2.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:toolbox/data/model/app/error.dart';
|
import 'package:server_box/data/model/app/error.dart';
|
||||||
import 'package:toolbox/data/res/store.dart';
|
import 'package:server_box/data/res/store.dart';
|
||||||
|
|
||||||
import '../../data/model/server/server_private_info.dart';
|
import '../../data/model/server/server_private_info.dart';
|
||||||
|
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ import 'dart:async';
|
|||||||
|
|
||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:toolbox/core/extension/context/locale.dart';
|
import 'package:server_box/core/extension/context/locale.dart';
|
||||||
import 'package:toolbox/data/model/server/server_private_info.dart';
|
import 'package:server_box/data/model/server/server_private_info.dart';
|
||||||
import 'package:toolbox/data/res/provider.dart';
|
import 'package:server_box/data/res/provider.dart';
|
||||||
|
|
||||||
abstract final class KeybordInteractive {
|
abstract final class KeybordInteractive {
|
||||||
static FutureOr<List<String>?> defaultHandle(
|
static FutureOr<List<String>?> defaultHandle(
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ import 'package:computer/computer.dart';
|
|||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:icloud_storage/icloud_storage.dart';
|
import 'package:icloud_storage/icloud_storage.dart';
|
||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
import 'package:toolbox/data/model/app/backup.dart';
|
import 'package:server_box/data/model/app/backup.dart';
|
||||||
import 'package:toolbox/data/model/app/sync.dart';
|
import 'package:server_box/data/model/app/sync.dart';
|
||||||
import 'package:toolbox/data/res/misc.dart';
|
import 'package:server_box/data/res/misc.dart';
|
||||||
|
|
||||||
import '../../../data/model/app/error.dart';
|
import '../../../data/model/app/error.dart';
|
||||||
|
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ import 'dart:io';
|
|||||||
import 'package:computer/computer.dart';
|
import 'package:computer/computer.dart';
|
||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
import 'package:toolbox/data/model/app/backup.dart';
|
import 'package:server_box/data/model/app/backup.dart';
|
||||||
import 'package:toolbox/data/model/app/error.dart';
|
import 'package:server_box/data/model/app/error.dart';
|
||||||
import 'package:toolbox/data/res/misc.dart';
|
import 'package:server_box/data/res/misc.dart';
|
||||||
import 'package:toolbox/data/res/store.dart';
|
import 'package:server_box/data/res/store.dart';
|
||||||
import 'package:webdav_client/webdav_client.dart';
|
import 'package:webdav_client/webdav_client.dart';
|
||||||
|
|
||||||
abstract final class Webdav {
|
abstract final class Webdav {
|
||||||
|
|||||||
@@ -3,13 +3,13 @@ import 'dart:io';
|
|||||||
|
|
||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
import 'package:toolbox/data/model/server/private_key_info.dart';
|
import 'package:server_box/data/model/server/private_key_info.dart';
|
||||||
import 'package:toolbox/data/model/server/server_private_info.dart';
|
import 'package:server_box/data/model/server/server_private_info.dart';
|
||||||
import 'package:toolbox/data/model/server/snippet.dart';
|
import 'package:server_box/data/model/server/snippet.dart';
|
||||||
import 'package:toolbox/data/res/misc.dart';
|
import 'package:server_box/data/res/misc.dart';
|
||||||
import 'package:toolbox/data/res/provider.dart';
|
import 'package:server_box/data/res/provider.dart';
|
||||||
import 'package:toolbox/data/res/rebuild.dart';
|
import 'package:server_box/data/res/rebuild.dart';
|
||||||
import 'package:toolbox/data/res/store.dart';
|
import 'package:server_box/data/res/store.dart';
|
||||||
|
|
||||||
const backupFormatVersion = 1;
|
const backupFormatVersion = 1;
|
||||||
|
|
||||||
@@ -170,7 +170,7 @@ class Backup {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Pros.reload();
|
Pros.reload();
|
||||||
RebuildNodes.app.rebuild();
|
RNodes.app.notify();
|
||||||
|
|
||||||
_logger.info('Restore success');
|
_logger.info('Restore success');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import 'package:toolbox/core/extension/context/locale.dart';
|
import 'package:server_box/core/extension/context/locale.dart';
|
||||||
|
|
||||||
enum ErrFrom {
|
enum ErrFrom {
|
||||||
unknown,
|
unknown,
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
typedef GhId = String;
|
|
||||||
|
|
||||||
extension GhIdX on GhId {
|
|
||||||
String get url => 'https://github.com/$this';
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:toolbox/core/extension/context/locale.dart';
|
import 'package:server_box/core/extension/context/locale.dart';
|
||||||
|
|
||||||
enum ContainerMenu {
|
enum ContainerMenu {
|
||||||
start,
|
start,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:hive_flutter/hive_flutter.dart';
|
import 'package:hive_flutter/hive_flutter.dart';
|
||||||
import 'package:icons_plus/icons_plus.dart';
|
import 'package:icons_plus/icons_plus.dart';
|
||||||
import 'package:toolbox/core/extension/context/locale.dart';
|
import 'package:server_box/core/extension/context/locale.dart';
|
||||||
|
|
||||||
part 'server_func.g.dart';
|
part 'server_func.g.dart';
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'package:hive_flutter/hive_flutter.dart';
|
import 'package:hive_flutter/hive_flutter.dart';
|
||||||
import 'package:toolbox/core/extension/context/locale.dart';
|
import 'package:server_box/core/extension/context/locale.dart';
|
||||||
import 'package:toolbox/data/model/server/server.dart';
|
import 'package:server_box/data/model/server/server.dart';
|
||||||
import 'package:toolbox/data/res/store.dart';
|
import 'package:server_box/data/res/store.dart';
|
||||||
|
|
||||||
part 'net_view.g.dart';
|
part 'net_view.g.dart';
|
||||||
|
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
import 'package:flutter/foundation.dart';
|
|
||||||
|
|
||||||
class RebuildNode implements Listenable {
|
|
||||||
final List<VoidCallback> _listeners = [];
|
|
||||||
|
|
||||||
RebuildNode();
|
|
||||||
|
|
||||||
@override
|
|
||||||
void addListener(VoidCallback listener) {
|
|
||||||
_listeners.add(listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void removeListener(VoidCallback listener) {
|
|
||||||
_listeners.remove(listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
void rebuild() {
|
|
||||||
for (var listener in _listeners) {
|
|
||||||
listener();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:icons_plus/icons_plus.dart';
|
import 'package:icons_plus/icons_plus.dart';
|
||||||
import 'package:toolbox/core/extension/context/locale.dart';
|
import 'package:server_box/core/extension/context/locale.dart';
|
||||||
import 'package:toolbox/data/res/store.dart';
|
import 'package:server_box/data/res/store.dart';
|
||||||
|
|
||||||
enum ServerDetailCards {
|
enum ServerDetailCards {
|
||||||
about(Icons.info),
|
about(Icons.info),
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import 'package:toolbox/core/extension/context/locale.dart';
|
import 'package:server_box/core/extension/context/locale.dart';
|
||||||
|
|
||||||
import '../../res/build_data.dart';
|
import '../../res/build_data.dart';
|
||||||
import '../server/system.dart';
|
import '../server/system.dart';
|
||||||
@@ -12,32 +12,17 @@ enum ShellFunc {
|
|||||||
suspend,
|
suspend,
|
||||||
;
|
;
|
||||||
|
|
||||||
static const _homeVar = '\$HOME';
|
|
||||||
static const seperator = 'SrvBoxSep';
|
static const seperator = 'SrvBoxSep';
|
||||||
|
|
||||||
/// The suffix `\t` is for formatting
|
/// The suffix `\t` is for formatting
|
||||||
static const cmdDivider = '\necho $seperator\n\t';
|
static const cmdDivider = '\necho $seperator\n\t';
|
||||||
static const _srvBoxDir = '.config/server_box';
|
|
||||||
static const scriptFile = 'mobile_v${BuildData.script}.sh';
|
|
||||||
|
|
||||||
/// Issue #159
|
/// srvboxm -> ServerBox Mobile
|
||||||
///
|
static const scriptFile = 'srvboxm_v${BuildData.script}.sh';
|
||||||
/// Use script commit count as version of shell script.
|
static const scriptPath = '/dev/shm/$scriptFile';
|
||||||
///
|
|
||||||
/// So different version of app can run at the same time.
|
|
||||||
///
|
|
||||||
/// **Can't** use it in SFTP, because SFTP can't recognize `$HOME`
|
|
||||||
static String getShellPath(String home) => '$home/$_srvBoxDir/$scriptFile';
|
|
||||||
|
|
||||||
static const srvBoxDir = '$_homeVar/$_srvBoxDir';
|
|
||||||
static const _installShellPath = '$_homeVar/$_srvBoxDir/$scriptFile';
|
|
||||||
|
|
||||||
// Issue #299, chmod ~/.config to avoid permission issue
|
|
||||||
static const installShellCmd = """
|
static const installShellCmd = """
|
||||||
chmod +x ~/.config &> /dev/null
|
cat > $scriptPath
|
||||||
mkdir -p $_homeVar/$_srvBoxDir
|
chmod 744 $scriptPath
|
||||||
cat > $_installShellPath
|
|
||||||
chmod +x $_installShellPath
|
|
||||||
""";
|
""";
|
||||||
|
|
||||||
String get flag {
|
String get flag {
|
||||||
@@ -57,7 +42,7 @@ chmod +x $_installShellPath
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String get exec => 'sh $_installShellPath -$flag';
|
String get exec => 'sh $scriptPath -$flag';
|
||||||
|
|
||||||
String get name {
|
String get name {
|
||||||
switch (this) {
|
switch (this) {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:toolbox/view/page/ping.dart';
|
import 'package:server_box/view/page/ping.dart';
|
||||||
import 'package:toolbox/view/page/server/tab.dart';
|
import 'package:server_box/view/page/server/tab.dart';
|
||||||
import 'package:toolbox/view/page/snippet/list.dart';
|
import 'package:server_box/view/page/snippet/list.dart';
|
||||||
import 'package:toolbox/view/page/ssh/tab.dart';
|
import 'package:server_box/view/page/ssh/tab.dart';
|
||||||
|
|
||||||
enum AppTab {
|
enum AppTab {
|
||||||
server,
|
server,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:toolbox/data/model/container/type.dart';
|
import 'package:server_box/data/model/container/type.dart';
|
||||||
|
|
||||||
abstract final class ContainerImg {
|
abstract final class ContainerImg {
|
||||||
final String? repository = null;
|
final String? repository = null;
|
||||||
@@ -72,7 +72,7 @@ final class DockerImg implements ContainerImg {
|
|||||||
final String repository;
|
final String repository;
|
||||||
final String size;
|
final String size;
|
||||||
@override
|
@override
|
||||||
final String tag;
|
final String? tag;
|
||||||
|
|
||||||
DockerImg({
|
DockerImg({
|
||||||
required this.containers,
|
required this.containers,
|
||||||
@@ -95,14 +95,30 @@ final class DockerImg implements ContainerImg {
|
|||||||
|
|
||||||
String toRawJson() => json.encode(toJson());
|
String toRawJson() => json.encode(toJson());
|
||||||
|
|
||||||
factory DockerImg.fromJson(Map<String, dynamic> json) => DockerImg(
|
factory DockerImg.fromJson(Map<String, dynamic> json) {
|
||||||
containers: json["Containers"],
|
final containers = switch (json["Containers"]) {
|
||||||
createdAt: json["CreatedAt"],
|
final String a => a,
|
||||||
id: json["ID"],
|
final Object? a => a.toString(),
|
||||||
repository: json["Repository"],
|
};
|
||||||
size: json["Size"],
|
final repo = switch (json["Repository"] ?? json["Names"]) {
|
||||||
tag: json["Tag"],
|
final String a => a,
|
||||||
);
|
final List a => a.firstOrNull.toString(),
|
||||||
|
final Object? a => a.toString(),
|
||||||
|
};
|
||||||
|
final size = switch (json["Size"]) {
|
||||||
|
final String a => a,
|
||||||
|
final int a => a.bytes2Str,
|
||||||
|
final Object? a => a.toString(),
|
||||||
|
};
|
||||||
|
return DockerImg(
|
||||||
|
containers: containers,
|
||||||
|
createdAt: json["CreatedAt"],
|
||||||
|
id: json["ID"] ?? json["Id"] ?? '',
|
||||||
|
repository: repo,
|
||||||
|
size: size,
|
||||||
|
tag: json["Tag"],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => {
|
Map<String, dynamic> toJson() => {
|
||||||
"Containers": containers,
|
"Containers": containers,
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:toolbox/core/extension/context/locale.dart';
|
import 'package:server_box/core/extension/context/locale.dart';
|
||||||
import 'package:toolbox/data/model/container/type.dart';
|
import 'package:server_box/data/model/container/type.dart';
|
||||||
|
import 'package:server_box/data/res/misc.dart';
|
||||||
|
|
||||||
abstract final class ContainerPs {
|
sealed class ContainerPs {
|
||||||
final String? id = null;
|
final String? id = null;
|
||||||
final String? image = null;
|
final String? image = null;
|
||||||
String? get name;
|
String? get name;
|
||||||
@@ -140,7 +141,10 @@ final class DockerPs implements ContainerPs {
|
|||||||
String? get cmd => null;
|
String? get cmd => null;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool get running => state?.contains('Up ') ?? false;
|
bool get running {
|
||||||
|
if (state?.contains('Exited') == true) return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void parseStats(String s) {
|
void parseStats(String s) {
|
||||||
@@ -154,12 +158,12 @@ final class DockerPs implements ContainerPs {
|
|||||||
/// CONTAINER ID NAMES IMAGE STATUS
|
/// CONTAINER ID NAMES IMAGE STATUS
|
||||||
/// a049d689e7a1 aria2-pro p3terx/aria2-pro Up 3 weeks
|
/// a049d689e7a1 aria2-pro p3terx/aria2-pro Up 3 weeks
|
||||||
factory DockerPs.parse(String raw) {
|
factory DockerPs.parse(String raw) {
|
||||||
final parts = raw.split(RegExp(r'\s{2,}'));
|
final parts = raw.split(Miscs.multiBlankreg);
|
||||||
return DockerPs(
|
return DockerPs(
|
||||||
id: parts[0],
|
id: parts[0],
|
||||||
names: parts[1],
|
state: parts[1],
|
||||||
image: parts[2],
|
names: parts[2],
|
||||||
state: parts[3],
|
image: parts[3].trim(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import 'package:toolbox/data/model/container/image.dart';
|
import 'package:server_box/data/model/container/image.dart';
|
||||||
import 'package:toolbox/data/model/container/ps.dart';
|
import 'package:server_box/data/model/container/ps.dart';
|
||||||
|
|
||||||
enum ContainerType {
|
enum ContainerType {
|
||||||
docker,
|
docker,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import 'package:toolbox/data/model/server/dist.dart';
|
import 'package:server_box/data/model/server/dist.dart';
|
||||||
|
|
||||||
enum PkgManager {
|
enum PkgManager {
|
||||||
apt,
|
apt,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import 'package:toolbox/data/model/pkg/manager.dart';
|
import 'package:server_box/data/model/pkg/manager.dart';
|
||||||
|
|
||||||
class UpgradePkgInfo {
|
class UpgradePkgInfo {
|
||||||
final PkgManager? _mgr;
|
final PkgManager? _mgr;
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import 'dart:collection';
|
import 'dart:collection';
|
||||||
|
|
||||||
import 'package:fl_chart/fl_chart.dart';
|
import 'package:fl_chart/fl_chart.dart';
|
||||||
import 'package:toolbox/data/model/server/time_seq.dart';
|
import 'package:server_box/data/model/server/time_seq.dart';
|
||||||
import 'package:toolbox/data/res/status.dart';
|
import 'package:server_box/data/res/status.dart';
|
||||||
|
|
||||||
const _kCap = 30;
|
const _kCap = 30;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:toolbox/data/model/server/time_seq.dart';
|
import 'package:server_box/data/model/server/time_seq.dart';
|
||||||
|
|
||||||
import '../../res/misc.dart';
|
import '../../res/misc.dart';
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:toolbox/core/extension/context/locale.dart';
|
import 'package:server_box/core/extension/context/locale.dart';
|
||||||
|
|
||||||
enum PveResType {
|
enum PveResType {
|
||||||
lxc,
|
lxc,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:toolbox/core/extension/context/locale.dart';
|
import 'package:server_box/core/extension/context/locale.dart';
|
||||||
|
|
||||||
final class SensorAdaptor {
|
final class SensorAdaptor {
|
||||||
final String raw;
|
final String raw;
|
||||||
|
|||||||
@@ -1,19 +1,19 @@
|
|||||||
import 'package:dartssh2/dartssh2.dart';
|
import 'package:dartssh2/dartssh2.dart';
|
||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:toolbox/core/extension/context/locale.dart';
|
import 'package:server_box/core/extension/context/locale.dart';
|
||||||
import 'package:toolbox/data/model/app/error.dart';
|
import 'package:server_box/data/model/app/error.dart';
|
||||||
import 'package:toolbox/data/model/app/shell_func.dart';
|
import 'package:server_box/data/model/app/shell_func.dart';
|
||||||
import 'package:toolbox/data/model/server/battery.dart';
|
import 'package:server_box/data/model/server/battery.dart';
|
||||||
import 'package:toolbox/data/model/server/conn.dart';
|
import 'package:server_box/data/model/server/conn.dart';
|
||||||
import 'package:toolbox/data/model/server/cpu.dart';
|
import 'package:server_box/data/model/server/cpu.dart';
|
||||||
import 'package:toolbox/data/model/server/disk.dart';
|
import 'package:server_box/data/model/server/disk.dart';
|
||||||
import 'package:toolbox/data/model/server/memory.dart';
|
import 'package:server_box/data/model/server/memory.dart';
|
||||||
import 'package:toolbox/data/model/server/net_speed.dart';
|
import 'package:server_box/data/model/server/net_speed.dart';
|
||||||
import 'package:toolbox/data/model/server/nvdia.dart';
|
import 'package:server_box/data/model/server/nvdia.dart';
|
||||||
import 'package:toolbox/data/model/server/sensors.dart';
|
import 'package:server_box/data/model/server/sensors.dart';
|
||||||
import 'package:toolbox/data/model/server/server_private_info.dart';
|
import 'package:server_box/data/model/server/server_private_info.dart';
|
||||||
import 'package:toolbox/data/model/server/system.dart';
|
import 'package:server_box/data/model/server/system.dart';
|
||||||
import 'package:toolbox/data/model/server/temp.dart';
|
import 'package:server_box/data/model/server/temp.dart';
|
||||||
|
|
||||||
import '../app/tag_pickable.dart';
|
import '../app/tag_pickable.dart';
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import 'package:hive_flutter/hive_flutter.dart';
|
import 'package:hive_flutter/hive_flutter.dart';
|
||||||
import 'package:toolbox/data/model/server/custom.dart';
|
import 'package:server_box/data/model/server/custom.dart';
|
||||||
import 'package:toolbox/data/model/server/server.dart';
|
import 'package:server_box/data/model/server/server.dart';
|
||||||
import 'package:toolbox/data/model/server/wol_cfg.dart';
|
import 'package:server_box/data/model/server/wol_cfg.dart';
|
||||||
import 'package:toolbox/data/res/provider.dart';
|
import 'package:server_box/data/res/provider.dart';
|
||||||
|
|
||||||
import '../app/error.dart';
|
import '../app/error.dart';
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:toolbox/data/model/server/battery.dart';
|
import 'package:server_box/data/model/server/battery.dart';
|
||||||
import 'package:toolbox/data/model/server/nvdia.dart';
|
import 'package:server_box/data/model/server/nvdia.dart';
|
||||||
import 'package:toolbox/data/model/server/sensors.dart';
|
import 'package:server_box/data/model/server/sensors.dart';
|
||||||
import 'package:toolbox/data/model/server/server.dart';
|
import 'package:server_box/data/model/server/server.dart';
|
||||||
import 'package:toolbox/data/model/server/system.dart';
|
import 'package:server_box/data/model/server/system.dart';
|
||||||
|
|
||||||
import '../app/shell_func.dart';
|
import '../app/shell_func.dart';
|
||||||
import 'cpu.dart';
|
import 'cpu.dart';
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:hive_flutter/hive_flutter.dart';
|
import 'package:hive_flutter/hive_flutter.dart';
|
||||||
import 'package:toolbox/data/model/server/server_private_info.dart';
|
import 'package:server_box/data/model/server/server_private_info.dart';
|
||||||
|
import 'package:xterm/core.dart';
|
||||||
|
|
||||||
import '../app/tag_pickable.dart';
|
import '../app/tag_pickable.dart';
|
||||||
|
|
||||||
@@ -53,19 +57,116 @@ class Snippet implements TagPickable {
|
|||||||
@override
|
@override
|
||||||
String get tagName => name;
|
String get tagName => name;
|
||||||
|
|
||||||
String fmtWith(ServerPrivateInfo spi) {
|
static final fmtFinder = RegExp(r'\$\{[^{}]+\}');
|
||||||
final fmted = script.replaceAllMapped(
|
|
||||||
RegExp(r'\${.+?}'),
|
String fmtWithSpi(ServerPrivateInfo spi) {
|
||||||
|
return script.replaceAllMapped(
|
||||||
|
fmtFinder,
|
||||||
(match) {
|
(match) {
|
||||||
final key = match.group(0);
|
final key = match.group(0);
|
||||||
final func = fmtArgs[key];
|
final func = fmtArgs[key];
|
||||||
if (func == null) {
|
if (func != null) return func(spi);
|
||||||
return key!;
|
// If not found, return the original content for further processing
|
||||||
}
|
return key ?? '';
|
||||||
return func(spi);
|
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
return fmted;
|
}
|
||||||
|
|
||||||
|
Future<void> runInTerm(
|
||||||
|
Terminal terminal,
|
||||||
|
ServerPrivateInfo spi, {
|
||||||
|
bool autoEnter = false,
|
||||||
|
}) async {
|
||||||
|
final argsFmted = fmtWithSpi(spi);
|
||||||
|
final matches = fmtFinder.allMatches(argsFmted);
|
||||||
|
|
||||||
|
/// There is no [TerminalKey] in the script
|
||||||
|
if (matches.isEmpty) {
|
||||||
|
terminal.textInput(argsFmted);
|
||||||
|
if (autoEnter) terminal.keyInput(TerminalKey.enter);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Records all start and end indexes of the matches
|
||||||
|
final (starts, ends) = matches.fold((<int>[], <int>[]), (pre, e) {
|
||||||
|
pre.$1.add(e.start);
|
||||||
|
pre.$2.add(e.end);
|
||||||
|
return pre;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Check all indexes, `(idx + 1).start` must >= `idx.end`
|
||||||
|
for (var i = 0; i < starts.length - 1; i++) {
|
||||||
|
final lastEnd = ends[i];
|
||||||
|
final nextStart = starts[i + 1];
|
||||||
|
if (nextStart < lastEnd) {
|
||||||
|
throw 'Invalid format: $nextStart < $lastEnd';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start term input
|
||||||
|
if (starts.first > 0) {
|
||||||
|
terminal.textInput(argsFmted.substring(0, starts.first));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process matched
|
||||||
|
for (var idx = 0; idx < starts.length; idx++) {
|
||||||
|
final start = starts[idx];
|
||||||
|
final end = ends[idx];
|
||||||
|
final key = argsFmted.substring(start, end).toLowerCase();
|
||||||
|
|
||||||
|
// Special funcs
|
||||||
|
final special = _find(SnippetFuncs.specialCtrl, key);
|
||||||
|
if (special != null) {
|
||||||
|
final raw = key.substring(special.key.length + 1, key.length - 1);
|
||||||
|
await special.value((term: terminal, raw: raw));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Term keys
|
||||||
|
final termKey = _find(fmtTermKeys, key);
|
||||||
|
if (termKey != null) await _doTermKeys(terminal, termKey, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
// End term input
|
||||||
|
if (ends.last < argsFmted.length) {
|
||||||
|
terminal.textInput(argsFmted.substring(ends.last));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (autoEnter) terminal.keyInput(TerminalKey.enter);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _doTermKeys(
|
||||||
|
Terminal terminal,
|
||||||
|
MapEntry<String, TerminalKey> termKey,
|
||||||
|
String key,
|
||||||
|
) async {
|
||||||
|
if (termKey.value == TerminalKey.enter) {
|
||||||
|
terminal.keyInput(TerminalKey.enter);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final ctrlAlt = switch (termKey.value) {
|
||||||
|
TerminalKey.control => (ctrl: true, alt: false),
|
||||||
|
TerminalKey.alt => (ctrl: false, alt: true),
|
||||||
|
_ => (ctrl: false, alt: false),
|
||||||
|
};
|
||||||
|
|
||||||
|
// `${ctrl+ad}` -> `ctrla + d`
|
||||||
|
final chars = key.substring(termKey.key.length + 1, key.length - 1);
|
||||||
|
if (chars.isEmpty) return;
|
||||||
|
final ok = terminal.charInput(
|
||||||
|
chars.codeUnitAt(0),
|
||||||
|
ctrl: ctrlAlt.ctrl,
|
||||||
|
alt: ctrlAlt.alt,
|
||||||
|
);
|
||||||
|
if (!ok) {
|
||||||
|
Loggers.app.warning('Failed to input: $key');
|
||||||
|
}
|
||||||
|
|
||||||
|
terminal.textInput(chars.substring(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
MapEntry<String, T>? _find<T>(Map<String, T> map, String key) {
|
||||||
|
return map.entries.firstWhereOrNull((e) => key.startsWith(e.key));
|
||||||
}
|
}
|
||||||
|
|
||||||
static final fmtArgs = {
|
static final fmtArgs = {
|
||||||
@@ -76,6 +177,12 @@ class Snippet implements TagPickable {
|
|||||||
r'${id}': (ServerPrivateInfo spi) => spi.id,
|
r'${id}': (ServerPrivateInfo spi) => spi.id,
|
||||||
r'${name}': (ServerPrivateInfo spi) => spi.name,
|
r'${name}': (ServerPrivateInfo spi) => spi.name,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// r'${ctrl+ad}' -> TerminalKey.control, a, d
|
||||||
|
static final fmtTermKeys = {
|
||||||
|
r'${ctrl': TerminalKey.control,
|
||||||
|
r'${alt': TerminalKey.alt,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
class SnippetResult {
|
class SnippetResult {
|
||||||
@@ -89,3 +196,32 @@ class SnippetResult {
|
|||||||
required this.time,
|
required this.time,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef SnippetFuncCtx = ({Terminal term, String raw});
|
||||||
|
|
||||||
|
abstract final class SnippetFuncs {
|
||||||
|
static final specialCtrl = {
|
||||||
|
// `${sleep 3}` -> sleep 3 seconds
|
||||||
|
r'${sleep': SnippetFuncs.sleep,
|
||||||
|
r'${enter': SnippetFuncs.enter,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const help = {
|
||||||
|
'sleep': 'Sleep for a few seconds',
|
||||||
|
'enter': 'Enter a few times',
|
||||||
|
};
|
||||||
|
|
||||||
|
static FutureOr<void> sleep(SnippetFuncCtx ctx) async {
|
||||||
|
final seconds = int.tryParse(ctx.raw);
|
||||||
|
if (seconds == null) return;
|
||||||
|
final duration = Duration(seconds: seconds);
|
||||||
|
await Future.delayed(duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
static FutureOr<void> enter(SnippetFuncCtx ctx) async {
|
||||||
|
final times = int.tryParse(ctx.raw) ?? 1;
|
||||||
|
for (var i = 0; i < times; i++) {
|
||||||
|
ctx.term.keyInput(TerminalKey.enter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import 'package:toolbox/data/model/app/shell_func.dart';
|
import 'package:server_box/data/model/app/shell_func.dart';
|
||||||
|
|
||||||
enum SystemType {
|
enum SystemType {
|
||||||
linux._(linuxSign),
|
linux._(linuxSign),
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import 'package:toolbox/data/res/store.dart';
|
import 'package:server_box/data/res/store.dart';
|
||||||
|
|
||||||
class TryLimiter {
|
class TryLimiter {
|
||||||
final Map<String, int> _triedTimes = {};
|
final Map<String, int> _triedTimes = {};
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import 'package:dartssh2/dartssh2.dart';
|
import 'package:dartssh2/dartssh2.dart';
|
||||||
import 'package:toolbox/data/model/sftp/absolute_path.dart';
|
import 'package:server_box/data/model/sftp/absolute_path.dart';
|
||||||
|
|
||||||
class SftpBrowserStatus {
|
class SftpBrowserStatus {
|
||||||
List<SftpName>? files;
|
List<SftpName>? files;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:toolbox/data/res/store.dart';
|
import 'package:server_box/data/res/store.dart';
|
||||||
|
|
||||||
import '../../../core/utils/server.dart';
|
import '../../../core/utils/server.dart';
|
||||||
import '../server/server_private_info.dart';
|
import '../server/server_private_info.dart';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:hive_flutter/hive_flutter.dart';
|
import 'package:hive_flutter/hive_flutter.dart';
|
||||||
import 'package:toolbox/core/extension/context/locale.dart';
|
import 'package:server_box/core/extension/context/locale.dart';
|
||||||
import 'package:xterm/core.dart';
|
import 'package:xterm/core.dart';
|
||||||
|
|
||||||
part 'virtual_key.g.dart';
|
part 'virtual_key.g.dart';
|
||||||
|
|||||||
@@ -3,13 +3,6 @@ import 'package:fl_lib/fl_lib.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class AppProvider extends ChangeNotifier {
|
class AppProvider extends ChangeNotifier {
|
||||||
int? _newestBuild;
|
|
||||||
int? get newestBuild => _newestBuild;
|
|
||||||
set newestBuild(int? build) {
|
|
||||||
_newestBuild = build;
|
|
||||||
notifyListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
BuildContext? ctx;
|
BuildContext? ctx;
|
||||||
|
|
||||||
bool isWearOS = false;
|
bool isWearOS = false;
|
||||||
|
|||||||
@@ -4,13 +4,13 @@ import 'dart:convert';
|
|||||||
import 'package:dartssh2/dartssh2.dart';
|
import 'package:dartssh2/dartssh2.dart';
|
||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:toolbox/core/extension/ssh_client.dart';
|
import 'package:server_box/core/extension/ssh_client.dart';
|
||||||
import 'package:toolbox/data/model/app/shell_func.dart';
|
import 'package:server_box/data/model/app/shell_func.dart';
|
||||||
import 'package:toolbox/data/model/container/image.dart';
|
import 'package:server_box/data/model/container/image.dart';
|
||||||
import 'package:toolbox/data/model/container/ps.dart';
|
import 'package:server_box/data/model/container/ps.dart';
|
||||||
import 'package:toolbox/data/model/app/error.dart';
|
import 'package:server_box/data/model/app/error.dart';
|
||||||
import 'package:toolbox/data/model/container/type.dart';
|
import 'package:server_box/data/model/container/type.dart';
|
||||||
import 'package:toolbox/data/res/store.dart';
|
import 'package:server_box/data/res/store.dart';
|
||||||
|
|
||||||
final _dockerNotFound =
|
final _dockerNotFound =
|
||||||
RegExp(r"command not found|Unknown command|Command '\w+' not found");
|
RegExp(r"command not found|Unknown command|Command '\w+' not found");
|
||||||
@@ -160,11 +160,18 @@ class ContainerProvider extends ChangeNotifier {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Parse images
|
// Parse images
|
||||||
final imageRaw = ContainerCmdType.images.find(segments);
|
final imageRaw = ContainerCmdType.images.find(segments).trim();
|
||||||
|
final isEntireJson = imageRaw.startsWith('[') && imageRaw.endsWith(']');
|
||||||
try {
|
try {
|
||||||
final imgLines = imageRaw.split('\n');
|
if (isEntireJson) {
|
||||||
imgLines.removeWhere((element) => element.isEmpty);
|
images = (json.decode(imageRaw) as List)
|
||||||
images = imgLines.map((e) => ContainerImg.fromRawJson(e, type)).toList();
|
.map((e) => ContainerImg.fromRawJson(json.encode(e), type))
|
||||||
|
.toList();
|
||||||
|
} else {
|
||||||
|
final lines = imageRaw.split('\n');
|
||||||
|
lines.removeWhere((element) => element.isEmpty);
|
||||||
|
images = lines.map((e) => ContainerImg.fromRawJson(e, type)).toList();
|
||||||
|
}
|
||||||
} catch (e, trace) {
|
} catch (e, trace) {
|
||||||
error = ContainerErr(
|
error = ContainerErr(
|
||||||
type: ContainerErrType.parseImages,
|
type: ContainerErrType.parseImages,
|
||||||
@@ -276,9 +283,13 @@ enum ContainerCmdType {
|
|||||||
return switch (this) {
|
return switch (this) {
|
||||||
ContainerCmdType.version => '$prefix version $_jsonFmt',
|
ContainerCmdType.version => '$prefix version $_jsonFmt',
|
||||||
ContainerCmdType.ps => switch (type) {
|
ContainerCmdType.ps => switch (type) {
|
||||||
|
/// TODO: Rollback to json format when permformance recovers.
|
||||||
/// Use [_jsonFmt] in Docker will cause the operation to slow down.
|
/// Use [_jsonFmt] in Docker will cause the operation to slow down.
|
||||||
ContainerType.docker => '$prefix ps -a --format "table '
|
ContainerType.docker => '$prefix ps -a --format "table {{printf \\"'
|
||||||
'{{printf \\"${"%-30.30s " * 4}\\" .ID .Names .Image .Status}}"',
|
'%-15.15s '
|
||||||
|
'%-30.30s '
|
||||||
|
'${"%-50.50s " * 2}\\"'
|
||||||
|
' .ID .Status .Names .Image}}"',
|
||||||
ContainerType.podman => '$prefix ps -a $_jsonFmt',
|
ContainerType.podman => '$prefix ps -a $_jsonFmt',
|
||||||
},
|
},
|
||||||
ContainerCmdType.stats =>
|
ContainerCmdType.stats =>
|
||||||
@@ -294,6 +305,6 @@ enum ContainerCmdType {
|
|||||||
}) {
|
}) {
|
||||||
return ContainerCmdType.values
|
return ContainerCmdType.values
|
||||||
.map((e) => e.exec(type, sudo: sudo, includeStats: includeStats))
|
.map((e) => e.exec(type, sudo: sudo, includeStats: includeStats))
|
||||||
.join(' && echo ${ShellFunc.seperator} && ');
|
.join('\necho ${ShellFunc.seperator}\n');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:toolbox/data/model/server/private_key_info.dart';
|
import 'package:server_box/data/model/server/private_key_info.dart';
|
||||||
import 'package:toolbox/data/res/store.dart';
|
import 'package:server_box/data/res/store.dart';
|
||||||
|
|
||||||
class PrivateKeyProvider extends ChangeNotifier {
|
class PrivateKeyProvider extends ChangeNotifier {
|
||||||
List<PrivateKeyInfo> get pkis => _pkis;
|
List<PrivateKeyInfo> get pkis => _pkis;
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ import 'package:dio/dio.dart';
|
|||||||
import 'package:dio/io.dart';
|
import 'package:dio/io.dart';
|
||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:toolbox/core/extension/context/locale.dart';
|
import 'package:server_box/core/extension/context/locale.dart';
|
||||||
import 'package:toolbox/data/model/app/error.dart';
|
import 'package:server_box/data/model/app/error.dart';
|
||||||
import 'package:toolbox/data/model/server/pve.dart';
|
import 'package:server_box/data/model/server/pve.dart';
|
||||||
import 'package:toolbox/data/model/server/server_private_info.dart';
|
import 'package:server_box/data/model/server/server_private_info.dart';
|
||||||
import 'package:dartssh2/dartssh2.dart';
|
import 'package:dartssh2/dartssh2.dart';
|
||||||
|
|
||||||
typedef PveCtrlFunc = Future<bool> Function(String node, String id);
|
typedef PveCtrlFunc = Future<bool> Function(String node, String id);
|
||||||
|
|||||||
@@ -5,20 +5,19 @@ import 'package:computer/computer.dart';
|
|||||||
import 'package:dartssh2/dartssh2.dart';
|
import 'package:dartssh2/dartssh2.dart';
|
||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:toolbox/core/extension/ssh_client.dart';
|
import 'package:server_box/core/extension/ssh_client.dart';
|
||||||
import 'package:toolbox/core/utils/ssh_auth.dart';
|
import 'package:server_box/core/utils/ssh_auth.dart';
|
||||||
import 'package:toolbox/data/model/app/error.dart';
|
import 'package:server_box/data/model/app/error.dart';
|
||||||
import 'package:toolbox/data/model/app/shell_func.dart';
|
import 'package:server_box/data/model/app/shell_func.dart';
|
||||||
import 'package:toolbox/data/model/server/system.dart';
|
import 'package:server_box/data/model/server/system.dart';
|
||||||
import 'package:toolbox/data/model/sftp/req.dart';
|
import 'package:server_box/data/model/sftp/req.dart';
|
||||||
import 'package:toolbox/data/res/provider.dart';
|
import 'package:server_box/data/res/provider.dart';
|
||||||
import 'package:toolbox/data/res/store.dart';
|
import 'package:server_box/data/res/store.dart';
|
||||||
|
|
||||||
import '../../core/utils/server.dart';
|
import '../../core/utils/server.dart';
|
||||||
import '../model/server/server.dart';
|
import '../model/server/server.dart';
|
||||||
import '../model/server/server_private_info.dart';
|
import '../model/server/server_private_info.dart';
|
||||||
import '../model/server/server_status_update_req.dart';
|
import '../model/server/server_status_update_req.dart';
|
||||||
import '../model/server/snippet.dart';
|
|
||||||
import '../model/server/try_limiter.dart';
|
import '../model/server/try_limiter.dart';
|
||||||
import '../res/status.dart';
|
import '../res/status.dart';
|
||||||
|
|
||||||
@@ -348,9 +347,13 @@ class ServerProvider extends ChangeNotifier {
|
|||||||
if (homePath == null || homePath.isEmpty) {
|
if (homePath == null || homePath.isEmpty) {
|
||||||
throw Exception('Got empty home path');
|
throw Exception('Got empty home path');
|
||||||
}
|
}
|
||||||
final remotePath = ShellFunc.getShellPath(homePath);
|
|
||||||
final reqId = Pros.sftp.add(
|
final reqId = Pros.sftp.add(
|
||||||
SftpReq(spi, remotePath, localPath, SftpReqType.upload),
|
SftpReq(
|
||||||
|
spi,
|
||||||
|
ShellFunc.scriptPath,
|
||||||
|
localPath,
|
||||||
|
SftpReqType.upload,
|
||||||
|
),
|
||||||
completer: completer,
|
completer: completer,
|
||||||
);
|
);
|
||||||
await completer.future;
|
await completer.future;
|
||||||
@@ -460,20 +463,20 @@ class ServerProvider extends ChangeNotifier {
|
|||||||
TryLimiter.reset(sid);
|
TryLimiter.reset(sid);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<SnippetResult?> runSnippet(String id, Snippet snippet) async {
|
// Future<SnippetResult?> runSnippet(String id, Snippet snippet) async {
|
||||||
final server = _servers[id];
|
// final server = _servers[id];
|
||||||
if (server == null) return null;
|
// if (server == null) return null;
|
||||||
final watch = Stopwatch()..start();
|
// final watch = Stopwatch()..start();
|
||||||
final result = await server.client?.run(snippet.fmtWith(server.spi)).string;
|
// final result = await server.client?.run(snippet.fmtWithArgs(server.spi)).string;
|
||||||
final time = watch.elapsed;
|
// final time = watch.elapsed;
|
||||||
watch.stop();
|
// watch.stop();
|
||||||
if (result == null) return null;
|
// if (result == null) return null;
|
||||||
return SnippetResult(
|
// return SnippetResult(
|
||||||
dest: _servers[id]?.spi.name,
|
// dest: _servers[id]?.spi.name,
|
||||||
result: result,
|
// result: result,
|
||||||
time: time,
|
// time: time,
|
||||||
);
|
// );
|
||||||
}
|
// }
|
||||||
|
|
||||||
// Future<List<SnippetResult?>> runSnippetsMulti(
|
// Future<List<SnippetResult?>> runSnippetsMulti(
|
||||||
// List<String> ids,
|
// List<String> ids,
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ import 'dart:convert';
|
|||||||
|
|
||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:toolbox/data/model/server/snippet.dart';
|
import 'package:server_box/data/model/server/snippet.dart';
|
||||||
import 'package:toolbox/data/res/store.dart';
|
import 'package:server_box/data/res/store.dart';
|
||||||
|
|
||||||
class SnippetProvider extends ChangeNotifier {
|
class SnippetProvider extends ChangeNotifier {
|
||||||
late List<Snippet> _snippets;
|
late List<Snippet> _snippets;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:toolbox/data/res/store.dart';
|
import 'package:server_box/data/res/store.dart';
|
||||||
import 'package:xterm/core.dart';
|
import 'package:xterm/core.dart';
|
||||||
|
|
||||||
class VirtKeyProvider extends TerminalInputHandler with ChangeNotifier {
|
class VirtKeyProvider extends TerminalInputHandler with ChangeNotifier {
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
|
|
||||||
class BuildData {
|
class BuildData {
|
||||||
static const String name = "ServerBox";
|
static const String name = "ServerBox";
|
||||||
static const int build = 923;
|
static const int build = 1018;
|
||||||
static const String engine = "3.22.1";
|
static const int script = 51;
|
||||||
static const String buildAt = "2024-06-01 22:31:14";
|
|
||||||
static const int modifications = 4;
|
|
||||||
static const int script = 48;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,19 +1,19 @@
|
|||||||
import 'package:toolbox/data/model/app/github_id.dart';
|
|
||||||
|
|
||||||
abstract final class GithubIds {
|
abstract final class GithubIds {
|
||||||
// Thanks
|
// Thanks
|
||||||
// If you want to change your Github ID, please open an issue.
|
// If you want to change your Github ID, please open an issue.
|
||||||
static const contributors = <GhId>{
|
static const contributors = <GhId>{
|
||||||
'PaperCube',
|
'PaperCube',
|
||||||
|
'Integral-Tech',
|
||||||
'its-tom',
|
'its-tom',
|
||||||
|
'leganck',
|
||||||
'azkadev',
|
'azkadev',
|
||||||
'kalashnikov',
|
'kalashnikov',
|
||||||
'FrancXPT',
|
|
||||||
'RainSunMe',
|
|
||||||
'calvinweb',
|
'calvinweb',
|
||||||
|
'QazCetelic',
|
||||||
|
'RainSunMe',
|
||||||
|
'FrancXPT',
|
||||||
'Liloupar',
|
'Liloupar',
|
||||||
'dccif',
|
'dccif',
|
||||||
'QazCetelic',
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const participants = <GhId>{
|
static const participants = <GhId>{
|
||||||
@@ -73,5 +73,22 @@ abstract final class GithubIds {
|
|||||||
'FHU-yezi',
|
'FHU-yezi',
|
||||||
'ZRY233',
|
'ZRY233',
|
||||||
'Jasonzhu1207',
|
'Jasonzhu1207',
|
||||||
|
'sakuraanzu',
|
||||||
|
'licaon-kter',
|
||||||
|
'77160860',
|
||||||
|
'mijjjj',
|
||||||
|
'muyunil',
|
||||||
|
'Hua159',
|
||||||
|
'jaydong2016',
|
||||||
|
'geol',
|
||||||
|
'Mooling0602',
|
||||||
|
'IllTamer',
|
||||||
|
'marlkiller',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef GhId = String;
|
||||||
|
|
||||||
|
extension GhIdX on GhId {
|
||||||
|
String get url => 'https://github.com/$this';
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import 'dart:convert';
|
|||||||
|
|
||||||
abstract final class Miscs {
|
abstract final class Miscs {
|
||||||
static final blankReg = RegExp(r'\s+');
|
static final blankReg = RegExp(r'\s+');
|
||||||
|
static final multiBlankreg = RegExp(r'\s{2,}');
|
||||||
|
|
||||||
/// RegExp for password request
|
/// RegExp for password request
|
||||||
static final pwdRequestWithUserReg = RegExp(r'\[sudo\] password for (.+):');
|
static final pwdRequestWithUserReg = RegExp(r'\[sudo\] password for (.+):');
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:toolbox/data/provider/app.dart';
|
import 'package:server_box/data/provider/app.dart';
|
||||||
import 'package:toolbox/data/provider/private_key.dart';
|
import 'package:server_box/data/provider/private_key.dart';
|
||||||
import 'package:toolbox/data/provider/server.dart';
|
import 'package:server_box/data/provider/server.dart';
|
||||||
import 'package:toolbox/data/provider/sftp.dart';
|
import 'package:server_box/data/provider/sftp.dart';
|
||||||
import 'package:toolbox/data/provider/snippet.dart';
|
import 'package:server_box/data/provider/snippet.dart';
|
||||||
|
|
||||||
abstract final class Pros {
|
abstract final class Pros {
|
||||||
static final app = AppProvider();
|
static final app = AppProvider();
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import 'package:toolbox/data/model/app/rebuild.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
|
|
||||||
abstract final class RebuildNodes {
|
abstract final class RNodes {
|
||||||
static final app = RebuildNode();
|
static final app = RNode();
|
||||||
|
static final dark = false.vn;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import 'package:toolbox/data/model/server/server.dart';
|
import 'package:server_box/data/model/server/server.dart';
|
||||||
import 'package:toolbox/data/model/server/temp.dart';
|
import 'package:server_box/data/model/server/temp.dart';
|
||||||
|
|
||||||
import '../model/server/cpu.dart';
|
import '../model/server/cpu.dart';
|
||||||
import '../model/server/disk.dart';
|
import '../model/server/disk.dart';
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:toolbox/data/store/container.dart';
|
import 'package:server_box/data/store/container.dart';
|
||||||
import 'package:toolbox/data/store/history.dart';
|
import 'package:server_box/data/store/history.dart';
|
||||||
import 'package:toolbox/data/store/private_key.dart';
|
import 'package:server_box/data/store/private_key.dart';
|
||||||
import 'package:toolbox/data/store/server.dart';
|
import 'package:server_box/data/store/server.dart';
|
||||||
import 'package:toolbox/data/store/setting.dart';
|
import 'package:server_box/data/store/setting.dart';
|
||||||
import 'package:toolbox/data/store/snippet.dart';
|
import 'package:server_box/data/store/snippet.dart';
|
||||||
|
|
||||||
abstract final class Stores {
|
abstract final class Stores {
|
||||||
static final setting = SettingStore();
|
static final setting = SettingStore();
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
abstract final class Urls {
|
abstract final class Urls {
|
||||||
static const cdnBase = 'https://cdn.lolli.tech/serverbox';
|
static const cdnBase = 'https://cdn.lolli.tech/serverbox';
|
||||||
static const updateCfg = '$cdnBase/update.json';
|
static const updateCfg = '$cdnBase/update2.json';
|
||||||
static const myGithub = 'https://github.com/lollipopkit';
|
static const myGithub = 'https://github.com/lollipopkit';
|
||||||
static const appHelp = '$myGithub/flutter_server_box#-help';
|
static const thisRepo = '$myGithub/flutter_server_box';
|
||||||
static const appWiki = '$myGithub/flutter_server_box/wiki';
|
static const appHelp = '$thisRepo#-help';
|
||||||
|
static const appWiki = '$thisRepo/wiki';
|
||||||
static const analysis = 'https://countly.lolli.tech';
|
static const analysis = 'https://countly.lolli.tech';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:toolbox/data/model/container/type.dart';
|
import 'package:server_box/data/model/container/type.dart';
|
||||||
import 'package:toolbox/data/res/store.dart';
|
import 'package:server_box/data/res/store.dart';
|
||||||
|
|
||||||
const _keyConfig = 'providerConfig';
|
const _keyConfig = 'providerConfig';
|
||||||
|
|
||||||
|
|||||||
@@ -54,4 +54,7 @@ class HistoryStore extends PersistentStore {
|
|||||||
late final sftpLastPath = _MapHistory(box: box, name: 'sftpLastPath');
|
late final sftpLastPath = _MapHistory(box: box, name: 'sftpLastPath');
|
||||||
|
|
||||||
late final sshCmds = _ListHistory(box: box, name: 'sshCmds');
|
late final sshCmds = _ListHistory(box: box, name: 'sshCmds');
|
||||||
|
|
||||||
|
/// Notify users that this app will write script to server to works properly
|
||||||
|
late final writeScriptTipShown = property('writeScriptTipShown', false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'package:fl_lib/fl_lib.dart';
|
import 'package:fl_lib/fl_lib.dart';
|
||||||
import 'package:toolbox/data/model/app/menu/server_func.dart';
|
import 'package:server_box/data/model/app/menu/server_func.dart';
|
||||||
import 'package:toolbox/data/model/app/server_detail_card.dart';
|
import 'package:server_box/data/model/app/server_detail_card.dart';
|
||||||
import 'package:toolbox/data/model/ssh/virtual_key.dart';
|
import 'package:server_box/data/model/ssh/virtual_key.dart';
|
||||||
|
|
||||||
import '../model/app/net_view.dart';
|
import '../model/app/net_view.dart';
|
||||||
import '../res/default.dart';
|
import '../res/default.dart';
|
||||||
@@ -265,8 +265,6 @@ class SettingStore extends PersistentStore {
|
|||||||
|
|
||||||
late final horizonVirtKey = property('horizonVirtKey', false);
|
late final horizonVirtKey = property('horizonVirtKey', false);
|
||||||
|
|
||||||
late final collectUsage = property('collectUsage', true);
|
|
||||||
|
|
||||||
/// general wake lock
|
/// general wake lock
|
||||||
late final generalWakeLock = property('generalWakeLock', false);
|
late final generalWakeLock = property('generalWakeLock', false);
|
||||||
|
|
||||||
@@ -276,6 +274,16 @@ class SettingStore extends PersistentStore {
|
|||||||
/// fmt: https://example.com/{DIST}-{BRIGHT}.png
|
/// fmt: https://example.com/{DIST}-{BRIGHT}.png
|
||||||
late final serverLogoUrl = property('serverLogoUrl', '');
|
late final serverLogoUrl = property('serverLogoUrl', '');
|
||||||
|
|
||||||
|
late final betaTest = property('betaTest', false);
|
||||||
|
|
||||||
|
/// If it's empty, skip change window size.
|
||||||
|
/// Format: {width}x{height}
|
||||||
|
late final windowSize = property('windowSize', '');
|
||||||
|
|
||||||
|
late final introVer = property('introVer', 0);
|
||||||
|
|
||||||
|
late final letterCache = property('letterCache', false);
|
||||||
|
|
||||||
// Never show these settings for users
|
// Never show these settings for users
|
||||||
//
|
//
|
||||||
// ------BEGIN------
|
// ------BEGIN------
|
||||||
|
|||||||
127
lib/intro.dart
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
part of 'app.dart';
|
||||||
|
|
||||||
|
final class _IntroPage extends StatelessWidget {
|
||||||
|
final List<IntroPageBuilder> pages;
|
||||||
|
|
||||||
|
const _IntroPage(this.pages);
|
||||||
|
|
||||||
|
static const _builders = {
|
||||||
|
1: _buildAppSettings,
|
||||||
|
2: _buildRecommended,
|
||||||
|
1006: _buildTermLetterCache,
|
||||||
|
};
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return LayoutBuilder(
|
||||||
|
builder: (context, cons) {
|
||||||
|
final padTop = cons.maxHeight * .16;
|
||||||
|
final pages_ = pages.map((e) => e(context, padTop)).toList();
|
||||||
|
return IntroPage(
|
||||||
|
pages: pages_,
|
||||||
|
onDone: (ctx) {
|
||||||
|
Stores.setting.introVer.put(BuildData.build);
|
||||||
|
Navigator.of(ctx).pushReplacement(
|
||||||
|
MaterialPageRoute(builder: (_) => const HomePage()),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Widget _buildTermLetterCache(BuildContext context, double padTop) {
|
||||||
|
return ListView(
|
||||||
|
padding: _introListPad,
|
||||||
|
children: [
|
||||||
|
SizedBox(height: padTop),
|
||||||
|
IntroPage.title(icon: BoxIcons.bxs_terminal, big: true),
|
||||||
|
SizedBox(height: padTop),
|
||||||
|
ListTile(
|
||||||
|
leading: const Icon(Bootstrap.input_cursor),
|
||||||
|
title: Text(l10n.letterCache),
|
||||||
|
subtitle: Text(l10n.letterCacheTip, style: UIs.textGrey),
|
||||||
|
trailing: StoreSwitch(prop: _setting.letterCache),
|
||||||
|
).cardx,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Widget _buildRecommended(BuildContext context, double padTop) {
|
||||||
|
return ListView(
|
||||||
|
padding: _introListPad,
|
||||||
|
children: [
|
||||||
|
SizedBox(height: padTop),
|
||||||
|
IntroPage.title(icon: Bootstrap.stars, big: true),
|
||||||
|
SizedBox(height: padTop),
|
||||||
|
ListTile(
|
||||||
|
leading: const Icon(MingCute.delete_2_fill),
|
||||||
|
title: const Text('rm -r'),
|
||||||
|
subtitle: Text(l10n.sftpRmrDirSummary, style: UIs.textGrey),
|
||||||
|
trailing: StoreSwitch(prop: _setting.sftpRmrDir),
|
||||||
|
).cardx,
|
||||||
|
ListTile(
|
||||||
|
leading: const Icon(IonIcons.stats_chart, size: _kIconSize),
|
||||||
|
title: Text(l10n.parseContainerStats),
|
||||||
|
subtitle: Text(l10n.parseContainerStatsTip, style: UIs.textGrey),
|
||||||
|
trailing: StoreSwitch(prop: _setting.containerParseStat),
|
||||||
|
).cardx,
|
||||||
|
ListTile(
|
||||||
|
leading: const Icon(OctIcons.cpu),
|
||||||
|
title: Text(l10n.noLineChartForCpu),
|
||||||
|
subtitle: Text(l10n.cpuViewAsProgressTip, style: UIs.textGrey),
|
||||||
|
trailing: StoreSwitch(prop: _setting.cpuViewAsProgress),
|
||||||
|
).cardx,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Widget _buildAppSettings(BuildContext ctx, double padTop) {
|
||||||
|
return ListView(
|
||||||
|
padding: _introListPad,
|
||||||
|
children: [
|
||||||
|
SizedBox(height: padTop),
|
||||||
|
IntroPage.title(text: l10n.init, big: true),
|
||||||
|
SizedBox(height: padTop),
|
||||||
|
ListTile(
|
||||||
|
leading: const Icon(IonIcons.language),
|
||||||
|
title: Text(l10n.language),
|
||||||
|
onTap: () async {
|
||||||
|
final selected = await ctx.showPickSingleDialog(
|
||||||
|
title: l10n.language,
|
||||||
|
items: AppLocalizations.supportedLocales,
|
||||||
|
name: (p0) => p0.code,
|
||||||
|
initial: _setting.locale.fetch().toLocale,
|
||||||
|
);
|
||||||
|
if (selected != null) {
|
||||||
|
_setting.locale.put(selected.code);
|
||||||
|
RNodes.app.notify();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
trailing: Text(
|
||||||
|
l10n.languageName,
|
||||||
|
style: const TextStyle(fontSize: 15, color: Colors.grey),
|
||||||
|
),
|
||||||
|
).cardx,
|
||||||
|
ListTile(
|
||||||
|
leading: const Icon(Icons.update),
|
||||||
|
title: Text(l10n.autoCheckUpdate),
|
||||||
|
subtitle: Text(l10n.fdroidReleaseTip, style: UIs.textGrey),
|
||||||
|
trailing: StoreSwitch(prop: _setting.autoCheckAppUpdate),
|
||||||
|
).cardx,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<IntroPageBuilder> get builders {
|
||||||
|
final storedVer = _setting.introVer.fetch();
|
||||||
|
return _builders.entries
|
||||||
|
.where((e) => e.key > storedVer)
|
||||||
|
.map((e) => e.value)
|
||||||
|
.toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
static final _setting = Stores.setting;
|
||||||
|
static const _kIconSize = 23.0;
|
||||||
|
static const _introListPad = EdgeInsets.symmetric(horizontal: 17);
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
"@@locale": "de",
|
"@@locale": "de",
|
||||||
"about": "Über",
|
"about": "Über",
|
||||||
"aboutThanks": "Vielen Dank an die folgenden Personen, die daran teilgenommen haben.\n",
|
"aboutThanks": "Vielen Dank an die folgenden Personen, die daran teilgenommen haben.\n",
|
||||||
|
"acceptBeta": "Akzeptieren Sie Testversion-Updates",
|
||||||
"add": "Neu",
|
"add": "Neu",
|
||||||
"addAServer": "Server hinzufügen",
|
"addAServer": "Server hinzufügen",
|
||||||
"addPrivateKey": "Private key hinzufügen",
|
"addPrivateKey": "Private key hinzufügen",
|
||||||
@@ -10,7 +11,6 @@
|
|||||||
"addr": "Adresse",
|
"addr": "Adresse",
|
||||||
"all": "Alle",
|
"all": "Alle",
|
||||||
"alreadyLastDir": "Bereits im letzten Verzeichnis.",
|
"alreadyLastDir": "Bereits im letzten Verzeichnis.",
|
||||||
"alterUrl": "Url ändern",
|
|
||||||
"askContinue": "{msg}. Weiter?",
|
"askContinue": "{msg}. Weiter?",
|
||||||
"attention": "Achtung",
|
"attention": "Achtung",
|
||||||
"authFailTip": "Authentifizierung fehlgeschlagen, bitte überprüfen Sie, ob das Passwort/Schlüssel/Host/Benutzer usw. falsch sind.",
|
"authFailTip": "Authentifizierung fehlgeschlagen, bitte überprüfen Sie, ob das Passwort/Schlüssel/Host/Benutzer usw. falsch sind.",
|
||||||
@@ -44,7 +44,6 @@
|
|||||||
"cnKeyboardCompTip": "Wenn das Terminal ein sicheres Tastenfeld öffnet, können Sie es aktivieren.",
|
"cnKeyboardCompTip": "Wenn das Terminal ein sicheres Tastenfeld öffnet, können Sie es aktivieren.",
|
||||||
"collapseUI": "Zusammenbrechen",
|
"collapseUI": "Zusammenbrechen",
|
||||||
"collapseUITip": "Ob lange Listen in der Benutzeroberfläche standardmäßig eingeklappt werden sollen oder nicht",
|
"collapseUITip": "Ob lange Listen in der Benutzeroberfläche standardmäßig eingeklappt werden sollen oder nicht",
|
||||||
"collectUsage": "Nutzungsinformationen sammeln (unabhängig von der Privatsphäre).",
|
|
||||||
"conn": "Verbindung",
|
"conn": "Verbindung",
|
||||||
"connected": "in Verbindung gebracht",
|
"connected": "in Verbindung gebracht",
|
||||||
"container": "Container",
|
"container": "Container",
|
||||||
@@ -68,7 +67,6 @@
|
|||||||
"decode": "Decode",
|
"decode": "Decode",
|
||||||
"decompress": "Dekomprimieren",
|
"decompress": "Dekomprimieren",
|
||||||
"delete": "Löschen",
|
"delete": "Löschen",
|
||||||
"deleteScripts": "Gleichzeitiges Löschen von Server-Skripten",
|
|
||||||
"deleteServers": "Batch-Löschung von Servern",
|
"deleteServers": "Batch-Löschung von Servern",
|
||||||
"deviceName": "Gerätename",
|
"deviceName": "Gerätename",
|
||||||
"dirEmpty": "Stelle sicher, dass der Ordner leer ist.",
|
"dirEmpty": "Stelle sicher, dass der Ordner leer ist.",
|
||||||
@@ -100,6 +98,8 @@
|
|||||||
"export": "Export",
|
"export": "Export",
|
||||||
"extraArgs": "Extra args",
|
"extraArgs": "Extra args",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
|
"fallbackSshDest": "SSH-Fallback-Ziel",
|
||||||
|
"fdroidReleaseTip": "Wenn Sie diese App von F-Droid heruntergeladen haben, wird empfohlen, diese Option zu deaktivieren.",
|
||||||
"feedback": "Feedback",
|
"feedback": "Feedback",
|
||||||
"feedbackOnGithub": "Wenn du Fragen hast, stelle diese bitte auf Github.",
|
"feedbackOnGithub": "Wenn du Fragen hast, stelle diese bitte auf Github.",
|
||||||
"fieldMustNotEmpty": "Die Eingabefelder dürfen nicht leer sein.",
|
"fieldMustNotEmpty": "Die Eingabefelder dürfen nicht leer sein.",
|
||||||
@@ -110,6 +110,7 @@
|
|||||||
"followSystem": "System verfolgen",
|
"followSystem": "System verfolgen",
|
||||||
"font": "Schriftarten",
|
"font": "Schriftarten",
|
||||||
"fontSize": "Schriftgröße",
|
"fontSize": "Schriftgröße",
|
||||||
|
"forExample": "Zum Beispiel",
|
||||||
"force": "freiwillig",
|
"force": "freiwillig",
|
||||||
"foundNUpdate": "Update {count} gefunden",
|
"foundNUpdate": "Update {count} gefunden",
|
||||||
"fullScreen": "Vollbildmodus",
|
"fullScreen": "Vollbildmodus",
|
||||||
@@ -133,6 +134,7 @@
|
|||||||
"imagesList": "Images",
|
"imagesList": "Images",
|
||||||
"import": "Importieren",
|
"import": "Importieren",
|
||||||
"inAppUpdate": "Im App aktualisieren? Andernfalls mit einem Browser herunterladen.",
|
"inAppUpdate": "Im App aktualisieren? Andernfalls mit einem Browser herunterladen.",
|
||||||
|
"init": "Initialisieren",
|
||||||
"inner": "Eingebaut",
|
"inner": "Eingebaut",
|
||||||
"inputDomainHere": "Domain eingeben",
|
"inputDomainHere": "Domain eingeben",
|
||||||
"install": "install",
|
"install": "install",
|
||||||
@@ -151,6 +153,8 @@
|
|||||||
"languageName": "Deutsch",
|
"languageName": "Deutsch",
|
||||||
"lastTry": "Letzter Versuch",
|
"lastTry": "Letzter Versuch",
|
||||||
"launchPage": "Startseite",
|
"launchPage": "Startseite",
|
||||||
|
"letterCache": "Buchstaben-Caching",
|
||||||
|
"letterCacheTip": "Empfohlen zu aktivieren, aber die Aktivierung verhindert die Eingabe von CJK (Chinesisch, Japanisch, Koreanisch) Zeichen",
|
||||||
"license": "Lizenzen",
|
"license": "Lizenzen",
|
||||||
"light": "Hell",
|
"light": "Hell",
|
||||||
"loadingFiles": "Lädt Dateien...",
|
"loadingFiles": "Lädt Dateien...",
|
||||||
@@ -171,12 +175,13 @@
|
|||||||
"name": "Name",
|
"name": "Name",
|
||||||
"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.",
|
"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.",
|
||||||
"needRestart": "App muss neugestartet werden",
|
"needRestart": "App muss neugestartet werden",
|
||||||
"net": "Netz",
|
"net": "Netzwerk",
|
||||||
"netViewType": "Netzwerkansicht Typ",
|
"netViewType": "Netzwerkansicht Typ",
|
||||||
"newContainer": "Neuer Container",
|
"newContainer": "Neuer Container",
|
||||||
"noClient": "Kein Client",
|
"noClient": "Kein Client",
|
||||||
"noInterface": "Kein Interface",
|
"noInterface": "Kein Interface",
|
||||||
"noLineChart": "Verwenden Sie keine Liniendiagramme",
|
"noLineChart": "Verwenden Sie keine Liniendiagramme",
|
||||||
|
"noLineChartForCpu": "Verwenden Sie keine Liniendiagramme für CPU",
|
||||||
"noNotiPerm": "Keine Benachrichtigungsrechte, möglicherweise keine Fortschrittsanzeige beim Herunterladen von App-Updates.",
|
"noNotiPerm": "Keine Benachrichtigungsrechte, möglicherweise keine Fortschrittsanzeige beim Herunterladen von App-Updates.",
|
||||||
"noOptions": "Keine Optionen verfügbar",
|
"noOptions": "Keine Optionen verfügbar",
|
||||||
"noPrivateKeyTip": "Der private Schlüssel existiert nicht, möglicherweise wurde er gelöscht oder es liegt ein Konfigurationsfehler vor.",
|
"noPrivateKeyTip": "Der private Schlüssel existiert nicht, möglicherweise wurde er gelöscht oder es liegt ein Konfigurationsfehler vor.",
|
||||||
@@ -204,6 +209,7 @@
|
|||||||
"paste": "Einfügen",
|
"paste": "Einfügen",
|
||||||
"path": "Pfad",
|
"path": "Pfad",
|
||||||
"percentOfSize": "{percent}% von {size}",
|
"percentOfSize": "{percent}% von {size}",
|
||||||
|
"permission": "Berechtigungen",
|
||||||
"pickFile": "Datei wählen",
|
"pickFile": "Datei wählen",
|
||||||
"pingAvg": "Avg:",
|
"pingAvg": "Avg:",
|
||||||
"pingInputIP": "Bitte gib eine Ziel-IP/Domain ein.",
|
"pingInputIP": "Bitte gib eine Ziel-IP/Domain ein.",
|
||||||
@@ -229,6 +235,7 @@
|
|||||||
"rememberChoice": "Auswahl merken",
|
"rememberChoice": "Auswahl merken",
|
||||||
"rememberPwdInMem": "Passwort im Speicher behalten",
|
"rememberPwdInMem": "Passwort im Speicher behalten",
|
||||||
"rememberPwdInMemTip": "Für Container, Aufhängen usw.",
|
"rememberPwdInMemTip": "Für Container, Aufhängen usw.",
|
||||||
|
"rememberWindowSize": "Fenstergröße merken",
|
||||||
"remotePath": "Entfernte Pfade",
|
"remotePath": "Entfernte Pfade",
|
||||||
"rename": "Umbenennen",
|
"rename": "Umbenennen",
|
||||||
"reportBugsOnGithubIssue": "Bitte Bugs auf {url} melden",
|
"reportBugsOnGithubIssue": "Bitte Bugs auf {url} melden",
|
||||||
@@ -297,7 +304,7 @@
|
|||||||
"total": "Total",
|
"total": "Total",
|
||||||
"traffic": "Durchflussmenge",
|
"traffic": "Durchflussmenge",
|
||||||
"trySudo": "Versuche es mit sudo",
|
"trySudo": "Versuche es mit sudo",
|
||||||
"ttl": "ttl",
|
"ttl": "TTL",
|
||||||
"unknown": "Unbekannt",
|
"unknown": "Unbekannt",
|
||||||
"unknownError": "Unbekannter Fehler",
|
"unknownError": "Unbekannter Fehler",
|
||||||
"unkownConvertMode": "Unbekannter Konvertierungsmodus",
|
"unkownConvertMode": "Unbekannter Konvertierungsmodus",
|
||||||
|
|||||||
@@ -2,31 +2,31 @@
|
|||||||
"@@locale": "en",
|
"@@locale": "en",
|
||||||
"about": "About",
|
"about": "About",
|
||||||
"aboutThanks": "Thanks to the following people who participated in.",
|
"aboutThanks": "Thanks to the following people who participated in.",
|
||||||
|
"acceptBeta": "Accept beta version updates",
|
||||||
"add": "Add",
|
"add": "Add",
|
||||||
"addAServer": "add a server",
|
"addAServer": "add a server",
|
||||||
"addPrivateKey": "Add private key",
|
"addPrivateKey": "Add private key",
|
||||||
"addSystemPrivateKeyTip": "Currently don't have any private key, do you add the one that comes with the system (~/.ssh/id_rsa)?",
|
"addSystemPrivateKeyTip": "Currently private keys don't exist, do you want to add the one that comes with the system (~/.ssh/id_rsa)?",
|
||||||
"added2List": "Added to task list",
|
"added2List": "Added to task list",
|
||||||
"addr": "Address",
|
"addr": "Address",
|
||||||
"all": "All",
|
"all": "All",
|
||||||
"alreadyLastDir": "Already in last directory.",
|
"alreadyLastDir": "Already in last directory.",
|
||||||
"alterUrl": "Alter url",
|
|
||||||
"askContinue": "{msg}. Continue?",
|
"askContinue": "{msg}. Continue?",
|
||||||
"attention": "Attention",
|
"attention": "Attention",
|
||||||
"authFailTip": "Authentication failed, please check if the password/key/host/user, etc., are incorrect.",
|
"authFailTip": "Authentication failed, please check whether credentials are correct",
|
||||||
"authRequired": "Auth required",
|
"authRequired": "Auth required",
|
||||||
"auto": "Auto",
|
"auto": "Auto",
|
||||||
"autoBackupConflict": "Only one automatic backup can be turned on at the same time.",
|
"autoBackupConflict": "Only one automatic backup can be turned on at the same time.",
|
||||||
"autoCheckUpdate": "Auto check update",
|
"autoCheckUpdate": "Automatic update check",
|
||||||
"autoConnect": "Auto connect",
|
"autoConnect": "Auto connect",
|
||||||
"autoRun": "Automatic Run",
|
"autoRun": "Auto run",
|
||||||
"autoUpdateHomeWidget": "Auto update home widget",
|
"autoUpdateHomeWidget": "Automatic home widget update",
|
||||||
"backup": "Backup",
|
"backup": "Backup",
|
||||||
"backupTip": "The exported data is simply encrypted. \nPlease keep it safe.",
|
"backupTip": "The exported data is weakly encrypted. \nPlease keep it safe.",
|
||||||
"backupVersionNotMatch": "Backup version is not match.",
|
"backupVersionNotMatch": "Backup version is not match.",
|
||||||
"battery": "Battery",
|
"battery": "Battery",
|
||||||
"bgRun": "Run in backgroud",
|
"bgRun": "Run in background",
|
||||||
"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 native Android, please disable \"Battery Optimization\" in this app, and for miui, please change the power saving policy to \"Unlimited\".",
|
"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\".",
|
||||||
"bioAuth": "Biometric auth",
|
"bioAuth": "Biometric auth",
|
||||||
"browser": "Browser",
|
"browser": "Browser",
|
||||||
"bulkImportServers": "Batch import servers",
|
"bulkImportServers": "Batch import servers",
|
||||||
@@ -44,7 +44,6 @@
|
|||||||
"cnKeyboardCompTip": "If the terminal pops up a secure keyboard, you can enable it.",
|
"cnKeyboardCompTip": "If the terminal pops up a secure keyboard, you can enable it.",
|
||||||
"collapseUI": "Collapse",
|
"collapseUI": "Collapse",
|
||||||
"collapseUITip": "Whether to collapse long lists present in the UI by default",
|
"collapseUITip": "Whether to collapse long lists present in the UI by default",
|
||||||
"collectUsage": "Collect usage information (unrelated to privacy).",
|
|
||||||
"conn": "Connection",
|
"conn": "Connection",
|
||||||
"connected": "Connected",
|
"connected": "Connected",
|
||||||
"container": "Container",
|
"container": "Container",
|
||||||
@@ -55,7 +54,7 @@
|
|||||||
"convert": "Convert",
|
"convert": "Convert",
|
||||||
"copy": "Copy",
|
"copy": "Copy",
|
||||||
"copyPath": "Copy path",
|
"copyPath": "Copy path",
|
||||||
"cpuViewAsProgressTip": "Display the usage rate of each CPU in a progress bar style (old style)",
|
"cpuViewAsProgressTip": "Display the usage of each CPU in a progress bar style (old style)",
|
||||||
"createFile": "Create file",
|
"createFile": "Create file",
|
||||||
"createFolder": "Create folder",
|
"createFolder": "Create folder",
|
||||||
"cursorType": "Cursor type",
|
"cursorType": "Cursor type",
|
||||||
@@ -68,10 +67,9 @@
|
|||||||
"decode": "Decode",
|
"decode": "Decode",
|
||||||
"decompress": "Decompress",
|
"decompress": "Decompress",
|
||||||
"delete": "Delete",
|
"delete": "Delete",
|
||||||
"deleteScripts": "Delete server scripts at the same time",
|
|
||||||
"deleteServers": "Batch delete servers",
|
"deleteServers": "Batch delete servers",
|
||||||
"deviceName": "Device name",
|
"deviceName": "Device name",
|
||||||
"dirEmpty": "Make sure dir is empty.",
|
"dirEmpty": "Make sure the folder is empty.",
|
||||||
"disabled": "Disabled",
|
"disabled": "Disabled",
|
||||||
"disconnected": "Disconnected",
|
"disconnected": "Disconnected",
|
||||||
"disk": "Disk",
|
"disk": "Disk",
|
||||||
@@ -92,16 +90,18 @@
|
|||||||
"edit": "Edit",
|
"edit": "Edit",
|
||||||
"editVirtKeys": "Edit virtual keys",
|
"editVirtKeys": "Edit virtual keys",
|
||||||
"editor": "Editor",
|
"editor": "Editor",
|
||||||
"editorHighlightTip": "The current code highlighting performance is worse and can be optionally turned off to improve.",
|
"editorHighlightTip": "The current code highlighting performance is not ideal and can be optionally turned off to improve.",
|
||||||
"encode": "Encode",
|
"encode": "Encode",
|
||||||
"error": "Error",
|
"error": "Error",
|
||||||
"exampleName": "Example name",
|
"exampleName": "Example name",
|
||||||
"experimentalFeature": "Experimental feature",
|
"experimentalFeature": "Experimental feature",
|
||||||
"export": "Export",
|
"export": "Export",
|
||||||
"extraArgs": "Extra args",
|
"extraArgs": "Extra arguments",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
|
"fallbackSshDest": "Fallback SSH destination",
|
||||||
|
"fdroidReleaseTip": "If you downloaded this app from F-Droid, it is recommended to turn off this option.",
|
||||||
"feedback": "Feedback",
|
"feedback": "Feedback",
|
||||||
"feedbackOnGithub": "If you have any questions, please feedback on Github.",
|
"feedbackOnGithub": "If you have any questions, please create issues on Github.",
|
||||||
"fieldMustNotEmpty": "These fields must not be empty.",
|
"fieldMustNotEmpty": "These fields must not be empty.",
|
||||||
"fileNotExist": "{file} not exist",
|
"fileNotExist": "{file} not exist",
|
||||||
"fileTooLarge": "File '{file}' too large {size}, max {sizeMax}",
|
"fileTooLarge": "File '{file}' too large {size}, max {sizeMax}",
|
||||||
@@ -110,6 +110,7 @@
|
|||||||
"followSystem": "Follow system",
|
"followSystem": "Follow system",
|
||||||
"font": "Font",
|
"font": "Font",
|
||||||
"fontSize": "Font size",
|
"fontSize": "Font size",
|
||||||
|
"forExample": "For example",
|
||||||
"force": "Force",
|
"force": "Force",
|
||||||
"foundNUpdate": "Found {count} update",
|
"foundNUpdate": "Found {count} update",
|
||||||
"fullScreen": "Full screen mode",
|
"fullScreen": "Full screen mode",
|
||||||
@@ -122,7 +123,7 @@
|
|||||||
"goto": "Go to",
|
"goto": "Go to",
|
||||||
"hideTitleBar": "Hide title bar",
|
"hideTitleBar": "Hide title bar",
|
||||||
"hideTitleBarTip": "After turning it on, please hold down the three buttons in the top right corner to drag.",
|
"hideTitleBarTip": "After turning it on, please hold down the three buttons in the top right corner to drag.",
|
||||||
"highlight": "Code highlight",
|
"highlight": "Code highlighting",
|
||||||
"homeWidgetUrlConfig": "Config home widget url",
|
"homeWidgetUrlConfig": "Config home widget url",
|
||||||
"host": "Host",
|
"host": "Host",
|
||||||
"hour": "Hour",
|
"hour": "Hour",
|
||||||
@@ -133,6 +134,7 @@
|
|||||||
"imagesList": "Images list",
|
"imagesList": "Images list",
|
||||||
"import": "Import",
|
"import": "Import",
|
||||||
"inAppUpdate": "Update within the app? Otherwise, download using a browser.",
|
"inAppUpdate": "Update within the app? Otherwise, download using a browser.",
|
||||||
|
"init": "Initialize",
|
||||||
"inner": "Inner",
|
"inner": "Inner",
|
||||||
"inputDomainHere": "Input Domain here",
|
"inputDomainHere": "Input Domain here",
|
||||||
"install": "install",
|
"install": "install",
|
||||||
@@ -151,6 +153,8 @@
|
|||||||
"languageName": "English",
|
"languageName": "English",
|
||||||
"lastTry": "Last try",
|
"lastTry": "Last try",
|
||||||
"launchPage": "Launch page",
|
"launchPage": "Launch page",
|
||||||
|
"letterCache": "Letter caching",
|
||||||
|
"letterCacheTip": "Recommended to enable, but enabling it prevents the input of CJK (Chinese, Japanese, Korean) characters",
|
||||||
"license": "License",
|
"license": "License",
|
||||||
"light": "Light",
|
"light": "Light",
|
||||||
"loadingFiles": "Loading files...",
|
"loadingFiles": "Loading files...",
|
||||||
@@ -160,7 +164,7 @@
|
|||||||
"madeWithLove": "Made with ❤️ by {myGithub}",
|
"madeWithLove": "Made with ❤️ by {myGithub}",
|
||||||
"manual": "Manual",
|
"manual": "Manual",
|
||||||
"max": "max",
|
"max": "max",
|
||||||
"maxRetryCount": "Number of server reconnection",
|
"maxRetryCount": "Number of server reconnections",
|
||||||
"maxRetryCountEqual0": "Will retry again and again.",
|
"maxRetryCountEqual0": "Will retry again and again.",
|
||||||
"min": "min",
|
"min": "min",
|
||||||
"minute": "Minute",
|
"minute": "Minute",
|
||||||
@@ -170,13 +174,14 @@
|
|||||||
"ms": "ms",
|
"ms": "ms",
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
"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.",
|
"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.",
|
||||||
"needRestart": "Need to restart app",
|
"needRestart": "App needs to be restarted",
|
||||||
"net": "Net",
|
"net": "Network",
|
||||||
"netViewType": "Net view type",
|
"netViewType": "Network view type",
|
||||||
"newContainer": "New container",
|
"newContainer": "New container",
|
||||||
"noClient": "No client",
|
"noClient": "No client",
|
||||||
"noInterface": "No interface",
|
"noInterface": "No interface",
|
||||||
"noLineChart": "Do not use line charts",
|
"noLineChart": "Do not use line charts",
|
||||||
|
"noLineChartForCpu": "Do not use line charts for CPU",
|
||||||
"noNotiPerm": "No notification permissions, possibly no progress indication when downloading app updates.",
|
"noNotiPerm": "No notification permissions, possibly no progress indication when downloading app updates.",
|
||||||
"noOptions": "No options",
|
"noOptions": "No options",
|
||||||
"noPrivateKeyTip": "The private key does not exist, it may have been deleted or there is a configuration error.",
|
"noPrivateKeyTip": "The private key does not exist, it may have been deleted or there is a configuration error.",
|
||||||
@@ -195,22 +200,23 @@
|
|||||||
"ok": "OK",
|
"ok": "OK",
|
||||||
"onServerDetailPage": "On server detail page",
|
"onServerDetailPage": "On server detail page",
|
||||||
"onlyOneLine": "Only display as one line (scrollable)",
|
"onlyOneLine": "Only display as one line (scrollable)",
|
||||||
"onlyWhenCoreBiggerThan8": "Works only when the number of cores > 8",
|
"onlyWhenCoreBiggerThan8": "Works only when the number of cores is greater than 8",
|
||||||
"open": "Open",
|
"open": "Open",
|
||||||
"openLastPath": "Open the last path",
|
"openLastPath": "Open the last path",
|
||||||
"openLastPathTip": "Different servers will have different logs, and the log is the path to the exit",
|
"openLastPathTip": "Different servers will have different logs, and the log is the path to the exit",
|
||||||
"parseContainerStats": "Parse the container occupancy status",
|
"parseContainerStats": "Parse the container occupancy status",
|
||||||
"parseContainerStatsTip": "Docker parsing the occupancy status is relatively slow.",
|
"parseContainerStatsTip": "Parsing the occupancy status of Docker is relatively slow.",
|
||||||
"paste": "Paste",
|
"paste": "Paste",
|
||||||
"path": "Path",
|
"path": "Path",
|
||||||
"percentOfSize": "{percent}% of {size}",
|
"percentOfSize": "{percent}% of {size}",
|
||||||
|
"permission": "Permissions",
|
||||||
"pickFile": "Pick file",
|
"pickFile": "Pick file",
|
||||||
"pingAvg": "Avg:",
|
"pingAvg": "Avg:",
|
||||||
"pingInputIP": "Please input a target IP / domain.",
|
"pingInputIP": "Please input a target IP / domain.",
|
||||||
"pingNoServer": "No server to ping.\nPlease add a server in server tab.",
|
"pingNoServer": "No server to ping.\nPlease add a server in server tab.",
|
||||||
"pkg": "Pkg",
|
"pkg": "Pkg",
|
||||||
"pkgUpgradeTip": "Please backup your system before updating.",
|
"pkgUpgradeTip": "Please backup your system before updating.",
|
||||||
"platformNotSupportUpdate": "Current platform does not support in app update.\nPlease build from source and install it.",
|
"platformNotSupportUpdate": "Current platform does not support in-app update.\nPlease build from source and install it.",
|
||||||
"plugInType": "Insertion Type",
|
"plugInType": "Insertion Type",
|
||||||
"plzEnterHost": "Please enter host.",
|
"plzEnterHost": "Please enter host.",
|
||||||
"plzSelectKey": "Please select a key.",
|
"plzSelectKey": "Please select a key.",
|
||||||
@@ -229,6 +235,7 @@
|
|||||||
"rememberChoice": "Remember the selection",
|
"rememberChoice": "Remember the selection",
|
||||||
"rememberPwdInMem": "Remember password in memory",
|
"rememberPwdInMem": "Remember password in memory",
|
||||||
"rememberPwdInMemTip": "Used for containers, suspending, etc.",
|
"rememberPwdInMemTip": "Used for containers, suspending, etc.",
|
||||||
|
"rememberWindowSize": "Remember window size",
|
||||||
"remotePath": "Remote path",
|
"remotePath": "Remote path",
|
||||||
"rename": "Rename",
|
"rename": "Rename",
|
||||||
"reportBugsOnGithubIssue": "Please report bugs on {url}",
|
"reportBugsOnGithubIssue": "Please report bugs on {url}",
|
||||||
@@ -247,7 +254,7 @@
|
|||||||
"sequence": "Sequence",
|
"sequence": "Sequence",
|
||||||
"server": "Server",
|
"server": "Server",
|
||||||
"serverDetailOrder": "Detail page widget order",
|
"serverDetailOrder": "Detail page widget order",
|
||||||
"serverFuncBtns": "Server func buttons",
|
"serverFuncBtns": "Server function buttons",
|
||||||
"serverOrder": "Server order",
|
"serverOrder": "Server order",
|
||||||
"serverTabConnecting": "Connecting...",
|
"serverTabConnecting": "Connecting...",
|
||||||
"serverTabEmpty": "There is no server.\nClick the fab to add one.",
|
"serverTabEmpty": "There is no server.\nClick the fab to add one.",
|
||||||
@@ -271,14 +278,14 @@
|
|||||||
"sshTip": "This function is now in the experimental stage.\n\nPlease report bugs on {url} or join our development.",
|
"sshTip": "This function is now in the experimental stage.\n\nPlease report bugs on {url} or join our development.",
|
||||||
"sshVirtualKeyAutoOff": "Auto switching of virtual keys",
|
"sshVirtualKeyAutoOff": "Auto switching of virtual keys",
|
||||||
"start": "Start",
|
"start": "Start",
|
||||||
"stats": "Stats",
|
"stats": "Statistics",
|
||||||
"stop": "Stop",
|
"stop": "Stop",
|
||||||
"stopped": "Stopped",
|
"stopped": "Stopped",
|
||||||
"storage": "Storage",
|
"storage": "Storage",
|
||||||
"success": "Success",
|
"success": "Success",
|
||||||
"supportFmtArgs": "The following formatting parameters are supported:",
|
"supportFmtArgs": "The following formatting parameters are supported:",
|
||||||
"suspend": "Suspend",
|
"suspend": "Suspend",
|
||||||
"suspendTip": "The suspend function requires root privileges and systemd support.",
|
"suspendTip": "The suspend function requires root permission and systemd support.",
|
||||||
"switchTo": "Switch to {val}",
|
"switchTo": "Switch to {val}",
|
||||||
"sync": "Sync",
|
"sync": "Sync",
|
||||||
"syncTip": "A restart may be required for some changes to take effect.",
|
"syncTip": "A restart may be required for some changes to take effect.",
|
||||||
@@ -297,10 +304,10 @@
|
|||||||
"total": "Total",
|
"total": "Total",
|
||||||
"traffic": "Traffic",
|
"traffic": "Traffic",
|
||||||
"trySudo": "Try using sudo",
|
"trySudo": "Try using sudo",
|
||||||
"ttl": "ttl",
|
"ttl": "TTL",
|
||||||
"unknown": "Unknown",
|
"unknown": "Unknown",
|
||||||
"unknownError": "Unknown error",
|
"unknownError": "Unknown error",
|
||||||
"unkownConvertMode": "Unknown convert mode",
|
"unkownConvertMode": "Unknown conversion mode",
|
||||||
"update": "Update",
|
"update": "Update",
|
||||||
"updateAll": "Update all",
|
"updateAll": "Update all",
|
||||||
"updateIntervalEqual0": "You set to 0, will not update automatically.\nCan't calculate CPU status.",
|
"updateIntervalEqual0": "You set to 0, will not update automatically.\nCan't calculate CPU status.",
|
||||||
@@ -314,7 +321,7 @@
|
|||||||
"useCdn": "Using CDN",
|
"useCdn": "Using CDN",
|
||||||
"useCdnTip": "Non-Chinese users are recommended to use CDN. Would you like to use it?",
|
"useCdnTip": "Non-Chinese users are recommended to use CDN. Would you like to use it?",
|
||||||
"useNoPwd": "No password will be used",
|
"useNoPwd": "No password will be used",
|
||||||
"usePodmanByDefault": "Defaulting to Podman",
|
"usePodmanByDefault": "Use Podman by default",
|
||||||
"used": "Used",
|
"used": "Used",
|
||||||
"user": "User",
|
"user": "User",
|
||||||
"versionHaveUpdate": "Found: v1.0.{build}, click to update",
|
"versionHaveUpdate": "Found: v1.0.{build}, click to update",
|
||||||
@@ -322,13 +329,13 @@
|
|||||||
"versionUpdated": "Current: v1.0.{build}, is up to date",
|
"versionUpdated": "Current: v1.0.{build}, is up to date",
|
||||||
"view": "View",
|
"view": "View",
|
||||||
"viewErr": "See error",
|
"viewErr": "See error",
|
||||||
"virtKeyHelpClipboard": "Copy to the clipboard if terminal selected is not empty, otherwise paste the contents of the clipboard to the terminal.",
|
"virtKeyHelpClipboard": "Copy to the clipboard if the selected terminal is not empty, otherwise paste the content of the clipboard to the terminal.",
|
||||||
"virtKeyHelpIME": "Turn on/off the keyboard",
|
"virtKeyHelpIME": "Turn on/off the keyboard",
|
||||||
"virtKeyHelpSFTP": "Open current directory in SFTP.",
|
"virtKeyHelpSFTP": "Open current directory in SFTP.",
|
||||||
"waitConnection": "Please wait for the connection to be established.",
|
"waitConnection": "Please wait for the connection to be established.",
|
||||||
"wakeLock": "Keep awake",
|
"wakeLock": "Keep awake",
|
||||||
"watchNotPaired": "No paired Apple Watch",
|
"watchNotPaired": "No paired Apple Watch",
|
||||||
"webdavSettingEmpty": "Webdav setting is empty",
|
"webdavSettingEmpty": "WebDav setting is empty",
|
||||||
"whenOpenApp": "When opening the app",
|
"whenOpenApp": "When opening the app",
|
||||||
"willTakEeffectImmediately": "Will take effect immediately",
|
"willTakEeffectImmediately": "Will take effect immediately",
|
||||||
"wolTip": "After configuring WOL (Wake-on-LAN), a WOL request is sent each time the server is connected.",
|
"wolTip": "After configuring WOL (Wake-on-LAN), a WOL request is sent each time the server is connected.",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"@@locale": "es",
|
"@@locale": "es",
|
||||||
"about": "Acerca de",
|
"about": "Acerca de",
|
||||||
"aboutThanks": "Gracias a los siguientes participantes.",
|
"aboutThanks": "Gracias a los siguientes participantes.",
|
||||||
|
"acceptBeta": "Aceptar actualizaciones de la versión de prueba",
|
||||||
"add": "Añadir",
|
"add": "Añadir",
|
||||||
"addAServer": "Agregar un servidor",
|
"addAServer": "Agregar un servidor",
|
||||||
"addPrivateKey": "Agregar una llave privada",
|
"addPrivateKey": "Agregar una llave privada",
|
||||||
@@ -10,7 +11,6 @@
|
|||||||
"addr": "Dirección",
|
"addr": "Dirección",
|
||||||
"all": "Todos",
|
"all": "Todos",
|
||||||
"alreadyLastDir": "Ya estás en el directorio superior",
|
"alreadyLastDir": "Ya estás en el directorio superior",
|
||||||
"alterUrl": "URL alternativa",
|
|
||||||
"askContinue": "{msg}, ¿continuar?",
|
"askContinue": "{msg}, ¿continuar?",
|
||||||
"attention": "Atención",
|
"attention": "Atención",
|
||||||
"authFailTip": "La autenticación ha fallado, por favor verifica si la contraseña/llave/host/usuario, etc., son incorrectos.",
|
"authFailTip": "La autenticación ha fallado, por favor verifica si la contraseña/llave/host/usuario, etc., son incorrectos.",
|
||||||
@@ -44,7 +44,6 @@
|
|||||||
"cnKeyboardCompTip": "Si el terminal muestra un teclado seguro, puedes activarlo.",
|
"cnKeyboardCompTip": "Si el terminal muestra un teclado seguro, puedes activarlo.",
|
||||||
"collapseUI": "Colapsar",
|
"collapseUI": "Colapsar",
|
||||||
"collapseUITip": "¿Colapsar por defecto las listas largas en la UI?",
|
"collapseUITip": "¿Colapsar por defecto las listas largas en la UI?",
|
||||||
"collectUsage": "Recopilar información de uso (no relacionada con la privacidad).",
|
|
||||||
"conn": "Conectar",
|
"conn": "Conectar",
|
||||||
"connected": "Conectado",
|
"connected": "Conectado",
|
||||||
"container": "Contenedor",
|
"container": "Contenedor",
|
||||||
@@ -68,7 +67,6 @@
|
|||||||
"decode": "Decodificar",
|
"decode": "Decodificar",
|
||||||
"decompress": "Descomprimir",
|
"decompress": "Descomprimir",
|
||||||
"delete": "Eliminar",
|
"delete": "Eliminar",
|
||||||
"deleteScripts": "Eliminar scripts del servidor simultáneamente",
|
|
||||||
"deleteServers": "Eliminar servidores en lote",
|
"deleteServers": "Eliminar servidores en lote",
|
||||||
"deviceName": "Nombre del dispositivo",
|
"deviceName": "Nombre del dispositivo",
|
||||||
"dirEmpty": "Asegúrate de que el directorio esté vacío",
|
"dirEmpty": "Asegúrate de que el directorio esté vacío",
|
||||||
@@ -100,6 +98,8 @@
|
|||||||
"export": "Exportar",
|
"export": "Exportar",
|
||||||
"extraArgs": "Argumentos extra",
|
"extraArgs": "Argumentos extra",
|
||||||
"failed": "Fallido",
|
"failed": "Fallido",
|
||||||
|
"fallbackSshDest": "Destino SSH alternativo",
|
||||||
|
"fdroidReleaseTip": "Si descargaste esta aplicación desde F-Droid, se recomienda desactivar esta opción.",
|
||||||
"feedback": "Retroalimentación",
|
"feedback": "Retroalimentación",
|
||||||
"feedbackOnGithub": "Si tienes algún problema, por favor informa en GitHub",
|
"feedbackOnGithub": "Si tienes algún problema, por favor informa en GitHub",
|
||||||
"fieldMustNotEmpty": "Estos campos no pueden estar vacíos.",
|
"fieldMustNotEmpty": "Estos campos no pueden estar vacíos.",
|
||||||
@@ -110,6 +110,7 @@
|
|||||||
"followSystem": "Seguir al sistema",
|
"followSystem": "Seguir al sistema",
|
||||||
"font": "Fuente",
|
"font": "Fuente",
|
||||||
"fontSize": "Tamaño de fuente",
|
"fontSize": "Tamaño de fuente",
|
||||||
|
"forExample": "Por ejemplo",
|
||||||
"force": "Forzar",
|
"force": "Forzar",
|
||||||
"foundNUpdate": "Encontradas {count} actualizaciones",
|
"foundNUpdate": "Encontradas {count} actualizaciones",
|
||||||
"fullScreen": "Modo pantalla completa",
|
"fullScreen": "Modo pantalla completa",
|
||||||
@@ -133,6 +134,7 @@
|
|||||||
"imagesList": "Lista de imágenes",
|
"imagesList": "Lista de imágenes",
|
||||||
"import": "Importar",
|
"import": "Importar",
|
||||||
"inAppUpdate": "¿Actualizar dentro de la app? De lo contrario, descargar usando un navegador.",
|
"inAppUpdate": "¿Actualizar dentro de la app? De lo contrario, descargar usando un navegador.",
|
||||||
|
"init": "Inicializar",
|
||||||
"inner": "Interno",
|
"inner": "Interno",
|
||||||
"inputDomainHere": "Introduce el dominio aquí",
|
"inputDomainHere": "Introduce el dominio aquí",
|
||||||
"install": "Instalar",
|
"install": "Instalar",
|
||||||
@@ -151,6 +153,8 @@
|
|||||||
"languageName": "Español",
|
"languageName": "Español",
|
||||||
"lastTry": "Último intento",
|
"lastTry": "Último intento",
|
||||||
"launchPage": "Página de lanzamiento",
|
"launchPage": "Página de lanzamiento",
|
||||||
|
"letterCache": "Caché de letras",
|
||||||
|
"letterCacheTip": "Se recomienda activar, pero al activarlo se impide la introducción de caracteres CJK (chino, japonés, coreano)",
|
||||||
"license": "Licencia de código abierto",
|
"license": "Licencia de código abierto",
|
||||||
"light": "Claro",
|
"light": "Claro",
|
||||||
"loadingFiles": "Cargando directorio...",
|
"loadingFiles": "Cargando directorio...",
|
||||||
@@ -177,6 +181,7 @@
|
|||||||
"noClient": "No hay conexión SSH",
|
"noClient": "No hay conexión SSH",
|
||||||
"noInterface": "No hay interfaz disponible",
|
"noInterface": "No hay interfaz disponible",
|
||||||
"noLineChart": "No utilice gráficos de líneas",
|
"noLineChart": "No utilice gráficos de líneas",
|
||||||
|
"noLineChartForCpu": "No utilice gráficos lineales para la CPU",
|
||||||
"noNotiPerm": "Sin permisos de notificación, posiblemente sin indicación de progreso al descargar actualizaciones de la aplicación.",
|
"noNotiPerm": "Sin permisos de notificación, posiblemente sin indicación de progreso al descargar actualizaciones de la aplicación.",
|
||||||
"noOptions": "Sin opciones disponibles",
|
"noOptions": "Sin opciones disponibles",
|
||||||
"noPrivateKeyTip": "La clave privada no existe, puede haber sido eliminada o hay un error de configuración.",
|
"noPrivateKeyTip": "La clave privada no existe, puede haber sido eliminada o hay un error de configuración.",
|
||||||
@@ -204,6 +209,7 @@
|
|||||||
"paste": "Pegar",
|
"paste": "Pegar",
|
||||||
"path": "Ruta",
|
"path": "Ruta",
|
||||||
"percentOfSize": "El {percent}% de {size}",
|
"percentOfSize": "El {percent}% de {size}",
|
||||||
|
"permission": "Permisos",
|
||||||
"pickFile": "Seleccionar archivo",
|
"pickFile": "Seleccionar archivo",
|
||||||
"pingAvg": "Promedio:",
|
"pingAvg": "Promedio:",
|
||||||
"pingInputIP": "Por favor, introduce la IP de destino o el dominio",
|
"pingInputIP": "Por favor, introduce la IP de destino o el dominio",
|
||||||
@@ -229,6 +235,7 @@
|
|||||||
"rememberChoice": "Recordar la selección",
|
"rememberChoice": "Recordar la selección",
|
||||||
"rememberPwdInMem": "Recordar contraseña en la memoria",
|
"rememberPwdInMem": "Recordar contraseña en la memoria",
|
||||||
"rememberPwdInMemTip": "Utilizado para contenedores, suspensión, etc.",
|
"rememberPwdInMemTip": "Utilizado para contenedores, suspensión, etc.",
|
||||||
|
"rememberWindowSize": "Recordar el tamaño de la ventana",
|
||||||
"remotePath": "Ruta remota",
|
"remotePath": "Ruta remota",
|
||||||
"rename": "Renombrar",
|
"rename": "Renombrar",
|
||||||
"reportBugsOnGithubIssue": "Por favor, informa los problemas en {url}",
|
"reportBugsOnGithubIssue": "Por favor, informa los problemas en {url}",
|
||||||
@@ -297,7 +304,7 @@
|
|||||||
"total": "Total",
|
"total": "Total",
|
||||||
"traffic": "Tráfico",
|
"traffic": "Tráfico",
|
||||||
"trySudo": "Intentar con sudo",
|
"trySudo": "Intentar con sudo",
|
||||||
"ttl": "Tiempo de vida (TTL)",
|
"ttl": "TTL",
|
||||||
"unknown": "Desconocido",
|
"unknown": "Desconocido",
|
||||||
"unknownError": "Error desconocido",
|
"unknownError": "Error desconocido",
|
||||||
"unkownConvertMode": "Modo de conversión desconocido",
|
"unkownConvertMode": "Modo de conversión desconocido",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"@@locale": "fr",
|
"@@locale": "fr",
|
||||||
"about": "À propos",
|
"about": "À propos",
|
||||||
"aboutThanks": "Merci aux personnes suivantes qui ont participé.",
|
"aboutThanks": "Merci aux personnes suivantes qui ont participé.",
|
||||||
|
"acceptBeta": "Accepter les mises à jour de la version de test",
|
||||||
"add": "Ajouter",
|
"add": "Ajouter",
|
||||||
"addAServer": "Ajouter un serveur",
|
"addAServer": "Ajouter un serveur",
|
||||||
"addPrivateKey": "Ajouter une clé privée",
|
"addPrivateKey": "Ajouter une clé privée",
|
||||||
@@ -10,7 +11,6 @@
|
|||||||
"addr": "Adresse",
|
"addr": "Adresse",
|
||||||
"all": "Tous",
|
"all": "Tous",
|
||||||
"alreadyLastDir": "Déjà dans le dernier répertoire.",
|
"alreadyLastDir": "Déjà dans le dernier répertoire.",
|
||||||
"alterUrl": "Modifier l'URL",
|
|
||||||
"askContinue": "{msg}. Continuer ?",
|
"askContinue": "{msg}. Continuer ?",
|
||||||
"attention": "Attention",
|
"attention": "Attention",
|
||||||
"authFailTip": "Échec de l'authentification. Veuillez vérifier si le mot de passe/clé/hôte/utilisateur, etc., est incorrect.",
|
"authFailTip": "Échec de l'authentification. Veuillez vérifier si le mot de passe/clé/hôte/utilisateur, etc., est incorrect.",
|
||||||
@@ -44,7 +44,6 @@
|
|||||||
"cnKeyboardCompTip": "Si le terminal affiche un clavier sécurisé, vous pouvez l'activer.",
|
"cnKeyboardCompTip": "Si le terminal affiche un clavier sécurisé, vous pouvez l'activer.",
|
||||||
"collapseUI": "Réduire",
|
"collapseUI": "Réduire",
|
||||||
"collapseUITip": "Indique si les longues listes présentées dans l'interface utilisateur doivent être réduites par défaut.",
|
"collapseUITip": "Indique si les longues listes présentées dans l'interface utilisateur doivent être réduites par défaut.",
|
||||||
"collectUsage": "Collecter des informations d'utilisation (sans rapport avec la confidentialité).",
|
|
||||||
"conn": "Connexion",
|
"conn": "Connexion",
|
||||||
"connected": "Connecté",
|
"connected": "Connecté",
|
||||||
"container": "Conteneur",
|
"container": "Conteneur",
|
||||||
@@ -68,7 +67,6 @@
|
|||||||
"decode": "Décoder",
|
"decode": "Décoder",
|
||||||
"decompress": "Décompresser",
|
"decompress": "Décompresser",
|
||||||
"delete": "Supprimer",
|
"delete": "Supprimer",
|
||||||
"deleteScripts": "Supprimer les scripts du serveur en même temps",
|
|
||||||
"deleteServers": "Supprimer des serveurs en lot",
|
"deleteServers": "Supprimer des serveurs en lot",
|
||||||
"deviceName": "Nom de l'appareil",
|
"deviceName": "Nom de l'appareil",
|
||||||
"dirEmpty": "Assurez-vous que le répertoire est vide.",
|
"dirEmpty": "Assurez-vous que le répertoire est vide.",
|
||||||
@@ -100,6 +98,8 @@
|
|||||||
"export": "Exporter",
|
"export": "Exporter",
|
||||||
"extraArgs": "Arguments supplémentaires",
|
"extraArgs": "Arguments supplémentaires",
|
||||||
"failed": "Échoué",
|
"failed": "Échoué",
|
||||||
|
"fallbackSshDest": "Destino SSH alternativo",
|
||||||
|
"fdroidReleaseTip": "Si vous avez téléchargé cette application depuis F-Droid, il est recommandé de désactiver cette option.",
|
||||||
"feedback": "Retour",
|
"feedback": "Retour",
|
||||||
"feedbackOnGithub": "Si vous avez des questions, veuillez donner votre avis sur Github.",
|
"feedbackOnGithub": "Si vous avez des questions, veuillez donner votre avis sur Github.",
|
||||||
"fieldMustNotEmpty": "Ces champs ne doivent pas être vides.",
|
"fieldMustNotEmpty": "Ces champs ne doivent pas être vides.",
|
||||||
@@ -110,6 +110,7 @@
|
|||||||
"followSystem": "Suivre le système",
|
"followSystem": "Suivre le système",
|
||||||
"font": "Police",
|
"font": "Police",
|
||||||
"fontSize": "Taille de la police",
|
"fontSize": "Taille de la police",
|
||||||
|
"forExample": "Par exemple",
|
||||||
"force": "Forcer",
|
"force": "Forcer",
|
||||||
"foundNUpdate": "{count} mise à jour trouvée",
|
"foundNUpdate": "{count} mise à jour trouvée",
|
||||||
"fullScreen": "Mode plein écran",
|
"fullScreen": "Mode plein écran",
|
||||||
@@ -133,6 +134,7 @@
|
|||||||
"imagesList": "Liste des images",
|
"imagesList": "Liste des images",
|
||||||
"import": "Importer",
|
"import": "Importer",
|
||||||
"inAppUpdate": "Mettre à jour dans l'application ? Sinon, téléchargez en utilisant un navigateur.",
|
"inAppUpdate": "Mettre à jour dans l'application ? Sinon, téléchargez en utilisant un navigateur.",
|
||||||
|
"init": "Initialiser",
|
||||||
"inner": "Interne",
|
"inner": "Interne",
|
||||||
"inputDomainHere": "Saisissez le domaine ici",
|
"inputDomainHere": "Saisissez le domaine ici",
|
||||||
"install": "Installer",
|
"install": "Installer",
|
||||||
@@ -151,6 +153,8 @@
|
|||||||
"languageName": "Français",
|
"languageName": "Français",
|
||||||
"lastTry": "Dernière tentative",
|
"lastTry": "Dernière tentative",
|
||||||
"launchPage": "Page de lancement",
|
"launchPage": "Page de lancement",
|
||||||
|
"letterCache": "Mise en cache des lettres",
|
||||||
|
"letterCacheTip": "Recommandé à activer, mais son activation empêche la saisie de caractères CJK (chinois, japonais, coréen)",
|
||||||
"license": "Licence",
|
"license": "Licence",
|
||||||
"light": "Clair",
|
"light": "Clair",
|
||||||
"loadingFiles": "Chargement des fichiers...",
|
"loadingFiles": "Chargement des fichiers...",
|
||||||
@@ -177,6 +181,7 @@
|
|||||||
"noClient": "Pas de client",
|
"noClient": "Pas de client",
|
||||||
"noInterface": "Pas d'interface",
|
"noInterface": "Pas d'interface",
|
||||||
"noLineChart": "Ne pas utiliser de graphiques linéaires",
|
"noLineChart": "Ne pas utiliser de graphiques linéaires",
|
||||||
|
"noLineChartForCpu": "Ne pas utiliser de graphiques linéaires pour l'unité centrale",
|
||||||
"noNotiPerm": "Pas de permissions de notification, peut-être pas d'indication de progression lors de la mise à jour des applications.",
|
"noNotiPerm": "Pas de permissions de notification, peut-être pas d'indication de progression lors de la mise à jour des applications.",
|
||||||
"noOptions": "Pas d'options",
|
"noOptions": "Pas d'options",
|
||||||
"noPrivateKeyTip": "La clé privée n'existe pas, elle a peut-être été supprimée ou il y a une erreur de configuration.",
|
"noPrivateKeyTip": "La clé privée n'existe pas, elle a peut-être été supprimée ou il y a une erreur de configuration.",
|
||||||
@@ -204,6 +209,7 @@
|
|||||||
"paste": "Coller",
|
"paste": "Coller",
|
||||||
"path": "Chemin",
|
"path": "Chemin",
|
||||||
"percentOfSize": "{percent}% de {size}",
|
"percentOfSize": "{percent}% de {size}",
|
||||||
|
"permission": "Permissions",
|
||||||
"pickFile": "Choisir un fichier",
|
"pickFile": "Choisir un fichier",
|
||||||
"pingAvg": "Moy.:",
|
"pingAvg": "Moy.:",
|
||||||
"pingInputIP": "Veuillez saisir une adresse IP / un domaine cible.",
|
"pingInputIP": "Veuillez saisir une adresse IP / un domaine cible.",
|
||||||
@@ -229,6 +235,7 @@
|
|||||||
"rememberChoice": "Se souvenir du choix",
|
"rememberChoice": "Se souvenir du choix",
|
||||||
"rememberPwdInMem": "Mémoriser le mot de passe en mémoire",
|
"rememberPwdInMem": "Mémoriser le mot de passe en mémoire",
|
||||||
"rememberPwdInMemTip": "Utilisé pour les conteneurs, la suspension, etc.",
|
"rememberPwdInMemTip": "Utilisé pour les conteneurs, la suspension, etc.",
|
||||||
|
"rememberWindowSize": "Se souvenir de la taille de la fenêtre",
|
||||||
"remotePath": "Chemin distant",
|
"remotePath": "Chemin distant",
|
||||||
"rename": "Renommer",
|
"rename": "Renommer",
|
||||||
"reportBugsOnGithubIssue": "Veuillez signaler les bugs sur {url}",
|
"reportBugsOnGithubIssue": "Veuillez signaler les bugs sur {url}",
|
||||||
@@ -297,7 +304,7 @@
|
|||||||
"total": "Total",
|
"total": "Total",
|
||||||
"traffic": "Trafic",
|
"traffic": "Trafic",
|
||||||
"trySudo": "Essayer d'utiliser sudo",
|
"trySudo": "Essayer d'utiliser sudo",
|
||||||
"ttl": "ttl",
|
"ttl": "TTL",
|
||||||
"unknown": "Inconnu",
|
"unknown": "Inconnu",
|
||||||
"unknownError": "Erreur inconnue",
|
"unknownError": "Erreur inconnue",
|
||||||
"unkownConvertMode": "Mode de conversion inconnu",
|
"unkownConvertMode": "Mode de conversion inconnu",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"@@locale": "id",
|
"@@locale": "id",
|
||||||
"about": "Tentang",
|
"about": "Tentang",
|
||||||
"aboutThanks": "Terima kasih kepada orang -orang berikut yang berpartisipasi.",
|
"aboutThanks": "Terima kasih kepada orang -orang berikut yang berpartisipasi.",
|
||||||
|
"acceptBeta": "Terima pembaruan versi uji coba",
|
||||||
"add": "Menambahkan",
|
"add": "Menambahkan",
|
||||||
"addAServer": "tambahkan server",
|
"addAServer": "tambahkan server",
|
||||||
"addPrivateKey": "Tambahkan kunci pribadi",
|
"addPrivateKey": "Tambahkan kunci pribadi",
|
||||||
@@ -10,7 +11,6 @@
|
|||||||
"addr": "Alamat",
|
"addr": "Alamat",
|
||||||
"all": "Semua",
|
"all": "Semua",
|
||||||
"alreadyLastDir": "Sudah di direktori terakhir.",
|
"alreadyLastDir": "Sudah di direktori terakhir.",
|
||||||
"alterUrl": "Alter url",
|
|
||||||
"askContinue": "{msg}, lanjutkan?",
|
"askContinue": "{msg}, lanjutkan?",
|
||||||
"attention": "Perhatian",
|
"attention": "Perhatian",
|
||||||
"authFailTip": "Otentikasi gagal, silakan periksa apakah kata sandi/kunci/host/pengguna, dll, salah.",
|
"authFailTip": "Otentikasi gagal, silakan periksa apakah kata sandi/kunci/host/pengguna, dll, salah.",
|
||||||
@@ -44,7 +44,6 @@
|
|||||||
"cnKeyboardCompTip": "Jika terminal munculkan keyboard aman, Anda bisa mengaktifkannya.",
|
"cnKeyboardCompTip": "Jika terminal munculkan keyboard aman, Anda bisa mengaktifkannya.",
|
||||||
"collapseUI": "Runtuh",
|
"collapseUI": "Runtuh",
|
||||||
"collapseUITip": "Apakah akan menciutkan daftar panjang yang ada di UI secara default atau tidak",
|
"collapseUITip": "Apakah akan menciutkan daftar panjang yang ada di UI secara default atau tidak",
|
||||||
"collectUsage": "Mengumpulkan informasi penggunaan (tidak terkait dengan privasi).",
|
|
||||||
"conn": "Koneksi",
|
"conn": "Koneksi",
|
||||||
"connected": "Terhubung",
|
"connected": "Terhubung",
|
||||||
"container": "Wadah",
|
"container": "Wadah",
|
||||||
@@ -68,7 +67,6 @@
|
|||||||
"decode": "Membaca sandi",
|
"decode": "Membaca sandi",
|
||||||
"decompress": "Dekompresi",
|
"decompress": "Dekompresi",
|
||||||
"delete": "Menghapus",
|
"delete": "Menghapus",
|
||||||
"deleteScripts": "Menghapus skrip server secara bersamaan",
|
|
||||||
"deleteServers": "Penghapusan server secara batch",
|
"deleteServers": "Penghapusan server secara batch",
|
||||||
"deviceName": "Nama perangkat",
|
"deviceName": "Nama perangkat",
|
||||||
"dirEmpty": "Pastikan dir kosong.",
|
"dirEmpty": "Pastikan dir kosong.",
|
||||||
@@ -100,6 +98,8 @@
|
|||||||
"export": "Ekspor",
|
"export": "Ekspor",
|
||||||
"extraArgs": "Args ekstra",
|
"extraArgs": "Args ekstra",
|
||||||
"failed": "Gagal",
|
"failed": "Gagal",
|
||||||
|
"fallbackSshDest": "Tujuan SSH mundur",
|
||||||
|
"fdroidReleaseTip": "Jika Anda mengunduh aplikasi ini dari F-Droid, disarankan untuk mematikan opsi ini.",
|
||||||
"feedback": "Masukan",
|
"feedback": "Masukan",
|
||||||
"feedbackOnGithub": "Jika Anda memiliki pertanyaan, silakan umpan balik tentang GitHub.",
|
"feedbackOnGithub": "Jika Anda memiliki pertanyaan, silakan umpan balik tentang GitHub.",
|
||||||
"fieldMustNotEmpty": "Bidang -bidang ini tidak boleh kosong.",
|
"fieldMustNotEmpty": "Bidang -bidang ini tidak boleh kosong.",
|
||||||
@@ -110,6 +110,7 @@
|
|||||||
"followSystem": "Ikuti sistem",
|
"followSystem": "Ikuti sistem",
|
||||||
"font": "Font",
|
"font": "Font",
|
||||||
"fontSize": "Ukuran huruf",
|
"fontSize": "Ukuran huruf",
|
||||||
|
"forExample": "Sebagai contoh",
|
||||||
"force": "sukarela",
|
"force": "sukarela",
|
||||||
"foundNUpdate": "Menemukan {count} pembaruan",
|
"foundNUpdate": "Menemukan {count} pembaruan",
|
||||||
"fullScreen": "Mode Layar Penuh",
|
"fullScreen": "Mode Layar Penuh",
|
||||||
@@ -133,6 +134,7 @@
|
|||||||
"imagesList": "Daftar gambar",
|
"imagesList": "Daftar gambar",
|
||||||
"import": "Impor",
|
"import": "Impor",
|
||||||
"inAppUpdate": "Perbarui di dalam aplikasi? Jika tidak, unduh menggunakan browser.",
|
"inAppUpdate": "Perbarui di dalam aplikasi? Jika tidak, unduh menggunakan browser.",
|
||||||
|
"init": "Menginisialisasi",
|
||||||
"inner": "Batin",
|
"inner": "Batin",
|
||||||
"inputDomainHere": "Input domain di sini",
|
"inputDomainHere": "Input domain di sini",
|
||||||
"install": "Install",
|
"install": "Install",
|
||||||
@@ -151,6 +153,8 @@
|
|||||||
"languageName": "Indonesia",
|
"languageName": "Indonesia",
|
||||||
"lastTry": "Percobaan terakhir",
|
"lastTry": "Percobaan terakhir",
|
||||||
"launchPage": "Halaman peluncuran",
|
"launchPage": "Halaman peluncuran",
|
||||||
|
"letterCache": "Caching huruf",
|
||||||
|
"letterCacheTip": "Disarankan untuk diaktifkan, tetapi mengaktifkannya mencegah input karakter CJK (Cina, Jepang, Korea)",
|
||||||
"license": "Lisensi",
|
"license": "Lisensi",
|
||||||
"light": "Terang",
|
"light": "Terang",
|
||||||
"loadingFiles": "Memuat file ...",
|
"loadingFiles": "Memuat file ...",
|
||||||
@@ -171,12 +175,13 @@
|
|||||||
"name": "Nama",
|
"name": "Nama",
|
||||||
"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.",
|
"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.",
|
||||||
"needRestart": "Perlu memulai ulang aplikasi",
|
"needRestart": "Perlu memulai ulang aplikasi",
|
||||||
"net": "Net",
|
"net": "Jaringan",
|
||||||
"netViewType": "Jenis tampilan bersih",
|
"netViewType": "Jenis tampilan bersih",
|
||||||
"newContainer": "Wadah baru",
|
"newContainer": "Wadah baru",
|
||||||
"noClient": "Tidak ada klien",
|
"noClient": "Tidak ada klien",
|
||||||
"noInterface": "Tidak ada antarmuka",
|
"noInterface": "Tidak ada antarmuka",
|
||||||
"noLineChart": "Jangan gunakan grafik garis",
|
"noLineChart": "Jangan gunakan grafik garis",
|
||||||
|
"noLineChartForCpu": "Jangan gunakan diagram garis untuk CPU",
|
||||||
"noNotiPerm": "Tidak ada izin notifikasi, mungkin tidak ada indikasi kemajuan saat mengunduh pembaruan aplikasi.",
|
"noNotiPerm": "Tidak ada izin notifikasi, mungkin tidak ada indikasi kemajuan saat mengunduh pembaruan aplikasi.",
|
||||||
"noOptions": "Tidak ada opsi",
|
"noOptions": "Tidak ada opsi",
|
||||||
"noPrivateKeyTip": "Kunci privat tidak ada, mungkin telah dihapus atau ada kesalahan konfigurasi.",
|
"noPrivateKeyTip": "Kunci privat tidak ada, mungkin telah dihapus atau ada kesalahan konfigurasi.",
|
||||||
@@ -204,6 +209,7 @@
|
|||||||
"paste": "Tempel",
|
"paste": "Tempel",
|
||||||
"path": "Jalur",
|
"path": "Jalur",
|
||||||
"percentOfSize": "{percent}% dari {size}",
|
"percentOfSize": "{percent}% dari {size}",
|
||||||
|
"permission": "Izin",
|
||||||
"pickFile": "Pilih file",
|
"pickFile": "Pilih file",
|
||||||
"pingAvg": "Rata -rata:",
|
"pingAvg": "Rata -rata:",
|
||||||
"pingInputIP": "Harap masukkan IP / domain target.",
|
"pingInputIP": "Harap masukkan IP / domain target.",
|
||||||
@@ -229,6 +235,7 @@
|
|||||||
"rememberChoice": "Ingat pilihan",
|
"rememberChoice": "Ingat pilihan",
|
||||||
"rememberPwdInMem": "Ingat kata sandi di dalam memori",
|
"rememberPwdInMem": "Ingat kata sandi di dalam memori",
|
||||||
"rememberPwdInMemTip": "Digunakan untuk kontainer, menangguhkan, dll.",
|
"rememberPwdInMemTip": "Digunakan untuk kontainer, menangguhkan, dll.",
|
||||||
|
"rememberWindowSize": "Ingat ukuran jendela",
|
||||||
"remotePath": "Jalur jarak jauh",
|
"remotePath": "Jalur jarak jauh",
|
||||||
"rename": "Ganti nama",
|
"rename": "Ganti nama",
|
||||||
"reportBugsOnGithubIssue": "Harap laporkan bug di {url}",
|
"reportBugsOnGithubIssue": "Harap laporkan bug di {url}",
|
||||||
@@ -297,7 +304,7 @@
|
|||||||
"total": "Total",
|
"total": "Total",
|
||||||
"traffic": "Lalu lintas",
|
"traffic": "Lalu lintas",
|
||||||
"trySudo": "Cobalah menggunakan sudo",
|
"trySudo": "Cobalah menggunakan sudo",
|
||||||
"ttl": "ttl",
|
"ttl": "TTL",
|
||||||
"unknown": "Tidak dikenal",
|
"unknown": "Tidak dikenal",
|
||||||
"unknownError": "Kesalahan yang tidak diketahui",
|
"unknownError": "Kesalahan yang tidak diketahui",
|
||||||
"unkownConvertMode": "Mode Konversi Tidak Diketahui",
|
"unkownConvertMode": "Mode Konversi Tidak Diketahui",
|
||||||
|
|||||||
@@ -2,15 +2,15 @@
|
|||||||
"@@locale": "ja",
|
"@@locale": "ja",
|
||||||
"about": "約",
|
"about": "約",
|
||||||
"aboutThanks": "以下の参加者に感謝します。",
|
"aboutThanks": "以下の参加者に感謝します。",
|
||||||
|
"acceptBeta": "テストバージョンの更新を受け入れる",
|
||||||
"add": "追加",
|
"add": "追加",
|
||||||
"addAServer": "サーバーを追加する",
|
"addAServer": "サーバーを追加する",
|
||||||
"addPrivateKey": "プライベートキーを追加",
|
"addPrivateKey": "秘密鍵を追加",
|
||||||
"addSystemPrivateKeyTip": "現在プライベートキーがありません。システムのデフォルト(~/.ssh/id_rsa)を追加しますか?",
|
"addSystemPrivateKeyTip": "現在秘密鍵がありません。システムのデフォルト(~/.ssh/id_rsa)を追加しますか?",
|
||||||
"added2List": "タスクリストに追加されました",
|
"added2List": "タスクリストに追加されました",
|
||||||
"addr": "住所",
|
"addr": "アドレス",
|
||||||
"all": "すべて",
|
"all": "すべて",
|
||||||
"alreadyLastDir": "すでに最上位のディレクトリです",
|
"alreadyLastDir": "すでに最上位のディレクトリです",
|
||||||
"alterUrl": "代替リンク",
|
|
||||||
"askContinue": "{msg}、続行しますか?",
|
"askContinue": "{msg}、続行しますか?",
|
||||||
"attention": "注意",
|
"attention": "注意",
|
||||||
"authFailTip": "認証に失敗しました。パスワード/鍵/ホスト/ユーザーなどが間違っていないか確認してください。",
|
"authFailTip": "認証に失敗しました。パスワード/鍵/ホスト/ユーザーなどが間違っていないか確認してください。",
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
"backupVersionNotMatch": "バックアップバージョンが一致しないため、復元できません",
|
"backupVersionNotMatch": "バックアップバージョンが一致しないため、復元できません",
|
||||||
"battery": "バッテリー",
|
"battery": "バッテリー",
|
||||||
"bgRun": "バックグラウンド実行",
|
"bgRun": "バックグラウンド実行",
|
||||||
"bgRunTip": "このスイッチはプログラムがバックグラウンドで実行を試みることを意味しますが、実際にバックグラウンドで実行できるかどうかは、権限が有効になっているかに依存します。ネイティブAndroidでは、このアプリの「バッテリー最適化」をオフにしてください。MIUIでは、省エネモードを「無制限」に変更してください。",
|
"bgRunTip": "このスイッチはプログラムがバックグラウンドで実行を試みることを意味しますが、実際にバックグラウンドで実行できるかどうかは、権限が有効になっているかに依存します。AOSPベースのAndroid ROMでは、このアプリの「バッテリー最適化」をオフにしてください。MIUIでは、省エネモードを「無制限」に変更してください。",
|
||||||
"bioAuth": "生体認証",
|
"bioAuth": "生体認証",
|
||||||
"browser": "ブラウザ",
|
"browser": "ブラウザ",
|
||||||
"bulkImportServers": "サーバーを一括インポートする",
|
"bulkImportServers": "サーバーを一括インポートする",
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
"cancel": "キャンセル",
|
"cancel": "キャンセル",
|
||||||
"choose": "選択",
|
"choose": "選択",
|
||||||
"chooseFontFile": "フォントファイルを選択",
|
"chooseFontFile": "フォントファイルを選択",
|
||||||
"choosePrivateKey": "プライベートキーを選択",
|
"choosePrivateKey": "秘密鍵を選択",
|
||||||
"clear": "クリア",
|
"clear": "クリア",
|
||||||
"clipboard": "クリップボード",
|
"clipboard": "クリップボード",
|
||||||
"close": "閉じる",
|
"close": "閉じる",
|
||||||
@@ -44,7 +44,6 @@
|
|||||||
"cnKeyboardCompTip": "ターミナルがセキュアキーボードを表示した場合、それを有効にできます。",
|
"cnKeyboardCompTip": "ターミナルがセキュアキーボードを表示した場合、それを有効にできます。",
|
||||||
"collapseUI": "UIを折りたたむ",
|
"collapseUI": "UIを折りたたむ",
|
||||||
"collapseUITip": "UIの長いリストをデフォルトで折りたたむかどうか",
|
"collapseUITip": "UIの長いリストをデフォルトで折りたたむかどうか",
|
||||||
"collectUsage": "使用情報を収集する(プライバシーとは関係ない)。",
|
|
||||||
"conn": "接続",
|
"conn": "接続",
|
||||||
"connected": "接続済み",
|
"connected": "接続済み",
|
||||||
"container": "コンテナ",
|
"container": "コンテナ",
|
||||||
@@ -68,7 +67,6 @@
|
|||||||
"decode": "デコード",
|
"decode": "デコード",
|
||||||
"decompress": "解凍",
|
"decompress": "解凍",
|
||||||
"delete": "削除",
|
"delete": "削除",
|
||||||
"deleteScripts": "サーバースクリプトも削除",
|
|
||||||
"deleteServers": "サーバーを一括削除",
|
"deleteServers": "サーバーを一括削除",
|
||||||
"deviceName": "デバイス名",
|
"deviceName": "デバイス名",
|
||||||
"dirEmpty": "フォルダーが空であることを確認してください",
|
"dirEmpty": "フォルダーが空であることを確認してください",
|
||||||
@@ -100,6 +98,8 @@
|
|||||||
"export": "エクスポート",
|
"export": "エクスポート",
|
||||||
"extraArgs": "追加引数",
|
"extraArgs": "追加引数",
|
||||||
"failed": "失敗しました",
|
"failed": "失敗しました",
|
||||||
|
"fallbackSshDest": "フォールバックSSH宛先",
|
||||||
|
"fdroidReleaseTip": "このアプリをF-Droidからダウンロードした場合、このオプションをオフにすることをお勧めします。",
|
||||||
"feedback": "フィードバック",
|
"feedback": "フィードバック",
|
||||||
"feedbackOnGithub": "問題がある場合は、GitHubでフィードバックしてください",
|
"feedbackOnGithub": "問題がある場合は、GitHubでフィードバックしてください",
|
||||||
"fieldMustNotEmpty": "これらの入力フィールドは空にできません。",
|
"fieldMustNotEmpty": "これらの入力フィールドは空にできません。",
|
||||||
@@ -110,6 +110,7 @@
|
|||||||
"followSystem": "システムに従う",
|
"followSystem": "システムに従う",
|
||||||
"font": "フォント",
|
"font": "フォント",
|
||||||
"fontSize": "フォントサイズ",
|
"fontSize": "フォントサイズ",
|
||||||
|
"forExample": "例えば",
|
||||||
"force": "強制",
|
"force": "強制",
|
||||||
"foundNUpdate": "{count}個の更新が見つかりました",
|
"foundNUpdate": "{count}個の更新が見つかりました",
|
||||||
"fullScreen": "フルスクリーンモード",
|
"fullScreen": "フルスクリーンモード",
|
||||||
@@ -133,6 +134,7 @@
|
|||||||
"imagesList": "イメージリスト",
|
"imagesList": "イメージリスト",
|
||||||
"import": "インポート",
|
"import": "インポート",
|
||||||
"inAppUpdate": "アプリ内で更新しますか?それ以外の場合は、ブラウザを使用してダウンロードしてください。",
|
"inAppUpdate": "アプリ内で更新しますか?それ以外の場合は、ブラウザを使用してダウンロードしてください。",
|
||||||
|
"init": "初期化する",
|
||||||
"inner": "内蔵",
|
"inner": "内蔵",
|
||||||
"inputDomainHere": "ここにドメインを入力",
|
"inputDomainHere": "ここにドメインを入力",
|
||||||
"install": "インストール",
|
"install": "インストール",
|
||||||
@@ -151,6 +153,8 @@
|
|||||||
"languageName": "日本語",
|
"languageName": "日本語",
|
||||||
"lastTry": "最後の試み",
|
"lastTry": "最後の試み",
|
||||||
"launchPage": "起動ページ",
|
"launchPage": "起動ページ",
|
||||||
|
"letterCache": "文字キャッシング",
|
||||||
|
"letterCacheTip": "有効化を推奨しますが、有効にするとCJK(中国語、日本語、韓国語)の文字の入力ができなくなります",
|
||||||
"license": "オープンソースライセンス",
|
"license": "オープンソースライセンス",
|
||||||
"light": "ライト",
|
"light": "ライト",
|
||||||
"loadingFiles": "ディレクトリを読み込んでいます...",
|
"loadingFiles": "ディレクトリを読み込んでいます...",
|
||||||
@@ -177,12 +181,13 @@
|
|||||||
"noClient": "SSH接続がありません",
|
"noClient": "SSH接続がありません",
|
||||||
"noInterface": "使用可能なインターフェースがありません",
|
"noInterface": "使用可能なインターフェースがありません",
|
||||||
"noLineChart": "折れ線グラフを使用しない",
|
"noLineChart": "折れ線グラフを使用しない",
|
||||||
|
"noLineChartForCpu": "CPUに折れ線グラフを使わない",
|
||||||
"noNotiPerm": "通知の権限がないため、アプリの更新のダウンロード中に進行状況が表示されない場合があります。",
|
"noNotiPerm": "通知の権限がないため、アプリの更新のダウンロード中に進行状況が表示されない場合があります。",
|
||||||
"noOptions": "選択肢がありません",
|
"noOptions": "選択肢がありません",
|
||||||
"noPrivateKeyTip": "私有鍵が存在しません。削除されたか、設定ミスがある可能性があります。",
|
"noPrivateKeyTip": "秘密鍵が存在しません。削除されたか、設定ミスがある可能性があります。",
|
||||||
"noPromptAgain": "再度確認しない",
|
"noPromptAgain": "再度確認しない",
|
||||||
"noResult": "結果なし",
|
"noResult": "結果なし",
|
||||||
"noSavedPrivateKey": "保存されたプライベートキーがありません。",
|
"noSavedPrivateKey": "保存された秘密鍵がありません。",
|
||||||
"noSavedSnippet": "保存されたスニペットがありません。",
|
"noSavedSnippet": "保存されたスニペットがありません。",
|
||||||
"noServerAvailable": "使用可能なサーバーがありません。",
|
"noServerAvailable": "使用可能なサーバーがありません。",
|
||||||
"noTask": "タスクがありません",
|
"noTask": "タスクがありません",
|
||||||
@@ -204,6 +209,7 @@
|
|||||||
"paste": "貼り付け",
|
"paste": "貼り付け",
|
||||||
"path": "パス",
|
"path": "パス",
|
||||||
"percentOfSize": "{size} の {percent}%",
|
"percentOfSize": "{size} の {percent}%",
|
||||||
|
"permission": "権限",
|
||||||
"pickFile": "ファイルを選択",
|
"pickFile": "ファイルを選択",
|
||||||
"pingAvg": "平均:",
|
"pingAvg": "平均:",
|
||||||
"pingInputIP": "対象のIPまたはドメインを入力してください",
|
"pingInputIP": "対象のIPまたはドメインを入力してください",
|
||||||
@@ -213,11 +219,11 @@
|
|||||||
"platformNotSupportUpdate": "現在のプラットフォームは更新をサポートしていません。最新のソースコードをコンパイルして手動でインストールしてください",
|
"platformNotSupportUpdate": "現在のプラットフォームは更新をサポートしていません。最新のソースコードをコンパイルして手動でインストールしてください",
|
||||||
"plugInType": "挿入タイプ",
|
"plugInType": "挿入タイプ",
|
||||||
"plzEnterHost": "ホストを入力してください",
|
"plzEnterHost": "ホストを入力してください",
|
||||||
"plzSelectKey": "プライベートキーを選択してください",
|
"plzSelectKey": "秘密鍵を選択してください",
|
||||||
"port": "ポート",
|
"port": "ポート",
|
||||||
"preview": "プレビュー",
|
"preview": "プレビュー",
|
||||||
"primaryColorSeed": "プライマリーカラーシード",
|
"primaryColorSeed": "プライマリーカラーシード",
|
||||||
"privateKey": "プライベートキー",
|
"privateKey": "秘密鍵",
|
||||||
"process": "プロセス",
|
"process": "プロセス",
|
||||||
"pushToken": "プッシュトークン",
|
"pushToken": "プッシュトークン",
|
||||||
"pveIgnoreCertTip": "オプションを有効にすることは推奨されません、セキュリティリスクに注意してください!PVEのデフォルト証明書を使用している場合は、このオプションを有効にする必要があります。",
|
"pveIgnoreCertTip": "オプションを有効にすることは推奨されません、セキュリティリスクに注意してください!PVEのデフォルト証明書を使用している場合は、このオプションを有効にする必要があります。",
|
||||||
@@ -229,6 +235,7 @@
|
|||||||
"rememberChoice": "選択を記憶する",
|
"rememberChoice": "選択を記憶する",
|
||||||
"rememberPwdInMem": "メモリにパスワードを記憶する",
|
"rememberPwdInMem": "メモリにパスワードを記憶する",
|
||||||
"rememberPwdInMemTip": "コンテナ、一時停止などに使用されます。",
|
"rememberPwdInMemTip": "コンテナ、一時停止などに使用されます。",
|
||||||
|
"rememberWindowSize": "ウィンドウサイズを記憶する",
|
||||||
"remotePath": "リモートパス",
|
"remotePath": "リモートパス",
|
||||||
"rename": "名前を変更",
|
"rename": "名前を変更",
|
||||||
"reportBugsOnGithubIssue": "{url}で問題を報告してください",
|
"reportBugsOnGithubIssue": "{url}で問題を報告してください",
|
||||||
@@ -253,7 +260,7 @@
|
|||||||
"serverTabEmpty": "現在サーバーはありません。\n右下のボタンをクリックして追加してください。",
|
"serverTabEmpty": "現在サーバーはありません。\n右下のボタンをクリックして追加してください。",
|
||||||
"serverTabFailed": "失敗",
|
"serverTabFailed": "失敗",
|
||||||
"serverTabLoading": "読み込み中...",
|
"serverTabLoading": "読み込み中...",
|
||||||
"serverTabPlzSave": "このプライベートキーを再保存してください",
|
"serverTabPlzSave": "この秘密鍵を再保存してください",
|
||||||
"serverTabUnkown": "不明な状態",
|
"serverTabUnkown": "不明な状態",
|
||||||
"setting": "設定",
|
"setting": "設定",
|
||||||
"sftpDlPrepare": "サーバーへの接続を準備中...",
|
"sftpDlPrepare": "サーバーへの接続を準備中...",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"@@locale": "nl",
|
"@@locale": "nl",
|
||||||
"about": "Over",
|
"about": "Over",
|
||||||
"aboutThanks": "Met dank aan de volgende mensen die hebben deelgenomen aan.",
|
"aboutThanks": "Met dank aan de volgende mensen die hebben deelgenomen aan.",
|
||||||
|
"acceptBeta": "Accepteer testversie-updates",
|
||||||
"add": "Toevoegen",
|
"add": "Toevoegen",
|
||||||
"addAServer": "een server toevoegen",
|
"addAServer": "een server toevoegen",
|
||||||
"addPrivateKey": "Privésleutel toevoegen",
|
"addPrivateKey": "Privésleutel toevoegen",
|
||||||
@@ -10,7 +11,6 @@
|
|||||||
"addr": "Adres",
|
"addr": "Adres",
|
||||||
"all": "Alle",
|
"all": "Alle",
|
||||||
"alreadyLastDir": "Al in de laatst gebruikte map.",
|
"alreadyLastDir": "Al in de laatst gebruikte map.",
|
||||||
"alterUrl": "Url wijzigen",
|
|
||||||
"askContinue": "{msg}. Doorgaan?",
|
"askContinue": "{msg}. Doorgaan?",
|
||||||
"attention": "Let op",
|
"attention": "Let op",
|
||||||
"authFailTip": "Authenticatie mislukt, controleer of het wachtwoord/sleutel/host/gebruiker, enz., incorrect zijn.",
|
"authFailTip": "Authenticatie mislukt, controleer of het wachtwoord/sleutel/host/gebruiker, enz., incorrect zijn.",
|
||||||
@@ -44,7 +44,6 @@
|
|||||||
"cnKeyboardCompTip": "Als de terminal een beveiligd toetsenbord weergeeft, kunt u dit inschakelen.",
|
"cnKeyboardCompTip": "Als de terminal een beveiligd toetsenbord weergeeft, kunt u dit inschakelen.",
|
||||||
"collapseUI": "Inklappen",
|
"collapseUI": "Inklappen",
|
||||||
"collapseUITip": "Of lange lijsten in de UI standaard moeten worden ingeklapt",
|
"collapseUITip": "Of lange lijsten in de UI standaard moeten worden ingeklapt",
|
||||||
"collectUsage": "Gebruiksinformatie verzamelen (niet gerelateerd aan privacy).",
|
|
||||||
"conn": "Verbinding",
|
"conn": "Verbinding",
|
||||||
"connected": "Verbonden",
|
"connected": "Verbonden",
|
||||||
"container": "Container",
|
"container": "Container",
|
||||||
@@ -68,7 +67,6 @@
|
|||||||
"decode": "Decoderen",
|
"decode": "Decoderen",
|
||||||
"decompress": "Decomprimeren",
|
"decompress": "Decomprimeren",
|
||||||
"delete": "Verwijderen",
|
"delete": "Verwijderen",
|
||||||
"deleteScripts": "Verwijder tegelijkertijd serverscripts",
|
|
||||||
"deleteServers": "Servers batchgewijs verwijderen",
|
"deleteServers": "Servers batchgewijs verwijderen",
|
||||||
"deviceName": "Apparaatnaam",
|
"deviceName": "Apparaatnaam",
|
||||||
"dirEmpty": "Zorg ervoor dat de map leeg is.",
|
"dirEmpty": "Zorg ervoor dat de map leeg is.",
|
||||||
@@ -100,6 +98,8 @@
|
|||||||
"export": "Exporteren",
|
"export": "Exporteren",
|
||||||
"extraArgs": "Extra argumenten",
|
"extraArgs": "Extra argumenten",
|
||||||
"failed": "Mislukt",
|
"failed": "Mislukt",
|
||||||
|
"fallbackSshDest": "Fallback SSH-bestemming",
|
||||||
|
"fdroidReleaseTip": "Als u deze app van F-Droid heeft gedownload, wordt aanbevolen deze optie uit te schakelen.",
|
||||||
"feedback": "Feedback",
|
"feedback": "Feedback",
|
||||||
"feedbackOnGithub": "Als je vragen hebt, geef dan feedback op Github.",
|
"feedbackOnGithub": "Als je vragen hebt, geef dan feedback op Github.",
|
||||||
"fieldMustNotEmpty": "Deze velden mogen niet leeg zijn.",
|
"fieldMustNotEmpty": "Deze velden mogen niet leeg zijn.",
|
||||||
@@ -110,6 +110,7 @@
|
|||||||
"followSystem": "Volg systeem",
|
"followSystem": "Volg systeem",
|
||||||
"font": "Lettertype",
|
"font": "Lettertype",
|
||||||
"fontSize": "Lettergrootte",
|
"fontSize": "Lettergrootte",
|
||||||
|
"forExample": "Bijvoorbeeld",
|
||||||
"force": "Forceer",
|
"force": "Forceer",
|
||||||
"foundNUpdate": "{count} update gevonden",
|
"foundNUpdate": "{count} update gevonden",
|
||||||
"fullScreen": "Volledig schermmodus",
|
"fullScreen": "Volledig schermmodus",
|
||||||
@@ -133,6 +134,7 @@
|
|||||||
"imagesList": "Lijst met afbeeldingen",
|
"imagesList": "Lijst met afbeeldingen",
|
||||||
"import": "Importeren",
|
"import": "Importeren",
|
||||||
"inAppUpdate": "Bijwerken binnen de app? Anders downloaden via een browser.",
|
"inAppUpdate": "Bijwerken binnen de app? Anders downloaden via een browser.",
|
||||||
|
"init": "Initialiseren",
|
||||||
"inner": "Intern",
|
"inner": "Intern",
|
||||||
"inputDomainHere": "Voer hier domein in",
|
"inputDomainHere": "Voer hier domein in",
|
||||||
"install": "Installeren",
|
"install": "Installeren",
|
||||||
@@ -151,6 +153,8 @@
|
|||||||
"languageName": "Nederlands",
|
"languageName": "Nederlands",
|
||||||
"lastTry": "Laatste poging",
|
"lastTry": "Laatste poging",
|
||||||
"launchPage": "Startpagina",
|
"launchPage": "Startpagina",
|
||||||
|
"letterCache": "Lettercaching",
|
||||||
|
"letterCacheTip": "Aanbevolen om in te schakelen, maar bij inschakeling wordt de invoer van CJK (Chinees, Japans, Koreaans) tekens voorkomen",
|
||||||
"license": "Licentie",
|
"license": "Licentie",
|
||||||
"light": "Licht",
|
"light": "Licht",
|
||||||
"loadingFiles": "Bestanden laden...",
|
"loadingFiles": "Bestanden laden...",
|
||||||
@@ -176,6 +180,8 @@
|
|||||||
"newContainer": "Nieuwe container",
|
"newContainer": "Nieuwe container",
|
||||||
"noClient": "Geen client",
|
"noClient": "Geen client",
|
||||||
"noInterface": "Geen interface",
|
"noInterface": "Geen interface",
|
||||||
|
"noLineChart": "lijndiagrammen gebruiken",
|
||||||
|
"noLineChartForCpu": "Gebruik geen lijndiagrammen voor CPU",
|
||||||
"noNotiPerm": "Geen meldingsmachtigingen, mogelijk geen voortgangsindicatie bij het downloaden van app-updates.",
|
"noNotiPerm": "Geen meldingsmachtigingen, mogelijk geen voortgangsindicatie bij het downloaden van app-updates.",
|
||||||
"noOptions": "Geen opties",
|
"noOptions": "Geen opties",
|
||||||
"noPrivateKeyTip": "De privésleutel bestaat niet, deze is mogelijk verwijderd of er is een configuratiefout.",
|
"noPrivateKeyTip": "De privésleutel bestaat niet, deze is mogelijk verwijderd of er is een configuratiefout.",
|
||||||
@@ -203,6 +209,7 @@
|
|||||||
"paste": "Plakken",
|
"paste": "Plakken",
|
||||||
"path": "Pad",
|
"path": "Pad",
|
||||||
"percentOfSize": "{percent}% van {size}",
|
"percentOfSize": "{percent}% van {size}",
|
||||||
|
"permission": "Machtigingen",
|
||||||
"pickFile": "Bestand kiezen",
|
"pickFile": "Bestand kiezen",
|
||||||
"pingAvg": "Gem:",
|
"pingAvg": "Gem:",
|
||||||
"pingInputIP": "Voer een doel-IP / domein in.",
|
"pingInputIP": "Voer een doel-IP / domein in.",
|
||||||
@@ -228,6 +235,7 @@
|
|||||||
"rememberChoice": "Selectie onthouden",
|
"rememberChoice": "Selectie onthouden",
|
||||||
"rememberPwdInMem": "Wachtwoord onthouden in geheugen",
|
"rememberPwdInMem": "Wachtwoord onthouden in geheugen",
|
||||||
"rememberPwdInMemTip": "Gebruikt voor containers, opschorting, enz.",
|
"rememberPwdInMemTip": "Gebruikt voor containers, opschorting, enz.",
|
||||||
|
"rememberWindowSize": "Venstergrootte onthouden",
|
||||||
"remotePath": "Extern pad",
|
"remotePath": "Extern pad",
|
||||||
"rename": "Hernoemen",
|
"rename": "Hernoemen",
|
||||||
"reportBugsOnGithubIssue": "Meld alstublieft bugs op {url}",
|
"reportBugsOnGithubIssue": "Meld alstublieft bugs op {url}",
|
||||||
@@ -296,7 +304,7 @@
|
|||||||
"total": "Totaal",
|
"total": "Totaal",
|
||||||
"traffic": "Verkeer",
|
"traffic": "Verkeer",
|
||||||
"trySudo": "Probeer sudo te gebruiken",
|
"trySudo": "Probeer sudo te gebruiken",
|
||||||
"ttl": "ttl",
|
"ttl": "TTL",
|
||||||
"unknown": "Onbekend",
|
"unknown": "Onbekend",
|
||||||
"unknownError": "Onbekende fout",
|
"unknownError": "Onbekende fout",
|
||||||
"unkownConvertMode": "Onbekende conversiemodus",
|
"unkownConvertMode": "Onbekende conversiemodus",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"@@locale": "pt",
|
"@@locale": "pt",
|
||||||
"about": "Sobre",
|
"about": "Sobre",
|
||||||
"aboutThanks": "Agradecimentos a todos os participantes.",
|
"aboutThanks": "Agradecimentos a todos os participantes.",
|
||||||
|
"acceptBeta": "Aceitar atualizações da versão de teste",
|
||||||
"add": "Adicionar",
|
"add": "Adicionar",
|
||||||
"addAServer": "Adicionar um servidor",
|
"addAServer": "Adicionar um servidor",
|
||||||
"addPrivateKey": "Adicionar uma chave privada",
|
"addPrivateKey": "Adicionar uma chave privada",
|
||||||
@@ -10,7 +11,6 @@
|
|||||||
"addr": "Endereço",
|
"addr": "Endereço",
|
||||||
"all": "Todos",
|
"all": "Todos",
|
||||||
"alreadyLastDir": "Já é o diretório mais alto",
|
"alreadyLastDir": "Já é o diretório mais alto",
|
||||||
"alterUrl": "URL alternativa",
|
|
||||||
"askContinue": "{msg}, continuar?",
|
"askContinue": "{msg}, continuar?",
|
||||||
"attention": "Atenção",
|
"attention": "Atenção",
|
||||||
"authFailTip": "Autenticação falhou, por favor verifique se a senha/chave/host/usuário, etc., estão incorretos.",
|
"authFailTip": "Autenticação falhou, por favor verifique se a senha/chave/host/usuário, etc., estão incorretos.",
|
||||||
@@ -44,7 +44,6 @@
|
|||||||
"cnKeyboardCompTip": "Se o terminal abrir um teclado seguro, você pode ativá-lo.",
|
"cnKeyboardCompTip": "Se o terminal abrir um teclado seguro, você pode ativá-lo.",
|
||||||
"collapseUI": "Colapsar",
|
"collapseUI": "Colapsar",
|
||||||
"collapseUITip": "Deve colapsar listas longas na UI por padrão?",
|
"collapseUITip": "Deve colapsar listas longas na UI por padrão?",
|
||||||
"collectUsage": "Coletar informações de uso (não relacionadas à privacidade).",
|
|
||||||
"conn": "Conectar",
|
"conn": "Conectar",
|
||||||
"connected": "Conectado",
|
"connected": "Conectado",
|
||||||
"container": "Contêiner",
|
"container": "Contêiner",
|
||||||
@@ -68,7 +67,6 @@
|
|||||||
"decode": "Decodificar",
|
"decode": "Decodificar",
|
||||||
"decompress": "Descomprimir",
|
"decompress": "Descomprimir",
|
||||||
"delete": "Excluir",
|
"delete": "Excluir",
|
||||||
"deleteScripts": "Excluir scripts do servidor simultaneamente",
|
|
||||||
"deleteServers": "Excluir servidores em lote",
|
"deleteServers": "Excluir servidores em lote",
|
||||||
"deviceName": "Nome do dispositivo",
|
"deviceName": "Nome do dispositivo",
|
||||||
"dirEmpty": "Certifique-se de que a pasta está vazia",
|
"dirEmpty": "Certifique-se de que a pasta está vazia",
|
||||||
@@ -100,6 +98,8 @@
|
|||||||
"export": "Exportar",
|
"export": "Exportar",
|
||||||
"extraArgs": "Argumentos extras",
|
"extraArgs": "Argumentos extras",
|
||||||
"failed": "Falhou",
|
"failed": "Falhou",
|
||||||
|
"fallbackSshDest": "Destino SSH de fallback",
|
||||||
|
"fdroidReleaseTip": "Se você baixou este aplicativo do F-Droid, é recomendado desativar esta opção.",
|
||||||
"feedback": "Feedback",
|
"feedback": "Feedback",
|
||||||
"feedbackOnGithub": "Se você tem qualquer problema, por favor, dê feedback no GitHub",
|
"feedbackOnGithub": "Se você tem qualquer problema, por favor, dê feedback no GitHub",
|
||||||
"fieldMustNotEmpty": "Estes campos não podem estar vazios.",
|
"fieldMustNotEmpty": "Estes campos não podem estar vazios.",
|
||||||
@@ -110,6 +110,7 @@
|
|||||||
"followSystem": "Seguir sistema",
|
"followSystem": "Seguir sistema",
|
||||||
"font": "Fonte",
|
"font": "Fonte",
|
||||||
"fontSize": "Tamanho da fonte",
|
"fontSize": "Tamanho da fonte",
|
||||||
|
"forExample": "Por exemplo",
|
||||||
"force": "Forçar",
|
"force": "Forçar",
|
||||||
"foundNUpdate": "Encontradas {count} atualizações",
|
"foundNUpdate": "Encontradas {count} atualizações",
|
||||||
"fullScreen": "Modo tela cheia",
|
"fullScreen": "Modo tela cheia",
|
||||||
@@ -133,6 +134,7 @@
|
|||||||
"imagesList": "Lista de imagens",
|
"imagesList": "Lista de imagens",
|
||||||
"import": "Importar",
|
"import": "Importar",
|
||||||
"inAppUpdate": "Atualizar dentro do app? Caso contrário, baixe usando um navegador.",
|
"inAppUpdate": "Atualizar dentro do app? Caso contrário, baixe usando um navegador.",
|
||||||
|
"init": "Inicializar",
|
||||||
"inner": "Interno",
|
"inner": "Interno",
|
||||||
"inputDomainHere": "Insira o domínio aqui",
|
"inputDomainHere": "Insira o domínio aqui",
|
||||||
"install": "Instalar",
|
"install": "Instalar",
|
||||||
@@ -151,6 +153,8 @@
|
|||||||
"languageName": "Português",
|
"languageName": "Português",
|
||||||
"lastTry": "Última tentativa",
|
"lastTry": "Última tentativa",
|
||||||
"launchPage": "Página de lançamento",
|
"launchPage": "Página de lançamento",
|
||||||
|
"letterCache": "Cache de letras",
|
||||||
|
"letterCacheTip": "Recomendado para ativar, mas a ativação impede a entrada de caracteres CJK (chinês, japonês, coreano)",
|
||||||
"license": "Licença de código aberto",
|
"license": "Licença de código aberto",
|
||||||
"light": "Claro",
|
"light": "Claro",
|
||||||
"loadingFiles": "Carregando diretórios...",
|
"loadingFiles": "Carregando diretórios...",
|
||||||
@@ -176,7 +180,8 @@
|
|||||||
"newContainer": "Novo contêiner",
|
"newContainer": "Novo contêiner",
|
||||||
"noClient": "Sem conexão SSH",
|
"noClient": "Sem conexão SSH",
|
||||||
"noInterface": "Sem interface disponível",
|
"noInterface": "Sem interface disponível",
|
||||||
"noLineChart": "Gebruik geen lijndiagrammen",
|
"noLineChart": "Não usar gráficos de linha",
|
||||||
|
"noLineChartForCpu": "Não utilizar gráficos de linhas para a CPU",
|
||||||
"noNotiPerm": "Sem permissão de notificação, possivelmente sem indicação de progresso ao baixar atualizações de aplicativos.",
|
"noNotiPerm": "Sem permissão de notificação, possivelmente sem indicação de progresso ao baixar atualizações de aplicativos.",
|
||||||
"noOptions": "Sem opções",
|
"noOptions": "Sem opções",
|
||||||
"noPrivateKeyTip": "A chave privada não existe, pode ter sido deletada ou há um erro de configuração.",
|
"noPrivateKeyTip": "A chave privada não existe, pode ter sido deletada ou há um erro de configuração.",
|
||||||
@@ -204,6 +209,7 @@
|
|||||||
"paste": "Colar",
|
"paste": "Colar",
|
||||||
"path": "Caminho",
|
"path": "Caminho",
|
||||||
"percentOfSize": "{percent}% de {size}",
|
"percentOfSize": "{percent}% de {size}",
|
||||||
|
"permission": "Permissões",
|
||||||
"pickFile": "Escolher arquivo",
|
"pickFile": "Escolher arquivo",
|
||||||
"pingAvg": "Média:",
|
"pingAvg": "Média:",
|
||||||
"pingInputIP": "Por favor, insira o IP ou domínio alvo",
|
"pingInputIP": "Por favor, insira o IP ou domínio alvo",
|
||||||
@@ -229,6 +235,7 @@
|
|||||||
"rememberChoice": "Lembrar da seleção",
|
"rememberChoice": "Lembrar da seleção",
|
||||||
"rememberPwdInMem": "Lembrar senha na memória",
|
"rememberPwdInMem": "Lembrar senha na memória",
|
||||||
"rememberPwdInMemTip": "Usado para contêineres, suspensão, etc.",
|
"rememberPwdInMemTip": "Usado para contêineres, suspensão, etc.",
|
||||||
|
"rememberWindowSize": "Lembrar o tamanho da janela",
|
||||||
"remotePath": "Caminho remoto",
|
"remotePath": "Caminho remoto",
|
||||||
"rename": "Renomear",
|
"rename": "Renomear",
|
||||||
"reportBugsOnGithubIssue": "Por favor, reporte problemas em {url}",
|
"reportBugsOnGithubIssue": "Por favor, reporte problemas em {url}",
|
||||||
@@ -297,7 +304,7 @@
|
|||||||
"total": "Total",
|
"total": "Total",
|
||||||
"traffic": "Tráfego",
|
"traffic": "Tráfego",
|
||||||
"trySudo": "Tentar usar sudo",
|
"trySudo": "Tentar usar sudo",
|
||||||
"ttl": "Tempo de vida do cache",
|
"ttl": "TTL",
|
||||||
"unknown": "Desconhecido",
|
"unknown": "Desconhecido",
|
||||||
"unknownError": "Erro desconhecido",
|
"unknownError": "Erro desconhecido",
|
||||||
"unkownConvertMode": "Modo de conversão desconhecido",
|
"unkownConvertMode": "Modo de conversão desconhecido",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"@@locale": "ru",
|
"@@locale": "ru",
|
||||||
"about": "о",
|
"about": "о",
|
||||||
"aboutThanks": "Благодарности всем участникам.",
|
"aboutThanks": "Благодарности всем участникам.",
|
||||||
|
"acceptBeta": "Принять обновления тестовой версии",
|
||||||
"add": "добавить",
|
"add": "добавить",
|
||||||
"addAServer": "добавить сервер",
|
"addAServer": "добавить сервер",
|
||||||
"addPrivateKey": "добавить приватный ключ",
|
"addPrivateKey": "добавить приватный ключ",
|
||||||
@@ -10,7 +11,6 @@
|
|||||||
"addr": "Адрес",
|
"addr": "Адрес",
|
||||||
"all": "все",
|
"all": "все",
|
||||||
"alreadyLastDir": "Уже в корневом каталоге",
|
"alreadyLastDir": "Уже в корневом каталоге",
|
||||||
"alterUrl": "альтернативная ссылка",
|
|
||||||
"askContinue": "{msg}, продолжить?",
|
"askContinue": "{msg}, продолжить?",
|
||||||
"attention": "внимание",
|
"attention": "внимание",
|
||||||
"authFailTip": "Аутентификация не удалась, пожалуйста, проверьте, правильны ли пароль/ключ/хост/пользователь и т.д.",
|
"authFailTip": "Аутентификация не удалась, пожалуйста, проверьте, правильны ли пароль/ключ/хост/пользователь и т.д.",
|
||||||
@@ -44,7 +44,6 @@
|
|||||||
"cnKeyboardCompTip": "Если терминал отображает безопасную клавиатуру, вы можете ее активировать.",
|
"cnKeyboardCompTip": "Если терминал отображает безопасную клавиатуру, вы можете ее активировать.",
|
||||||
"collapseUI": "свернуть",
|
"collapseUI": "свернуть",
|
||||||
"collapseUITip": "Свернуть длинные списки в UI по умолчанию",
|
"collapseUITip": "Свернуть длинные списки в UI по умолчанию",
|
||||||
"collectUsage": "Сбор информации об использовании (не связано с конфиденциальностью).",
|
|
||||||
"conn": "подключение",
|
"conn": "подключение",
|
||||||
"connected": "подключено",
|
"connected": "подключено",
|
||||||
"container": "контейнер",
|
"container": "контейнер",
|
||||||
@@ -68,7 +67,6 @@
|
|||||||
"decode": "декодировать",
|
"decode": "декодировать",
|
||||||
"decompress": "разархивировать",
|
"decompress": "разархивировать",
|
||||||
"delete": "удалить",
|
"delete": "удалить",
|
||||||
"deleteScripts": "удалить скрипты с сервера",
|
|
||||||
"deleteServers": "удалить серверы пакетно",
|
"deleteServers": "удалить серверы пакетно",
|
||||||
"deviceName": "Название устройства",
|
"deviceName": "Название устройства",
|
||||||
"dirEmpty": "Пожалуйста, убедитесь, что папка пуста",
|
"dirEmpty": "Пожалуйста, убедитесь, что папка пуста",
|
||||||
@@ -100,6 +98,8 @@
|
|||||||
"export": "экспорт",
|
"export": "экспорт",
|
||||||
"extraArgs": "дополнительные аргументы",
|
"extraArgs": "дополнительные аргументы",
|
||||||
"failed": "неудача",
|
"failed": "неудача",
|
||||||
|
"fallbackSshDest": "Резервное место назначения SSH",
|
||||||
|
"fdroidReleaseTip": "Если вы скачали это приложение с F-Droid, рекомендуется отключить эту опцию.",
|
||||||
"feedback": "обратная связь",
|
"feedback": "обратная связь",
|
||||||
"feedbackOnGithub": "Если у вас есть какие-либо вопросы, пожалуйста, отправьте отзыв на GitHub",
|
"feedbackOnGithub": "Если у вас есть какие-либо вопросы, пожалуйста, отправьте отзыв на GitHub",
|
||||||
"fieldMustNotEmpty": "Эти поля не могут быть пустыми.",
|
"fieldMustNotEmpty": "Эти поля не могут быть пустыми.",
|
||||||
@@ -110,6 +110,7 @@
|
|||||||
"followSystem": "следовать за системой",
|
"followSystem": "следовать за системой",
|
||||||
"font": "шрифт",
|
"font": "шрифт",
|
||||||
"fontSize": "размер шрифта",
|
"fontSize": "размер шрифта",
|
||||||
|
"forExample": "Например",
|
||||||
"force": "принудительно",
|
"force": "принудительно",
|
||||||
"foundNUpdate": "Найдено {count} обновлений",
|
"foundNUpdate": "Найдено {count} обновлений",
|
||||||
"fullScreen": "полноэкранный режим",
|
"fullScreen": "полноэкранный режим",
|
||||||
@@ -133,6 +134,7 @@
|
|||||||
"imagesList": "список образов",
|
"imagesList": "список образов",
|
||||||
"import": "импорт",
|
"import": "импорт",
|
||||||
"inAppUpdate": "Обновить в приложении? В противном случае загрузите с помощью браузера.",
|
"inAppUpdate": "Обновить в приложении? В противном случае загрузите с помощью браузера.",
|
||||||
|
"init": "Инициализировать",
|
||||||
"inner": "встроенный",
|
"inner": "встроенный",
|
||||||
"inputDomainHere": "введите домен здесь",
|
"inputDomainHere": "введите домен здесь",
|
||||||
"install": "установить",
|
"install": "установить",
|
||||||
@@ -151,6 +153,8 @@
|
|||||||
"languageName": "Русский",
|
"languageName": "Русский",
|
||||||
"lastTry": "последняя попытка",
|
"lastTry": "последняя попытка",
|
||||||
"launchPage": "стартовая страница",
|
"launchPage": "стартовая страница",
|
||||||
|
"letterCache": "Кэширование букв",
|
||||||
|
"letterCacheTip": "Рекомендуется включить, но его активация препятствует вводу символов CJK (китайский, японский, корейский)",
|
||||||
"license": "лицензия",
|
"license": "лицензия",
|
||||||
"light": "светлая",
|
"light": "светлая",
|
||||||
"loadingFiles": "Загрузка файлов...",
|
"loadingFiles": "Загрузка файлов...",
|
||||||
@@ -176,7 +180,8 @@
|
|||||||
"newContainer": "создать контейнер",
|
"newContainer": "создать контейнер",
|
||||||
"noClient": "нет SSH соединения",
|
"noClient": "нет SSH соединения",
|
||||||
"noInterface": "нет доступных интерфейсов",
|
"noInterface": "нет доступных интерфейсов",
|
||||||
"noLineChart": "Não use gráficos de linha",
|
"noLineChart": "Не использовать линейные графики",
|
||||||
|
"noLineChartForCpu": "Не используйте линейные графики для ЦП",
|
||||||
"noNotiPerm": "Нет разрешения на уведомления, возможно отсутствие индикации прогресса при загрузке обновлений приложений.",
|
"noNotiPerm": "Нет разрешения на уведомления, возможно отсутствие индикации прогресса при загрузке обновлений приложений.",
|
||||||
"noOptions": "нет доступных опций",
|
"noOptions": "нет доступных опций",
|
||||||
"noPrivateKeyTip": "Приватный ключ не существует, возможно, он был удален или есть ошибка в настройках.",
|
"noPrivateKeyTip": "Приватный ключ не существует, возможно, он был удален или есть ошибка в настройках.",
|
||||||
@@ -204,6 +209,7 @@
|
|||||||
"paste": "вставить",
|
"paste": "вставить",
|
||||||
"path": "путь",
|
"path": "путь",
|
||||||
"percentOfSize": "{percent}% от {size}",
|
"percentOfSize": "{percent}% от {size}",
|
||||||
|
"permission": "Разрешения",
|
||||||
"pickFile": "выбрать файл",
|
"pickFile": "выбрать файл",
|
||||||
"pingAvg": "Среднее:",
|
"pingAvg": "Среднее:",
|
||||||
"pingInputIP": "Пожалуйста, введите целевой IP или доменное имя",
|
"pingInputIP": "Пожалуйста, введите целевой IP или доменное имя",
|
||||||
@@ -229,6 +235,7 @@
|
|||||||
"rememberChoice": "Запомнить выбор",
|
"rememberChoice": "Запомнить выбор",
|
||||||
"rememberPwdInMem": "Запомнить пароль в памяти",
|
"rememberPwdInMem": "Запомнить пароль в памяти",
|
||||||
"rememberPwdInMemTip": "Используется для контейнеров, приостановки и т. д.",
|
"rememberPwdInMemTip": "Используется для контейнеров, приостановки и т. д.",
|
||||||
|
"rememberWindowSize": "Запомнить размер окна",
|
||||||
"remotePath": "удаленный путь",
|
"remotePath": "удаленный путь",
|
||||||
"rename": "переименовать",
|
"rename": "переименовать",
|
||||||
"reportBugsOnGithubIssue": "Пожалуйста, сообщайте о проблемах на {url}",
|
"reportBugsOnGithubIssue": "Пожалуйста, сообщайте о проблемах на {url}",
|
||||||
@@ -297,7 +304,7 @@
|
|||||||
"total": "всего",
|
"total": "всего",
|
||||||
"traffic": "трафик",
|
"traffic": "трафик",
|
||||||
"trySudo": "попробовать использовать sudo",
|
"trySudo": "попробовать использовать sudo",
|
||||||
"ttl": "время жизни кеша",
|
"ttl": "TTL",
|
||||||
"unknown": "неизвестно",
|
"unknown": "неизвестно",
|
||||||
"unknownError": "неизвестная ошибка",
|
"unknownError": "неизвестная ошибка",
|
||||||
"unkownConvertMode": "неизвестный режим конвертации",
|
"unkownConvertMode": "неизвестный режим конвертации",
|
||||||
|
|||||||
@@ -2,15 +2,15 @@
|
|||||||
"@@locale": "zh",
|
"@@locale": "zh",
|
||||||
"about": "关于",
|
"about": "关于",
|
||||||
"aboutThanks": "感谢以下参与的各位。",
|
"aboutThanks": "感谢以下参与的各位。",
|
||||||
|
"acceptBeta": "接受测试版更新推送",
|
||||||
"add": "新增",
|
"add": "新增",
|
||||||
"addAServer": "添加服务器",
|
"addAServer": "添加服务器",
|
||||||
"addPrivateKey": "添加一个私钥",
|
"addPrivateKey": "添加私钥",
|
||||||
"addSystemPrivateKeyTip": "当前没有任何私钥,是否添加系统自带的(~/.ssh/id_rsa)?",
|
"addSystemPrivateKeyTip": "当前没有任何私钥,是否添加系统自带的(~/.ssh/id_rsa)?",
|
||||||
"added2List": "已添加至任务列表",
|
"added2List": "已添加至任务列表",
|
||||||
"addr": "地址",
|
"addr": "地址",
|
||||||
"all": "所有",
|
"all": "所有",
|
||||||
"alreadyLastDir": "已经是最上层目录了",
|
"alreadyLastDir": "已经是最上层目录了",
|
||||||
"alterUrl": "备选链接",
|
|
||||||
"askContinue": "{msg},继续吗?",
|
"askContinue": "{msg},继续吗?",
|
||||||
"attention": "注意",
|
"attention": "注意",
|
||||||
"authFailTip": "认证失败,请检查密码/密钥/主机/用户等是否错误",
|
"authFailTip": "认证失败,请检查密码/密钥/主机/用户等是否错误",
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
"backupVersionNotMatch": "备份版本不匹配,无法恢复",
|
"backupVersionNotMatch": "备份版本不匹配,无法恢复",
|
||||||
"battery": "电池",
|
"battery": "电池",
|
||||||
"bgRun": "后台运行",
|
"bgRun": "后台运行",
|
||||||
"bgRunTip": "此开关只代表程序会尝试在后台运行,具体能否后台运行取决于是否开启了权限。原生 Android 请关闭本 App 的“电池优化”,MIUI 请修改省电策略为“无限制”。",
|
"bgRunTip": "此开关只代表程序会尝试在后台运行,具体能否后台运行取决于是否开启了权限。原生 Android 请关闭本 App 的“电池优化”,MIUI / HyperOS 请修改省电策略为“无限制”。",
|
||||||
"bioAuth": "生物认证",
|
"bioAuth": "生物认证",
|
||||||
"browser": "浏览器",
|
"browser": "浏览器",
|
||||||
"bulkImportServers": "批量导入服务器",
|
"bulkImportServers": "批量导入服务器",
|
||||||
@@ -40,22 +40,21 @@
|
|||||||
"clipboard": "剪切板",
|
"clipboard": "剪切板",
|
||||||
"close": "关闭",
|
"close": "关闭",
|
||||||
"cmd": "命令",
|
"cmd": "命令",
|
||||||
"cnKeyboardComp": "中国Android兼容性",
|
"cnKeyboardComp": "中国 Android 兼容性",
|
||||||
"cnKeyboardCompTip": "如果终端弹出安全键盘,可以开启",
|
"cnKeyboardCompTip": "如果终端弹出安全键盘,可以开启",
|
||||||
"collapseUI": "折叠",
|
"collapseUI": "折叠",
|
||||||
"collapseUITip": "是否默认折叠UI中存在的长列表",
|
"collapseUITip": "是否默认折叠 UI 中的长列表",
|
||||||
"collectUsage": "搜集使用信息(与隐私无关)",
|
|
||||||
"conn": "连接",
|
"conn": "连接",
|
||||||
"connected": "已连接",
|
"connected": "已连接",
|
||||||
"container": "容器",
|
"container": "容器",
|
||||||
"containerName": "容器名",
|
"containerName": "容器名",
|
||||||
"containerStatus": "容器状态",
|
"containerStatus": "容器状态",
|
||||||
"containerTrySudoTip": "例如:在应用内将用户设置为aaa,但是Docker安装在root用户下,这时就需要启用此选项",
|
"containerTrySudoTip": "例如:在应用内将用户设置为 aaa,但是 Docker 安装在root用户下,这时就需要启用此选项",
|
||||||
"content": "内容",
|
"content": "内容",
|
||||||
"convert": "转换",
|
"convert": "转换",
|
||||||
"copy": "复制",
|
"copy": "复制",
|
||||||
"copyPath": "复制路径",
|
"copyPath": "复制路径",
|
||||||
"cpuViewAsProgressTip": "以进度条样式显示每个CPU的使用率(旧版样式)",
|
"cpuViewAsProgressTip": "以进度条样式显示每个 CPU 的使用率(旧版样式)",
|
||||||
"createFile": "创建文件",
|
"createFile": "创建文件",
|
||||||
"createFolder": "创建文件夹",
|
"createFolder": "创建文件夹",
|
||||||
"cursorType": "光标类型",
|
"cursorType": "光标类型",
|
||||||
@@ -68,24 +67,23 @@
|
|||||||
"decode": "解码",
|
"decode": "解码",
|
||||||
"decompress": "解压缩",
|
"decompress": "解压缩",
|
||||||
"delete": "删除",
|
"delete": "删除",
|
||||||
"deleteScripts": "同时删除服务器脚本",
|
|
||||||
"deleteServers": "批量删除服务器",
|
"deleteServers": "批量删除服务器",
|
||||||
"deviceName": "设备名",
|
"deviceName": "设备名",
|
||||||
"dirEmpty": "请确保文件夹为空",
|
"dirEmpty": "请确保文件夹为空",
|
||||||
"disabled": "已禁用",
|
"disabled": "已禁用",
|
||||||
"disconnected": "连接断开",
|
"disconnected": "连接断开",
|
||||||
"disk": "硬盘",
|
"disk": "磁盘",
|
||||||
"diskIgnorePath": "忽略的磁盘路径",
|
"diskIgnorePath": "忽略的磁盘路径",
|
||||||
"displayCpuIndex": "显示CPU索引",
|
"displayCpuIndex": "显示 CPU 索引",
|
||||||
"displayName": "显示名称",
|
"displayName": "显示名称",
|
||||||
"dl2Local": "下载 {fileName} 到本地?",
|
"dl2Local": "下载 {fileName} 到本地?",
|
||||||
"doc": "文档",
|
"doc": "文档",
|
||||||
"dockerEditHost": "编辑 DOCKER_HOST",
|
"dockerEditHost": "编辑 DOCKER_HOST",
|
||||||
"dockerEmptyRunningItems": "没有正在运行的容器。\n这可能是因为:\n- Docker 安装用户与 App 内配置的用户名不同\n- 环境变量 DOCKER_HOST 没有被正确读取。你可以通过在终端内运行 `echo $DOCKER_HOST` 来获取。",
|
"dockerEmptyRunningItems": "没有正在运行的容器。\n这可能是因为:\n- Docker 安装用户与 App 内配置的用户名不同\n- 环境变量 DOCKER_HOST 没有被正确读取。可以通过在终端内运行 `echo $DOCKER_HOST` 来获取。",
|
||||||
"dockerImagesFmt": "共 {count} 个镜像",
|
"dockerImagesFmt": "共 {count} 个镜像",
|
||||||
"dockerNotInstalled": "Docker 未安装",
|
"dockerNotInstalled": "Docker 未安装",
|
||||||
"dockerStatusRunningAndStoppedFmt": "{runningCount}个正在运行, {stoppedCount}个已停止",
|
"dockerStatusRunningAndStoppedFmt": "{runningCount} 个正在运行, {stoppedCount} 个已停止",
|
||||||
"dockerStatusRunningFmt": "{count}个容器正在运行",
|
"dockerStatusRunningFmt": "{count} 个容器正在运行",
|
||||||
"doubleColumnMode": "双列模式",
|
"doubleColumnMode": "双列模式",
|
||||||
"doubleColumnTip": "此选项仅开启功能,实际是否能开启还取决于设备的宽度",
|
"doubleColumnTip": "此选项仅开启功能,实际是否能开启还取决于设备的宽度",
|
||||||
"download": "下载",
|
"download": "下载",
|
||||||
@@ -100,6 +98,8 @@
|
|||||||
"export": "导出",
|
"export": "导出",
|
||||||
"extraArgs": "额外参数",
|
"extraArgs": "额外参数",
|
||||||
"failed": "失败",
|
"failed": "失败",
|
||||||
|
"fallbackSshDest": "备选 SSH 目标",
|
||||||
|
"fdroidReleaseTip": "如果你是从 F-Droid 下载的本应用,推荐关闭此选项",
|
||||||
"feedback": "反馈",
|
"feedback": "反馈",
|
||||||
"feedbackOnGithub": "如果你有任何问题,请在GitHub反馈",
|
"feedbackOnGithub": "如果你有任何问题,请在GitHub反馈",
|
||||||
"fieldMustNotEmpty": "这些输入框不能为空。",
|
"fieldMustNotEmpty": "这些输入框不能为空。",
|
||||||
@@ -110,14 +110,15 @@
|
|||||||
"followSystem": "跟随系统",
|
"followSystem": "跟随系统",
|
||||||
"font": "字体",
|
"font": "字体",
|
||||||
"fontSize": "字体大小",
|
"fontSize": "字体大小",
|
||||||
|
"forExample": "例如",
|
||||||
"force": "强制",
|
"force": "强制",
|
||||||
"foundNUpdate": "找到 {count} 个更新",
|
"foundNUpdate": "找到 {count} 个更新",
|
||||||
"fullScreen": "全屏模式",
|
"fullScreen": "全屏模式",
|
||||||
"fullScreenJitter": "全屏模式抖动",
|
"fullScreenJitter": "全屏模式抖动",
|
||||||
"fullScreenJitterHelp": "防止烧屏",
|
"fullScreenJitterHelp": "防止烧屏",
|
||||||
"fullScreenTip": "当设备旋转为横屏时,是否开启全屏模式。此选项仅作用于服务器Tab页。",
|
"fullScreenTip": "当设备旋转为横屏时,是否开启全屏模式。此选项仅作用于服务器 Tab 页。",
|
||||||
"getPushTokenFailed": "未能获取到推送token",
|
"getPushTokenFailed": "未能获取到推送 token",
|
||||||
"gettingToken": "正在获取Token...",
|
"gettingToken": "正在获取 Token...",
|
||||||
"goBackQ": "返回?",
|
"goBackQ": "返回?",
|
||||||
"goto": "前往",
|
"goto": "前往",
|
||||||
"hideTitleBar": "隐藏标题栏",
|
"hideTitleBar": "隐藏标题栏",
|
||||||
@@ -127,12 +128,13 @@
|
|||||||
"host": "主机",
|
"host": "主机",
|
||||||
"hour": "小时",
|
"hour": "小时",
|
||||||
"httpFailedWithCode": "请求失败, 状态码: {code}",
|
"httpFailedWithCode": "请求失败, 状态码: {code}",
|
||||||
"icloudSynced": "iCloud已同步,某些设置可能需要重启才能生效。",
|
"icloudSynced": "iCloud 已同步,某些设置可能需要重启才能生效。",
|
||||||
"ignoreCert": "忽略证书",
|
"ignoreCert": "忽略证书",
|
||||||
"image": "镜像",
|
"image": "镜像",
|
||||||
"imagesList": "镜像列表",
|
"imagesList": "镜像列表",
|
||||||
"import": "导入",
|
"import": "导入",
|
||||||
"inAppUpdate": "在App内更新?否则使用浏览器下载",
|
"inAppUpdate": "在 App 内更新?否则使用浏览器下载",
|
||||||
|
"init": "初始化",
|
||||||
"inner": "内置",
|
"inner": "内置",
|
||||||
"inputDomainHere": "在这里输入域名",
|
"inputDomainHere": "在这里输入域名",
|
||||||
"install": "安装",
|
"install": "安装",
|
||||||
@@ -140,7 +142,7 @@
|
|||||||
"invalid": "无效",
|
"invalid": "无效",
|
||||||
"invalidJson": "无效的 JSON",
|
"invalidJson": "无效的 JSON",
|
||||||
"invalidVersion": "不支持的版本",
|
"invalidVersion": "不支持的版本",
|
||||||
"invalidVersionHelp": "请确保正确安装了docker,或者使用的非自编译版本。如果没有以上问题,请在 {url} 提交问题。",
|
"invalidVersionHelp": "请确保正确安装了 docker,或者使用的非自编译版本。如果没有以上问题,请在 {url} 提交问题。",
|
||||||
"isBusy": "当前正忙",
|
"isBusy": "当前正忙",
|
||||||
"jumpServer": "跳板服务器",
|
"jumpServer": "跳板服务器",
|
||||||
"keepForeground": "请保持应用处于前台!",
|
"keepForeground": "请保持应用处于前台!",
|
||||||
@@ -151,7 +153,9 @@
|
|||||||
"languageName": "简体中文",
|
"languageName": "简体中文",
|
||||||
"lastTry": "最后尝试",
|
"lastTry": "最后尝试",
|
||||||
"launchPage": "启动页",
|
"launchPage": "启动页",
|
||||||
"license": "开源证书",
|
"letterCache": "输入法字符缓存",
|
||||||
|
"letterCacheTip": "推荐开启,但是开启后无法输入 CJK 等文字",
|
||||||
|
"license": "开源许可证",
|
||||||
"light": "亮",
|
"light": "亮",
|
||||||
"loadingFiles": "正在加载目录。。。",
|
"loadingFiles": "正在加载目录。。。",
|
||||||
"location": "位置",
|
"location": "位置",
|
||||||
@@ -174,10 +178,11 @@
|
|||||||
"net": "网络",
|
"net": "网络",
|
||||||
"netViewType": "网络视图类型",
|
"netViewType": "网络视图类型",
|
||||||
"newContainer": "新建容器",
|
"newContainer": "新建容器",
|
||||||
"noClient": "没有SSH连接",
|
"noClient": "没有 SSH 连接",
|
||||||
"noInterface": "没有可用的接口",
|
"noInterface": "没有可用的接口",
|
||||||
"noLineChart": "不使用折线图",
|
"noLineChart": "不使用折线图",
|
||||||
"noNotiPerm": "无通知权限,可能下载App更新时无进度提示。",
|
"noLineChartForCpu": "CPU 不使用折线图",
|
||||||
|
"noNotiPerm": "无通知权限,可能下载 App 更新时无进度提示。",
|
||||||
"noOptions": "无可选项",
|
"noOptions": "无可选项",
|
||||||
"noPrivateKeyTip": "私钥不存在,可能已被删除/配置错误",
|
"noPrivateKeyTip": "私钥不存在,可能已被删除/配置错误",
|
||||||
"noPromptAgain": "不再提示",
|
"noPromptAgain": "不再提示",
|
||||||
@@ -191,23 +196,24 @@
|
|||||||
"notAvailable": "不可用",
|
"notAvailable": "不可用",
|
||||||
"notSelected": "未选择",
|
"notSelected": "未选择",
|
||||||
"note": "备注",
|
"note": "备注",
|
||||||
"nullToken": "无Token",
|
"nullToken": "无 Token",
|
||||||
"ok": "好",
|
"ok": "好",
|
||||||
"onServerDetailPage": "在服务器详情页",
|
"onServerDetailPage": "在服务器详情页",
|
||||||
"onlyOneLine": "仅显示为一行(可滚动)",
|
"onlyOneLine": "仅显示为一行(可滚动)",
|
||||||
"onlyWhenCoreBiggerThan8": "仅当核心数>8时生效",
|
"onlyWhenCoreBiggerThan8": "仅当核心数大于 8 时生效",
|
||||||
"open": "打开",
|
"open": "打开",
|
||||||
"openLastPath": "打开上次的路径",
|
"openLastPath": "打开上次的路径",
|
||||||
"openLastPathTip": "不同的服务器会有不同的记录,且记录的是退出时的路径",
|
"openLastPathTip": "不同的服务器会有不同的记录,且记录的是退出时的路径",
|
||||||
"parseContainerStats": "解析容器占用状态",
|
"parseContainerStats": "解析容器占用状态",
|
||||||
"parseContainerStatsTip": "Docker解析占用状态较为缓慢",
|
"parseContainerStatsTip": "Docker 解析占用状态较为缓慢",
|
||||||
"paste": "粘贴",
|
"paste": "粘贴",
|
||||||
"path": "路径",
|
"path": "路径",
|
||||||
"percentOfSize": "{size} 的 {percent}%",
|
"percentOfSize": "{size} 的 {percent}%",
|
||||||
|
"permission": "权限",
|
||||||
"pickFile": "选择文件",
|
"pickFile": "选择文件",
|
||||||
"pingAvg": "平均:",
|
"pingAvg": "平均:",
|
||||||
"pingInputIP": "请输入目标IP或域名",
|
"pingInputIP": "请输入目标IP或域名",
|
||||||
"pingNoServer": "没有服务器可用于Ping\n请在服务器tab添加服务器后再试",
|
"pingNoServer": "没有服务器可用于 Ping\n请在服务器 tab 添加服务器后再试",
|
||||||
"pkg": "包管理",
|
"pkg": "包管理",
|
||||||
"pkgUpgradeTip": "请在更新前备份系统。",
|
"pkgUpgradeTip": "请在更新前备份系统。",
|
||||||
"platformNotSupportUpdate": "当前平台不支持更新,请编译最新源码后手动安装",
|
"platformNotSupportUpdate": "当前平台不支持更新,请编译最新源码后手动安装",
|
||||||
@@ -220,21 +226,22 @@
|
|||||||
"privateKey": "私钥",
|
"privateKey": "私钥",
|
||||||
"process": "进程",
|
"process": "进程",
|
||||||
"pushToken": "消息推送 Token",
|
"pushToken": "消息推送 Token",
|
||||||
"pveIgnoreCertTip": "不推荐开启,注意安全隐患!如果你使用的PVE默认证书,需要开启该选项",
|
"pveIgnoreCertTip": "不推荐开启,注意安全隐患!如果你使用的 PVE 默认证书,需要开启该选项",
|
||||||
"pveLoginFailed": "登录失败。无法使用服务器配置内的用户/密码,以Linux PAM方式登录。",
|
"pveLoginFailed": "登录失败。无法使用服务器配置内的用户/密码,以 Linux PAM 方式登录。",
|
||||||
"pveVersionLow": "当前该功能处于测试阶段,仅在PVE 8+上测试过,请谨慎使用",
|
"pveVersionLow": "当前该功能处于测试阶段,仅在 PVE 8+ 上测试过,请谨慎使用",
|
||||||
"pwd": "密码",
|
"pwd": "密码",
|
||||||
"read": "读",
|
"read": "读",
|
||||||
"reboot": "重启",
|
"reboot": "重启",
|
||||||
"rememberChoice": "记住选择",
|
"rememberChoice": "记住选择",
|
||||||
"rememberPwdInMem": "在内存中记住密码",
|
"rememberPwdInMem": "在内存中记住密码",
|
||||||
"rememberPwdInMemTip": "用于容器、挂起等",
|
"rememberPwdInMemTip": "用于容器、挂起等",
|
||||||
|
"rememberWindowSize": "记住窗口大小",
|
||||||
"remotePath": "远端路径",
|
"remotePath": "远端路径",
|
||||||
"rename": "重命名",
|
"rename": "重命名",
|
||||||
"reportBugsOnGithubIssue": "请到 {url} 提交问题",
|
"reportBugsOnGithubIssue": "请到 {url} 提交问题",
|
||||||
"restart": "重启",
|
"restart": "重启",
|
||||||
"restore": "恢复",
|
"restore": "恢复",
|
||||||
"restoreSuccess": "恢复成功,需要重启App来应用更改",
|
"restoreSuccess": "恢复成功,需要重启 App 来应用更改",
|
||||||
"result": "结果",
|
"result": "结果",
|
||||||
"rotateAngel": "旋转角度",
|
"rotateAngel": "旋转角度",
|
||||||
"route": "路由",
|
"route": "路由",
|
||||||
@@ -267,7 +274,7 @@
|
|||||||
"softWrap": "自动换行",
|
"softWrap": "自动换行",
|
||||||
"speed": "速度",
|
"speed": "速度",
|
||||||
"spentTime": "耗时: {time}",
|
"spentTime": "耗时: {time}",
|
||||||
"sshTermHelp": "在终端可滚动时,横向拖动可以选中文字。点击键盘按钮可以开启/关闭键盘。文件图标会打开当前路径SFTP。粘贴板按钮会在有选中文字时复制内容,在未选中并且剪切板有内容时粘贴内容到终端。代码图标会粘贴代码片段到终端并执行。",
|
"sshTermHelp": "在终端可滚动时,横向拖动可以选中文字。点击键盘按钮可以开启/关闭键盘。文件图标会打开当前路径 SFTP。剪切板按钮会在有选中文字时复制内容,在未选中并且剪切板有内容时粘贴内容到终端。代码图标会粘贴代码片段到终端并执行。",
|
||||||
"sshTip": "该功能目前处于测试阶段。\n\n请在 {url} 反馈问题,或者加入我们开发。",
|
"sshTip": "该功能目前处于测试阶段。\n\n请在 {url} 反馈问题,或者加入我们开发。",
|
||||||
"sshVirtualKeyAutoOff": "虚拟按键自动切换",
|
"sshVirtualKeyAutoOff": "虚拟按键自动切换",
|
||||||
"start": "开始",
|
"start": "开始",
|
||||||
@@ -285,7 +292,7 @@
|
|||||||
"system": "系统",
|
"system": "系统",
|
||||||
"tag": "标签",
|
"tag": "标签",
|
||||||
"temperature": "温度",
|
"temperature": "温度",
|
||||||
"termFontSizeTip": "此设置会影响终端大小(宽高)。可以在终端页面缩放来调整当前会话的字体大小",
|
"termFontSizeTip": "此设置会影响终端大小(宽和高)。可以在终端页面缩放来调整当前会话的字体大小",
|
||||||
"terminal": "终端",
|
"terminal": "终端",
|
||||||
"test": "测试",
|
"test": "测试",
|
||||||
"textScaler": "字体缩放",
|
"textScaler": "字体缩放",
|
||||||
@@ -296,23 +303,23 @@
|
|||||||
"times": "次",
|
"times": "次",
|
||||||
"total": "总共",
|
"total": "总共",
|
||||||
"traffic": "流量",
|
"traffic": "流量",
|
||||||
"trySudo": "尝试使用sudo",
|
"trySudo": "尝试使用 sudo",
|
||||||
"ttl": "缓存时间",
|
"ttl": "TTL",
|
||||||
"unknown": "未知",
|
"unknown": "未知",
|
||||||
"unknownError": "未知错误",
|
"unknownError": "未知错误",
|
||||||
"unkownConvertMode": "未知转换模式",
|
"unkownConvertMode": "未知转换模式",
|
||||||
"update": "更新",
|
"update": "更新",
|
||||||
"updateAll": "更新全部",
|
"updateAll": "更新全部",
|
||||||
"updateIntervalEqual0": "你设置为0,服务器状态不会自动刷新。\n且不能计算CPU使用情况。",
|
"updateIntervalEqual0": "你设置为 0,服务器状态不会自动刷新。\n且不能计算 CPU 使用情况。",
|
||||||
"updateServerStatusInterval": "服务器状态刷新间隔",
|
"updateServerStatusInterval": "服务器状态刷新间隔",
|
||||||
"updateTip": "新版本: v1.0.{newest}",
|
"updateTip": "新版本: v1.0.{newest}",
|
||||||
"updateTipTooLow": "当前版本过低,请升级至 v1.0.{newest}",
|
"updateTipTooLow": "当前版本过低,请升级至 v1.0.{newest}",
|
||||||
"upload": "上传",
|
"upload": "上传",
|
||||||
"upsideDown": "上下交换",
|
"upsideDown": "上下交换",
|
||||||
"uptime": "启动时长",
|
"uptime": "启动时长",
|
||||||
"urlOrJson": "链接或JSON",
|
"urlOrJson": "链接或 JSON",
|
||||||
"useCdn": "使用CDN",
|
"useCdn": "使用 CDN",
|
||||||
"useCdnTip": "非中国大陆用户推荐使用CDN,是否使用?",
|
"useCdnTip": "非中国大陆用户推荐使用 CDN,是否使用?",
|
||||||
"useNoPwd": "将会使用无密码",
|
"useNoPwd": "将会使用无密码",
|
||||||
"usePodmanByDefault": "默认使用 Podman",
|
"usePodmanByDefault": "默认使用 Podman",
|
||||||
"used": "已用",
|
"used": "已用",
|
||||||
@@ -328,10 +335,10 @@
|
|||||||
"waitConnection": "请等待连接建立",
|
"waitConnection": "请等待连接建立",
|
||||||
"wakeLock": "保持唤醒",
|
"wakeLock": "保持唤醒",
|
||||||
"watchNotPaired": "没有已配对的 Apple Watch",
|
"watchNotPaired": "没有已配对的 Apple Watch",
|
||||||
"webdavSettingEmpty": "Webdav 设置项为空",
|
"webdavSettingEmpty": "WebDav 设置项为空",
|
||||||
"whenOpenApp": "当打开 App 时",
|
"whenOpenApp": "当打开 App 时",
|
||||||
"willTakEeffectImmediately": "更改将会立即生效",
|
"willTakEeffectImmediately": "更改将会立即生效",
|
||||||
"wolTip": "在配置 WOL 后,每次连接服务器都会先发送一次 WOl 请求",
|
"wolTip": "在配置 WOL 后,每次连接服务器都会先发送一次 WOL 请求",
|
||||||
"write": "写",
|
"write": "写",
|
||||||
"writeScriptFailTip": "写入脚本失败,可能是没有权限/目录不存在等"
|
"writeScriptFailTip": "写入脚本失败,可能是没有权限/目录不存在等"
|
||||||
}
|
}
|
||||||