mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2026-02-15 12:44:59 +01:00
Compare commits
23 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
749fd4d800 | ||
|
|
bec4a3b314 | ||
|
|
9e5babec76 | ||
|
|
dbbb10364b | ||
|
|
16948c3e0f | ||
|
|
e39fb23b66 | ||
|
|
4777166dd9 | ||
|
|
0ae0241800 | ||
|
|
e7a5f43cc4 | ||
|
|
7f58237589 | ||
|
|
0bbd0b43b3 | ||
|
|
aaa1eddeaf | ||
|
|
2f6db2961f | ||
|
|
831efa833b | ||
|
|
867fcbfc0d | ||
|
|
41886be649 | ||
|
|
029b4e0dba | ||
|
|
3a3c29764a | ||
|
|
4ace4af7da | ||
|
|
ddd32e82d4 | ||
|
|
b882baeafa | ||
|
|
046f2c06d0 | ||
|
|
d706886343 |
23
.github/workflows/release.yml
vendored
23
.github/workflows/release.yml
vendored
@@ -19,7 +19,7 @@ jobs:
|
||||
uses: subosito/flutter-action@v2
|
||||
with:
|
||||
channel: 'stable'
|
||||
flutter-version: '3.24.1'
|
||||
flutter-version: '3.27.3'
|
||||
- uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: 'zulu'
|
||||
@@ -53,14 +53,31 @@ jobs:
|
||||
uses: actions/checkout@v4
|
||||
- name: Install Flutter
|
||||
uses: subosito/flutter-action@v2
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt update
|
||||
# Basic
|
||||
sudo apt install -y clang cmake ninja-build pkg-config libgtk-3-dev libvulkan-dev desktop-file-utils
|
||||
# App Specific
|
||||
sudo apt install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libunwind-dev
|
||||
# Packaging
|
||||
sudo apt install -y rpm patchelf
|
||||
- name: Build
|
||||
run: |
|
||||
dart run fl_build -p linux
|
||||
dart run fl_build
|
||||
dart run flutter_distributor:main release --name linux --skip-clean
|
||||
- name: Rename artifacts
|
||||
run: |
|
||||
deb_name=$(ls dist/*/*.deb)
|
||||
mv $deb_name ${{ env.APP_NAME }}_${{ env.BUILD_NUMBER }}_amd64.deb
|
||||
rpm_name=$(ls dist/*/*.rpm)
|
||||
mv $rpm_name ${{ env.APP_NAME }}_${{ env.BUILD_NUMBER }}_amd64.rpm
|
||||
- name: Create Release
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
files: |
|
||||
${{ env.APP_NAME }}_${{ env.BUILD_NUMBER }}_amd64.AppImage
|
||||
${{ env.APP_NAME }}_${{ env.BUILD_NUMBER }}_amd64.deb
|
||||
${{ env.APP_NAME }}_${{ env.BUILD_NUMBER }}_amd64.rpm
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -46,6 +46,7 @@ app.*.map.json
|
||||
/android/app/release
|
||||
|
||||
/android/app/fjy.androidstudio.key
|
||||
/android/app/app.key
|
||||
/release
|
||||
test.dart
|
||||
|
||||
|
||||
12
README.md
12
README.md
@@ -9,7 +9,7 @@ English | [简体中文](README_zh.md)
|
||||
</div>
|
||||
|
||||
<p align="center">
|
||||
A Flutter project which provide charts to display <a href="../../issues/43">Linux</a> server status and tools to manage server.
|
||||
A Flutter project which provide charts to display <a href="https://github.com/lollipopkit/flutter_server_box/issues/43">Linux</a> server status and tools to manage server.
|
||||
<br>
|
||||
Especially thanks to <a href="https://github.com/TerminalStudio/dartssh2">dartssh2</a> & <a href="https://github.com/TerminalStudio/xterm.dart">xterm.dart</a>.
|
||||
</p>
|
||||
@@ -28,11 +28,11 @@ Especially thanks to <a href="https://github.com/TerminalStudio/dartssh2">dartss
|
||||
|
||||
## 📥 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)
|
||||
| Platform | From |
|
||||
|-----------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| iOS / macOS | [AppStore](https://apps.apple.com/app/id1586449703) |
|
||||
| Android | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lpkt.cn/serverbox/pkg/?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.lpkt.cn/serverbox/pkg/?sort=time&order=desc&layout=grid) |
|
||||
|
||||
Please only download pkgs from the source that **you trust**!
|
||||
|
||||
|
||||
14
README_zh.md
14
README_zh.md
@@ -9,7 +9,7 @@
|
||||
</div>
|
||||
|
||||
<p align="center">
|
||||
使用 Flutter 开发的 <a href="../../issues/43">Linux</a> 服务器工具箱,提供服务器状态图表和管理工具。
|
||||
使用 Flutter 开发的 <a href="https://github.com/lollipopkit/flutter_server_box/issues/43">Linux</a> 服务器工具箱,提供服务器状态图表和管理工具。
|
||||
<br>
|
||||
特别感谢 <a href="https://github.com/TerminalStudio/dartssh2">dartssh2</a> & <a href="https://github.com/TerminalStudio/xterm.dart">xterm.dart</a>。
|
||||
</p>
|
||||
@@ -28,11 +28,11 @@
|
||||
|
||||
## 📥 安装
|
||||
|
||||
平台 | 下载
|
||||
--- | ---
|
||||
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)
|
||||
平台 | 下载
|
||||
----------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
iOS / macOS | [AppStore](https://apps.apple.com/app/id1586449703)
|
||||
Android | [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) / [CDN](https://cdn.lpkt.cn/serverbox/pkg/?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.lpkt.cn/serverbox/pkg/?sort=time&order=desc&layout=grid)
|
||||
|
||||
请从 **信任** 的来源下载!
|
||||
|
||||
@@ -72,7 +72,7 @@ Linux / Windows | [GitHub](https://github.com/lollipopkit/flutter_server_box/rel
|
||||
3. 运行 `dart run fl_build -p PLATFORM` 构建应用
|
||||
|
||||
### 翻译
|
||||
[指南](https://blog.lolli.tech/faq/) 可在我的博客中找到。
|
||||
[指南](https://blog.lpkt.cn/faq/) 可在我的博客中找到。
|
||||
|
||||
## 💡 我的其它 Apps
|
||||
- [GPT Box](https://github.com/lollipopkit/flutter_gpt_box) - 支持 OpenAI API 的 第三方全平台客户端。
|
||||
|
||||
@@ -86,10 +86,12 @@ android {
|
||||
|
||||
debug {
|
||||
applicationIdSuffix '.debug'
|
||||
resValue "string", "app_name", "SrvBxD"
|
||||
}
|
||||
|
||||
profile {
|
||||
applicationIdSuffix '.debug'
|
||||
resValue "string", "app_name", "SrvBxP"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||
|
||||
<application
|
||||
android:label="ServerBox"
|
||||
android:label="@string/app_name"
|
||||
android:name="${applicationName}"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:allowBackup="true"
|
||||
|
||||
@@ -4,85 +4,158 @@ import android.app.*
|
||||
import android.content.Intent
|
||||
import android.os.Build
|
||||
import android.os.IBinder
|
||||
import android.util.Log
|
||||
import java.io.File
|
||||
import java.util.*
|
||||
|
||||
class ForegroundService : Service() {
|
||||
private val chanId = "ForegroundServiceChannel"
|
||||
|
||||
private fun logError(message: String, error: Throwable? = null) {
|
||||
Log.e("ForegroundService", message, error)
|
||||
try {
|
||||
val logFile = File(getExternalFilesDir(null), "server_box.log")
|
||||
val timestamp = java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US).format(Date())
|
||||
val logMessage = "$timestamp [ForegroundService] ERROR: $message\n${error?.stackTraceToString() ?: ""}\n"
|
||||
logFile.appendText(logMessage)
|
||||
} catch (e: Exception) {
|
||||
Log.e("ForegroundService", "Failed to write log", e)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
Log.d("ForegroundService", "Service onCreate")
|
||||
createNotificationChannel()
|
||||
}
|
||||
|
||||
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
||||
when (intent?.action) {
|
||||
"ACTION_STOP_FOREGROUND" -> {
|
||||
try {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
|
||||
androidx.core.content.ContextCompat.checkSelfPermission(
|
||||
this, android.Manifest.permission.POST_NOTIFICATIONS
|
||||
) != android.content.pm.PackageManager.PERMISSION_GRANTED
|
||||
) {
|
||||
Log.w("ForegroundService", "Notification permission denied. Stopping service.")
|
||||
stopForegroundService()
|
||||
return START_NOT_STICKY
|
||||
}
|
||||
else -> {
|
||||
val notification = createNotification()
|
||||
startForeground(1, notification)
|
||||
return START_STICKY
|
||||
|
||||
if (intent == null) {
|
||||
Log.w("ForegroundService", "onStartCommand called with null intent")
|
||||
stopForegroundService()
|
||||
return START_NOT_STICKY
|
||||
}
|
||||
|
||||
val action = intent.action
|
||||
Log.d("ForegroundService", "onStartCommand action=$action")
|
||||
|
||||
// Create notification before starting foreground
|
||||
val notification = createNotification()
|
||||
|
||||
// Use try-catch for startForeground
|
||||
try {
|
||||
startForeground(1, notification)
|
||||
} catch (e: Exception) {
|
||||
logError("Failed to start foreground", e)
|
||||
stopSelf()
|
||||
return START_NOT_STICKY
|
||||
}
|
||||
|
||||
return when (action) {
|
||||
"ACTION_STOP_FOREGROUND" -> {
|
||||
stopForegroundService()
|
||||
START_NOT_STICKY
|
||||
}
|
||||
else -> {
|
||||
START_STICKY
|
||||
}
|
||||
}
|
||||
|
||||
} catch (e: Exception) {
|
||||
logError("Error in onStartCommand", e)
|
||||
stopSelf()
|
||||
return START_NOT_STICKY
|
||||
}
|
||||
}
|
||||
|
||||
override fun onBind(intent: Intent): IBinder? {
|
||||
override fun onBind(intent: Intent?): IBinder? {
|
||||
return null
|
||||
}
|
||||
|
||||
private fun createNotificationChannel() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
val manager = getSystemService(NotificationManager::class.java)
|
||||
if (manager == null) {
|
||||
Log.e("ForegroundService", "Failed to get NotificationManager")
|
||||
return
|
||||
}
|
||||
val serviceChannel = NotificationChannel(
|
||||
chanId,
|
||||
chanId,
|
||||
"ForegroundServiceChannel",
|
||||
NotificationManager.IMPORTANCE_DEFAULT
|
||||
)
|
||||
val manager = getSystemService(NotificationManager::class.java)
|
||||
).apply {
|
||||
description = "For foreground service"
|
||||
}
|
||||
manager.createNotificationChannel(serviceChannel)
|
||||
}
|
||||
}
|
||||
|
||||
private fun createNotification(): Notification {
|
||||
val notificationIntent = Intent(this, MainActivity::class.java)
|
||||
val pendingIntent = PendingIntent.getActivity(
|
||||
this,
|
||||
0,
|
||||
notificationIntent,
|
||||
PendingIntent.FLAG_IMMUTABLE
|
||||
)
|
||||
try {
|
||||
val notificationIntent = Intent(this, MainActivity::class.java)
|
||||
val pendingIntent = PendingIntent.getActivity(
|
||||
this,
|
||||
0,
|
||||
notificationIntent,
|
||||
PendingIntent.FLAG_IMMUTABLE
|
||||
)
|
||||
|
||||
val deleteIntent = Intent(this, ForegroundService::class.java).apply {
|
||||
action = "ACTION_STOP_FOREGROUND"
|
||||
}
|
||||
val deletePendingIntent = PendingIntent.getService(
|
||||
this,
|
||||
0,
|
||||
deleteIntent,
|
||||
PendingIntent.FLAG_IMMUTABLE
|
||||
)
|
||||
val deleteIntent = Intent(this, ForegroundService::class.java).apply {
|
||||
action = "ACTION_STOP_FOREGROUND"
|
||||
}
|
||||
val deletePendingIntent = PendingIntent.getService(
|
||||
this,
|
||||
0,
|
||||
deleteIntent,
|
||||
PendingIntent.FLAG_IMMUTABLE
|
||||
)
|
||||
|
||||
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
Notification.Builder(this, chanId)
|
||||
val builder = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
Notification.Builder(this, chanId)
|
||||
} else {
|
||||
Notification.Builder(this)
|
||||
}
|
||||
|
||||
return builder
|
||||
.setContentTitle("Server Box")
|
||||
.setContentText("Open the app")
|
||||
.setContentText("Running in background")
|
||||
.setSmallIcon(R.mipmap.ic_launcher)
|
||||
.setContentIntent(pendingIntent)
|
||||
.addAction(android.R.drawable.ic_delete, "Stop", deletePendingIntent)
|
||||
.build()
|
||||
} else {
|
||||
Notification.Builder(this)
|
||||
} catch (e: Exception) {
|
||||
logError("Error creating notification", e)
|
||||
// Return a basic notification as fallback
|
||||
return Notification.Builder(this)
|
||||
.setContentTitle("Server Box")
|
||||
.setContentText("Open the app")
|
||||
.setSmallIcon(R.mipmap.ic_launcher)
|
||||
.setContentIntent(pendingIntent)
|
||||
.addAction(android.R.drawable.ic_delete, "Stop", deletePendingIntent)
|
||||
.build()
|
||||
}
|
||||
}
|
||||
|
||||
fun stopForegroundService() {
|
||||
stopForeground(true)
|
||||
private fun stopForegroundService() {
|
||||
try {
|
||||
stopForeground(true)
|
||||
} catch (e: Exception) {
|
||||
logError("Error stopping foreground", e)
|
||||
}
|
||||
stopSelf()
|
||||
Log.d("ForegroundService", "ForegroundService stopped")
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
Log.d("ForegroundService", "Service onDestroy")
|
||||
}
|
||||
}
|
||||
@@ -9,13 +9,15 @@ import androidx.core.content.ContextCompat
|
||||
import io.flutter.embedding.android.FlutterFragmentActivity
|
||||
import io.flutter.embedding.engine.FlutterEngine
|
||||
import io.flutter.plugin.common.MethodChannel
|
||||
import android.appwidget.AppWidgetManager
|
||||
import tech.lolli.toolbox.widget.HomeWidget
|
||||
|
||||
class MainActivity: FlutterFragmentActivity() {
|
||||
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
|
||||
super.configureFlutterEngine(flutterEngine)
|
||||
val binaryMessenger = flutterEngine.dartExecutor.binaryMessenger
|
||||
|
||||
MethodChannel(binaryMessenger, "tech.lolli.toolbox/app_retain").apply {
|
||||
MethodChannel(binaryMessenger, "tech.lolli.toolbox/main_chan").apply {
|
||||
setMethodCallHandler { method, result ->
|
||||
when (method.method) {
|
||||
"sendToBackground" -> {
|
||||
@@ -23,12 +25,19 @@ class MainActivity: FlutterFragmentActivity() {
|
||||
result.success(null)
|
||||
}
|
||||
"startService" -> {
|
||||
reqPerm()
|
||||
val serviceIntent = Intent(this@MainActivity, ForegroundService::class.java)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
startForegroundService(serviceIntent)
|
||||
} else {
|
||||
startService(serviceIntent)
|
||||
try {
|
||||
reqPerm()
|
||||
val serviceIntent = Intent(this@MainActivity, ForegroundService::class.java)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
startForegroundService(serviceIntent)
|
||||
} else {
|
||||
startService(serviceIntent)
|
||||
}
|
||||
result.success(null)
|
||||
} catch (e: Exception) {
|
||||
// Log error but don't crash
|
||||
android.util.Log.e("MainActivity", "Failed to start service: ${e.message}")
|
||||
result.error("SERVICE_ERROR", e.message, null)
|
||||
}
|
||||
}
|
||||
"stopService" -> {
|
||||
@@ -36,6 +45,12 @@ class MainActivity: FlutterFragmentActivity() {
|
||||
stopService(serviceIntent)
|
||||
result.success(null)
|
||||
}
|
||||
"updateHomeWidget" -> {
|
||||
val intent = Intent(this@MainActivity, HomeWidget::class.java)
|
||||
intent.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
|
||||
sendBroadcast(intent)
|
||||
result.success(null)
|
||||
}
|
||||
else -> {
|
||||
result.notImplemented()
|
||||
}
|
||||
@@ -46,13 +61,21 @@ class MainActivity: FlutterFragmentActivity() {
|
||||
|
||||
private fun reqPerm() {
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) return
|
||||
|
||||
// Check if we already have the permission to avoid unnecessary prompts
|
||||
if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS)
|
||||
!= PackageManager.PERMISSION_GRANTED) {
|
||||
ActivityCompat.requestPermissions(
|
||||
this,
|
||||
arrayOf(Manifest.permission.POST_NOTIFICATIONS),
|
||||
123,
|
||||
)
|
||||
try {
|
||||
ActivityCompat.requestPermissions(
|
||||
this,
|
||||
arrayOf(Manifest.permission.POST_NOTIFICATIONS),
|
||||
123,
|
||||
)
|
||||
} catch (e: Exception) {
|
||||
// Log error but don't crash
|
||||
android.util.Log.e("MainActivity", "Failed to request permissions: ${e.message}")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,15 +6,18 @@ import android.appwidget.AppWidgetProvider
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import android.widget.RemoteViews
|
||||
import kotlinx.coroutines.DelicateCoroutinesApi
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import org.json.JSONObject
|
||||
import tech.lolli.toolbox.R
|
||||
import java.net.URL
|
||||
import java.net.HttpURLConnection
|
||||
import java.io.FileNotFoundException
|
||||
|
||||
class HomeWidget : AppWidgetProvider() {
|
||||
override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {
|
||||
@@ -23,7 +26,6 @@ class HomeWidget : AppWidgetProvider() {
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(DelicateCoroutinesApi::class)
|
||||
private fun updateAppWidget(context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int) {
|
||||
val views = RemoteViews(context.packageName, R.layout.home_widget)
|
||||
val sp = context.getSharedPreferences("FlutterSharedPreferences", Context.MODE_PRIVATE)
|
||||
@@ -36,6 +38,10 @@ class HomeWidget : AppWidgetProvider() {
|
||||
url = gUrl
|
||||
}
|
||||
|
||||
if (url.isNullOrEmpty()) {
|
||||
Log.e("HomeWidget", "URL not found")
|
||||
}
|
||||
|
||||
val intentUpdate = Intent(context, HomeWidget::class.java)
|
||||
intentUpdate.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
|
||||
val ids = intArrayOf(appWidgetId)
|
||||
@@ -54,11 +60,13 @@ class HomeWidget : AppWidgetProvider() {
|
||||
views.setOnClickPendingIntent(R.id.widget_container, pendingUpdate)
|
||||
|
||||
if (url.isNullOrEmpty()) {
|
||||
views.setViewVisibility(R.id.widget_cpu_label, View.INVISIBLE)
|
||||
views.setViewVisibility(R.id.widget_mem_label, View.INVISIBLE)
|
||||
views.setViewVisibility(R.id.widget_disk_label, View.INVISIBLE)
|
||||
views.setViewVisibility(R.id.widget_net_label, View.INVISIBLE)
|
||||
views.setTextViewText(R.id.widget_name, "ID: $appWidgetId")
|
||||
views.setTextViewText(R.id.widget_name, "No URL")
|
||||
// Update the widget to display a message for missing URL
|
||||
views.setViewVisibility(R.id.error_message, View.VISIBLE)
|
||||
views.setTextViewText(R.id.error_message, "Please configure the widget URL.")
|
||||
views.setViewVisibility(R.id.widget_content, View.GONE)
|
||||
views.setFloat(R.id.widget_name, "setAlpha", 1f)
|
||||
views.setFloat(R.id.error_message, "setAlpha", 1f)
|
||||
appWidgetManager.updateAppWidget(appWidgetId, views)
|
||||
return
|
||||
} else {
|
||||
@@ -68,44 +76,53 @@ class HomeWidget : AppWidgetProvider() {
|
||||
views.setViewVisibility(R.id.widget_net_label, View.VISIBLE)
|
||||
}
|
||||
|
||||
GlobalScope.launch(Dispatchers.IO) {
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
try {
|
||||
val jsonStr = URL(url).readText()
|
||||
val jsonObject = JSONObject(jsonStr)
|
||||
val data = jsonObject.getJSONObject("data")
|
||||
val server = data.getString("name")
|
||||
val cpu = data.getString("cpu")
|
||||
val mem = data.getString("mem")
|
||||
val disk = data.getString("disk")
|
||||
val net = data.getString("net")
|
||||
|
||||
GlobalScope.launch(Dispatchers.Main) main@ {
|
||||
// mem or disk is empty -> get status failed
|
||||
// (cpu | net) isEmpty -> data is not ready
|
||||
if (mem.isEmpty() || disk.isEmpty()) {
|
||||
return@main
|
||||
val connection = URL(url).openConnection() as HttpURLConnection
|
||||
connection.requestMethod = "GET"
|
||||
val responseCode = connection.responseCode
|
||||
if (responseCode == HttpURLConnection.HTTP_OK) {
|
||||
val jsonStr = connection.inputStream.bufferedReader().use { it.readText() }
|
||||
val jsonObject = JSONObject(jsonStr)
|
||||
val data = jsonObject.getJSONObject("data")
|
||||
val server = data.getString("name")
|
||||
val cpu = data.getString("cpu")
|
||||
val mem = data.getString("mem")
|
||||
val disk = data.getString("disk")
|
||||
val net = data.getString("net")
|
||||
withContext(Dispatchers.Main) {
|
||||
if (mem.isEmpty() || disk.isEmpty()) {
|
||||
Log.e("HomeWidget", "Failed to retrieve status: Memory or disk information is empty")
|
||||
return@withContext
|
||||
}
|
||||
views.setTextViewText(R.id.widget_name, server)
|
||||
views.setTextViewText(R.id.widget_cpu, cpu)
|
||||
views.setTextViewText(R.id.widget_mem, mem)
|
||||
views.setTextViewText(R.id.widget_disk, disk)
|
||||
views.setTextViewText(R.id.widget_net, net)
|
||||
val timeStr = android.text.format.DateFormat.format("HH:mm", java.util.Date()).toString()
|
||||
views.setTextViewText(R.id.widget_time, timeStr)
|
||||
views.setFloat(R.id.widget_name, "setAlpha", 1f)
|
||||
views.setFloat(R.id.widget_cpu_label, "setAlpha", 1f)
|
||||
views.setFloat(R.id.widget_mem_label, "setAlpha", 1f)
|
||||
views.setFloat(R.id.widget_disk_label, "setAlpha", 1f)
|
||||
views.setFloat(R.id.widget_net_label, "setAlpha", 1f)
|
||||
views.setFloat(R.id.widget_time, "setAlpha", 1f)
|
||||
appWidgetManager.updateAppWidget(appWidgetId, views)
|
||||
}
|
||||
views.setTextViewText(R.id.widget_name, server)
|
||||
|
||||
views.setTextViewText(R.id.widget_cpu, cpu)
|
||||
views.setTextViewText(R.id.widget_mem, mem)
|
||||
views.setTextViewText(R.id.widget_disk, disk)
|
||||
views.setTextViewText(R.id.widget_net, net)
|
||||
|
||||
val timeStr = android.text.format.DateFormat.format("HH:mm", java.util.Date()).toString()
|
||||
views.setTextViewText(R.id.widget_time, timeStr)
|
||||
|
||||
appWidgetManager.updateAppWidget(appWidgetId, views)
|
||||
} else {
|
||||
throw FileNotFoundException("HTTP response code: $responseCode")
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
println("ServerBoxHomeWidget: ${e.localizedMessage}")
|
||||
GlobalScope.launch(Dispatchers.Main) main@ {
|
||||
views.setViewVisibility(R.id.widget_cpu_label, View.INVISIBLE)
|
||||
views.setViewVisibility(R.id.widget_mem_label, View.INVISIBLE)
|
||||
views.setViewVisibility(R.id.widget_disk_label, View.INVISIBLE)
|
||||
views.setViewVisibility(R.id.widget_net_label, View.INVISIBLE)
|
||||
views.setTextViewText(R.id.widget_name, "ID: $appWidgetId")
|
||||
views.setTextViewText(R.id.widget_mem, e.localizedMessage)
|
||||
Log.e("HomeWidget", "Error updating widget: ${e.localizedMessage}", e)
|
||||
withContext(Dispatchers.Main) {
|
||||
views.setTextViewText(R.id.widget_name, "Error")
|
||||
// Update the widget to display a message for data retrieval failure
|
||||
views.setViewVisibility(R.id.error_message, View.VISIBLE)
|
||||
views.setTextViewText(R.id.error_message, "Failed to retrieve data.")
|
||||
views.setViewVisibility(R.id.widget_content, View.GONE)
|
||||
views.setFloat(R.id.widget_name, "setAlpha", 1f)
|
||||
views.setFloat(R.id.error_message, "setAlpha", 1f)
|
||||
appWidgetManager.updateAppWidget(appWidgetId, views)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,124 +16,151 @@
|
||||
android:textSize="23sp"
|
||||
android:textStyle="bold"
|
||||
android:maxLines="1"
|
||||
android:alpha="0"
|
||||
android:animateLayoutChanges="true"
|
||||
tools:text="Server Name" />
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/widget_container_inner"
|
||||
<!-- Wrap the content in a LinearLayout for easy visibility management -->
|
||||
<LinearLayout
|
||||
android:id="@+id/widget_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:layout_below="@id/widget_name"
|
||||
android:paddingTop="13dp">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/widget_cpu_label"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingBottom="2.7dp"
|
||||
<RelativeLayout
|
||||
android:id="@+id/widget_container_inner"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
android:paddingTop="13dp"
|
||||
android:animateLayoutChanges="true">
|
||||
|
||||
<ImageView
|
||||
android:layout_width="17dp"
|
||||
android:layout_height="17dp"
|
||||
android:src="@drawable/speed_24">
|
||||
</ImageView>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/widget_cpu"
|
||||
android:layout_width="match_parent"
|
||||
<LinearLayout
|
||||
android:id="@+id/widget_cpu_label"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="11dp"
|
||||
android:singleLine="true"
|
||||
android:ellipsize = "marquee"
|
||||
android:textColor="@color/widgetSummaryText"
|
||||
android:textSize="12.7sp"
|
||||
tools:text="CPU" />
|
||||
android:paddingBottom="2.7dp"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<ImageView
|
||||
android:layout_width="17dp"
|
||||
android:layout_height="17dp"
|
||||
android:src="@drawable/speed_24">
|
||||
</ImageView>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/widget_cpu"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="11dp"
|
||||
android:singleLine="true"
|
||||
android:ellipsize = "marquee"
|
||||
android:textColor="@color/widgetSummaryText"
|
||||
android:textSize="12.7sp"
|
||||
tools:text="CPU" />
|
||||
|
||||
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/widget_mem_label"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingBottom="2.7dp"
|
||||
android:layout_below="@id/widget_cpu_label"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<ImageView
|
||||
android:layout_width="17dp"
|
||||
android:layout_height="17dp"
|
||||
android:src="@drawable/memory_24">
|
||||
</ImageView>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/widget_mem"
|
||||
android:layout_width="match_parent"
|
||||
<LinearLayout
|
||||
android:id="@+id/widget_mem_label"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="11dp"
|
||||
android:maxLines="1"
|
||||
android:textColor="@color/widgetSummaryText"
|
||||
android:textSize="12.7sp"
|
||||
tools:text="Mem" />
|
||||
android:paddingBottom="2.7dp"
|
||||
android:layout_below="@id/widget_cpu_label"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
|
||||
</LinearLayout>
|
||||
<ImageView
|
||||
android:layout_width="17dp"
|
||||
android:layout_height="17dp"
|
||||
android:src="@drawable/memory_24">
|
||||
</ImageView>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/widget_disk_label"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingBottom="2.7dp"
|
||||
android:layout_below="@id/widget_mem_label"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
<TextView
|
||||
android:id="@+id/widget_mem"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="11dp"
|
||||
android:maxLines="1"
|
||||
android:textColor="@color/widgetSummaryText"
|
||||
android:textSize="12.7sp"
|
||||
tools:text="Mem" />
|
||||
|
||||
<ImageView
|
||||
android:layout_width="17dp"
|
||||
android:layout_height="17dp"
|
||||
android:src="@drawable/storage_24">
|
||||
</ImageView>
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/widget_disk"
|
||||
android:layout_width="match_parent"
|
||||
<LinearLayout
|
||||
android:id="@+id/widget_disk_label"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="11dp"
|
||||
android:maxLines="1"
|
||||
android:textColor="@color/widgetSummaryText"
|
||||
android:textSize="12.7sp"
|
||||
tools:text="Disk" />
|
||||
android:paddingBottom="2.7dp"
|
||||
android:layout_below="@id/widget_mem_label"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
|
||||
</LinearLayout>
|
||||
<ImageView
|
||||
android:layout_width="17dp"
|
||||
android:layout_height="17dp"
|
||||
android:src="@drawable/storage_24">
|
||||
</ImageView>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/widget_net_label"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/widget_disk_label"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
<TextView
|
||||
android:id="@+id/widget_disk"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="11dp"
|
||||
android:maxLines="1"
|
||||
android:textColor="@color/widgetSummaryText"
|
||||
android:textSize="12.7sp"
|
||||
tools:text="Disk" />
|
||||
|
||||
<ImageView
|
||||
android:layout_width="17dp"
|
||||
android:layout_height="17dp"
|
||||
android:src="@drawable/net_24">
|
||||
</ImageView>
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/widget_net"
|
||||
android:layout_width="match_parent"
|
||||
<LinearLayout
|
||||
android:id="@+id/widget_net_label"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="11dp"
|
||||
android:maxLines="1"
|
||||
android:textColor="@color/widgetSummaryText"
|
||||
android:textSize="12.7sp"
|
||||
tools:text="Net" />
|
||||
android:layout_below="@id/widget_disk_label"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
|
||||
</LinearLayout>
|
||||
<ImageView
|
||||
android:layout_width="17dp"
|
||||
android:layout_height="17dp"
|
||||
android:src="@drawable/net_24">
|
||||
</ImageView>
|
||||
|
||||
</RelativeLayout>
|
||||
<TextView
|
||||
android:id="@+id/widget_net"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="11dp"
|
||||
android:maxLines="1"
|
||||
android:textColor="@color/widgetSummaryText"
|
||||
android:textSize="12.7sp"
|
||||
tools:text="Net" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<!-- Add a TextView for error messages -->
|
||||
<TextView
|
||||
android:id="@+id/error_message"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/widget_name"
|
||||
android:textColor="@color/widgetSummaryText"
|
||||
android:textSize="12sp"
|
||||
android:visibility="gone"
|
||||
android:alpha="0"
|
||||
android:animateLayoutChanges="true"
|
||||
tools:text="Error message" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/widget_time"
|
||||
@@ -143,6 +170,8 @@
|
||||
android:maxLines="2"
|
||||
android:textColor="@color/widgetSummaryText"
|
||||
android:textSize="11sp"
|
||||
android:alpha="0"
|
||||
android:animateLayoutChanges="true"
|
||||
tools:text="UpdateTime" />
|
||||
|
||||
</RelativeLayout>
|
||||
4
android/app/src/main/res/values/strings.xml
Normal file
4
android/app/src/main/res/values/strings.xml
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">ServerBox</string>
|
||||
</resources>
|
||||
@@ -1,3 +1,6 @@
|
||||
org.gradle.jvmargs=-Xmx4G
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
||||
android.defaults.buildfeatures.buildconfig=true
|
||||
android.nonTransitiveRClass=false
|
||||
android.nonFinalResIds=false
|
||||
|
||||
@@ -2,5 +2,4 @@ distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip
|
||||
distributionSha256Sum=6001aba9b2204d26fa25a5800bb9382cf3ee01ccb78fe77317b2872336eb2f80
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip
|
||||
|
||||
@@ -19,7 +19,7 @@ pluginManagement {
|
||||
|
||||
plugins {
|
||||
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
||||
id "com.android.application" version "7.4.2" apply false
|
||||
id "com.android.application" version '8.6.0' apply false
|
||||
id "org.jetbrains.kotlin.android" version "1.8.10" apply false
|
||||
}
|
||||
|
||||
|
||||
13
distribute_options.yaml
Normal file
13
distribute_options.yaml
Normal file
@@ -0,0 +1,13 @@
|
||||
variables:
|
||||
output: dist/
|
||||
releases:
|
||||
- name: linux
|
||||
jobs:
|
||||
- name: release-linux-deb
|
||||
package:
|
||||
platform: linux
|
||||
target: deb
|
||||
- name: release-linux-rpm
|
||||
package:
|
||||
platform: linux
|
||||
target: rpm
|
||||
@@ -6,13 +6,21 @@ PODS:
|
||||
- file_picker (0.0.1):
|
||||
- Flutter
|
||||
- Flutter (1.0.0)
|
||||
- flutter_native_splash (0.0.1):
|
||||
- flutter_inappwebview_ios (0.0.1):
|
||||
- Flutter
|
||||
- flutter_inappwebview_ios/Core (= 0.0.1)
|
||||
- OrderedSet (~> 6.0.3)
|
||||
- flutter_inappwebview_ios/Core (0.0.1):
|
||||
- Flutter
|
||||
- OrderedSet (~> 6.0.3)
|
||||
- flutter_native_splash (2.4.3):
|
||||
- Flutter
|
||||
- icloud_storage (0.0.1):
|
||||
- Flutter
|
||||
- local_auth_darwin (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- OrderedSet (6.0.3)
|
||||
- package_info_plus (0.4.5):
|
||||
- Flutter
|
||||
- path_provider_foundation (0.0.1):
|
||||
@@ -31,14 +39,13 @@ PODS:
|
||||
- Flutter
|
||||
- watch_connectivity (0.0.1):
|
||||
- Flutter
|
||||
- webview_flutter_wkwebview (0.0.1):
|
||||
- Flutter
|
||||
|
||||
DEPENDENCIES:
|
||||
- app_links (from `.symlinks/plugins/app_links/ios`)
|
||||
- camera_avfoundation (from `.symlinks/plugins/camera_avfoundation/ios`)
|
||||
- file_picker (from `.symlinks/plugins/file_picker/ios`)
|
||||
- Flutter (from `Flutter`)
|
||||
- flutter_inappwebview_ios (from `.symlinks/plugins/flutter_inappwebview_ios/ios`)
|
||||
- flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`)
|
||||
- icloud_storage (from `.symlinks/plugins/icloud_storage/ios`)
|
||||
- local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`)
|
||||
@@ -50,7 +57,10 @@ DEPENDENCIES:
|
||||
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
|
||||
- wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`)
|
||||
- watch_connectivity (from `.symlinks/plugins/watch_connectivity/ios`)
|
||||
- webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`)
|
||||
|
||||
SPEC REPOS:
|
||||
trunk:
|
||||
- OrderedSet
|
||||
|
||||
EXTERNAL SOURCES:
|
||||
app_links:
|
||||
@@ -61,6 +71,8 @@ EXTERNAL SOURCES:
|
||||
:path: ".symlinks/plugins/file_picker/ios"
|
||||
Flutter:
|
||||
:path: Flutter
|
||||
flutter_inappwebview_ios:
|
||||
:path: ".symlinks/plugins/flutter_inappwebview_ios/ios"
|
||||
flutter_native_splash:
|
||||
:path: ".symlinks/plugins/flutter_native_splash/ios"
|
||||
icloud_storage:
|
||||
@@ -83,27 +95,26 @@ EXTERNAL SOURCES:
|
||||
:path: ".symlinks/plugins/wakelock_plus/ios"
|
||||
watch_connectivity:
|
||||
:path: ".symlinks/plugins/watch_connectivity/ios"
|
||||
webview_flutter_wkwebview:
|
||||
:path: ".symlinks/plugins/webview_flutter_wkwebview/ios"
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
app_links: e7a6750a915a9e161c58d91bc610e8cd1d4d0ad0
|
||||
camera_avfoundation: dd002b0330f4981e1bbcb46ae9b62829237459a4
|
||||
file_picker: c79185e70b9b45728cde2a8d8da454e0cb43f287
|
||||
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
|
||||
flutter_native_splash: edf599c81f74d093a4daf8e17bd7a018854bc778
|
||||
flutter_inappwebview_ios: 6f63631e2c62a7c350263b13fa5427aedefe81d4
|
||||
flutter_native_splash: e8a1e01082d97a8099d973f919f57904c925008a
|
||||
icloud_storage: d9ac7a33ced81df08ba7ea1bf3099cc0ee58f60a
|
||||
local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3
|
||||
package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c
|
||||
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
|
||||
package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4
|
||||
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
|
||||
plain_notification_token: b36467dc91939a7b6754267c701bbaca14996ee1
|
||||
share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad
|
||||
share_plus: 8b6f8b3447e494cca5317c8c3073de39b3600d1f
|
||||
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
|
||||
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
|
||||
wakelock_plus: 78ec7c5b202cab7761af8e2b2b3d0671be6c4ae1
|
||||
watch_connectivity: 715eb484685e05846eab74795348a44bb2809b82
|
||||
webview_flutter_wkwebview: 2a23822e9039b7b1bc52e5add778e5d89ad488d1
|
||||
|
||||
PODFILE CHECKSUM: ec6ef69056f066e8b21a3391082f23b5ad2d37f8
|
||||
|
||||
COCOAPODS: 1.15.2
|
||||
COCOAPODS: 1.16.2
|
||||
|
||||
@@ -672,7 +672,7 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||
CURRENT_PROJECT_VERSION = 1104;
|
||||
CURRENT_PROJECT_VERSION = 1128;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
||||
@@ -682,7 +682,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.1104;
|
||||
MARKETING_VERSION = 1.0.1128;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
@@ -808,7 +808,7 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||
CURRENT_PROJECT_VERSION = 1104;
|
||||
CURRENT_PROJECT_VERSION = 1128;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
||||
@@ -818,7 +818,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.1104;
|
||||
MARKETING_VERSION = 1.0.1128;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
@@ -836,7 +836,7 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||
CURRENT_PROJECT_VERSION = 1104;
|
||||
CURRENT_PROJECT_VERSION = 1128;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = "Runner/Info-$(CONFIGURATION).plist";
|
||||
@@ -846,7 +846,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.1104;
|
||||
MARKETING_VERSION = 1.0.1128;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
@@ -867,7 +867,7 @@
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1104;
|
||||
CURRENT_PROJECT_VERSION = 1128;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -880,7 +880,7 @@
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.1104;
|
||||
MARKETING_VERSION = 1.0.1128;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
||||
@@ -906,7 +906,7 @@
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1104;
|
||||
CURRENT_PROJECT_VERSION = 1128;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -919,7 +919,7 @@
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.1104;
|
||||
MARKETING_VERSION = 1.0.1128;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
@@ -942,7 +942,7 @@
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1104;
|
||||
CURRENT_PROJECT_VERSION = 1128;
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -955,7 +955,7 @@
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.1104;
|
||||
MARKETING_VERSION = 1.0.1128;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.StatusWidget;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
@@ -978,7 +978,7 @@
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1104;
|
||||
CURRENT_PROJECT_VERSION = 1128;
|
||||
DEVELOPMENT_ASSET_PATHS = "";
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
@@ -990,7 +990,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.1104;
|
||||
MARKETING_VERSION = 1.0.1128;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
|
||||
@@ -1019,7 +1019,7 @@
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1104;
|
||||
CURRENT_PROJECT_VERSION = 1128;
|
||||
DEVELOPMENT_ASSET_PATHS = "";
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
@@ -1031,7 +1031,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.1104;
|
||||
MARKETING_VERSION = 1.0.1128;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
|
||||
PRODUCT_NAME = ServerBox;
|
||||
@@ -1057,7 +1057,7 @@
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1104;
|
||||
CURRENT_PROJECT_VERSION = 1128;
|
||||
DEVELOPMENT_ASSET_PATHS = "";
|
||||
DEVELOPMENT_TEAM = BA88US33G6;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
@@ -1069,7 +1069,7 @@
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.1104;
|
||||
MARKETING_VERSION = 1.0.1128;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lollipopkit.toolbox.WatchEnd;
|
||||
PRODUCT_NAME = ServerBox;
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
arb-dir: lib/l10n
|
||||
template-arb-file: app_en.arb
|
||||
output-localization-file: l10n.dart
|
||||
output-dir: lib/generated/l10n
|
||||
synthetic-package: false
|
||||
untranslated-messages-file: untranlated.json
|
||||
@@ -1,12 +1,13 @@
|
||||
import 'package:dynamic_color/dynamic_color.dart';
|
||||
import 'package:fl_lib/fl_lib.dart';
|
||||
import 'package:fl_lib/l10n/gen_l10n/lib_l10n.dart';
|
||||
import 'package:fl_lib/generated/l10n/lib_l10n.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||
|
||||
import 'package:server_box/core/extension/context/locale.dart';
|
||||
import 'package:server_box/data/res/build_data.dart';
|
||||
import 'package:server_box/data/res/rebuild.dart';
|
||||
import 'package:server_box/data/res/store.dart';
|
||||
import 'package:server_box/generated/l10n/l10n.dart';
|
||||
import 'package:server_box/view/page/home/home.dart';
|
||||
import 'package:icons_plus/icons_plus.dart';
|
||||
|
||||
|
||||
27
lib/core/chan.dart
Normal file
27
lib/core/chan.dart
Normal file
@@ -0,0 +1,27 @@
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:server_box/data/res/misc.dart';
|
||||
|
||||
abstract final class MethodChans {
|
||||
static const _channel = MethodChannel('${Miscs.pkgName}/main_chan');
|
||||
|
||||
static void moveToBg() {
|
||||
_channel.invokeMethod('sendToBackground');
|
||||
}
|
||||
|
||||
/// Issue #662
|
||||
static void startService() {
|
||||
// if (Stores.setting.fgService.fetch() != true) return;
|
||||
// _channel.invokeMethod('startService');
|
||||
}
|
||||
|
||||
/// Issue #662
|
||||
static void stopService() {
|
||||
// if (Stores.setting.fgService.fetch() != true) return;
|
||||
// _channel.invokeMethod('stopService');
|
||||
}
|
||||
|
||||
static void updateHomeWidget() async {
|
||||
//if (!Stores.setting.autoUpdateHomeWidget.fetch()) return;
|
||||
await _channel.invokeMethod('updateHomeWidget');
|
||||
}
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:server_box/data/res/misc.dart';
|
||||
|
||||
abstract final class BgRunMC {
|
||||
static const _channel = MethodChannel('${Miscs.pkgName}/app_retain');
|
||||
|
||||
static void moveToBg() {
|
||||
_channel.invokeMethod('sendToBackground');
|
||||
}
|
||||
|
||||
static void startService() {
|
||||
_channel.invokeMethod('startService');
|
||||
}
|
||||
|
||||
static void stopService() {
|
||||
_channel.invokeMethod('stopService');
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:server_box/data/res/misc.dart';
|
||||
import 'package:server_box/data/res/store.dart';
|
||||
|
||||
abstract final class HomeWidgetMC {
|
||||
static const _channel = MethodChannel('${Miscs.pkgName}/home_widget');
|
||||
|
||||
static void update() {
|
||||
if (!Stores.setting.autoUpdateHomeWidget.fetch()) return;
|
||||
_channel.invokeMethod('update');
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||
import 'package:flutter_gen/gen_l10n/l10n_en.dart';
|
||||
import 'package:server_box/generated/l10n/l10n.dart';
|
||||
import 'package:server_box/generated/l10n/l10n_en.dart';
|
||||
|
||||
AppLocalizations l10n = AppLocalizationsEn();
|
||||
|
||||
@@ -2,13 +2,19 @@ import 'dart:io';
|
||||
|
||||
import 'package:fl_lib/fl_lib.dart';
|
||||
import 'package:server_box/data/model/app/backup.dart';
|
||||
import 'package:server_box/data/store/no_backup.dart';
|
||||
|
||||
const bakSync = BakSyncer._();
|
||||
|
||||
final icloud = ICloud(containerId: 'iCloud.tech.lolli.serverbox');
|
||||
|
||||
final class BakSyncer extends SyncIface<Backup> {
|
||||
const BakSyncer._() : super();
|
||||
|
||||
@override
|
||||
void init() {
|
||||
Webdav.shared.prefix = 'serverbox/';
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> saveToFile() => Backup.backup();
|
||||
|
||||
@@ -19,21 +25,12 @@ final class BakSyncer extends SyncIface<Backup> {
|
||||
}
|
||||
|
||||
@override
|
||||
Future<RemoteStorage?> get remoteStorage async {
|
||||
if (isMacOS || isIOS) await icloud.init('iCloud.tech.lolli.serverbox');
|
||||
final settings = NoBackupStore.instance;
|
||||
await webdav.init(WebdavInitArgs(
|
||||
url: settings.webdavUrl.fetch(),
|
||||
user: settings.webdavUser.fetch(),
|
||||
pwd: settings.webdavPwd.fetch(),
|
||||
prefix: 'serverbox/',
|
||||
));
|
||||
|
||||
final icloudEnabled = settings.icloudSync.fetch();
|
||||
RemoteStorage? get remoteStorage {
|
||||
final icloudEnabled = PrefProps.icloudSync.get();
|
||||
if (icloudEnabled) return icloud;
|
||||
|
||||
final webdavEnabled = settings.webdavSync.fetch();
|
||||
if (webdavEnabled) return webdav;
|
||||
final webdavEnabled = PrefProps.webdavSync.get();
|
||||
if (webdavEnabled) return Webdav.shared;
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ enum GenSSHClientStatus {
|
||||
}
|
||||
|
||||
String getPrivateKey(String id) {
|
||||
final pki = Stores.key.get(id);
|
||||
final pki = Stores.key.fetchOne(id);
|
||||
if (pki == null) {
|
||||
throw SSHErr(
|
||||
type: SSHErrType.noPrivateKey,
|
||||
|
||||
@@ -46,19 +46,24 @@ class Backup implements Mergeable {
|
||||
|
||||
Map<String, dynamic> toJson() => _$BackupToJson(this);
|
||||
|
||||
Backup.loadFromStore()
|
||||
: version = backupFormatVersion,
|
||||
date = DateTime.now().toString().split('.').firstOrNull ?? '',
|
||||
spis = Stores.server.fetch(),
|
||||
snippets = Stores.snippet.fetch(),
|
||||
keys = Stores.key.fetch(),
|
||||
container = Stores.container.box.toJson(),
|
||||
lastModTime = Stores.lastModTime,
|
||||
history = Stores.history.box.toJson(),
|
||||
settings = Stores.setting.box.toJson();
|
||||
static Future<Backup> loadFromStore() async {
|
||||
final lastModTime = Stores.lastModTime?.millisecondsSinceEpoch;
|
||||
return Backup(
|
||||
version: backupFormatVersion,
|
||||
date: DateTime.now().toString().split('.').firstOrNull ?? '',
|
||||
spis: Stores.server.fetch(),
|
||||
snippets: Stores.snippet.fetch(),
|
||||
keys: Stores.key.fetch(),
|
||||
container: await Stores.container.getAllMap(),
|
||||
lastModTime: lastModTime,
|
||||
history: await Stores.history.getAllMap(),
|
||||
settings: await Stores.setting.getAllMap(),
|
||||
);
|
||||
}
|
||||
|
||||
static Future<String> backup([String? name]) async {
|
||||
final result = _diyEncrypt(json.encode(Backup.loadFromStore().toJson()));
|
||||
final bak = await Backup.loadFromStore();
|
||||
final result = _diyEncrypt(json.encode(bak.toJson()));
|
||||
final path = Paths.doc.joinPath(name ?? Miscs.bakFileName);
|
||||
await File(path).writeAsString(result);
|
||||
return path;
|
||||
@@ -66,7 +71,7 @@ class Backup implements Mergeable {
|
||||
|
||||
@override
|
||||
Future<void> merge({bool force = false}) async {
|
||||
final curTime = Stores.lastModTime ?? 0;
|
||||
final curTime = Stores.lastModTime?.millisecondsSinceEpoch ?? 0;
|
||||
final bakTime = lastModTime ?? 0;
|
||||
final shouldRestore = force || curTime < bakTime;
|
||||
if (!shouldRestore) {
|
||||
|
||||
@@ -2,7 +2,7 @@ import 'package:fl_lib/fl_lib.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:server_box/core/extension/context/locale.dart';
|
||||
import 'package:server_box/view/page/server/tab.dart';
|
||||
import 'package:server_box/view/page/setting/entry.dart';
|
||||
// import 'package:server_box/view/page/setting/entry.dart';
|
||||
import 'package:server_box/view/page/snippet/list.dart';
|
||||
import 'package:server_box/view/page/ssh/tab.dart';
|
||||
import 'package:icons_plus/icons_plus.dart';
|
||||
@@ -13,13 +13,13 @@ enum AppTab {
|
||||
ssh,
|
||||
file,
|
||||
snippet,
|
||||
settings,
|
||||
//settings,
|
||||
;
|
||||
|
||||
Widget get page {
|
||||
return switch (this) {
|
||||
server => const ServerPage(),
|
||||
settings => const SettingsPage(),
|
||||
//settings => const SettingsPage(),
|
||||
ssh => const SSHTabPage(),
|
||||
file => const LocalFilePage(),
|
||||
snippet => const SnippetListPage(),
|
||||
@@ -33,11 +33,11 @@ enum AppTab {
|
||||
label: l10n.server,
|
||||
selectedIcon: const Icon(BoxIcons.bxs_server),
|
||||
),
|
||||
settings => NavigationDestination(
|
||||
icon: const Icon(Icons.settings),
|
||||
label: libL10n.setting,
|
||||
selectedIcon: const Icon(Icons.settings),
|
||||
),
|
||||
// settings => NavigationDestination(
|
||||
// icon: const Icon(Icons.settings),
|
||||
// label: libL10n.setting,
|
||||
// selectedIcon: const Icon(Icons.settings),
|
||||
// ),
|
||||
ssh => const NavigationDestination(
|
||||
icon: Icon(Icons.terminal_outlined),
|
||||
label: 'SSH',
|
||||
|
||||
@@ -22,8 +22,6 @@ enum PkgManager {
|
||||
return 'opkg list-upgradable';
|
||||
case PkgManager.apk:
|
||||
return 'apk list --upgradable';
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,8 +54,6 @@ enum PkgManager {
|
||||
return 'opkg upgrade $args';
|
||||
case PkgManager.apk:
|
||||
return 'apk upgrade';
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -104,7 +104,9 @@ class DiskIO extends TimeSeq<List<DiskIOPiece>> {
|
||||
!item.dev.startsWith('vd') &&
|
||||
!item.dev.startsWith('hd') &&
|
||||
!item.dev.startsWith('mmcblk') &&
|
||||
!item.dev.startsWith('sr')) continue;
|
||||
!item.dev.startsWith('sr')) {
|
||||
continue;
|
||||
}
|
||||
final (read_, write_) = _getSpeed(item.dev);
|
||||
read += read_ ?? 0;
|
||||
write += write_ ?? 0;
|
||||
|
||||
@@ -36,7 +36,7 @@ class _AbsolutePath {
|
||||
_path = newPath;
|
||||
return;
|
||||
}
|
||||
_path = _path.joinPath(newPath, seperator: _sep);
|
||||
_path = _path.joinPath(newPath, separator: _sep);
|
||||
}
|
||||
|
||||
bool undo() {
|
||||
|
||||
@@ -21,7 +21,7 @@ class SftpReq {
|
||||
}
|
||||
if (spi.jumpId != null) {
|
||||
jumpSpi = Stores.server.box.get(spi.jumpId);
|
||||
jumpPrivateKey = Stores.key.get(jumpSpi?.keyId)?.key;
|
||||
jumpPrivateKey = Stores.key.fetchOne(jumpSpi?.keyId)?.key;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,8 +60,6 @@ Future<void> isolateMessageHandler(
|
||||
case SftpReqType.upload:
|
||||
await _upload(data, mainSendPort, sendError);
|
||||
break;
|
||||
default:
|
||||
sendError(Exception('unknown type'));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -75,7 +75,30 @@ enum VirtKey {
|
||||
colon,
|
||||
@HiveField(31)
|
||||
semicolon,
|
||||
;
|
||||
@HiveField(32)
|
||||
f1,
|
||||
@HiveField(33)
|
||||
f2,
|
||||
@HiveField(34)
|
||||
f3,
|
||||
@HiveField(35)
|
||||
f4,
|
||||
@HiveField(36)
|
||||
f5,
|
||||
@HiveField(37)
|
||||
f6,
|
||||
@HiveField(38)
|
||||
f7,
|
||||
@HiveField(39)
|
||||
f8,
|
||||
@HiveField(40)
|
||||
f9,
|
||||
@HiveField(41)
|
||||
f10,
|
||||
@HiveField(42)
|
||||
f11,
|
||||
@HiveField(43)
|
||||
f12;
|
||||
}
|
||||
|
||||
extension VirtKeyX on VirtKey {
|
||||
@@ -146,6 +169,18 @@ extension VirtKeyX on VirtKey {
|
||||
VirtKey.right => TerminalKey.arrowRight,
|
||||
VirtKey.pgup => TerminalKey.pageUp,
|
||||
VirtKey.pgdn => TerminalKey.pageDown,
|
||||
VirtKey.f1 => TerminalKey.f1,
|
||||
VirtKey.f2 => TerminalKey.f2,
|
||||
VirtKey.f3 => TerminalKey.f3,
|
||||
VirtKey.f4 => TerminalKey.f4,
|
||||
VirtKey.f5 => TerminalKey.f5,
|
||||
VirtKey.f6 => TerminalKey.f6,
|
||||
VirtKey.f7 => TerminalKey.f7,
|
||||
VirtKey.f8 => TerminalKey.f8,
|
||||
VirtKey.f9 => TerminalKey.f9,
|
||||
VirtKey.f10 => TerminalKey.f10,
|
||||
VirtKey.f11 => TerminalKey.f11,
|
||||
VirtKey.f12 => TerminalKey.f12,
|
||||
_ => null,
|
||||
};
|
||||
|
||||
|
||||
@@ -77,6 +77,30 @@ class VirtKeyAdapter extends TypeAdapter<VirtKey> {
|
||||
return VirtKey.colon;
|
||||
case 31:
|
||||
return VirtKey.semicolon;
|
||||
case 32:
|
||||
return VirtKey.f1;
|
||||
case 33:
|
||||
return VirtKey.f2;
|
||||
case 34:
|
||||
return VirtKey.f3;
|
||||
case 35:
|
||||
return VirtKey.f4;
|
||||
case 36:
|
||||
return VirtKey.f5;
|
||||
case 37:
|
||||
return VirtKey.f6;
|
||||
case 38:
|
||||
return VirtKey.f7;
|
||||
case 39:
|
||||
return VirtKey.f8;
|
||||
case 40:
|
||||
return VirtKey.f9;
|
||||
case 41:
|
||||
return VirtKey.f10;
|
||||
case 42:
|
||||
return VirtKey.f11;
|
||||
case 43:
|
||||
return VirtKey.f12;
|
||||
default:
|
||||
return VirtKey.esc;
|
||||
}
|
||||
@@ -181,6 +205,42 @@ class VirtKeyAdapter extends TypeAdapter<VirtKey> {
|
||||
case VirtKey.semicolon:
|
||||
writer.writeByte(31);
|
||||
break;
|
||||
case VirtKey.f1:
|
||||
writer.writeByte(32);
|
||||
break;
|
||||
case VirtKey.f2:
|
||||
writer.writeByte(33);
|
||||
break;
|
||||
case VirtKey.f3:
|
||||
writer.writeByte(34);
|
||||
break;
|
||||
case VirtKey.f4:
|
||||
writer.writeByte(35);
|
||||
break;
|
||||
case VirtKey.f5:
|
||||
writer.writeByte(36);
|
||||
break;
|
||||
case VirtKey.f6:
|
||||
writer.writeByte(37);
|
||||
break;
|
||||
case VirtKey.f7:
|
||||
writer.writeByte(38);
|
||||
break;
|
||||
case VirtKey.f8:
|
||||
writer.writeByte(39);
|
||||
break;
|
||||
case VirtKey.f9:
|
||||
writer.writeByte(40);
|
||||
break;
|
||||
case VirtKey.f10:
|
||||
writer.writeByte(41);
|
||||
break;
|
||||
case VirtKey.f11:
|
||||
writer.writeByte(42);
|
||||
break;
|
||||
case VirtKey.f12:
|
||||
writer.writeByte(43);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -210,12 +210,10 @@ class ServerProvider extends Provider {
|
||||
Stores.setting.serverOrder.put(serverOrder.value);
|
||||
Stores.server.deleteAll();
|
||||
_updateTags();
|
||||
bakSync.sync(milliDelay: 1000);
|
||||
}
|
||||
|
||||
static Future<void> updateServer(
|
||||
Spi old,
|
||||
Spi newSpi,
|
||||
) async {
|
||||
static Future<void> updateServer(Spi old, Spi newSpi) async {
|
||||
if (old != newSpi) {
|
||||
Stores.server.update(old, newSpi);
|
||||
servers[old.id]?.value.spi = newSpi;
|
||||
@@ -236,7 +234,7 @@ class ServerProvider extends Provider {
|
||||
}
|
||||
}
|
||||
_updateTags();
|
||||
bakSync.sync();
|
||||
bakSync.sync(milliDelay: 1000);
|
||||
}
|
||||
|
||||
static void _setServerState(VNode<Server> s, ServerConn ss) {
|
||||
|
||||
@@ -3,6 +3,6 @@
|
||||
|
||||
abstract class BuildData {
|
||||
static const String name = "ServerBox";
|
||||
static const int build = 1104;
|
||||
static const int script = 58;
|
||||
static const int build = 1128;
|
||||
static const int script = 59;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import 'package:fl_lib/fl_lib.dart';
|
||||
import 'package:server_box/data/store/container.dart';
|
||||
import 'package:server_box/data/store/history.dart';
|
||||
import 'package:server_box/data/store/no_backup.dart';
|
||||
import 'package:server_box/data/store/private_key.dart';
|
||||
import 'package:server_box/data/store/server.dart';
|
||||
import 'package:server_box/data/store/setting.dart';
|
||||
@@ -16,7 +15,7 @@ abstract final class Stores {
|
||||
static final history = HistoryStore.instance;
|
||||
|
||||
/// All stores that need backup
|
||||
static final List<PersistentStore> _allBackup = [
|
||||
static final List<HiveStore> _allBackup = [
|
||||
SettingStore.instance,
|
||||
ServerStore.instance,
|
||||
ContainerStore.instance,
|
||||
@@ -27,14 +26,18 @@ abstract final class Stores {
|
||||
|
||||
static Future<void> init() async {
|
||||
await Future.wait(_allBackup.map((store) => store.init()));
|
||||
await NoBackupStore.instance.init();
|
||||
}
|
||||
|
||||
static int? get lastModTime {
|
||||
int? lastModTime = 0;
|
||||
static DateTime? get lastModTime {
|
||||
DateTime? lastModTime;
|
||||
for (final store in _allBackup) {
|
||||
final last = store.box.lastModified ?? 0;
|
||||
if (last > (lastModTime ?? 0)) {
|
||||
final last = store.lastUpdateTs;
|
||||
if (last == null) {
|
||||
continue;
|
||||
}
|
||||
if (lastModTime == null) {
|
||||
lastModTime = last;
|
||||
} else if (last.isAfter(lastModTime)) {
|
||||
lastModTime = last;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ import 'package:server_box/data/res/store.dart';
|
||||
|
||||
const _keyConfig = 'providerConfig';
|
||||
|
||||
class ContainerStore extends PersistentStore {
|
||||
class ContainerStore extends HiveStore {
|
||||
ContainerStore._() : super('docker');
|
||||
|
||||
static final instance = ContainerStore._();
|
||||
@@ -15,7 +15,7 @@ class ContainerStore extends PersistentStore {
|
||||
|
||||
void put(String id, String host) {
|
||||
box.put(id, host);
|
||||
box.updateLastModified();
|
||||
updateLastUpdateTs();
|
||||
}
|
||||
|
||||
ContainerType getType([String id = '']) {
|
||||
@@ -30,7 +30,7 @@ class ContainerStore extends PersistentStore {
|
||||
}
|
||||
|
||||
ContainerType get defaultType {
|
||||
if (Stores.setting.usePodman.fetch()) return ContainerType.podman;
|
||||
if (Stores.setting.usePodman.get()) return ContainerType.podman;
|
||||
return ContainerType.docker;
|
||||
}
|
||||
|
||||
@@ -40,6 +40,6 @@ class ContainerStore extends PersistentStore {
|
||||
} else {
|
||||
box.put(_keyConfig + id, type.toString());
|
||||
}
|
||||
box.updateLastModified();
|
||||
updateLastUpdateTs();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,7 +18,6 @@ class _ListHistory {
|
||||
_history.remove(path);
|
||||
_history.insert(0, path);
|
||||
_box.put(_name, _history);
|
||||
_box.updateLastModified();
|
||||
}
|
||||
|
||||
List get all => _history;
|
||||
@@ -39,13 +38,12 @@ class _MapHistory {
|
||||
void put(String id, String val) {
|
||||
_history[id] = val;
|
||||
_box.put(_name, _history);
|
||||
_box.updateLastModified();
|
||||
}
|
||||
|
||||
String? fetch(String id) => _history[id];
|
||||
}
|
||||
|
||||
class HistoryStore extends PersistentStore {
|
||||
class HistoryStore extends HiveStore {
|
||||
HistoryStore._() : super('history');
|
||||
|
||||
static final instance = HistoryStore._();
|
||||
@@ -58,5 +56,6 @@ class HistoryStore extends PersistentStore {
|
||||
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);
|
||||
late final writeScriptTipShown =
|
||||
propertyDefault('writeScriptTipShown', false);
|
||||
}
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
import 'package:fl_lib/fl_lib.dart';
|
||||
import 'package:server_box/data/res/build_data.dart';
|
||||
import 'package:server_box/data/res/store.dart';
|
||||
|
||||
final class NoBackupStore extends PersistentStore {
|
||||
NoBackupStore._() : super('no_backup');
|
||||
|
||||
static final instance = NoBackupStore._();
|
||||
|
||||
/// Only valid on iOS and macOS
|
||||
late final icloudSync = property('icloudSync', false);
|
||||
|
||||
/// Webdav sync
|
||||
late final webdavSync = property('webdavSync', false);
|
||||
late final webdavUrl = property('webdavUrl', '');
|
||||
late final webdavUser = property('webdavUser', '');
|
||||
late final webdavPwd = property('webdavPwd', '');
|
||||
|
||||
void migrate() {
|
||||
if (BuildData.build > 1076) return;
|
||||
|
||||
final settings = Stores.setting;
|
||||
final icloudSync_ = settings.box.get('icloudSync');
|
||||
if (icloudSync_ is bool) {
|
||||
icloudSync.put(icloudSync_);
|
||||
settings.box.delete('icloudSync');
|
||||
}
|
||||
final webdavSync_ = settings.box.get('webdavSync');
|
||||
if (webdavSync_ is bool) {
|
||||
webdavSync.put(webdavSync_);
|
||||
settings.box.delete('webdavSync');
|
||||
}
|
||||
final webdavUrl_ = settings.box.get('webdavUrl');
|
||||
if (webdavUrl_ is String) {
|
||||
webdavUrl.put(webdavUrl_);
|
||||
settings.box.delete('webdavUrl');
|
||||
}
|
||||
final webdavUser_ = settings.box.get('webdavUser');
|
||||
if (webdavUser_ is String) {
|
||||
webdavUser.put(webdavUser_);
|
||||
settings.box.delete('webdavUser');
|
||||
}
|
||||
final webdavPwd_ = settings.box.get('webdavPwd');
|
||||
if (webdavPwd_ is String) {
|
||||
webdavPwd.put(webdavPwd_);
|
||||
settings.box.delete('webdavPwd');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,14 +2,13 @@ import 'package:fl_lib/fl_lib.dart';
|
||||
|
||||
import 'package:server_box/data/model/server/private_key_info.dart';
|
||||
|
||||
class PrivateKeyStore extends PersistentStore {
|
||||
class PrivateKeyStore extends HiveStore {
|
||||
PrivateKeyStore._() : super('key');
|
||||
|
||||
static final instance = PrivateKeyStore._();
|
||||
|
||||
void put(PrivateKeyInfo info) {
|
||||
box.put(info.id, info);
|
||||
box.updateLastModified();
|
||||
set(info.id, info);
|
||||
}
|
||||
|
||||
List<PrivateKeyInfo> fetch() {
|
||||
@@ -24,13 +23,12 @@ class PrivateKeyStore extends PersistentStore {
|
||||
return ps;
|
||||
}
|
||||
|
||||
PrivateKeyInfo? get(String? id) {
|
||||
PrivateKeyInfo? fetchOne(String? id) {
|
||||
if (id == null) return null;
|
||||
return box.get(id);
|
||||
}
|
||||
|
||||
void delete(PrivateKeyInfo s) {
|
||||
box.delete(s.id);
|
||||
box.updateLastModified();
|
||||
remove(s.id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,14 +2,15 @@ import 'package:fl_lib/fl_lib.dart';
|
||||
|
||||
import 'package:server_box/data/model/server/server_private_info.dart';
|
||||
|
||||
class ServerStore extends PersistentStore {
|
||||
class ServerStore extends HiveStore {
|
||||
ServerStore._() : super('server');
|
||||
|
||||
static final instance = ServerStore._();
|
||||
|
||||
void put(Spi info) {
|
||||
box.put(info.id, info);
|
||||
box.updateLastModified();
|
||||
// box.put(info.id, info);
|
||||
// box.updateLastModified();
|
||||
set(info.id, info);
|
||||
}
|
||||
|
||||
List<Spi> fetch() {
|
||||
@@ -25,13 +26,11 @@ class ServerStore extends PersistentStore {
|
||||
}
|
||||
|
||||
void delete(String id) {
|
||||
box.delete(id);
|
||||
box.updateLastModified();
|
||||
remove(id);
|
||||
}
|
||||
|
||||
void deleteAll() {
|
||||
box.clear();
|
||||
box.updateLastModified();
|
||||
clear();
|
||||
}
|
||||
|
||||
void update(Spi old, Spi newInfo) {
|
||||
|
||||
@@ -6,7 +6,7 @@ import 'package:server_box/data/model/ssh/virtual_key.dart';
|
||||
import 'package:server_box/data/model/app/net_view.dart';
|
||||
import 'package:server_box/data/res/default.dart';
|
||||
|
||||
class SettingStore extends PersistentStore {
|
||||
class SettingStore extends HiveStore {
|
||||
SettingStore._() : super('setting');
|
||||
|
||||
static final instance = SettingStore._();
|
||||
@@ -18,19 +18,19 @@ class SettingStore extends PersistentStore {
|
||||
// item in the drawer of the home page)
|
||||
|
||||
/// Discussion #146
|
||||
late final serverTabUseOldUI = property('serverTabUseOldUI', false);
|
||||
late final serverTabUseOldUI = propertyDefault('serverTabUseOldUI', false);
|
||||
|
||||
/// Time out for server connect and more...
|
||||
late final timeout = property('timeOut', 5);
|
||||
late final timeout = propertyDefault('timeOut', 5);
|
||||
|
||||
/// Record history of SFTP path and etc.
|
||||
late final recordHistory = property('recordHistory', true);
|
||||
late final recordHistory = propertyDefault('recordHistory', true);
|
||||
|
||||
/// Lanch page idx
|
||||
// late final launchPage = property('launchPage', Defaults.launchPageIdx);
|
||||
|
||||
/// Disk view: amount / IO
|
||||
late final serverTabPreferDiskAmount = property(
|
||||
late final serverTabPreferDiskAmount = propertyDefault(
|
||||
'serverTabPreferDiskAmount',
|
||||
false,
|
||||
);
|
||||
@@ -40,59 +40,60 @@ class SettingStore extends PersistentStore {
|
||||
/// Bigger for bigger font size
|
||||
/// 1.0 means 100%
|
||||
/// Warning: This may cause some UI issues
|
||||
late final textFactor = property('textFactor', 1.0);
|
||||
late final textFactor = propertyDefault('textFactor', 1.0);
|
||||
|
||||
/// The seed of color scheme
|
||||
late final colorSeed = property('primaryColor', 4287106639);
|
||||
late final colorSeed = propertyDefault('primaryColor', 4287106639);
|
||||
|
||||
late final serverStatusUpdateInterval = property(
|
||||
late final serverStatusUpdateInterval = propertyDefault(
|
||||
'serverStatusUpdateInterval',
|
||||
Defaults.updateInterval,
|
||||
);
|
||||
|
||||
// Max retry count when connect to server
|
||||
late final maxRetryCount = property('maxRetryCount', 2);
|
||||
late final maxRetryCount = propertyDefault('maxRetryCount', 2);
|
||||
|
||||
// Night mode: 0 -> auto, 1 -> light, 2 -> dark, 3 -> AMOLED, 4 -> AUTO-AMOLED
|
||||
late final themeMode = property('themeMode', 0);
|
||||
late final themeMode = propertyDefault('themeMode', 0);
|
||||
|
||||
// Font file path
|
||||
late final fontPath = property('fontPath', '');
|
||||
late final fontPath = propertyDefault('fontPath', '');
|
||||
|
||||
// Backgroud running (Android)
|
||||
late final bgRun = property('bgRun', isAndroid);
|
||||
late final bgRun = propertyDefault('bgRun', isAndroid);
|
||||
|
||||
// Server order
|
||||
late final serverOrder = listProperty<String>('serverOrder', []);
|
||||
late final serverOrder = propertyDefault<List<String>>('serverOrder', []);
|
||||
|
||||
late final snippetOrder = listProperty<String>('snippetOrder', []);
|
||||
late final snippetOrder = propertyDefault<List<String>>('snippetOrder', []);
|
||||
|
||||
// Server details page cards order
|
||||
late final detailCardOrder = listProperty(
|
||||
late final detailCardOrder = propertyDefault(
|
||||
'detailCardOrder',
|
||||
ServerDetailCards.values.map((e) => e.name).toList(),
|
||||
);
|
||||
|
||||
// SSH term font size
|
||||
late final termFontSize = property('termFontSize', 13.0);
|
||||
late final termFontSize = propertyDefault('termFontSize', 13.0);
|
||||
|
||||
// Locale
|
||||
late final locale = property('locale', '');
|
||||
late final locale = propertyDefault('locale', '');
|
||||
|
||||
// SSH virtual key (ctrl | alt) auto turn off
|
||||
late final sshVirtualKeyAutoOff = property('sshVirtualKeyAutoOff', true);
|
||||
late final sshVirtualKeyAutoOff =
|
||||
propertyDefault('sshVirtualKeyAutoOff', true);
|
||||
|
||||
late final editorFontSize = property('editorFontSize', 12.5);
|
||||
late final editorFontSize = propertyDefault('editorFontSize', 12.5);
|
||||
|
||||
// Editor theme
|
||||
late final editorTheme = property('editorTheme', Defaults.editorTheme);
|
||||
late final editorTheme = propertyDefault('editorTheme', Defaults.editorTheme);
|
||||
|
||||
late final editorDarkTheme =
|
||||
property('editorDarkTheme', Defaults.editorDarkTheme);
|
||||
propertyDefault('editorDarkTheme', Defaults.editorDarkTheme);
|
||||
|
||||
late final fullScreen = property('fullScreen', false);
|
||||
late final fullScreen = propertyDefault('fullScreen', false);
|
||||
|
||||
late final fullScreenJitter = property('fullScreenJitter', true);
|
||||
late final fullScreenJitter = propertyDefault('fullScreenJitter', true);
|
||||
|
||||
// late final fullScreenRotateQuarter = property(
|
||||
// 'fullScreenRotateQuarter',
|
||||
@@ -104,140 +105,151 @@ class SettingStore extends PersistentStore {
|
||||
// TextInputType.text.index,
|
||||
// );
|
||||
|
||||
late final sshVirtKeys = listProperty(
|
||||
late final sshVirtKeys = propertyDefault(
|
||||
'sshVirtKeys',
|
||||
VirtKeyX.defaultOrder.map((e) => e.index).toList(),
|
||||
);
|
||||
|
||||
late final netViewType = property('netViewType', NetViewType.speed);
|
||||
late final netViewType = propertyDefault('netViewType', NetViewType.speed);
|
||||
|
||||
// Only valid on iOS
|
||||
late final autoUpdateHomeWidget = property('autoUpdateHomeWidget', isIOS);
|
||||
late final autoUpdateHomeWidget =
|
||||
propertyDefault('autoUpdateHomeWidget', isIOS);
|
||||
|
||||
late final autoCheckAppUpdate = property('autoCheckAppUpdate', true);
|
||||
late final autoCheckAppUpdate = propertyDefault('autoCheckAppUpdate', true);
|
||||
|
||||
/// Display server tab function buttons on the bottom of each server card if [true]
|
||||
///
|
||||
/// Otherwise, display them on the top of server detail page
|
||||
late final moveServerFuncs = property('moveOutServerTabFuncBtns', false);
|
||||
late final moveServerFuncs =
|
||||
propertyDefault('moveOutServerTabFuncBtns', false);
|
||||
|
||||
/// Whether use `rm -r` to delete directory on SFTP
|
||||
late final sftpRmrDir = property('sftpRmrDir', false);
|
||||
late final sftpRmrDir = propertyDefault('sftpRmrDir', false);
|
||||
|
||||
/// Whether use system's primary color as the app's primary color
|
||||
late final useSystemPrimaryColor = property('useSystemPrimaryColor', false);
|
||||
late final useSystemPrimaryColor =
|
||||
propertyDefault('useSystemPrimaryColor', false);
|
||||
|
||||
/// Only valid on iOS / Android / Windows
|
||||
late final useBioAuth = property('useBioAuth', false);
|
||||
late final useBioAuth = propertyDefault('useBioAuth', false);
|
||||
|
||||
/// The performance of highlight is bad
|
||||
late final editorHighlight = property('editorHighlight', true);
|
||||
late final editorHighlight = propertyDefault('editorHighlight', true);
|
||||
|
||||
/// Open SFTP with last viewed path
|
||||
late final sftpOpenLastPath = property('sftpOpenLastPath', true);
|
||||
late final sftpOpenLastPath = propertyDefault('sftpOpenLastPath', true);
|
||||
|
||||
/// Show folders first in SFTP file browser
|
||||
late final sftpShowFoldersFirst = property('sftpShowFoldersFirst', true);
|
||||
late final sftpShowFoldersFirst =
|
||||
propertyDefault('sftpShowFoldersFirst', true);
|
||||
|
||||
/// Show tip of suspend
|
||||
late final showSuspendTip = property('showSuspendTip', true);
|
||||
late final showSuspendTip = propertyDefault('showSuspendTip', true);
|
||||
|
||||
/// Whether collapse UI items by default
|
||||
late final collapseUIDefault = property('collapseUIDefault', true);
|
||||
late final collapseUIDefault = propertyDefault('collapseUIDefault', true);
|
||||
|
||||
late final serverFuncBtns = listProperty(
|
||||
late final serverFuncBtns = propertyDefault(
|
||||
'serverBtns',
|
||||
ServerFuncBtn.defaultIdxs,
|
||||
);
|
||||
|
||||
/// Docker is more popular than podman, set to `false` to use docker
|
||||
late final usePodman = property('usePodman', false);
|
||||
late final usePodman = propertyDefault('usePodman', false);
|
||||
|
||||
/// Try to use `sudo` to run docker command
|
||||
late final containerTrySudo = property('containerTrySudo', true);
|
||||
late final containerTrySudo = propertyDefault('containerTrySudo', true);
|
||||
|
||||
/// Keep previous server status when err occurs
|
||||
late final keepStatusWhenErr = property('keepStatusWhenErr', false);
|
||||
late final keepStatusWhenErr = propertyDefault('keepStatusWhenErr', false);
|
||||
|
||||
/// Parse container stat
|
||||
late final containerParseStat = property('containerParseStat', true);
|
||||
late final containerParseStat = propertyDefault('containerParseStat', true);
|
||||
|
||||
/// Auto refresh container status
|
||||
late final contaienrAutoRefresh = property('contaienrAutoRefresh', true);
|
||||
late final contaienrAutoRefresh =
|
||||
propertyDefault('contaienrAutoRefresh', true);
|
||||
|
||||
/// Use double column servers page on Desktop
|
||||
late final doubleColumnServersPage = property(
|
||||
late final doubleColumnServersPage = propertyDefault(
|
||||
'doubleColumnServersPage',
|
||||
true,
|
||||
);
|
||||
|
||||
/// Ignore local network device (eg: br-xxx, ovs-system...)
|
||||
/// when building traffic view on server tab
|
||||
//late final ignoreLocalNet = property('ignoreLocalNet', true);
|
||||
//late final ignoreLocalNet = propertyDefault('ignoreLocalNet', true);
|
||||
|
||||
/// Remerber pwd in memory
|
||||
/// Used for [DialogX.showPwdDialog]
|
||||
late final rememberPwdInMem = property('rememberPwdInMem', true);
|
||||
late final rememberPwdInMem = propertyDefault('rememberPwdInMem', true);
|
||||
|
||||
/// SSH Term Theme
|
||||
/// 0: follow app theme, 1: light, 2: dark
|
||||
late final termTheme = property('termTheme', 0);
|
||||
late final termTheme = propertyDefault('termTheme', 0);
|
||||
|
||||
/// Compatiablity for Chinese Android.
|
||||
/// Set it to true, if you use Safe Keyboard on Chinese Android
|
||||
// late final cnKeyboardComp = property('cnKeyboardComp', false);
|
||||
// late final cnKeyboardComp = propertyDefault('cnKeyboardComp', false);
|
||||
|
||||
late final lastVer = property('lastVer', 0);
|
||||
late final lastVer = propertyDefault('lastVer', 0);
|
||||
|
||||
/// Use CupertinoPageRoute for all routes
|
||||
late final cupertinoRoute = property('cupertinoRoute', isIOS);
|
||||
late final cupertinoRoute = propertyDefault('cupertinoRoute', isIOS);
|
||||
|
||||
/// Hide title bar on desktop
|
||||
late final hideTitleBar = property('hideTitleBar', isDesktop);
|
||||
late final hideTitleBar = propertyDefault('hideTitleBar', isDesktop);
|
||||
|
||||
/// Display CPU view as progress, also called as old CPU view
|
||||
late final cpuViewAsProgress = property('cpuViewAsProgress', false);
|
||||
late final cpuViewAsProgress = propertyDefault('cpuViewAsProgress', false);
|
||||
|
||||
late final displayCpuIndex = property('displayCpuIndex', true);
|
||||
late final displayCpuIndex = propertyDefault('displayCpuIndex', true);
|
||||
|
||||
late final editorSoftWrap = property('editorSoftWrap', isIOS);
|
||||
late final editorSoftWrap = propertyDefault('editorSoftWrap', isIOS);
|
||||
|
||||
late final sshTermHelpShown = property('sshTermHelpShown', false);
|
||||
late final sshTermHelpShown = propertyDefault('sshTermHelpShown', false);
|
||||
|
||||
late final horizonVirtKey = property('horizonVirtKey', false);
|
||||
late final horizonVirtKey = propertyDefault('horizonVirtKey', false);
|
||||
|
||||
/// general wake lock
|
||||
late final generalWakeLock = property('generalWakeLock', false);
|
||||
late final generalWakeLock = propertyDefault('generalWakeLock', false);
|
||||
|
||||
/// ssh page
|
||||
late final sshWakeLock = property('sshWakeLock', true);
|
||||
late final sshWakeLock = propertyDefault('sshWakeLock', true);
|
||||
|
||||
/// fmt: https://example.com/{DIST}-{BRIGHT}.png
|
||||
late final serverLogoUrl = property('serverLogoUrl', '');
|
||||
late final serverLogoUrl = propertyDefault('serverLogoUrl', '');
|
||||
|
||||
late final betaTest = property('betaTest', false);
|
||||
late final betaTest = propertyDefault('betaTest', false);
|
||||
|
||||
/// If it's empty, skip change window size.
|
||||
/// Format: {width}x{height}
|
||||
late final windowSize = property('windowSize', '');
|
||||
late final windowSize = propertyDefault('windowSize', '');
|
||||
|
||||
late final introVer = property('introVer', 0);
|
||||
late final introVer = propertyDefault('introVer', 0);
|
||||
|
||||
late final letterCache = property('letterCache', false);
|
||||
late final letterCache = propertyDefault('letterCache', false);
|
||||
|
||||
/// Set it to `$EDITOR`, `vim` and etc. to use remote system editor in SSH terminal.
|
||||
/// Set it empty to use local editor GUI.
|
||||
late final sftpEditor = property('sftpEditor', '');
|
||||
late final sftpEditor = propertyDefault('sftpEditor', '');
|
||||
|
||||
/// Run foreground service on Android, if the SSH terminal is running
|
||||
late final fgService = propertyDefault('fgService', false);
|
||||
|
||||
/// Close the editor after saving
|
||||
late final closeAfterSave = propertyDefault('closeAfterSave', false);
|
||||
|
||||
// Never show these settings for users
|
||||
//
|
||||
// ------BEGIN------
|
||||
|
||||
/// Version of store db
|
||||
late final storeVersion = property('storeVersion', 0);
|
||||
late final storeVersion = propertyDefault('storeVersion', 0);
|
||||
|
||||
/// Have notified user for notificaiton permission or not
|
||||
late final noNotiPerm = property('noNotiPerm', false);
|
||||
late final noNotiPerm = propertyDefault('noNotiPerm', false);
|
||||
|
||||
// ------END------
|
||||
}
|
||||
|
||||
@@ -2,14 +2,15 @@ import 'package:fl_lib/fl_lib.dart';
|
||||
|
||||
import 'package:server_box/data/model/server/snippet.dart';
|
||||
|
||||
class SnippetStore extends PersistentStore {
|
||||
class SnippetStore extends HiveStore {
|
||||
SnippetStore._() : super('snippet');
|
||||
|
||||
static final instance = SnippetStore._();
|
||||
|
||||
void put(Snippet snippet) {
|
||||
box.put(snippet.name, snippet);
|
||||
box.updateLastModified();
|
||||
// box.put(snippet.name, snippet);
|
||||
// box.updateLastModified();
|
||||
set(snippet.name, snippet);
|
||||
}
|
||||
|
||||
List<Snippet> fetch() {
|
||||
@@ -25,7 +26,8 @@ class SnippetStore extends PersistentStore {
|
||||
}
|
||||
|
||||
void delete(Snippet s) {
|
||||
box.delete(s.name);
|
||||
box.updateLastModified();
|
||||
// box.delete(s.name);
|
||||
// box.updateLastModified();
|
||||
remove(s.name);
|
||||
}
|
||||
}
|
||||
|
||||
1525
lib/generated/l10n/l10n.dart
Normal file
1525
lib/generated/l10n/l10n.dart
Normal file
File diff suppressed because it is too large
Load Diff
708
lib/generated/l10n/l10n_de.dart
Normal file
708
lib/generated/l10n/l10n_de.dart
Normal file
@@ -0,0 +1,708 @@
|
||||
import 'l10n.dart';
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
/// The translations for German (`de`).
|
||||
class AppLocalizationsDe extends AppLocalizations {
|
||||
AppLocalizationsDe([String locale = 'de']) : super(locale);
|
||||
|
||||
@override
|
||||
String get aboutThanks => 'Vielen Dank an die folgenden Personen, die daran teilgenommen haben.\n';
|
||||
|
||||
@override
|
||||
String get acceptBeta => 'Akzeptieren Sie Testversion-Updates';
|
||||
|
||||
@override
|
||||
String get addSystemPrivateKeyTip => 'Derzeit haben Sie keinen privaten Schlüssel, fügen Sie den Schlüssel hinzu, der mit dem System geliefert wird (~/.ssh/id_rsa)?';
|
||||
|
||||
@override
|
||||
String get added2List => 'Zur Aufgabenliste hinzugefügt';
|
||||
|
||||
@override
|
||||
String get addr => 'Adresse';
|
||||
|
||||
@override
|
||||
String get alreadyLastDir => 'Bereits im letzten Verzeichnis.';
|
||||
|
||||
@override
|
||||
String get authFailTip => 'Authentifizierung fehlgeschlagen, bitte überprüfen Sie, ob das Passwort/Schlüssel/Host/Benutzer usw. falsch sind.';
|
||||
|
||||
@override
|
||||
String get autoBackupConflict => 'Es kann nur eine automatische Sicherung gleichzeitig aktiviert werden.';
|
||||
|
||||
@override
|
||||
String get autoConnect => 'Automatisch verbinden';
|
||||
|
||||
@override
|
||||
String get autoRun => 'Automatischer Start';
|
||||
|
||||
@override
|
||||
String get autoUpdateHomeWidget => 'Home-Widget automatisch aktualisieren';
|
||||
|
||||
@override
|
||||
String get backupTip => 'Das Backup wird nur einfach verschlüsselt.\nBitte bewahre die Datei sicher auf.';
|
||||
|
||||
@override
|
||||
String get backupVersionNotMatch => 'Die Backup-Version stimmt nicht überein.';
|
||||
|
||||
@override
|
||||
String get battery => 'Batterie';
|
||||
|
||||
@override
|
||||
String get bgRun => 'Hintergrundaktualisierung';
|
||||
|
||||
@override
|
||||
String get bgRunTip => 'Dieser Schalter bedeutet nur, dass die App versuchen wird, im Hintergrund zu laufen. Ob sie im Hintergrund laufen kann, hängt davon ab, ob die Berechtigungen aktiviert sind oder nicht. Bei nativem Android deaktivieren Sie bitte \"Batterieoptimierung\" in dieser App, und bei miui ändern Sie bitte die Energiesparrichtlinie auf \"Unbegrenzt\".';
|
||||
|
||||
@override
|
||||
String get closeAfterSave => 'Speichern und schließen';
|
||||
|
||||
@override
|
||||
String get cmd => 'Command';
|
||||
|
||||
@override
|
||||
String get collapseUITip => 'Ob lange Listen in der Benutzeroberfläche standardmäßig eingeklappt werden sollen oder nicht';
|
||||
|
||||
@override
|
||||
String get conn => 'Verbindung';
|
||||
|
||||
@override
|
||||
String get container => 'Container';
|
||||
|
||||
@override
|
||||
String get containerTrySudoTip => 'Zum Beispiel: In der App ist der Benutzer auf aaa eingestellt, aber Docker ist unter dem Root-Benutzer installiert. In diesem Fall müssen Sie diese Option aktivieren';
|
||||
|
||||
@override
|
||||
String get convert => 'Konvertieren';
|
||||
|
||||
@override
|
||||
String get copyPath => 'Pfad kopieren';
|
||||
|
||||
@override
|
||||
String get cpuViewAsProgressTip => 'Zeigen Sie die Auslastung jedes CPUs in einem Fortschrittsbalken-Stil an (alter Stil)';
|
||||
|
||||
@override
|
||||
String get cursorType => 'Cursor-Typ';
|
||||
|
||||
@override
|
||||
String get customCmd => 'Benutzerdefinierte Befehle';
|
||||
|
||||
@override
|
||||
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
|
||||
|
||||
@override
|
||||
String get customCmdHint => '\"Befehlsname\": \"Befehl\"';
|
||||
|
||||
@override
|
||||
String get decode => 'Decode';
|
||||
|
||||
@override
|
||||
String get decompress => 'Dekomprimieren';
|
||||
|
||||
@override
|
||||
String get deleteServers => 'Batch-Löschung von Servern';
|
||||
|
||||
@override
|
||||
String get dirEmpty => 'Stelle sicher, dass der Ordner leer ist.';
|
||||
|
||||
@override
|
||||
String get disconnected => 'Disconnected';
|
||||
|
||||
@override
|
||||
String get disk => 'Festplatte';
|
||||
|
||||
@override
|
||||
String get diskIgnorePath => 'Pfad für Datenträger ignorieren';
|
||||
|
||||
@override
|
||||
String get displayCpuIndex => 'Zeigen Sie den CPU-Index an';
|
||||
|
||||
@override
|
||||
String dl2Local(Object fileName) {
|
||||
return 'Datei \"$fileName\" herunterladen?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerEmptyRunningItems => 'Es gibt keine laufenden Container.\nDas könnte daran liegen:\n- Der Docker-Installationsbenutzer ist nicht mit dem in der App konfigurierten Benutzernamen identisch.\n- Die Umgebungsvariable DOCKER_HOST wurde nicht korrekt gelesen. Sie können sie ermitteln, indem Sie `echo \$DOCKER_HOST` im Terminal ausführen.';
|
||||
|
||||
@override
|
||||
String dockerImagesFmt(Object count) {
|
||||
return '$count Image(s)';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerNotInstalled => 'Docker ist nicht installiert';
|
||||
|
||||
@override
|
||||
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
|
||||
return '$runningCount aktiv, $stoppedCount container gestoppt.';
|
||||
}
|
||||
|
||||
@override
|
||||
String dockerStatusRunningFmt(Object count) {
|
||||
return '$count Container aktiv';
|
||||
}
|
||||
|
||||
@override
|
||||
String get doubleColumnMode => 'Doppelspaltiger Modus';
|
||||
|
||||
@override
|
||||
String get doubleColumnTip => 'Diese Option aktiviert nur die Funktion, ob sie tatsächlich aktiviert werden kann, hängt auch von der Breite des Geräts ab';
|
||||
|
||||
@override
|
||||
String get editVirtKeys => 'Virtuelle Tasten bearbeiten';
|
||||
|
||||
@override
|
||||
String get editor => 'Editor';
|
||||
|
||||
@override
|
||||
String get editorHighlightTip => 'Die Leistung der aktuellen Codehervorhebung ist schlechter und kann zur Verbesserung optional ausgeschaltet werden.';
|
||||
|
||||
@override
|
||||
String get encode => 'Encode';
|
||||
|
||||
@override
|
||||
String get envVars => 'Umgebungsvariable';
|
||||
|
||||
@override
|
||||
String get experimentalFeature => 'Experimentelles Feature';
|
||||
|
||||
@override
|
||||
String get extraArgs => 'Extra args';
|
||||
|
||||
@override
|
||||
String get fallbackSshDest => 'SSH-Fallback-Ziel';
|
||||
|
||||
@override
|
||||
String get fdroidReleaseTip => 'Wenn Sie diese App von F-Droid heruntergeladen haben, wird empfohlen, diese Option zu deaktivieren.';
|
||||
|
||||
@override
|
||||
String get fgService => 'Vordergrund-Dienst';
|
||||
|
||||
@override
|
||||
String get fgServiceTip => 'Nach dem Einschalten kann es bei einigen Gerätemodellen zu Abstürzen kommen. Das Ausschalten kann bei einigen Modellen dazu führen, dass SSH-Verbindungen im Hintergrund nicht aufrechterhalten werden können. Bitte erlauben Sie ServerBox in den Systemeinstellungen Benachrichtigungsrechte, Hintergrundausführung und Selbstaktivierung.';
|
||||
|
||||
@override
|
||||
String fileTooLarge(Object file, Object size, Object sizeMax) {
|
||||
return 'Datei \'$file\' ist zu groß $size, max $sizeMax';
|
||||
}
|
||||
|
||||
@override
|
||||
String get followSystem => 'System verfolgen';
|
||||
|
||||
@override
|
||||
String get font => 'Schriftarten';
|
||||
|
||||
@override
|
||||
String get fontSize => 'Schriftgröße';
|
||||
|
||||
@override
|
||||
String get force => 'freiwillig';
|
||||
|
||||
@override
|
||||
String get fullScreen => 'Vollbildmodus';
|
||||
|
||||
@override
|
||||
String get fullScreenJitter => 'Jitter im Vollbildmodus';
|
||||
|
||||
@override
|
||||
String get fullScreenJitterHelp => 'Einbrennen des Bildschirms verhindern';
|
||||
|
||||
@override
|
||||
String get fullScreenTip => 'Soll der Vollbildmodus aktiviert werden, wenn das Gerät in den Quermodus gedreht wird? Diese Option gilt nur für die Server-Registerkarte.';
|
||||
|
||||
@override
|
||||
String get goBackQ => 'Zurückkommen?';
|
||||
|
||||
@override
|
||||
String get goto => 'Pfad öffnen';
|
||||
|
||||
@override
|
||||
String get hideTitleBar => 'Titelleiste ausblenden';
|
||||
|
||||
@override
|
||||
String get highlight => 'Code highlight';
|
||||
|
||||
@override
|
||||
String get homeWidgetUrlConfig => 'Home-Widget-Link konfigurieren';
|
||||
|
||||
@override
|
||||
String get host => 'Host';
|
||||
|
||||
@override
|
||||
String httpFailedWithCode(Object code) {
|
||||
return 'Anfrage fehlgeschlagen, Statuscode: $code';
|
||||
}
|
||||
|
||||
@override
|
||||
String get ignoreCert => 'Zertifikat ignorieren';
|
||||
|
||||
@override
|
||||
String get image => 'Image';
|
||||
|
||||
@override
|
||||
String get imagesList => 'Images';
|
||||
|
||||
@override
|
||||
String get init => 'Initialisieren';
|
||||
|
||||
@override
|
||||
String get inner => 'Eingebaut';
|
||||
|
||||
@override
|
||||
String get install => 'install';
|
||||
|
||||
@override
|
||||
String get installDockerWithUrl => 'Bitte installiere docker zuerst. https://docs.docker.com/engine/install';
|
||||
|
||||
@override
|
||||
String get invalid => 'Ungültig';
|
||||
|
||||
@override
|
||||
String get jumpServer => 'Server springen';
|
||||
|
||||
@override
|
||||
String get keepForeground => 'Stelle sicher, dass die App geöffnet bleibt.';
|
||||
|
||||
@override
|
||||
String get keepStatusWhenErr => 'Den letzten Serverstatus beibehalten';
|
||||
|
||||
@override
|
||||
String get keepStatusWhenErrTip => 'Nur im Fehlerfall während der Ausführung des Skripts';
|
||||
|
||||
@override
|
||||
String get keyAuth => 'Schlüsselauthentifzierung';
|
||||
|
||||
@override
|
||||
String get letterCache => 'Buchstaben-Caching';
|
||||
|
||||
@override
|
||||
String get letterCacheTip => 'Empfohlen, zu deaktivieren, aber nach dem Deaktivieren können keine CJK-Zeichen eingegeben werden.';
|
||||
|
||||
@override
|
||||
String get license => 'Lizenzen';
|
||||
|
||||
@override
|
||||
String get location => 'Standort';
|
||||
|
||||
@override
|
||||
String get loss => 'loss';
|
||||
|
||||
@override
|
||||
String madeWithLove(Object myGithub) {
|
||||
return 'Erstellt mit ❤️ von $myGithub';
|
||||
}
|
||||
|
||||
@override
|
||||
String get manual => 'Handbuch';
|
||||
|
||||
@override
|
||||
String get max => 'max';
|
||||
|
||||
@override
|
||||
String get maxRetryCount => 'Anzahl an Verbindungsversuchen';
|
||||
|
||||
@override
|
||||
String get maxRetryCountEqual0 => 'Unbegrenzte Verbindungsversuche zum Server';
|
||||
|
||||
@override
|
||||
String get min => 'min';
|
||||
|
||||
@override
|
||||
String get mission => 'Mission';
|
||||
|
||||
@override
|
||||
String get more => 'Mehr';
|
||||
|
||||
@override
|
||||
String get moveOutServerFuncBtnsHelp => 'Ein: kann unter jeder Karte auf der Registerkarte \"Server\" angezeigt werden. Aus: kann oben auf der Seite \"Serverdetails\" angezeigt werden.';
|
||||
|
||||
@override
|
||||
String get ms => 'ms';
|
||||
|
||||
@override
|
||||
String get needHomeDir => 'Wenn Sie ein Synology-Benutzer sind, [sehen Sie hier](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Benutzer anderer Systeme müssen suchen, wie man ein Home-Verzeichnis erstellt.';
|
||||
|
||||
@override
|
||||
String get needRestart => 'App muss neugestartet werden';
|
||||
|
||||
@override
|
||||
String get net => 'Netzwerk';
|
||||
|
||||
@override
|
||||
String get netViewType => 'Netzwerkansicht Typ';
|
||||
|
||||
@override
|
||||
String get newContainer => 'Neuer Container';
|
||||
|
||||
@override
|
||||
String get noLineChart => 'Verwenden Sie keine Liniendiagramme';
|
||||
|
||||
@override
|
||||
String get noLineChartForCpu => 'Verwenden Sie keine Liniendiagramme für CPU';
|
||||
|
||||
@override
|
||||
String get noPrivateKeyTip => 'Der private Schlüssel existiert nicht, möglicherweise wurde er gelöscht oder es liegt ein Konfigurationsfehler vor.';
|
||||
|
||||
@override
|
||||
String get noPromptAgain => 'Nicht mehr nachfragen';
|
||||
|
||||
@override
|
||||
String get node => 'Knoten';
|
||||
|
||||
@override
|
||||
String get notAvailable => 'Nicht verfügbar';
|
||||
|
||||
@override
|
||||
String get onServerDetailPage => 'in Detailansicht des Servers';
|
||||
|
||||
@override
|
||||
String get onlyOneLine => 'Nur als eine Zeile anzeigen (scrollbar)';
|
||||
|
||||
@override
|
||||
String get onlyWhenCoreBiggerThan8 => 'Wirksam nur, wenn die Anzahl der Kerne > 8 ist.';
|
||||
|
||||
@override
|
||||
String get openLastPath => 'Öffnen Sie den letzten Pfad';
|
||||
|
||||
@override
|
||||
String get openLastPathTip => 'Verschiedene Server haben unterschiedliche Einträge, und der Eintrag ist der Pfad zum Ausgang';
|
||||
|
||||
@override
|
||||
String get parseContainerStatsTip => 'Das Analysieren des Belegungsstatus durch Docker ist relativ langsam';
|
||||
|
||||
@override
|
||||
String percentOfSize(Object percent, Object size) {
|
||||
return '$percent% von $size';
|
||||
}
|
||||
|
||||
@override
|
||||
String get permission => 'Berechtigungen';
|
||||
|
||||
@override
|
||||
String get pingAvg => 'Avg:';
|
||||
|
||||
@override
|
||||
String get pingInputIP => 'Bitte gib eine Ziel-IP/Domain ein.';
|
||||
|
||||
@override
|
||||
String get pingNoServer => 'Kein Server zum Anpingen.\nBitte füge einen Server hinzu.';
|
||||
|
||||
@override
|
||||
String get pkg => 'Pkg';
|
||||
|
||||
@override
|
||||
String get plugInType => 'Einfügetyp';
|
||||
|
||||
@override
|
||||
String get port => 'Port';
|
||||
|
||||
@override
|
||||
String get preview => 'Vorschau';
|
||||
|
||||
@override
|
||||
String get privateKey => 'Private Key';
|
||||
|
||||
@override
|
||||
String get process => 'Prozess';
|
||||
|
||||
@override
|
||||
String get pushToken => 'Push Token';
|
||||
|
||||
@override
|
||||
String get pveIgnoreCertTip => 'Nicht empfohlen, Achten Sie auf Sicherheitsrisiken! Wenn Sie das Standardzertifikat von PVE verwenden, müssen Sie diese Option aktivieren.';
|
||||
|
||||
@override
|
||||
String get pveLoginFailed => 'Anmeldung fehlgeschlagen. Kann nicht mit Benutzername/Passwort aus der Serverkonfiguration angemeldet werden, um sich über Linux PAM anzumelden.';
|
||||
|
||||
@override
|
||||
String get pveVersionLow => 'Diese Funktion befindet sich derzeit in der Testphase und wurde nur auf PVE 8+ getestet. Bitte verwenden Sie sie mit Vorsicht.';
|
||||
|
||||
@override
|
||||
String get pwd => 'Passwort';
|
||||
|
||||
@override
|
||||
String get read => 'Lesen';
|
||||
|
||||
@override
|
||||
String get reboot => 'Neustart';
|
||||
|
||||
@override
|
||||
String get rememberPwdInMem => 'Passwort im Speicher behalten';
|
||||
|
||||
@override
|
||||
String get rememberPwdInMemTip => 'Für Container, Aufhängen usw.';
|
||||
|
||||
@override
|
||||
String get rememberWindowSize => 'Fenstergröße merken';
|
||||
|
||||
@override
|
||||
String get remotePath => 'Entfernte Pfade';
|
||||
|
||||
@override
|
||||
String get restart => 'Neustart';
|
||||
|
||||
@override
|
||||
String get result => 'Result';
|
||||
|
||||
@override
|
||||
String get rotateAngel => 'Rotationswinkel';
|
||||
|
||||
@override
|
||||
String get route => 'Routen';
|
||||
|
||||
@override
|
||||
String get run => 'Ausführen';
|
||||
|
||||
@override
|
||||
String get running => 'läuft';
|
||||
|
||||
@override
|
||||
String get sameIdServerExist => 'Ein Server mit derselben ID existiert bereits';
|
||||
|
||||
@override
|
||||
String get save => 'Speichern';
|
||||
|
||||
@override
|
||||
String get saved => 'Gerettet';
|
||||
|
||||
@override
|
||||
String get second => 's';
|
||||
|
||||
@override
|
||||
String get sensors => 'Sensor';
|
||||
|
||||
@override
|
||||
String get sequence => 'Sequenz';
|
||||
|
||||
@override
|
||||
String get server => 'Server';
|
||||
|
||||
@override
|
||||
String get serverDetailOrder => 'Reihenfolge der Widgets auf der Detailseite';
|
||||
|
||||
@override
|
||||
String get serverFuncBtns => 'Server-Funktionsschaltflächen';
|
||||
|
||||
@override
|
||||
String get serverOrder => 'Server-Bestellung';
|
||||
|
||||
@override
|
||||
String get sftpDlPrepare => 'Verbindung vorbereiten...';
|
||||
|
||||
@override
|
||||
String get sftpEditorTip => 'Wenn leer, verwenden Sie den im App integrierten Dateieditor. Wenn ein Wert vorhanden ist, wird der Editor des Remote-Servers verwendet, z.B. `vim` (es wird empfohlen, automatisch gemäß `EDITOR` zu ermitteln).';
|
||||
|
||||
@override
|
||||
String get sftpRmrDirSummary => 'Verwenden Sie \"rm -r\", um das Verzeichnis in SFTP zu löschen.';
|
||||
|
||||
@override
|
||||
String get sftpSSHConnected => 'SFTP Verbunden';
|
||||
|
||||
@override
|
||||
String get sftpShowFoldersFirst => 'Ordner zuerst anzeigen';
|
||||
|
||||
@override
|
||||
String get showDistLogo => 'Distributionslogo anzeigen';
|
||||
|
||||
@override
|
||||
String get shutdown => 'Abschaltung';
|
||||
|
||||
@override
|
||||
String get size => 'Größe';
|
||||
|
||||
@override
|
||||
String get snippet => 'Snippet';
|
||||
|
||||
@override
|
||||
String get softWrap => 'Weicher Umbruch';
|
||||
|
||||
@override
|
||||
String get specifyDev => 'Gerät angeben';
|
||||
|
||||
@override
|
||||
String get specifyDevTip => 'Zum Beispiel bezieht sich die Standard-Netzwerkverkehrsstatistik auf alle Geräte. Hier können Sie ein bestimmtes Gerät angeben.';
|
||||
|
||||
@override
|
||||
String get speed => 'Tempo';
|
||||
|
||||
@override
|
||||
String spentTime(Object time) {
|
||||
return 'Benötigte Zeit: $time';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshTermHelp => 'Wenn das Terminal scrollbar ist, kann durch horizontales Ziehen Text ausgewählt werden. Durch Klicken auf die Tastentaste wird die Tastatur ein- oder ausgeschaltet. Das Dateisymbol öffnet den aktuellen Pfad SFTP. Die Zwischenablage-Schaltfläche kopiert den Inhalt, wenn Text ausgewählt ist, und fügt Inhalte aus der Zwischenablage in das Terminal ein, wenn kein Text ausgewählt ist und Inhalte in der Zwischenablage vorhanden sind. Das Codesymbol fügt Code-Schnipsel ins Terminal ein und führt sie aus.';
|
||||
|
||||
@override
|
||||
String sshTip(Object url) {
|
||||
return 'Diese Funktion befindet sich jetzt in der Experimentierphase.\n\nBitte melde Bugs auf $url oder mach mit bei der Entwicklung.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshVirtualKeyAutoOff => 'Automatische Umschaltung der virtuellen Tasten';
|
||||
|
||||
@override
|
||||
String get start => 'Start';
|
||||
|
||||
@override
|
||||
String get stat => 'Statistik';
|
||||
|
||||
@override
|
||||
String get stats => 'Statistik';
|
||||
|
||||
@override
|
||||
String get stop => 'Stop';
|
||||
|
||||
@override
|
||||
String get stopped => 'Ausgelaufen';
|
||||
|
||||
@override
|
||||
String get storage => 'Speicher';
|
||||
|
||||
@override
|
||||
String get supportFmtArgs => 'Die folgenden Formatierungsparameter werden unterstützt:';
|
||||
|
||||
@override
|
||||
String get suspend => 'Suspend';
|
||||
|
||||
@override
|
||||
String get suspendTip => 'Die Suspend-Funktion erfordert Root-Rechte und systemd-Unterstützung.';
|
||||
|
||||
@override
|
||||
String switchTo(Object val) {
|
||||
return 'Wechseln zu $val';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sync => 'Sync';
|
||||
|
||||
@override
|
||||
String get syncTip => 'Damit einige Änderungen wirksam werden, kann ein Neustart erforderlich sein.';
|
||||
|
||||
@override
|
||||
String get system => 'Systeme';
|
||||
|
||||
@override
|
||||
String get tag => 'Tags';
|
||||
|
||||
@override
|
||||
String get temperature => 'Temperatur';
|
||||
|
||||
@override
|
||||
String get termFontSizeTip => 'Diese Einstellung beeinflusst die Größe des Terminals (Breite und Höhe). Sie können die Terminalseite zoomen, um die Schriftgröße der aktuellen Sitzung anzupassen.';
|
||||
|
||||
@override
|
||||
String get terminal => 'Terminal';
|
||||
|
||||
@override
|
||||
String get test => 'Prüfung';
|
||||
|
||||
@override
|
||||
String get textScaler => 'Skalierung der Schriftart';
|
||||
|
||||
@override
|
||||
String get textScalerTip => '1.0 => 100% (Originalgröße), funktioniert nur auf der Serverseite Teil der Schrift, nicht empfohlen zu ändern.';
|
||||
|
||||
@override
|
||||
String get theme => 'Themen';
|
||||
|
||||
@override
|
||||
String get time => 'Zeit';
|
||||
|
||||
@override
|
||||
String get times => 'x';
|
||||
|
||||
@override
|
||||
String get total => 'Total';
|
||||
|
||||
@override
|
||||
String get traffic => 'Durchflussmenge';
|
||||
|
||||
@override
|
||||
String get trySudo => 'Versuche es mit sudo';
|
||||
|
||||
@override
|
||||
String get ttl => 'TTL';
|
||||
|
||||
@override
|
||||
String get unknown => 'Unbekannt';
|
||||
|
||||
@override
|
||||
String get unkownConvertMode => 'Unbekannter Konvertierungsmodus';
|
||||
|
||||
@override
|
||||
String get update => 'Update';
|
||||
|
||||
@override
|
||||
String get updateIntervalEqual0 => 'Wenn du den Wert 0 einstellst, wird nicht automatisch aktualisiert.\nDer CPU-Status kann nicht berechnet werden.';
|
||||
|
||||
@override
|
||||
String get updateServerStatusInterval => 'Aktualisierungsintervall des Serverstatus';
|
||||
|
||||
@override
|
||||
String get upload => 'Hochladen';
|
||||
|
||||
@override
|
||||
String get upsideDown => 'Upside Down';
|
||||
|
||||
@override
|
||||
String get uptime => 'Betriebszeit';
|
||||
|
||||
@override
|
||||
String get useCdn => 'Verwenden von CDN';
|
||||
|
||||
@override
|
||||
String get useCdnTip => 'Nicht-chinesischen Benutzern wird die Verwendung eines CDN empfohlen. Möchten Sie es verwenden?';
|
||||
|
||||
@override
|
||||
String get useNoPwd => 'Es wird kein Passwort verwendet';
|
||||
|
||||
@override
|
||||
String get usePodmanByDefault => 'Standardmäßige Verwendung von Podman';
|
||||
|
||||
@override
|
||||
String get used => 'Gebraucht';
|
||||
|
||||
@override
|
||||
String get view => 'Ansicht';
|
||||
|
||||
@override
|
||||
String get viewErr => 'Fehler anzeigen';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpClipboard => 'In die Zwischenablage kopieren, wenn das ausgewählte Terminal nicht leer ist, andernfalls den Inhalt der Zwischenablage in das Terminal einfügen.';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpIME => 'Tastatur ein-/ausschalten';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpSFTP => 'Aktuelles Verzeichnis in SFTP öffnen.';
|
||||
|
||||
@override
|
||||
String get waitConnection => 'Bitte warte, bis die Verbindung hergestellt wurde.';
|
||||
|
||||
@override
|
||||
String get wakeLock => 'Wach halten';
|
||||
|
||||
@override
|
||||
String get watchNotPaired => 'Keine gekoppelte Apple Watch';
|
||||
|
||||
@override
|
||||
String get webdavSettingEmpty => 'Webdav-Einstellungen sind leer';
|
||||
|
||||
@override
|
||||
String get whenOpenApp => 'Beim Öffnen der App';
|
||||
|
||||
@override
|
||||
String get wolTip => 'Nach der Konfiguration von WOL (Wake-on-LAN) wird jedes Mal, wenn der Server verbunden wird, eine WOL-Anfrage gesendet.';
|
||||
|
||||
@override
|
||||
String get write => 'Schreiben';
|
||||
|
||||
@override
|
||||
String get writeScriptFailTip => 'Das Schreiben des Skripts ist fehlgeschlagen, möglicherweise aufgrund fehlender Berechtigungen oder das Verzeichnis existiert nicht.';
|
||||
|
||||
@override
|
||||
String get writeScriptTip => 'Nach der Verbindung mit dem Server wird ein Skript in ~/.config/server_box geschrieben, um den Systemstatus zu überwachen. Sie können den Skriptinhalt überprüfen.';
|
||||
}
|
||||
708
lib/generated/l10n/l10n_en.dart
Normal file
708
lib/generated/l10n/l10n_en.dart
Normal file
@@ -0,0 +1,708 @@
|
||||
import 'l10n.dart';
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
/// The translations for English (`en`).
|
||||
class AppLocalizationsEn extends AppLocalizations {
|
||||
AppLocalizationsEn([String locale = 'en']) : super(locale);
|
||||
|
||||
@override
|
||||
String get aboutThanks => 'Thanks to the following people who participated in.';
|
||||
|
||||
@override
|
||||
String get acceptBeta => 'Accept beta version updates';
|
||||
|
||||
@override
|
||||
String get addSystemPrivateKeyTip => 'Currently private keys don\'t exist, do you want to add the one that comes with the system (~/.ssh/id_rsa)?';
|
||||
|
||||
@override
|
||||
String get added2List => 'Added to task list';
|
||||
|
||||
@override
|
||||
String get addr => 'Address';
|
||||
|
||||
@override
|
||||
String get alreadyLastDir => 'Already in last directory.';
|
||||
|
||||
@override
|
||||
String get authFailTip => 'Authentication failed, please check whether credentials are correct';
|
||||
|
||||
@override
|
||||
String get autoBackupConflict => 'Only one automatic backup can be turned on at the same time.';
|
||||
|
||||
@override
|
||||
String get autoConnect => 'Auto connect';
|
||||
|
||||
@override
|
||||
String get autoRun => 'Auto run';
|
||||
|
||||
@override
|
||||
String get autoUpdateHomeWidget => 'Automatic home widget update';
|
||||
|
||||
@override
|
||||
String get backupTip => 'The exported data is weakly encrypted. \nPlease keep it safe.';
|
||||
|
||||
@override
|
||||
String get backupVersionNotMatch => 'Backup version is not match.';
|
||||
|
||||
@override
|
||||
String get battery => 'Battery';
|
||||
|
||||
@override
|
||||
String get bgRun => 'Run in background';
|
||||
|
||||
@override
|
||||
String get bgRunTip => 'This switch only means the program will try to run in the background. Whether it can run in the background depends on whether the permission is enabled or not. For AOSP-based Android ROMs, please disable \"Battery Optimization\" in this app. For MIUI / HyperOS, please change the power saving policy to \"Unlimited\".';
|
||||
|
||||
@override
|
||||
String get closeAfterSave => 'Save and close';
|
||||
|
||||
@override
|
||||
String get cmd => 'Command';
|
||||
|
||||
@override
|
||||
String get collapseUITip => 'Whether to collapse long lists present in the UI by default';
|
||||
|
||||
@override
|
||||
String get conn => 'Connection';
|
||||
|
||||
@override
|
||||
String get container => 'Container';
|
||||
|
||||
@override
|
||||
String get containerTrySudoTip => 'For example: In the app, the user is set to aaa, but Docker is installed under the root user. In this case, you need to enable this option.';
|
||||
|
||||
@override
|
||||
String get convert => 'Convert';
|
||||
|
||||
@override
|
||||
String get copyPath => 'Copy path';
|
||||
|
||||
@override
|
||||
String get cpuViewAsProgressTip => 'Display the usage of each CPU in a progress bar style (old style)';
|
||||
|
||||
@override
|
||||
String get cursorType => 'Cursor type';
|
||||
|
||||
@override
|
||||
String get customCmd => 'Custom commands';
|
||||
|
||||
@override
|
||||
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
|
||||
|
||||
@override
|
||||
String get customCmdHint => '\"Command Name\": \"Command\"';
|
||||
|
||||
@override
|
||||
String get decode => 'Decode';
|
||||
|
||||
@override
|
||||
String get decompress => 'Decompress';
|
||||
|
||||
@override
|
||||
String get deleteServers => 'Batch delete servers';
|
||||
|
||||
@override
|
||||
String get dirEmpty => 'Make sure the folder is empty.';
|
||||
|
||||
@override
|
||||
String get disconnected => 'Disconnected';
|
||||
|
||||
@override
|
||||
String get disk => 'Disk';
|
||||
|
||||
@override
|
||||
String get diskIgnorePath => 'Ignore path for disk';
|
||||
|
||||
@override
|
||||
String get displayCpuIndex => 'Display CPU index';
|
||||
|
||||
@override
|
||||
String dl2Local(Object fileName) {
|
||||
return 'Download $fileName to local?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerEmptyRunningItems => 'There are no running containers.\nThis could be because:\n- The Docker installation user is not the same as the username configured within the App.\n- The environment variable DOCKER_HOST was not read correctly. You can get it by running `echo \$DOCKER_HOST` in the terminal.';
|
||||
|
||||
@override
|
||||
String dockerImagesFmt(Object count) {
|
||||
return '$count images';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerNotInstalled => 'Docker not installed';
|
||||
|
||||
@override
|
||||
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
|
||||
return '$runningCount running, $stoppedCount container stopped.';
|
||||
}
|
||||
|
||||
@override
|
||||
String dockerStatusRunningFmt(Object count) {
|
||||
return '$count container running.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get doubleColumnMode => 'Double column mode';
|
||||
|
||||
@override
|
||||
String get doubleColumnTip => 'This option only enables the feature, whether it can actually be enabled depends on the width of the device';
|
||||
|
||||
@override
|
||||
String get editVirtKeys => 'Edit virtual keys';
|
||||
|
||||
@override
|
||||
String get editor => 'Editor';
|
||||
|
||||
@override
|
||||
String get editorHighlightTip => 'The current code highlighting performance is not ideal and can be optionally turned off to improve.';
|
||||
|
||||
@override
|
||||
String get encode => 'Encode';
|
||||
|
||||
@override
|
||||
String get envVars => 'Environment variable';
|
||||
|
||||
@override
|
||||
String get experimentalFeature => 'Experimental feature';
|
||||
|
||||
@override
|
||||
String get extraArgs => 'Extra arguments';
|
||||
|
||||
@override
|
||||
String get fallbackSshDest => 'Fallback SSH destination';
|
||||
|
||||
@override
|
||||
String get fdroidReleaseTip => 'If you downloaded this app from F-Droid, it is recommended to turn off this option.';
|
||||
|
||||
@override
|
||||
String get fgService => 'Foreground Service';
|
||||
|
||||
@override
|
||||
String get fgServiceTip => 'After enabling, some device models may crash. Disabling it may cause some models to be unable to maintain SSH connections in the background. Please allow ServerBox notification permissions, background running, and self-wake-up in system settings.';
|
||||
|
||||
@override
|
||||
String fileTooLarge(Object file, Object size, Object sizeMax) {
|
||||
return 'File \'$file\' too large $size, max $sizeMax';
|
||||
}
|
||||
|
||||
@override
|
||||
String get followSystem => 'Follow system';
|
||||
|
||||
@override
|
||||
String get font => 'Font';
|
||||
|
||||
@override
|
||||
String get fontSize => 'Font size';
|
||||
|
||||
@override
|
||||
String get force => 'Force';
|
||||
|
||||
@override
|
||||
String get fullScreen => 'Full screen mode';
|
||||
|
||||
@override
|
||||
String get fullScreenJitter => 'Full screen jitter';
|
||||
|
||||
@override
|
||||
String get fullScreenJitterHelp => 'To avoid screen burn-in';
|
||||
|
||||
@override
|
||||
String get fullScreenTip => 'Should full-screen mode be enabled when the device is rotated to landscape mode? This option only applies to the server tab.';
|
||||
|
||||
@override
|
||||
String get goBackQ => 'Go back?';
|
||||
|
||||
@override
|
||||
String get goto => 'Go to';
|
||||
|
||||
@override
|
||||
String get hideTitleBar => 'Hide title bar';
|
||||
|
||||
@override
|
||||
String get highlight => 'Code highlighting';
|
||||
|
||||
@override
|
||||
String get homeWidgetUrlConfig => 'Config home widget url';
|
||||
|
||||
@override
|
||||
String get host => 'Host';
|
||||
|
||||
@override
|
||||
String httpFailedWithCode(Object code) {
|
||||
return 'request failed, status code: $code';
|
||||
}
|
||||
|
||||
@override
|
||||
String get ignoreCert => 'Ignore certificate';
|
||||
|
||||
@override
|
||||
String get image => 'Image';
|
||||
|
||||
@override
|
||||
String get imagesList => 'Images list';
|
||||
|
||||
@override
|
||||
String get init => 'Initialize';
|
||||
|
||||
@override
|
||||
String get inner => 'Inner';
|
||||
|
||||
@override
|
||||
String get install => 'install';
|
||||
|
||||
@override
|
||||
String get installDockerWithUrl => 'Please https://docs.docker.com/engine/install docker first.';
|
||||
|
||||
@override
|
||||
String get invalid => 'Invalid';
|
||||
|
||||
@override
|
||||
String get jumpServer => 'Jump server';
|
||||
|
||||
@override
|
||||
String get keepForeground => 'Keep app foreground!';
|
||||
|
||||
@override
|
||||
String get keepStatusWhenErr => 'Preserve the last server state';
|
||||
|
||||
@override
|
||||
String get keepStatusWhenErrTip => 'Only in the event of an error during script execution';
|
||||
|
||||
@override
|
||||
String get keyAuth => 'Key Auth';
|
||||
|
||||
@override
|
||||
String get letterCache => 'Letter caching';
|
||||
|
||||
@override
|
||||
String get letterCacheTip => 'Recommended to disable, but after disabling, it will be impossible to input CJK characters.';
|
||||
|
||||
@override
|
||||
String get license => 'License';
|
||||
|
||||
@override
|
||||
String get location => 'Location';
|
||||
|
||||
@override
|
||||
String get loss => 'loss';
|
||||
|
||||
@override
|
||||
String madeWithLove(Object myGithub) {
|
||||
return 'Made with ❤️ by $myGithub';
|
||||
}
|
||||
|
||||
@override
|
||||
String get manual => 'Manual';
|
||||
|
||||
@override
|
||||
String get max => 'max';
|
||||
|
||||
@override
|
||||
String get maxRetryCount => 'Number of server reconnections';
|
||||
|
||||
@override
|
||||
String get maxRetryCountEqual0 => 'Will retry again and again.';
|
||||
|
||||
@override
|
||||
String get min => 'min';
|
||||
|
||||
@override
|
||||
String get mission => 'Mission';
|
||||
|
||||
@override
|
||||
String get more => 'More';
|
||||
|
||||
@override
|
||||
String get moveOutServerFuncBtnsHelp => 'On: can be displayed below each card on the Server Tab page. Off: can be displayed at the top of the Server Details page.';
|
||||
|
||||
@override
|
||||
String get ms => 'ms';
|
||||
|
||||
@override
|
||||
String get needHomeDir => 'If you are a Synology user, [see here](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Users of other systems need to search for how to create a home directory.';
|
||||
|
||||
@override
|
||||
String get needRestart => 'App needs to be restarted';
|
||||
|
||||
@override
|
||||
String get net => 'Network';
|
||||
|
||||
@override
|
||||
String get netViewType => 'Network view type';
|
||||
|
||||
@override
|
||||
String get newContainer => 'New container';
|
||||
|
||||
@override
|
||||
String get noLineChart => 'Do not use line charts';
|
||||
|
||||
@override
|
||||
String get noLineChartForCpu => 'Do not use line charts for CPU';
|
||||
|
||||
@override
|
||||
String get noPrivateKeyTip => 'The private key does not exist, it may have been deleted or there is a configuration error.';
|
||||
|
||||
@override
|
||||
String get noPromptAgain => 'Do not prompt again';
|
||||
|
||||
@override
|
||||
String get node => 'Node';
|
||||
|
||||
@override
|
||||
String get notAvailable => 'Unavailable';
|
||||
|
||||
@override
|
||||
String get onServerDetailPage => 'On server detail page';
|
||||
|
||||
@override
|
||||
String get onlyOneLine => 'Only display as one line (scrollable)';
|
||||
|
||||
@override
|
||||
String get onlyWhenCoreBiggerThan8 => 'Works only when the number of cores is greater than 8';
|
||||
|
||||
@override
|
||||
String get openLastPath => 'Open the last path';
|
||||
|
||||
@override
|
||||
String get openLastPathTip => 'Different servers will have different logs, and the log is the path to the exit';
|
||||
|
||||
@override
|
||||
String get parseContainerStatsTip => 'Parsing the occupancy status of Docker is relatively slow.';
|
||||
|
||||
@override
|
||||
String percentOfSize(Object percent, Object size) {
|
||||
return '$percent% of $size';
|
||||
}
|
||||
|
||||
@override
|
||||
String get permission => 'Permissions';
|
||||
|
||||
@override
|
||||
String get pingAvg => 'Avg:';
|
||||
|
||||
@override
|
||||
String get pingInputIP => 'Please input a target IP / domain.';
|
||||
|
||||
@override
|
||||
String get pingNoServer => 'No server to ping.\nPlease add a server in server tab.';
|
||||
|
||||
@override
|
||||
String get pkg => 'Pkg';
|
||||
|
||||
@override
|
||||
String get plugInType => 'Insertion Type';
|
||||
|
||||
@override
|
||||
String get port => 'Port';
|
||||
|
||||
@override
|
||||
String get preview => 'Preview';
|
||||
|
||||
@override
|
||||
String get privateKey => 'Private Key';
|
||||
|
||||
@override
|
||||
String get process => 'Process';
|
||||
|
||||
@override
|
||||
String get pushToken => 'Push token';
|
||||
|
||||
@override
|
||||
String get pveIgnoreCertTip => 'Not recommended to enable, beware of security risks! If you are using the default certificate from PVE, you need to enable this option.';
|
||||
|
||||
@override
|
||||
String get pveLoginFailed => 'Login failed. Unable to authenticate with username/password from server configuration for Linux PAM login.';
|
||||
|
||||
@override
|
||||
String get pveVersionLow => 'This feature is currently in the testing phase and has only been tested on PVE 8+. Please use it with caution.';
|
||||
|
||||
@override
|
||||
String get pwd => 'Password';
|
||||
|
||||
@override
|
||||
String get read => 'Read';
|
||||
|
||||
@override
|
||||
String get reboot => 'Reboot';
|
||||
|
||||
@override
|
||||
String get rememberPwdInMem => 'Remember password in memory';
|
||||
|
||||
@override
|
||||
String get rememberPwdInMemTip => 'Used for containers, suspending, etc.';
|
||||
|
||||
@override
|
||||
String get rememberWindowSize => 'Remember window size';
|
||||
|
||||
@override
|
||||
String get remotePath => 'Remote path';
|
||||
|
||||
@override
|
||||
String get restart => 'Restart';
|
||||
|
||||
@override
|
||||
String get result => 'Result';
|
||||
|
||||
@override
|
||||
String get rotateAngel => 'Rotation angle';
|
||||
|
||||
@override
|
||||
String get route => 'Routing';
|
||||
|
||||
@override
|
||||
String get run => 'Run';
|
||||
|
||||
@override
|
||||
String get running => 'Running';
|
||||
|
||||
@override
|
||||
String get sameIdServerExist => 'A server with the same ID already exists';
|
||||
|
||||
@override
|
||||
String get save => 'Save';
|
||||
|
||||
@override
|
||||
String get saved => 'Saved';
|
||||
|
||||
@override
|
||||
String get second => 's';
|
||||
|
||||
@override
|
||||
String get sensors => 'Sensor';
|
||||
|
||||
@override
|
||||
String get sequence => 'Sequence';
|
||||
|
||||
@override
|
||||
String get server => 'Server';
|
||||
|
||||
@override
|
||||
String get serverDetailOrder => 'Detail page widget order';
|
||||
|
||||
@override
|
||||
String get serverFuncBtns => 'Server function buttons';
|
||||
|
||||
@override
|
||||
String get serverOrder => 'Server order';
|
||||
|
||||
@override
|
||||
String get sftpDlPrepare => 'Preparing to connect...';
|
||||
|
||||
@override
|
||||
String get sftpEditorTip => 'If empty, use the built-in file editor of the app. If a value is present, use the remote server’s editor, e.g., `vim` (recommended to automatically detect according to `EDITOR`).';
|
||||
|
||||
@override
|
||||
String get sftpRmrDirSummary => 'Use `rm -r` to delete a folder in SFTP.';
|
||||
|
||||
@override
|
||||
String get sftpSSHConnected => 'SFTP Connected';
|
||||
|
||||
@override
|
||||
String get sftpShowFoldersFirst => 'Display folders first';
|
||||
|
||||
@override
|
||||
String get showDistLogo => 'Show distribution logo';
|
||||
|
||||
@override
|
||||
String get shutdown => 'Shutdown';
|
||||
|
||||
@override
|
||||
String get size => 'Size';
|
||||
|
||||
@override
|
||||
String get snippet => 'Snippet';
|
||||
|
||||
@override
|
||||
String get softWrap => 'Soft wrap';
|
||||
|
||||
@override
|
||||
String get specifyDev => 'Specify device';
|
||||
|
||||
@override
|
||||
String get specifyDevTip => 'For example, network traffic statistics are by default for all devices. You can specify a particular device here.';
|
||||
|
||||
@override
|
||||
String get speed => 'Speed';
|
||||
|
||||
@override
|
||||
String spentTime(Object time) {
|
||||
return 'Spent time: $time';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshTermHelp => 'When the terminal is scrollable, dragging horizontally can select text. Clicking the keyboard button turns the keyboard on/off. The file icon opens the current path SFTP. The clipboard button copies the content when text is selected, and pastes content from the clipboard into the terminal when no text is selected and there is content on the clipboard. The code icon pastes code snippets into the terminal and executes them.';
|
||||
|
||||
@override
|
||||
String sshTip(Object url) {
|
||||
return 'This function is now in the experimental stage.\n\nPlease report bugs on $url or join our development.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshVirtualKeyAutoOff => 'Auto switching of virtual keys';
|
||||
|
||||
@override
|
||||
String get start => 'Start';
|
||||
|
||||
@override
|
||||
String get stat => 'Statistics';
|
||||
|
||||
@override
|
||||
String get stats => 'Statistics';
|
||||
|
||||
@override
|
||||
String get stop => 'Stop';
|
||||
|
||||
@override
|
||||
String get stopped => 'Stopped';
|
||||
|
||||
@override
|
||||
String get storage => 'Storage';
|
||||
|
||||
@override
|
||||
String get supportFmtArgs => 'The following formatting parameters are supported:';
|
||||
|
||||
@override
|
||||
String get suspend => 'Suspend';
|
||||
|
||||
@override
|
||||
String get suspendTip => 'The suspend function requires root permission and systemd support.';
|
||||
|
||||
@override
|
||||
String switchTo(Object val) {
|
||||
return 'Switch to $val';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sync => 'Sync';
|
||||
|
||||
@override
|
||||
String get syncTip => 'A restart may be required for some changes to take effect.';
|
||||
|
||||
@override
|
||||
String get system => 'System';
|
||||
|
||||
@override
|
||||
String get tag => 'Tags';
|
||||
|
||||
@override
|
||||
String get temperature => 'Temperature';
|
||||
|
||||
@override
|
||||
String get termFontSizeTip => 'This setting will affect the terminal size (width and height). You can zoom in on the terminal page to adjust the font size of the current session.';
|
||||
|
||||
@override
|
||||
String get terminal => 'Terminal';
|
||||
|
||||
@override
|
||||
String get test => 'Test';
|
||||
|
||||
@override
|
||||
String get textScaler => 'Text scaler';
|
||||
|
||||
@override
|
||||
String get textScalerTip => '1.0 => 100% (original size), only works on server page part of the font, not recommended to change.';
|
||||
|
||||
@override
|
||||
String get theme => 'Theme';
|
||||
|
||||
@override
|
||||
String get time => 'Time';
|
||||
|
||||
@override
|
||||
String get times => 'Times';
|
||||
|
||||
@override
|
||||
String get total => 'Total';
|
||||
|
||||
@override
|
||||
String get traffic => 'Traffic';
|
||||
|
||||
@override
|
||||
String get trySudo => 'Try using sudo';
|
||||
|
||||
@override
|
||||
String get ttl => 'TTL';
|
||||
|
||||
@override
|
||||
String get unknown => 'Unknown';
|
||||
|
||||
@override
|
||||
String get unkownConvertMode => 'Unknown conversion mode';
|
||||
|
||||
@override
|
||||
String get update => 'Update';
|
||||
|
||||
@override
|
||||
String get updateIntervalEqual0 => 'You set to 0, will not update automatically.\nCan\'t calculate CPU status.';
|
||||
|
||||
@override
|
||||
String get updateServerStatusInterval => 'Server status update interval';
|
||||
|
||||
@override
|
||||
String get upload => 'Upload';
|
||||
|
||||
@override
|
||||
String get upsideDown => 'Upside Down';
|
||||
|
||||
@override
|
||||
String get uptime => 'Uptime';
|
||||
|
||||
@override
|
||||
String get useCdn => 'Using CDN';
|
||||
|
||||
@override
|
||||
String get useCdnTip => 'Non-Chinese users are recommended to use CDN. Would you like to use it?';
|
||||
|
||||
@override
|
||||
String get useNoPwd => 'No password will be used';
|
||||
|
||||
@override
|
||||
String get usePodmanByDefault => 'Use Podman by default';
|
||||
|
||||
@override
|
||||
String get used => 'Used';
|
||||
|
||||
@override
|
||||
String get view => 'View';
|
||||
|
||||
@override
|
||||
String get viewErr => 'See error';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpClipboard => 'Copy to the clipboard if the selected terminal is not empty, otherwise paste the content of the clipboard to the terminal.';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpIME => 'Turn on/off the keyboard';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpSFTP => 'Open current directory in SFTP.';
|
||||
|
||||
@override
|
||||
String get waitConnection => 'Please wait for the connection to be established.';
|
||||
|
||||
@override
|
||||
String get wakeLock => 'Keep awake';
|
||||
|
||||
@override
|
||||
String get watchNotPaired => 'No paired Apple Watch';
|
||||
|
||||
@override
|
||||
String get webdavSettingEmpty => 'WebDav setting is empty';
|
||||
|
||||
@override
|
||||
String get whenOpenApp => 'When opening the app';
|
||||
|
||||
@override
|
||||
String get wolTip => 'After configuring WOL (Wake-on-LAN), a WOL request is sent each time the server is connected.';
|
||||
|
||||
@override
|
||||
String get write => 'Write';
|
||||
|
||||
@override
|
||||
String get writeScriptFailTip => 'Writing to the script failed, possibly due to lack of permissions or the directory does not exist.';
|
||||
|
||||
@override
|
||||
String get writeScriptTip => 'After connecting to the server, a script will be written to ~/.config/server_box to monitor the system status. You can review the script content.';
|
||||
}
|
||||
708
lib/generated/l10n/l10n_es.dart
Normal file
708
lib/generated/l10n/l10n_es.dart
Normal file
@@ -0,0 +1,708 @@
|
||||
import 'l10n.dart';
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
/// The translations for Spanish Castilian (`es`).
|
||||
class AppLocalizationsEs extends AppLocalizations {
|
||||
AppLocalizationsEs([String locale = 'es']) : super(locale);
|
||||
|
||||
@override
|
||||
String get aboutThanks => 'Gracias a los siguientes participantes.';
|
||||
|
||||
@override
|
||||
String get acceptBeta => 'Aceptar actualizaciones de la versión de prueba';
|
||||
|
||||
@override
|
||||
String get addSystemPrivateKeyTip => 'Actualmente no hay ninguna llave privada, ¿quieres agregar la que viene por defecto en el sistema (~/.ssh/id_rsa)?';
|
||||
|
||||
@override
|
||||
String get added2List => 'Añadido a la lista de tareas';
|
||||
|
||||
@override
|
||||
String get addr => 'Dirección';
|
||||
|
||||
@override
|
||||
String get alreadyLastDir => 'Ya estás en el directorio superior';
|
||||
|
||||
@override
|
||||
String get authFailTip => 'La autenticación ha fallado, por favor verifica si la contraseña/llave/host/usuario, etc., son incorrectos.';
|
||||
|
||||
@override
|
||||
String get autoBackupConflict => 'Solo se puede activar una copia de seguridad automática a la vez';
|
||||
|
||||
@override
|
||||
String get autoConnect => 'Conexión automática';
|
||||
|
||||
@override
|
||||
String get autoRun => 'Ejecución automática';
|
||||
|
||||
@override
|
||||
String get autoUpdateHomeWidget => 'Actualizar automáticamente el widget del escritorio';
|
||||
|
||||
@override
|
||||
String get backupTip => 'Los datos exportados solo están encriptados de manera básica, por favor guárdalos en un lugar seguro.';
|
||||
|
||||
@override
|
||||
String get backupVersionNotMatch => 'La versión de la copia de seguridad no coincide, no se puede restaurar';
|
||||
|
||||
@override
|
||||
String get battery => 'Batería';
|
||||
|
||||
@override
|
||||
String get bgRun => 'Ejecución en segundo plano';
|
||||
|
||||
@override
|
||||
String get bgRunTip => 'Este interruptor solo indica que la aplicación intentará correr en segundo plano, si puede hacerlo o no depende de si tiene el permiso correspondiente. En Android puro, por favor desactiva la “optimización de batería” para esta app, en MIUI por favor cambia la estrategia de ahorro de energía a “Sin restricciones”.';
|
||||
|
||||
@override
|
||||
String get closeAfterSave => 'Guardar y cerrar';
|
||||
|
||||
@override
|
||||
String get cmd => 'Comando';
|
||||
|
||||
@override
|
||||
String get collapseUITip => '¿Colapsar por defecto las listas largas en la UI?';
|
||||
|
||||
@override
|
||||
String get conn => 'Conectar';
|
||||
|
||||
@override
|
||||
String get container => 'Contenedor';
|
||||
|
||||
@override
|
||||
String get containerTrySudoTip => 'Por ejemplo: si configuras el usuario dentro de la app como aaa, pero Docker está instalado bajo el usuario root, entonces necesitarás habilitar esta opción';
|
||||
|
||||
@override
|
||||
String get convert => 'Convertir';
|
||||
|
||||
@override
|
||||
String get copyPath => 'Copiar ruta';
|
||||
|
||||
@override
|
||||
String get cpuViewAsProgressTip => 'Muestre la tasa de uso de cada CPU en estilo de barra de progreso (estilo antiguo)';
|
||||
|
||||
@override
|
||||
String get cursorType => 'Tipo de cursor';
|
||||
|
||||
@override
|
||||
String get customCmd => 'Comandos personalizados';
|
||||
|
||||
@override
|
||||
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
|
||||
|
||||
@override
|
||||
String get customCmdHint => '\"Nombre del comando\": \"Comando\"';
|
||||
|
||||
@override
|
||||
String get decode => 'Decodificar';
|
||||
|
||||
@override
|
||||
String get decompress => 'Descomprimir';
|
||||
|
||||
@override
|
||||
String get deleteServers => 'Eliminar servidores en lote';
|
||||
|
||||
@override
|
||||
String get dirEmpty => 'Asegúrate de que el directorio esté vacío';
|
||||
|
||||
@override
|
||||
String get disconnected => 'Desconectado';
|
||||
|
||||
@override
|
||||
String get disk => 'Disco';
|
||||
|
||||
@override
|
||||
String get diskIgnorePath => 'Rutas de disco ignoradas';
|
||||
|
||||
@override
|
||||
String get displayCpuIndex => 'Muestre el índice de CPU';
|
||||
|
||||
@override
|
||||
String dl2Local(Object fileName) {
|
||||
return '¿Descargar $fileName a local?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerEmptyRunningItems => 'No hay contenedores en ejecución.\nEsto podría deberse a que:\n- El usuario con el que se instaló Docker es diferente al configurado en la app\n- La variable de entorno DOCKER_HOST no se ha leído correctamente. Puedes obtenerla ejecutando `echo \$DOCKER_HOST` en el terminal.';
|
||||
|
||||
@override
|
||||
String dockerImagesFmt(Object count) {
|
||||
return 'Total de $count imágenes';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerNotInstalled => 'Docker no está instalado';
|
||||
|
||||
@override
|
||||
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
|
||||
return '$runningCount en ejecución, $stoppedCount detenidos';
|
||||
}
|
||||
|
||||
@override
|
||||
String dockerStatusRunningFmt(Object count) {
|
||||
return '$count contenedores en ejecución';
|
||||
}
|
||||
|
||||
@override
|
||||
String get doubleColumnMode => 'Modo de doble columna';
|
||||
|
||||
@override
|
||||
String get doubleColumnTip => 'Esta opción solo habilita la función, si se puede activar o no depende del ancho del dispositivo';
|
||||
|
||||
@override
|
||||
String get editVirtKeys => 'Editar teclas virtuales';
|
||||
|
||||
@override
|
||||
String get editor => 'Editor';
|
||||
|
||||
@override
|
||||
String get editorHighlightTip => 'El rendimiento del resaltado de código es bastante pobre actualmente, puedes elegir desactivarlo para mejorar.';
|
||||
|
||||
@override
|
||||
String get encode => 'Codificar';
|
||||
|
||||
@override
|
||||
String get envVars => 'Variable de entorno';
|
||||
|
||||
@override
|
||||
String get experimentalFeature => 'Función experimental';
|
||||
|
||||
@override
|
||||
String get extraArgs => 'Argumentos extra';
|
||||
|
||||
@override
|
||||
String get fallbackSshDest => 'Destino SSH alternativo';
|
||||
|
||||
@override
|
||||
String get fdroidReleaseTip => 'Si descargaste esta aplicación desde F-Droid, se recomienda desactivar esta opción.';
|
||||
|
||||
@override
|
||||
String get fgService => 'Servicio en primer plano';
|
||||
|
||||
@override
|
||||
String get fgServiceTip => 'Después de activarlo, algunos modelos de dispositivos pueden bloquearse. Desactivarlo puede hacer que algunos modelos no puedan mantener las conexiones SSH en segundo plano. Por favor, permita los permisos de notificación de ServerBox, la ejecución en segundo plano y el auto-despertar en la configuración del sistema.';
|
||||
|
||||
@override
|
||||
String fileTooLarge(Object file, Object size, Object sizeMax) {
|
||||
return 'El archivo \'$file\' es demasiado grande \'$size\', supera el $sizeMax';
|
||||
}
|
||||
|
||||
@override
|
||||
String get followSystem => 'Seguir al sistema';
|
||||
|
||||
@override
|
||||
String get font => 'Fuente';
|
||||
|
||||
@override
|
||||
String get fontSize => 'Tamaño de fuente';
|
||||
|
||||
@override
|
||||
String get force => 'Forzar';
|
||||
|
||||
@override
|
||||
String get fullScreen => 'Modo pantalla completa';
|
||||
|
||||
@override
|
||||
String get fullScreenJitter => 'Temblores en modo pantalla completa';
|
||||
|
||||
@override
|
||||
String get fullScreenJitterHelp => 'Prevención de quemaduras de pantalla';
|
||||
|
||||
@override
|
||||
String get fullScreenTip => '¿Debe habilitarse el modo de pantalla completa cuando el dispositivo se rote al modo horizontal? Esta opción solo se aplica a la pestaña del servidor.';
|
||||
|
||||
@override
|
||||
String get goBackQ => '¿Regresar?';
|
||||
|
||||
@override
|
||||
String get goto => 'Ir a';
|
||||
|
||||
@override
|
||||
String get hideTitleBar => 'Ocultar barra de título';
|
||||
|
||||
@override
|
||||
String get highlight => 'Resaltar código';
|
||||
|
||||
@override
|
||||
String get homeWidgetUrlConfig => 'Configuración de URL del widget de inicio';
|
||||
|
||||
@override
|
||||
String get host => 'Anfitrión';
|
||||
|
||||
@override
|
||||
String httpFailedWithCode(Object code) {
|
||||
return 'Fallo en la solicitud, código de estado: $code';
|
||||
}
|
||||
|
||||
@override
|
||||
String get ignoreCert => 'Ignorar certificado';
|
||||
|
||||
@override
|
||||
String get image => 'Imagen';
|
||||
|
||||
@override
|
||||
String get imagesList => 'Lista de imágenes';
|
||||
|
||||
@override
|
||||
String get init => 'Inicializar';
|
||||
|
||||
@override
|
||||
String get inner => 'Interno';
|
||||
|
||||
@override
|
||||
String get install => 'Instalar';
|
||||
|
||||
@override
|
||||
String get installDockerWithUrl => 'Por favor instala Docker primero desde https://docs.docker.com/engine/install';
|
||||
|
||||
@override
|
||||
String get invalid => 'Inválido';
|
||||
|
||||
@override
|
||||
String get jumpServer => 'Servidor de salto';
|
||||
|
||||
@override
|
||||
String get keepForeground => '¡Por favor, mantén la app en primer plano!';
|
||||
|
||||
@override
|
||||
String get keepStatusWhenErr => 'Mantener el estado anterior del servidor';
|
||||
|
||||
@override
|
||||
String get keepStatusWhenErrTip => 'Solo aplica cuando hay errores al ejecutar scripts';
|
||||
|
||||
@override
|
||||
String get keyAuth => 'Autenticación con llave';
|
||||
|
||||
@override
|
||||
String get letterCache => 'Caché de letras';
|
||||
|
||||
@override
|
||||
String get letterCacheTip => 'Recomendado desactivar, pero después de desactivarlo, no se podrán ingresar caracteres CJK.';
|
||||
|
||||
@override
|
||||
String get license => 'Licencia de código abierto';
|
||||
|
||||
@override
|
||||
String get location => 'Ubicación';
|
||||
|
||||
@override
|
||||
String get loss => 'Tasa de pérdida';
|
||||
|
||||
@override
|
||||
String madeWithLove(Object myGithub) {
|
||||
return 'Hecho con ❤️ por $myGithub';
|
||||
}
|
||||
|
||||
@override
|
||||
String get manual => 'Manual';
|
||||
|
||||
@override
|
||||
String get max => 'Máximo';
|
||||
|
||||
@override
|
||||
String get maxRetryCount => 'Número máximo de reintentos de conexión al servidor';
|
||||
|
||||
@override
|
||||
String get maxRetryCountEqual0 => 'Reintentará infinitamente';
|
||||
|
||||
@override
|
||||
String get min => 'Mínimo';
|
||||
|
||||
@override
|
||||
String get mission => 'Misión';
|
||||
|
||||
@override
|
||||
String get more => 'Más';
|
||||
|
||||
@override
|
||||
String get moveOutServerFuncBtnsHelp => 'Activado: se mostrará debajo de cada tarjeta en la página de servidores. Desactivado: se mostrará en la parte superior de los detalles del servidor.';
|
||||
|
||||
@override
|
||||
String get ms => 'milisegundos';
|
||||
|
||||
@override
|
||||
String get needHomeDir => 'Si eres usuario de Synology, [consulta aquí](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Los usuarios de otros sistemas deben buscar cómo crear un directorio home.';
|
||||
|
||||
@override
|
||||
String get needRestart => 'Necesita reiniciar la app';
|
||||
|
||||
@override
|
||||
String get net => 'Red';
|
||||
|
||||
@override
|
||||
String get netViewType => 'Tipo de vista de red';
|
||||
|
||||
@override
|
||||
String get newContainer => 'Crear contenedor nuevo';
|
||||
|
||||
@override
|
||||
String get noLineChart => 'No utilice gráficos de líneas';
|
||||
|
||||
@override
|
||||
String get noLineChartForCpu => 'No utilice gráficos lineales para la CPU';
|
||||
|
||||
@override
|
||||
String get noPrivateKeyTip => 'La clave privada no existe, puede haber sido eliminada o hay un error de configuración.';
|
||||
|
||||
@override
|
||||
String get noPromptAgain => 'No volver a preguntar';
|
||||
|
||||
@override
|
||||
String get node => 'Nodo';
|
||||
|
||||
@override
|
||||
String get notAvailable => 'No disponible';
|
||||
|
||||
@override
|
||||
String get onServerDetailPage => 'En la página de detalles del servidor';
|
||||
|
||||
@override
|
||||
String get onlyOneLine => 'Mostrar solo en una línea (desplazable)';
|
||||
|
||||
@override
|
||||
String get onlyWhenCoreBiggerThan8 => 'Efectivo solo cuando el número de núcleos > 8';
|
||||
|
||||
@override
|
||||
String get openLastPath => 'Abrir el último camino';
|
||||
|
||||
@override
|
||||
String get openLastPathTip => 'Los diferentes servidores tendrán diferentes registros, y lo que se registra es la ruta de salida';
|
||||
|
||||
@override
|
||||
String get parseContainerStatsTip => 'El análisis del estado de uso de Docker es bastante lento';
|
||||
|
||||
@override
|
||||
String percentOfSize(Object percent, Object size) {
|
||||
return 'El $percent% de $size';
|
||||
}
|
||||
|
||||
@override
|
||||
String get permission => 'Permisos';
|
||||
|
||||
@override
|
||||
String get pingAvg => 'Promedio:';
|
||||
|
||||
@override
|
||||
String get pingInputIP => 'Por favor, introduce la IP de destino o el dominio';
|
||||
|
||||
@override
|
||||
String get pingNoServer => 'No hay servidores disponibles para hacer Ping\nPor favor, añade un servidor en la pestaña de servidores y vuelve a intentarlo';
|
||||
|
||||
@override
|
||||
String get pkg => 'Gestión de paquetes';
|
||||
|
||||
@override
|
||||
String get plugInType => 'Tipo de inserción';
|
||||
|
||||
@override
|
||||
String get port => 'Puerto';
|
||||
|
||||
@override
|
||||
String get preview => 'Vista previa';
|
||||
|
||||
@override
|
||||
String get privateKey => 'Llave privada';
|
||||
|
||||
@override
|
||||
String get process => 'Proceso';
|
||||
|
||||
@override
|
||||
String get pushToken => 'Token de notificaciones';
|
||||
|
||||
@override
|
||||
String get pveIgnoreCertTip => 'No se recomienda activarlo, ¡tenga cuidado con los riesgos de seguridad! Si está utilizando el certificado predeterminado de PVE, debe habilitar esta opción.';
|
||||
|
||||
@override
|
||||
String get pveLoginFailed => 'Fallo al iniciar sesión. No se puede autenticar con el nombre de usuario/contraseña de la configuración del servidor para el inicio de sesión de Linux PAM.';
|
||||
|
||||
@override
|
||||
String get pveVersionLow => 'Esta función está actualmente en fase de prueba y solo se ha probado en PVE 8+. Úsela con precaución.';
|
||||
|
||||
@override
|
||||
String get pwd => 'Contraseña';
|
||||
|
||||
@override
|
||||
String get read => 'Leer';
|
||||
|
||||
@override
|
||||
String get reboot => 'Reiniciar';
|
||||
|
||||
@override
|
||||
String get rememberPwdInMem => 'Recordar contraseña en la memoria';
|
||||
|
||||
@override
|
||||
String get rememberPwdInMemTip => 'Utilizado para contenedores, suspensión, etc.';
|
||||
|
||||
@override
|
||||
String get rememberWindowSize => 'Recordar el tamaño de la ventana';
|
||||
|
||||
@override
|
||||
String get remotePath => 'Ruta remota';
|
||||
|
||||
@override
|
||||
String get restart => 'Reiniciar';
|
||||
|
||||
@override
|
||||
String get result => 'Resultado';
|
||||
|
||||
@override
|
||||
String get rotateAngel => 'Ángulo de rotación';
|
||||
|
||||
@override
|
||||
String get route => 'Enrutamiento';
|
||||
|
||||
@override
|
||||
String get run => 'Ejecutar';
|
||||
|
||||
@override
|
||||
String get running => 'En ejecución';
|
||||
|
||||
@override
|
||||
String get sameIdServerExist => 'Ya existe un servidor con el mismo ID';
|
||||
|
||||
@override
|
||||
String get save => 'Guardar';
|
||||
|
||||
@override
|
||||
String get saved => 'Guardado';
|
||||
|
||||
@override
|
||||
String get second => 'Segundo';
|
||||
|
||||
@override
|
||||
String get sensors => 'Sensores';
|
||||
|
||||
@override
|
||||
String get sequence => 'Secuencia';
|
||||
|
||||
@override
|
||||
String get server => 'Servidor';
|
||||
|
||||
@override
|
||||
String get serverDetailOrder => 'Orden de los componentes en la página de detalles del servidor';
|
||||
|
||||
@override
|
||||
String get serverFuncBtns => 'Botones de función del servidor';
|
||||
|
||||
@override
|
||||
String get serverOrder => 'Orden del servidor';
|
||||
|
||||
@override
|
||||
String get sftpDlPrepare => 'Preparando para conectar al servidor...';
|
||||
|
||||
@override
|
||||
String get sftpEditorTip => 'Si está vacío, use el editor de archivos incorporado de la aplicación. Si hay un valor, use el editor del servidor remoto, por ejemplo, `vim` (se recomienda detectar automáticamente según `EDITOR`).';
|
||||
|
||||
@override
|
||||
String get sftpRmrDirSummary => 'Usar `rm -r` en SFTP para eliminar directorios';
|
||||
|
||||
@override
|
||||
String get sftpSSHConnected => 'SFTP conectado...';
|
||||
|
||||
@override
|
||||
String get sftpShowFoldersFirst => 'Mostrar carpetas primero';
|
||||
|
||||
@override
|
||||
String get showDistLogo => 'Mostrar logo de distribución';
|
||||
|
||||
@override
|
||||
String get shutdown => 'Apagar';
|
||||
|
||||
@override
|
||||
String get size => 'Tamaño';
|
||||
|
||||
@override
|
||||
String get snippet => 'Fragmento de código';
|
||||
|
||||
@override
|
||||
String get softWrap => 'Salto de línea suave';
|
||||
|
||||
@override
|
||||
String get specifyDev => 'Especificar dispositivo';
|
||||
|
||||
@override
|
||||
String get specifyDevTip => 'Por ejemplo, las estadísticas de tráfico de red son por defecto para todos los dispositivos. Aquí puede especificar un dispositivo en particular.';
|
||||
|
||||
@override
|
||||
String get speed => 'Velocidad';
|
||||
|
||||
@override
|
||||
String spentTime(Object time) {
|
||||
return 'Tiempo gastado: $time';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshTermHelp => 'Cuando el terminal es desplazable, arrastrar horizontalmente puede seleccionar texto. Hacer clic en el botón del teclado enciende/apaga el teclado. El icono de archivo abre el SFTP de la ruta actual. El botón del portapapeles copia el contenido cuando se selecciona texto y pega el contenido del portapapeles en el terminal cuando no se selecciona texto y hay contenido en el portapapeles. El icono de código pega fragmentos de código en el terminal y los ejecuta.';
|
||||
|
||||
@override
|
||||
String sshTip(Object url) {
|
||||
return 'Esta función está en fase de pruebas.\n\nPor favor, informa los problemas en $url, o únete a nuestro desarrollo.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshVirtualKeyAutoOff => 'Desactivación automática de teclas virtuales';
|
||||
|
||||
@override
|
||||
String get start => 'Iniciar';
|
||||
|
||||
@override
|
||||
String get stat => 'Estadísticas';
|
||||
|
||||
@override
|
||||
String get stats => 'Estadísticas';
|
||||
|
||||
@override
|
||||
String get stop => 'Detener';
|
||||
|
||||
@override
|
||||
String get stopped => 'Detenido';
|
||||
|
||||
@override
|
||||
String get storage => 'Almacenamiento';
|
||||
|
||||
@override
|
||||
String get supportFmtArgs => 'Soporta los siguientes argumentos de formato:';
|
||||
|
||||
@override
|
||||
String get suspend => 'Suspender';
|
||||
|
||||
@override
|
||||
String get suspendTip => 'La función de suspender necesita permisos de root y soporte de systemd.';
|
||||
|
||||
@override
|
||||
String switchTo(Object val) {
|
||||
return 'Cambiar a $val';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sync => 'Sincronizar';
|
||||
|
||||
@override
|
||||
String get syncTip => 'Puede que necesites reiniciar para que algunos cambios tengan efecto.';
|
||||
|
||||
@override
|
||||
String get system => 'Sistema';
|
||||
|
||||
@override
|
||||
String get tag => 'Etiqueta';
|
||||
|
||||
@override
|
||||
String get temperature => 'Temperatura';
|
||||
|
||||
@override
|
||||
String get termFontSizeTip => 'Este ajuste afectará el tamaño del terminal (ancho y alto). Puedes hacer zoom en la página del terminal para ajustar el tamaño de fuente de la sesión actual.';
|
||||
|
||||
@override
|
||||
String get terminal => 'Terminal';
|
||||
|
||||
@override
|
||||
String get test => 'Prueba';
|
||||
|
||||
@override
|
||||
String get textScaler => 'Escalar texto';
|
||||
|
||||
@override
|
||||
String get textScalerTip => '1.0 => 100% (tamaño original), solo afecta a ciertas fuentes en la página del servidor, no se recomienda modificar.';
|
||||
|
||||
@override
|
||||
String get theme => 'Tema';
|
||||
|
||||
@override
|
||||
String get time => 'Tiempo';
|
||||
|
||||
@override
|
||||
String get times => 'Veces';
|
||||
|
||||
@override
|
||||
String get total => 'Total';
|
||||
|
||||
@override
|
||||
String get traffic => 'Tráfico';
|
||||
|
||||
@override
|
||||
String get trySudo => 'Intentar con sudo';
|
||||
|
||||
@override
|
||||
String get ttl => 'TTL';
|
||||
|
||||
@override
|
||||
String get unknown => 'Desconocido';
|
||||
|
||||
@override
|
||||
String get unkownConvertMode => 'Modo de conversión desconocido';
|
||||
|
||||
@override
|
||||
String get update => 'Actualizar';
|
||||
|
||||
@override
|
||||
String get updateIntervalEqual0 => 'Si configuras esto a 0, el estado del servidor no se refrescará automáticamente.\nY no se podrá calcular el uso de CPU.';
|
||||
|
||||
@override
|
||||
String get updateServerStatusInterval => 'Intervalo de actualización del estado del servidor';
|
||||
|
||||
@override
|
||||
String get upload => 'Subir';
|
||||
|
||||
@override
|
||||
String get upsideDown => 'Invertir arriba por abajo';
|
||||
|
||||
@override
|
||||
String get uptime => 'Tiempo de actividad';
|
||||
|
||||
@override
|
||||
String get useCdn => 'Usando CDN';
|
||||
|
||||
@override
|
||||
String get useCdnTip => 'Se recomienda a los usuarios no chinos utilizar CDN. ¿Le gustaría utilizarlo?';
|
||||
|
||||
@override
|
||||
String get useNoPwd => 'Se usará sin contraseña';
|
||||
|
||||
@override
|
||||
String get usePodmanByDefault => 'Usar Podman por defecto';
|
||||
|
||||
@override
|
||||
String get used => 'Usado';
|
||||
|
||||
@override
|
||||
String get view => 'Vista';
|
||||
|
||||
@override
|
||||
String get viewErr => 'Ver error';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpClipboard => 'Si el terminal tiene caracteres seleccionados, entonces copiará los caracteres seleccionados al portapapeles, de lo contrario, pegará el contenido del portapapeles al terminal.';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpIME => 'Encender/apagar el teclado';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpSFTP => 'Abrir la ruta actual en SFTP.';
|
||||
|
||||
@override
|
||||
String get waitConnection => 'Por favor, espera a que la conexión se establezca';
|
||||
|
||||
@override
|
||||
String get wakeLock => 'Mantener despierto';
|
||||
|
||||
@override
|
||||
String get watchNotPaired => 'No hay un Apple Watch emparejado';
|
||||
|
||||
@override
|
||||
String get webdavSettingEmpty => 'La configuración de Webdav está vacía';
|
||||
|
||||
@override
|
||||
String get whenOpenApp => 'Al abrir la App';
|
||||
|
||||
@override
|
||||
String get wolTip => 'Después de configurar WOL (Wake-on-LAN), se envía una solicitud de WOL cada vez que se conecta el servidor.';
|
||||
|
||||
@override
|
||||
String get write => 'Escribir';
|
||||
|
||||
@override
|
||||
String get writeScriptFailTip => 'La escritura en el script falló, posiblemente por falta de permisos o porque el directorio no existe.';
|
||||
|
||||
@override
|
||||
String get writeScriptTip => 'Después de conectarse al servidor, se escribirá un script en ~/.config/server_box para monitorear el estado del sistema. Puedes revisar el contenido del script.';
|
||||
}
|
||||
708
lib/generated/l10n/l10n_fr.dart
Normal file
708
lib/generated/l10n/l10n_fr.dart
Normal file
@@ -0,0 +1,708 @@
|
||||
import 'l10n.dart';
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
/// The translations for French (`fr`).
|
||||
class AppLocalizationsFr extends AppLocalizations {
|
||||
AppLocalizationsFr([String locale = 'fr']) : super(locale);
|
||||
|
||||
@override
|
||||
String get aboutThanks => 'Merci aux personnes suivantes qui ont participé.';
|
||||
|
||||
@override
|
||||
String get acceptBeta => 'Accepter les mises à jour de la version de test';
|
||||
|
||||
@override
|
||||
String get addSystemPrivateKeyTip => 'Actuellement, vous n\'avez aucune clé privée. Souhaitez-vous ajouter celle qui vient avec le système (~/.ssh/id_rsa) ?';
|
||||
|
||||
@override
|
||||
String get added2List => 'Ajouté à la liste des tâches';
|
||||
|
||||
@override
|
||||
String get addr => 'Adresse';
|
||||
|
||||
@override
|
||||
String get alreadyLastDir => 'Déjà dans le dernier répertoire.';
|
||||
|
||||
@override
|
||||
String get authFailTip => 'Échec de l\'authentification. Veuillez vérifier si le mot de passe/clé/hôte/utilisateur, etc., est incorrect.';
|
||||
|
||||
@override
|
||||
String get autoBackupConflict => 'Un seul sauvegarde automatique peut être activé en même temps.';
|
||||
|
||||
@override
|
||||
String get autoConnect => 'Connexion automatique';
|
||||
|
||||
@override
|
||||
String get autoRun => 'Exécution automatique';
|
||||
|
||||
@override
|
||||
String get autoUpdateHomeWidget => 'Mise à jour automatique du widget d\'accueil';
|
||||
|
||||
@override
|
||||
String get backupTip => 'Les données exportées sont simplement chiffrées. \nVeuillez les garder en sécurité.';
|
||||
|
||||
@override
|
||||
String get backupVersionNotMatch => 'La version de sauvegarde ne correspond pas.';
|
||||
|
||||
@override
|
||||
String get battery => 'Batterie';
|
||||
|
||||
@override
|
||||
String get bgRun => 'Exécution en arrière-plan';
|
||||
|
||||
@override
|
||||
String get bgRunTip => 'Cette option signifie seulement que le programme essaiera de s\'exécuter en arrière-plan, que cela soit possible dépend de l\'autorisation activée ou non. Pour Android natif, veuillez désactiver l\'« Optimisation de la batterie » dans cette application, et pour MIUI, veuillez changer la politique d\'économie d\'énergie en « Illimité ».';
|
||||
|
||||
@override
|
||||
String get closeAfterSave => 'Enregistrer et fermer';
|
||||
|
||||
@override
|
||||
String get cmd => 'Commande';
|
||||
|
||||
@override
|
||||
String get collapseUITip => 'Indique si les longues listes présentées dans l\'interface utilisateur doivent être réduites par défaut.';
|
||||
|
||||
@override
|
||||
String get conn => 'Connexion';
|
||||
|
||||
@override
|
||||
String get container => 'Conteneur';
|
||||
|
||||
@override
|
||||
String get containerTrySudoTip => 'Par exemple : Dans l\'application, l\'utilisateur est défini comme aaa, mais Docker est installé sous l\'utilisateur root. Dans ce cas, vous devez activer cette option.';
|
||||
|
||||
@override
|
||||
String get convert => 'Convertir';
|
||||
|
||||
@override
|
||||
String get copyPath => 'Copier le chemin';
|
||||
|
||||
@override
|
||||
String get cpuViewAsProgressTip => 'Afficher le taux d\'utilisation de chaque CPU sous forme de barre de progression (ancien style)';
|
||||
|
||||
@override
|
||||
String get cursorType => 'Type de curseur';
|
||||
|
||||
@override
|
||||
String get customCmd => 'Commandes personnalisées';
|
||||
|
||||
@override
|
||||
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
|
||||
|
||||
@override
|
||||
String get customCmdHint => '\"Nom de la commande\": \"Commande\"';
|
||||
|
||||
@override
|
||||
String get decode => 'Décoder';
|
||||
|
||||
@override
|
||||
String get decompress => 'Décompresser';
|
||||
|
||||
@override
|
||||
String get deleteServers => 'Supprimer des serveurs en lot';
|
||||
|
||||
@override
|
||||
String get dirEmpty => 'Assurez-vous que le répertoire est vide.';
|
||||
|
||||
@override
|
||||
String get disconnected => 'Déconnecté';
|
||||
|
||||
@override
|
||||
String get disk => 'Disque';
|
||||
|
||||
@override
|
||||
String get diskIgnorePath => 'Chemin à ignorer pour le disque';
|
||||
|
||||
@override
|
||||
String get displayCpuIndex => 'Afficher l\'index CPU';
|
||||
|
||||
@override
|
||||
String dl2Local(Object fileName) {
|
||||
return 'Télécharger $fileName localement ?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerEmptyRunningItems => 'Aucun conteneur en cours d\'exécution.\nCela peut être dû à :\n- L\'utilisateur d\'installation de Docker n\'est pas le même que celui configuré dans l\'application.\n- La variable d\'environnement DOCKER_HOST n\'a pas été lue correctement. Vous pouvez l\'obtenir en exécutant `echo \$DOCKER_HOST` dans le terminal.';
|
||||
|
||||
@override
|
||||
String dockerImagesFmt(Object count) {
|
||||
return '$count images';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerNotInstalled => 'Docker non installé';
|
||||
|
||||
@override
|
||||
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
|
||||
return '$runningCount en cours d\'exécution, $stoppedCount conteneur arrêté.';
|
||||
}
|
||||
|
||||
@override
|
||||
String dockerStatusRunningFmt(Object count) {
|
||||
return '$count conteneur en cours d\'exécution.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get doubleColumnMode => 'Mode double colonne';
|
||||
|
||||
@override
|
||||
String get doubleColumnTip => 'Cette option n\'active que la fonctionnalité, qu\'elle puisse être activée dépend de la largeur de l\'appareil.';
|
||||
|
||||
@override
|
||||
String get editVirtKeys => 'Modifier les touches virtuelles';
|
||||
|
||||
@override
|
||||
String get editor => 'Éditeur';
|
||||
|
||||
@override
|
||||
String get editorHighlightTip => 'La performance actuelle de mise en surbrillance du code est pire et peut être désactivée en option pour s\'améliorer.';
|
||||
|
||||
@override
|
||||
String get encode => 'Encoder';
|
||||
|
||||
@override
|
||||
String get envVars => 'Variable d’environnement';
|
||||
|
||||
@override
|
||||
String get experimentalFeature => 'Fonctionnalité expérimentale';
|
||||
|
||||
@override
|
||||
String get extraArgs => 'Arguments supplémentaires';
|
||||
|
||||
@override
|
||||
String get fallbackSshDest => 'Destino SSH alternativo';
|
||||
|
||||
@override
|
||||
String get fdroidReleaseTip => 'Si vous avez téléchargé cette application depuis F-Droid, il est recommandé de désactiver cette option.';
|
||||
|
||||
@override
|
||||
String get fgService => 'Service de premier plan';
|
||||
|
||||
@override
|
||||
String get fgServiceTip => 'Après l\'activation, certains modèles d\'appareils peuvent planter. La désactivation peut empêcher certains modèles de maintenir les connexions SSH en arrière-plan. Veuillez autoriser les permissions de notification ServerBox, l\'exécution en arrière-plan et l\'auto-réveil dans les paramètres système.';
|
||||
|
||||
@override
|
||||
String fileTooLarge(Object file, Object size, Object sizeMax) {
|
||||
return 'Fichier \'$file\' trop volumineux $size, max $sizeMax';
|
||||
}
|
||||
|
||||
@override
|
||||
String get followSystem => 'Suivre le système';
|
||||
|
||||
@override
|
||||
String get font => 'Police';
|
||||
|
||||
@override
|
||||
String get fontSize => 'Taille de la police';
|
||||
|
||||
@override
|
||||
String get force => 'Forcer';
|
||||
|
||||
@override
|
||||
String get fullScreen => 'Mode plein écran';
|
||||
|
||||
@override
|
||||
String get fullScreenJitter => 'Secousse en plein écran';
|
||||
|
||||
@override
|
||||
String get fullScreenJitterHelp => 'Pour éviter les brûlures d\'écran';
|
||||
|
||||
@override
|
||||
String get fullScreenTip => 'Le mode plein écran doit-il être activé lorsque l\'appareil est orienté en mode paysage ? Cette option s\'applique uniquement à l\'onglet serveur.';
|
||||
|
||||
@override
|
||||
String get goBackQ => 'Revenir en arrière ?';
|
||||
|
||||
@override
|
||||
String get goto => 'Aller à';
|
||||
|
||||
@override
|
||||
String get hideTitleBar => 'Masquer la barre de titre';
|
||||
|
||||
@override
|
||||
String get highlight => 'Mise en surbrillance du code';
|
||||
|
||||
@override
|
||||
String get homeWidgetUrlConfig => 'Configurer l\'URL du widget d\'accueil';
|
||||
|
||||
@override
|
||||
String get host => 'Hôte';
|
||||
|
||||
@override
|
||||
String httpFailedWithCode(Object code) {
|
||||
return 'Échec de la requête, code d\'état : $code';
|
||||
}
|
||||
|
||||
@override
|
||||
String get ignoreCert => 'Ignorer le certificat';
|
||||
|
||||
@override
|
||||
String get image => 'Image';
|
||||
|
||||
@override
|
||||
String get imagesList => 'Liste des images';
|
||||
|
||||
@override
|
||||
String get init => 'Initialiser';
|
||||
|
||||
@override
|
||||
String get inner => 'Interne';
|
||||
|
||||
@override
|
||||
String get install => 'Installer';
|
||||
|
||||
@override
|
||||
String get installDockerWithUrl => 'Veuillez d\'abord installer docker depuis https://docs.docker.com/engine/install.';
|
||||
|
||||
@override
|
||||
String get invalid => 'Invalide';
|
||||
|
||||
@override
|
||||
String get jumpServer => 'Aller au serveur';
|
||||
|
||||
@override
|
||||
String get keepForeground => 'Garder l\'application en premier plan !';
|
||||
|
||||
@override
|
||||
String get keepStatusWhenErr => 'Conserver l\'état du dernier serveur';
|
||||
|
||||
@override
|
||||
String get keepStatusWhenErrTip => 'Uniquement en cas d\'erreur lors de l\'exécution du script';
|
||||
|
||||
@override
|
||||
String get keyAuth => 'Authentification par clé';
|
||||
|
||||
@override
|
||||
String get letterCache => 'Mise en cache des lettres';
|
||||
|
||||
@override
|
||||
String get letterCacheTip => 'Recommandé de désactiver, mais après désactivation, il sera impossible de saisir des caractères CJK.';
|
||||
|
||||
@override
|
||||
String get license => 'Licence';
|
||||
|
||||
@override
|
||||
String get location => 'Emplacement';
|
||||
|
||||
@override
|
||||
String get loss => 'Perte';
|
||||
|
||||
@override
|
||||
String madeWithLove(Object myGithub) {
|
||||
return 'Fabriqué avec ❤️ par $myGithub';
|
||||
}
|
||||
|
||||
@override
|
||||
String get manual => 'Manuel';
|
||||
|
||||
@override
|
||||
String get max => 'max';
|
||||
|
||||
@override
|
||||
String get maxRetryCount => 'Nombre de reconnexions au serveur';
|
||||
|
||||
@override
|
||||
String get maxRetryCountEqual0 => 'Il va réessayer encore et encore.';
|
||||
|
||||
@override
|
||||
String get min => 'min';
|
||||
|
||||
@override
|
||||
String get mission => 'Mission';
|
||||
|
||||
@override
|
||||
String get more => 'Plus';
|
||||
|
||||
@override
|
||||
String get moveOutServerFuncBtnsHelp => 'Activé : peut être affiché sous chaque carte sur la page de l\'onglet Serveur. Désactivé : peut être affiché en haut de la page de détails du serveur.';
|
||||
|
||||
@override
|
||||
String get ms => 'ms';
|
||||
|
||||
@override
|
||||
String get needHomeDir => 'Si vous êtes utilisateur Synology, [consultez ici](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Les utilisateurs d\'autres systèmes doivent rechercher comment créer un répertoire personnel.';
|
||||
|
||||
@override
|
||||
String get needRestart => 'Nécessite un redémarrage de l\'application';
|
||||
|
||||
@override
|
||||
String get net => 'Réseau';
|
||||
|
||||
@override
|
||||
String get netViewType => 'Type de vue réseau';
|
||||
|
||||
@override
|
||||
String get newContainer => 'Nouveau conteneur';
|
||||
|
||||
@override
|
||||
String get noLineChart => 'Ne pas utiliser de graphiques linéaires';
|
||||
|
||||
@override
|
||||
String get noLineChartForCpu => 'Ne pas utiliser de graphiques linéaires pour l\'unité centrale';
|
||||
|
||||
@override
|
||||
String get noPrivateKeyTip => 'La clé privée n\'existe pas, elle a peut-être été supprimée ou il y a une erreur de configuration.';
|
||||
|
||||
@override
|
||||
String get noPromptAgain => 'Ne pas demander à nouveau';
|
||||
|
||||
@override
|
||||
String get node => 'Nœud';
|
||||
|
||||
@override
|
||||
String get notAvailable => 'Indisponible';
|
||||
|
||||
@override
|
||||
String get onServerDetailPage => 'Sur la page de détails du serveur';
|
||||
|
||||
@override
|
||||
String get onlyOneLine => 'Afficher uniquement en une seule ligne (défilement)';
|
||||
|
||||
@override
|
||||
String get onlyWhenCoreBiggerThan8 => 'Fonctionne uniquement lorsque le nombre de cœurs est > 8';
|
||||
|
||||
@override
|
||||
String get openLastPath => 'Ouvrir le dernier chemin';
|
||||
|
||||
@override
|
||||
String get openLastPathTip => 'Les différents serveurs auront des journaux différents, et le journal est le chemin vers la sortie';
|
||||
|
||||
@override
|
||||
String get parseContainerStatsTip => 'L\'analyse de l\'occupation des conteneurs Docker est relativement lente.';
|
||||
|
||||
@override
|
||||
String percentOfSize(Object percent, Object size) {
|
||||
return '$percent% de $size';
|
||||
}
|
||||
|
||||
@override
|
||||
String get permission => 'Permissions';
|
||||
|
||||
@override
|
||||
String get pingAvg => 'Moy.:';
|
||||
|
||||
@override
|
||||
String get pingInputIP => 'Veuillez saisir une adresse IP / un domaine cible.';
|
||||
|
||||
@override
|
||||
String get pingNoServer => 'Aucun serveur à pinger.\nVeuillez ajouter un serveur dans l\'onglet serveur.';
|
||||
|
||||
@override
|
||||
String get pkg => 'Pkg';
|
||||
|
||||
@override
|
||||
String get plugInType => 'Type d\'insertion';
|
||||
|
||||
@override
|
||||
String get port => 'Port';
|
||||
|
||||
@override
|
||||
String get preview => 'Aperçu';
|
||||
|
||||
@override
|
||||
String get privateKey => 'Clé privée';
|
||||
|
||||
@override
|
||||
String get process => 'Processus';
|
||||
|
||||
@override
|
||||
String get pushToken => 'Jeton d\'identification';
|
||||
|
||||
@override
|
||||
String get pveIgnoreCertTip => 'Il n\'est pas recommandé de l\'activer, attention aux risques de sécurité ! Si vous utilisez le certificat par défaut de PVE, vous devez activer cette option.';
|
||||
|
||||
@override
|
||||
String get pveLoginFailed => 'Échec de la connexion. Impossible d\'authentifier avec le nom d\'utilisateur / mot de passe de la configuration du serveur pour la connexion Linux PAM.';
|
||||
|
||||
@override
|
||||
String get pveVersionLow => 'Cette fonctionnalité est actuellement en phase de test et n\'a été testée que sur PVE 8+. Veuillez l\'utiliser avec prudence.';
|
||||
|
||||
@override
|
||||
String get pwd => 'Mot de passe';
|
||||
|
||||
@override
|
||||
String get read => 'Lire';
|
||||
|
||||
@override
|
||||
String get reboot => 'Redémarrer';
|
||||
|
||||
@override
|
||||
String get rememberPwdInMem => 'Mémoriser le mot de passe en mémoire';
|
||||
|
||||
@override
|
||||
String get rememberPwdInMemTip => 'Utilisé pour les conteneurs, la suspension, etc.';
|
||||
|
||||
@override
|
||||
String get rememberWindowSize => 'Se souvenir de la taille de la fenêtre';
|
||||
|
||||
@override
|
||||
String get remotePath => 'Chemin distant';
|
||||
|
||||
@override
|
||||
String get restart => 'Redémarrer';
|
||||
|
||||
@override
|
||||
String get result => 'Résultat';
|
||||
|
||||
@override
|
||||
String get rotateAngel => 'Angle de rotation';
|
||||
|
||||
@override
|
||||
String get route => 'Routage';
|
||||
|
||||
@override
|
||||
String get run => 'Exécuter';
|
||||
|
||||
@override
|
||||
String get running => 'En cours d\'exécution';
|
||||
|
||||
@override
|
||||
String get sameIdServerExist => 'Un serveur avec le même ID existe déjà';
|
||||
|
||||
@override
|
||||
String get save => 'Enregistrer';
|
||||
|
||||
@override
|
||||
String get saved => 'Enregistré';
|
||||
|
||||
@override
|
||||
String get second => 's';
|
||||
|
||||
@override
|
||||
String get sensors => 'Capteurs';
|
||||
|
||||
@override
|
||||
String get sequence => 'Séquence';
|
||||
|
||||
@override
|
||||
String get server => 'Serveur';
|
||||
|
||||
@override
|
||||
String get serverDetailOrder => 'Ordre des widgets de la page de détails du serveur';
|
||||
|
||||
@override
|
||||
String get serverFuncBtns => 'Boutons de fonction du serveur';
|
||||
|
||||
@override
|
||||
String get serverOrder => 'Ordre du serveur';
|
||||
|
||||
@override
|
||||
String get sftpDlPrepare => 'Préparation de la connexion...';
|
||||
|
||||
@override
|
||||
String get sftpEditorTip => 'Si vide, utilisez l’éditeur de fichiers intégré de l’application. Si une valeur est présente, utilisez l’éditeur du serveur distant, par exemple `vim` (il est recommandé de détecter automatiquement selon `EDITOR`).';
|
||||
|
||||
@override
|
||||
String get sftpRmrDirSummary => 'Utilisez `rm -r` pour supprimer un dossier en SFTP.';
|
||||
|
||||
@override
|
||||
String get sftpSSHConnected => 'SFTP Connecté';
|
||||
|
||||
@override
|
||||
String get sftpShowFoldersFirst => 'Afficher d\'abord les dossiers';
|
||||
|
||||
@override
|
||||
String get showDistLogo => 'Afficher le logo de la distribution';
|
||||
|
||||
@override
|
||||
String get shutdown => 'Éteindre';
|
||||
|
||||
@override
|
||||
String get size => 'Taille';
|
||||
|
||||
@override
|
||||
String get snippet => 'Extrait';
|
||||
|
||||
@override
|
||||
String get softWrap => 'Retour à la ligne souple';
|
||||
|
||||
@override
|
||||
String get specifyDev => 'Spécifier l\'appareil';
|
||||
|
||||
@override
|
||||
String get specifyDevTip => 'Par exemple, les statistiques de trafic réseau concernent par défaut tous les appareils. Vous pouvez spécifier ici un appareil particulier.';
|
||||
|
||||
@override
|
||||
String get speed => 'Vitesse';
|
||||
|
||||
@override
|
||||
String spentTime(Object time) {
|
||||
return 'Temps écoulé : $time';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshTermHelp => 'Lorsque le terminal est défilable, faire glisser horizontalement permet de sélectionner du texte. En cliquant sur le bouton du clavier, vous activez/désactivez le clavier. L\'icône de fichier ouvre le chemin actuel SFTP. Le bouton du presse-papiers copie le contenu lorsque du texte est sélectionné, et colle le contenu du presse-papiers dans le terminal lorsqu\'aucun texte n\'est sélectionné et qu\'il y a du contenu dans le presse-papiers. L\'icône de code colle des extraits de code dans le terminal et les exécute.';
|
||||
|
||||
@override
|
||||
String sshTip(Object url) {
|
||||
return 'Cette fonctionnalité est actuellement à l\'étape expérimentale.\n\nVeuillez signaler les bugs sur $url ou rejoindre notre développement.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshVirtualKeyAutoOff => 'Activation automatique des touches virtuelles';
|
||||
|
||||
@override
|
||||
String get start => 'Démarrer';
|
||||
|
||||
@override
|
||||
String get stat => 'Statistiques';
|
||||
|
||||
@override
|
||||
String get stats => 'Statistiques';
|
||||
|
||||
@override
|
||||
String get stop => 'Arrêter';
|
||||
|
||||
@override
|
||||
String get stopped => 'Arrêté';
|
||||
|
||||
@override
|
||||
String get storage => 'Stockage';
|
||||
|
||||
@override
|
||||
String get supportFmtArgs => 'Les paramètres de mise en forme suivants sont pris en charge :';
|
||||
|
||||
@override
|
||||
String get suspend => 'Suspendre';
|
||||
|
||||
@override
|
||||
String get suspendTip => 'La fonction de suspension nécessite des privilèges root et le support de systemd.';
|
||||
|
||||
@override
|
||||
String switchTo(Object val) {
|
||||
return 'Passer à $val';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sync => 'Sync';
|
||||
|
||||
@override
|
||||
String get syncTip => 'Un redémarrage peut être nécessaire pour que certains changements prennent effet.';
|
||||
|
||||
@override
|
||||
String get system => 'Système';
|
||||
|
||||
@override
|
||||
String get tag => 'Étiquettes';
|
||||
|
||||
@override
|
||||
String get temperature => 'Température';
|
||||
|
||||
@override
|
||||
String get termFontSizeTip => 'Ce paramètre affectera la taille du terminal (largeur et hauteur). Vous pouvez zoomer sur la page du terminal pour ajuster la taille de la police de la session en cours.';
|
||||
|
||||
@override
|
||||
String get terminal => 'Terminal';
|
||||
|
||||
@override
|
||||
String get test => 'Tester';
|
||||
|
||||
@override
|
||||
String get textScaler => 'Mise à l\'échelle du texte';
|
||||
|
||||
@override
|
||||
String get textScalerTip => '1.0 => 100% (taille originale), fonctionne uniquement sur la partie de la police de la page du serveur, il est déconseillé de la modifier.';
|
||||
|
||||
@override
|
||||
String get theme => 'Thème';
|
||||
|
||||
@override
|
||||
String get time => 'Temps';
|
||||
|
||||
@override
|
||||
String get times => 'Fois';
|
||||
|
||||
@override
|
||||
String get total => 'Total';
|
||||
|
||||
@override
|
||||
String get traffic => 'Trafic';
|
||||
|
||||
@override
|
||||
String get trySudo => 'Essayer d\'utiliser sudo';
|
||||
|
||||
@override
|
||||
String get ttl => 'TTL';
|
||||
|
||||
@override
|
||||
String get unknown => 'Inconnu';
|
||||
|
||||
@override
|
||||
String get unkownConvertMode => 'Mode de conversion inconnu';
|
||||
|
||||
@override
|
||||
String get update => 'Mettre à jour';
|
||||
|
||||
@override
|
||||
String get updateIntervalEqual0 => 'Vous avez défini à 0, la mise à jour ne se fera pas automatiquement.\nImpossible de calculer l\'état du CPU.';
|
||||
|
||||
@override
|
||||
String get updateServerStatusInterval => 'Intervalle de mise à jour de l\'état du serveur';
|
||||
|
||||
@override
|
||||
String get upload => 'Télécharger';
|
||||
|
||||
@override
|
||||
String get upsideDown => 'À l\'envers';
|
||||
|
||||
@override
|
||||
String get uptime => 'Temps d\'activité';
|
||||
|
||||
@override
|
||||
String get useCdn => 'Utiliser CDN';
|
||||
|
||||
@override
|
||||
String get useCdnTip => 'Il est recommandé aux utilisateurs non chinois d\'utiliser le CDN. Souhaitez-vous l\'utiliser ?';
|
||||
|
||||
@override
|
||||
String get useNoPwd => 'Aucun mot de passe ne sera utilisé';
|
||||
|
||||
@override
|
||||
String get usePodmanByDefault => 'Par défaut avec Podman';
|
||||
|
||||
@override
|
||||
String get used => 'Utilisé';
|
||||
|
||||
@override
|
||||
String get view => 'Vue';
|
||||
|
||||
@override
|
||||
String get viewErr => 'Voir erreur';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpClipboard => 'Copiez dans le presse-papiers si le terminal sélectionné n\'est pas vide, sinon collez le contenu du presse-papiers dans le terminal.';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpIME => 'Activer/désactiver le clavier';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpSFTP => 'Ouvrir le répertoire actuel en SFTP.';
|
||||
|
||||
@override
|
||||
String get waitConnection => 'Veuillez attendre que la connexion soit établie.';
|
||||
|
||||
@override
|
||||
String get wakeLock => 'Maintenir éveillé';
|
||||
|
||||
@override
|
||||
String get watchNotPaired => 'Aucune Apple Watch associée';
|
||||
|
||||
@override
|
||||
String get webdavSettingEmpty => 'Le paramètre Webdav est vide';
|
||||
|
||||
@override
|
||||
String get whenOpenApp => 'À l\'ouverture de l\'application';
|
||||
|
||||
@override
|
||||
String get wolTip => 'Après avoir configuré le WOL (Wake-on-LAN), une requête WOL est envoyée chaque fois que le serveur est connecté.';
|
||||
|
||||
@override
|
||||
String get write => 'Écrire';
|
||||
|
||||
@override
|
||||
String get writeScriptFailTip => 'Échec de l\'écriture dans le script, probablement en raison d\'un manque de permissions ou que le répertoire n\'existe pas.';
|
||||
|
||||
@override
|
||||
String get writeScriptTip => 'Après la connexion au serveur, un script sera écrit dans ~/.config/server_box pour surveiller l’état du système. Vous pouvez examiner le contenu du script.';
|
||||
}
|
||||
708
lib/generated/l10n/l10n_id.dart
Normal file
708
lib/generated/l10n/l10n_id.dart
Normal file
@@ -0,0 +1,708 @@
|
||||
import 'l10n.dart';
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
/// The translations for Indonesian (`id`).
|
||||
class AppLocalizationsId extends AppLocalizations {
|
||||
AppLocalizationsId([String locale = 'id']) : super(locale);
|
||||
|
||||
@override
|
||||
String get aboutThanks => 'Terima kasih kepada orang -orang berikut yang berpartisipasi.';
|
||||
|
||||
@override
|
||||
String get acceptBeta => 'Terima pembaruan versi uji coba';
|
||||
|
||||
@override
|
||||
String get addSystemPrivateKeyTip => 'Saat ini tidak memiliki kunci privat, apakah Anda menambahkan kunci yang disertakan dengan sistem (~/.ssh/id_rsa)?';
|
||||
|
||||
@override
|
||||
String get added2List => 'Ditambahkan ke Daftar Tugas';
|
||||
|
||||
@override
|
||||
String get addr => 'Alamat';
|
||||
|
||||
@override
|
||||
String get alreadyLastDir => 'Sudah di direktori terakhir.';
|
||||
|
||||
@override
|
||||
String get authFailTip => 'Otentikasi gagal, silakan periksa apakah kata sandi/kunci/host/pengguna, dll, salah.';
|
||||
|
||||
@override
|
||||
String get autoBackupConflict => 'Hanya satu pencadangan otomatis yang dapat diaktifkan pada saat yang bersamaan.';
|
||||
|
||||
@override
|
||||
String get autoConnect => 'Hubungkan otomatis';
|
||||
|
||||
@override
|
||||
String get autoRun => 'Berjalan Otomatis';
|
||||
|
||||
@override
|
||||
String get autoUpdateHomeWidget => 'Widget Rumah Pembaruan Otomatis';
|
||||
|
||||
@override
|
||||
String get backupTip => 'Data yang diekspor hanya dienkripsi.\nTolong jaga keamanannya.';
|
||||
|
||||
@override
|
||||
String get backupVersionNotMatch => 'Versi cadangan tidak cocok.';
|
||||
|
||||
@override
|
||||
String get battery => 'Baterai';
|
||||
|
||||
@override
|
||||
String get bgRun => 'Jalankan di Backgroud';
|
||||
|
||||
@override
|
||||
String get bgRunTip => 'Sakelar ini hanya berarti aplikasi akan mencoba berjalan di latar belakang, apakah aplikasi dapat berjalan di latar belakang tergantung pada apakah izin diaktifkan atau tidak. Untuk Android asli, nonaktifkan \"Pengoptimalan Baterai\" di aplikasi ini, dan untuk miui, ubah kebijakan penghematan daya ke \"Tidak Terbatas\".';
|
||||
|
||||
@override
|
||||
String get closeAfterSave => 'Simpan dan tutup';
|
||||
|
||||
@override
|
||||
String get cmd => 'Memerintah';
|
||||
|
||||
@override
|
||||
String get collapseUITip => 'Apakah akan menciutkan daftar panjang yang ada di UI secara default atau tidak';
|
||||
|
||||
@override
|
||||
String get conn => 'Koneksi';
|
||||
|
||||
@override
|
||||
String get container => 'Wadah';
|
||||
|
||||
@override
|
||||
String get containerTrySudoTip => 'Contohnya: Di dalam aplikasi, pengguna diatur sebagai aaa, tetapi Docker diinstal di bawah pengguna root. Dalam kasus ini, Anda perlu mengaktifkan opsi ini.';
|
||||
|
||||
@override
|
||||
String get convert => 'Mengubah';
|
||||
|
||||
@override
|
||||
String get copyPath => 'Path Copy';
|
||||
|
||||
@override
|
||||
String get cpuViewAsProgressTip => 'Tampilkan tingkat penggunaan setiap CPU dalam gaya bilah kemajuan (gaya lama)';
|
||||
|
||||
@override
|
||||
String get cursorType => 'Jenis kursor';
|
||||
|
||||
@override
|
||||
String get customCmd => 'Perintah kustom';
|
||||
|
||||
@override
|
||||
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
|
||||
|
||||
@override
|
||||
String get customCmdHint => '\"Nama Perintah\": \"Perintah\"';
|
||||
|
||||
@override
|
||||
String get decode => 'Membaca sandi';
|
||||
|
||||
@override
|
||||
String get decompress => 'Dekompresi';
|
||||
|
||||
@override
|
||||
String get deleteServers => 'Penghapusan server secara batch';
|
||||
|
||||
@override
|
||||
String get dirEmpty => 'Pastikan dir kosong.';
|
||||
|
||||
@override
|
||||
String get disconnected => 'Terputus';
|
||||
|
||||
@override
|
||||
String get disk => 'Disk';
|
||||
|
||||
@override
|
||||
String get diskIgnorePath => 'Abaikan jalan untuk disk';
|
||||
|
||||
@override
|
||||
String get displayCpuIndex => 'Tampilkan indeks CPU';
|
||||
|
||||
@override
|
||||
String dl2Local(Object fileName) {
|
||||
return 'Unduh $fileName ke lokal?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerEmptyRunningItems => 'Tidak ada wadah yang sedang berjalan.\nHal ini dapat terjadi karena:\n- Pengguna instalasi Docker tidak sama dengan nama pengguna yang dikonfigurasi di dalam Aplikasi.\n- Variabel lingkungan DOCKER_HOST tidak terbaca dengan benar. Anda bisa mendapatkannya dengan menjalankan `echo \$DOCKER_HOST` di terminal.';
|
||||
|
||||
@override
|
||||
String dockerImagesFmt(Object count) {
|
||||
return '$count gambar';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerNotInstalled => 'Docker tidak terpasang';
|
||||
|
||||
@override
|
||||
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
|
||||
return '$runningCount running, $stoppedCount container stopped.';
|
||||
}
|
||||
|
||||
@override
|
||||
String dockerStatusRunningFmt(Object count) {
|
||||
return '$count wadah berjalan.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get doubleColumnMode => 'Mode kolom ganda';
|
||||
|
||||
@override
|
||||
String get doubleColumnTip => 'Opsi ini hanya mengaktifkan fitur, apakah itu benar-benar dapat diaktifkan tergantung pada lebar perangkat';
|
||||
|
||||
@override
|
||||
String get editVirtKeys => 'Edit kunci virtual';
|
||||
|
||||
@override
|
||||
String get editor => 'Editor';
|
||||
|
||||
@override
|
||||
String get editorHighlightTip => 'Performa penyorotan kode saat ini lebih buruk, dan dapat dimatikan secara opsional untuk perbaikan.';
|
||||
|
||||
@override
|
||||
String get encode => 'Menyandi';
|
||||
|
||||
@override
|
||||
String get envVars => 'Variabel lingkungan';
|
||||
|
||||
@override
|
||||
String get experimentalFeature => 'Fitur eksperimental';
|
||||
|
||||
@override
|
||||
String get extraArgs => 'Args ekstra';
|
||||
|
||||
@override
|
||||
String get fallbackSshDest => 'Tujuan SSH mundur';
|
||||
|
||||
@override
|
||||
String get fdroidReleaseTip => 'Jika Anda mengunduh aplikasi ini dari F-Droid, disarankan untuk mematikan opsi ini.';
|
||||
|
||||
@override
|
||||
String get fgService => 'Layanan Latar Depan';
|
||||
|
||||
@override
|
||||
String get fgServiceTip => 'Setelah diaktifkan, beberapa model perangkat mungkin crash. Menonaktifkannya dapat menyebabkan beberapa model tidak dapat mempertahankan koneksi SSH di latar belakang. Harap izinkan perizinan notifikasi ServerBox, menjalankan di latar belakang, dan bangun mandiri di pengaturan sistem.';
|
||||
|
||||
@override
|
||||
String fileTooLarge(Object file, Object size, Object sizeMax) {
|
||||
return 'File \'$file\' terlalu besar $size, max $sizeMax';
|
||||
}
|
||||
|
||||
@override
|
||||
String get followSystem => 'Ikuti sistem';
|
||||
|
||||
@override
|
||||
String get font => 'Font';
|
||||
|
||||
@override
|
||||
String get fontSize => 'Ukuran huruf';
|
||||
|
||||
@override
|
||||
String get force => 'sukarela';
|
||||
|
||||
@override
|
||||
String get fullScreen => 'Mode Layar Penuh';
|
||||
|
||||
@override
|
||||
String get fullScreenJitter => 'Jitter layar penuh';
|
||||
|
||||
@override
|
||||
String get fullScreenJitterHelp => 'Untuk menghindari pembakaran layar';
|
||||
|
||||
@override
|
||||
String get fullScreenTip => 'Apakah mode layar penuh diaktifkan ketika perangkat diputar ke modus lanskap? Opsi ini hanya berlaku untuk tab server.';
|
||||
|
||||
@override
|
||||
String get goBackQ => 'Datang kembali?';
|
||||
|
||||
@override
|
||||
String get goto => 'Pergi ke';
|
||||
|
||||
@override
|
||||
String get hideTitleBar => 'Sembunyikan bilah judul';
|
||||
|
||||
@override
|
||||
String get highlight => 'Sorotan kode';
|
||||
|
||||
@override
|
||||
String get homeWidgetUrlConfig => 'Konfigurasi URL Widget Rumah';
|
||||
|
||||
@override
|
||||
String get host => 'Host';
|
||||
|
||||
@override
|
||||
String httpFailedWithCode(Object code) {
|
||||
return 'Permintaan gagal, kode status: $code';
|
||||
}
|
||||
|
||||
@override
|
||||
String get ignoreCert => 'Abaikan sertifikat';
|
||||
|
||||
@override
|
||||
String get image => 'Gambar';
|
||||
|
||||
@override
|
||||
String get imagesList => 'Daftar gambar';
|
||||
|
||||
@override
|
||||
String get init => 'Menginisialisasi';
|
||||
|
||||
@override
|
||||
String get inner => 'Batin';
|
||||
|
||||
@override
|
||||
String get install => 'Install';
|
||||
|
||||
@override
|
||||
String get installDockerWithUrl => 'Silakan https://docs.docker.com/engine/install Docker pertama.';
|
||||
|
||||
@override
|
||||
String get invalid => 'Tidak valid';
|
||||
|
||||
@override
|
||||
String get jumpServer => 'Lompat server';
|
||||
|
||||
@override
|
||||
String get keepForeground => 'Simpan Aplikasi Foreground!';
|
||||
|
||||
@override
|
||||
String get keepStatusWhenErr => 'Menyimpan status server terakhir';
|
||||
|
||||
@override
|
||||
String get keepStatusWhenErrTip => 'Hanya ketika terjadi kesalahan saat menjalankan skrip';
|
||||
|
||||
@override
|
||||
String get keyAuth => 'Auth kunci';
|
||||
|
||||
@override
|
||||
String get letterCache => 'Caching huruf';
|
||||
|
||||
@override
|
||||
String get letterCacheTip => 'Direkomendasikan untuk menonaktifkan, tetapi setelah dinonaktifkan, tidak mungkin untuk memasukkan karakter CJK.';
|
||||
|
||||
@override
|
||||
String get license => 'Lisensi';
|
||||
|
||||
@override
|
||||
String get location => 'Lokasi';
|
||||
|
||||
@override
|
||||
String get loss => 'kehilangan';
|
||||
|
||||
@override
|
||||
String madeWithLove(Object myGithub) {
|
||||
return 'Dibuat dengan ❤️ oleh $myGithub';
|
||||
}
|
||||
|
||||
@override
|
||||
String get manual => 'Manual';
|
||||
|
||||
@override
|
||||
String get max => 'Max';
|
||||
|
||||
@override
|
||||
String get maxRetryCount => 'Jumlah penyambungan kembali server';
|
||||
|
||||
@override
|
||||
String get maxRetryCountEqual0 => 'Akan mencoba lagi lagi dan lagi.';
|
||||
|
||||
@override
|
||||
String get min => 'Min';
|
||||
|
||||
@override
|
||||
String get mission => 'Misi';
|
||||
|
||||
@override
|
||||
String get more => 'Lebih Banyak';
|
||||
|
||||
@override
|
||||
String get moveOutServerFuncBtnsHelp => 'Aktif: dapat ditampilkan di bawah setiap kartu pada halaman Tab Server. Nonaktif: dapat ditampilkan di bagian atas halaman Rincian Server.';
|
||||
|
||||
@override
|
||||
String get ms => 'MS';
|
||||
|
||||
@override
|
||||
String get needHomeDir => 'Jika Anda pengguna Synology, [lihat di sini](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Pengguna sistem lain perlu mencari cara membuat direktori home.';
|
||||
|
||||
@override
|
||||
String get needRestart => 'Perlu memulai ulang aplikasi';
|
||||
|
||||
@override
|
||||
String get net => 'Jaringan';
|
||||
|
||||
@override
|
||||
String get netViewType => 'Jenis tampilan bersih';
|
||||
|
||||
@override
|
||||
String get newContainer => 'Wadah baru';
|
||||
|
||||
@override
|
||||
String get noLineChart => 'Jangan gunakan grafik garis';
|
||||
|
||||
@override
|
||||
String get noLineChartForCpu => 'Jangan gunakan diagram garis untuk CPU';
|
||||
|
||||
@override
|
||||
String get noPrivateKeyTip => 'Kunci privat tidak ada, mungkin telah dihapus atau ada kesalahan konfigurasi.';
|
||||
|
||||
@override
|
||||
String get noPromptAgain => 'Jangan tanya lagi';
|
||||
|
||||
@override
|
||||
String get node => 'Node';
|
||||
|
||||
@override
|
||||
String get notAvailable => 'Tidak tersedia';
|
||||
|
||||
@override
|
||||
String get onServerDetailPage => 'Di halaman detail server';
|
||||
|
||||
@override
|
||||
String get onlyOneLine => 'Hanya tampilkan sebagai satu baris (dapat digulir)';
|
||||
|
||||
@override
|
||||
String get onlyWhenCoreBiggerThan8 => 'Berlaku hanya ketika jumlah inti > 8';
|
||||
|
||||
@override
|
||||
String get openLastPath => 'Buka jalur terakhir';
|
||||
|
||||
@override
|
||||
String get openLastPathTip => 'Server yang berbeda akan memiliki catatan yang berbeda, dan catatan tersebut adalah jalur menuju pintu keluar';
|
||||
|
||||
@override
|
||||
String get parseContainerStatsTip => 'Parsing status okupansi oleh Docker agak lambat';
|
||||
|
||||
@override
|
||||
String percentOfSize(Object percent, Object size) {
|
||||
return '$percent% dari $size';
|
||||
}
|
||||
|
||||
@override
|
||||
String get permission => 'Izin';
|
||||
|
||||
@override
|
||||
String get pingAvg => 'Rata -rata:';
|
||||
|
||||
@override
|
||||
String get pingInputIP => 'Harap masukkan IP / domain target.';
|
||||
|
||||
@override
|
||||
String get pingNoServer => 'Tidak ada server untuk melakukan ping.\nHarap tambahkan server di tab Server.';
|
||||
|
||||
@override
|
||||
String get pkg => 'Pkg';
|
||||
|
||||
@override
|
||||
String get plugInType => 'Jenis Penyisipan';
|
||||
|
||||
@override
|
||||
String get port => 'Port';
|
||||
|
||||
@override
|
||||
String get preview => 'Pratinjau';
|
||||
|
||||
@override
|
||||
String get privateKey => 'Kunci Pribadi';
|
||||
|
||||
@override
|
||||
String get process => 'Proses';
|
||||
|
||||
@override
|
||||
String get pushToken => 'Dorong token';
|
||||
|
||||
@override
|
||||
String get pveIgnoreCertTip => 'Tidak disarankan untuk diaktifkan, waspadai risiko keamanan! Jika Anda menggunakan sertifikat default dari PVE, Anda perlu mengaktifkan opsi ini.';
|
||||
|
||||
@override
|
||||
String get pveLoginFailed => 'Login gagal. Tidak dapat mengautentikasi dengan nama pengguna/kata sandi dari konfigurasi server untuk login Linux PAM.';
|
||||
|
||||
@override
|
||||
String get pveVersionLow => 'Fitur ini saat ini sedang dalam tahap pengujian dan hanya diuji pada PVE 8+. Gunakan dengan hati-hati.';
|
||||
|
||||
@override
|
||||
String get pwd => 'Kata sandi';
|
||||
|
||||
@override
|
||||
String get read => 'Baca';
|
||||
|
||||
@override
|
||||
String get reboot => 'Reboot';
|
||||
|
||||
@override
|
||||
String get rememberPwdInMem => 'Ingat kata sandi di dalam memori';
|
||||
|
||||
@override
|
||||
String get rememberPwdInMemTip => 'Digunakan untuk kontainer, menangguhkan, dll.';
|
||||
|
||||
@override
|
||||
String get rememberWindowSize => 'Ingat ukuran jendela';
|
||||
|
||||
@override
|
||||
String get remotePath => 'Jalur jarak jauh';
|
||||
|
||||
@override
|
||||
String get restart => 'Mengulang kembali';
|
||||
|
||||
@override
|
||||
String get result => 'Hasil';
|
||||
|
||||
@override
|
||||
String get rotateAngel => 'Sudut rotasi';
|
||||
|
||||
@override
|
||||
String get route => 'Routing';
|
||||
|
||||
@override
|
||||
String get run => 'Berlari';
|
||||
|
||||
@override
|
||||
String get running => 'berlari';
|
||||
|
||||
@override
|
||||
String get sameIdServerExist => 'Server dengan ID yang sama sudah ada';
|
||||
|
||||
@override
|
||||
String get save => 'Menyimpan';
|
||||
|
||||
@override
|
||||
String get saved => 'Diselamatkan';
|
||||
|
||||
@override
|
||||
String get second => 'S';
|
||||
|
||||
@override
|
||||
String get sensors => 'Sensor';
|
||||
|
||||
@override
|
||||
String get sequence => 'Urutan';
|
||||
|
||||
@override
|
||||
String get server => 'Server';
|
||||
|
||||
@override
|
||||
String get serverDetailOrder => 'Detail pesanan widget halaman';
|
||||
|
||||
@override
|
||||
String get serverFuncBtns => 'Tombol fungsi server';
|
||||
|
||||
@override
|
||||
String get serverOrder => 'Pesanan server';
|
||||
|
||||
@override
|
||||
String get sftpDlPrepare => 'Bersiap untuk terhubung ...';
|
||||
|
||||
@override
|
||||
String get sftpEditorTip => 'Jika kosong, gunakan editor file bawaan aplikasi. Jika ada nilai, gunakan editor server jarak jauh, misalnya `vim` (disarankan untuk mendeteksi secara otomatis sesuai `EDITOR`).';
|
||||
|
||||
@override
|
||||
String get sftpRmrDirSummary => 'Gunakan `rm -r` untuk menghapus dir di SFTP';
|
||||
|
||||
@override
|
||||
String get sftpSSHConnected => 'Sftp terhubung';
|
||||
|
||||
@override
|
||||
String get sftpShowFoldersFirst => 'Folder ditampilkan lebih dulu';
|
||||
|
||||
@override
|
||||
String get showDistLogo => 'Tampilkan logo distribusi';
|
||||
|
||||
@override
|
||||
String get shutdown => 'Matikan';
|
||||
|
||||
@override
|
||||
String get size => 'Ukuran';
|
||||
|
||||
@override
|
||||
String get snippet => 'Snippet';
|
||||
|
||||
@override
|
||||
String get softWrap => 'Pembungkus lembut';
|
||||
|
||||
@override
|
||||
String get specifyDev => 'Tentukan perangkat';
|
||||
|
||||
@override
|
||||
String get specifyDevTip => 'Misalnya, statistik lalu lintas jaringan secara default adalah untuk semua perangkat. Anda dapat menentukan perangkat tertentu di sini.';
|
||||
|
||||
@override
|
||||
String get speed => 'Kecepatan';
|
||||
|
||||
@override
|
||||
String spentTime(Object time) {
|
||||
return 'Menghabiskan waktu: $time';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshTermHelp => 'Ketika terminal dapat digulirkan, menggeser secara horizontal dapat memilih teks. Mengklik tombol keyboard mengaktifkan/menonaktifkan keyboard. Ikon file membuka SFTP jalur saat ini. Tombol papan klip menyalin konten saat teks dipilih, dan menempelkan konten dari papan klip ke terminal saat tidak ada teks yang dipilih dan ada konten di papan klip. Ikon kode menempelkan potongan kode ke terminal dan mengeksekusinya.';
|
||||
|
||||
@override
|
||||
String sshTip(Object url) {
|
||||
return 'Fungsi ini sekarang dalam tahap eksperimen.\n\nHarap laporkan bug di $url atau bergabunglah dengan pengembangan kami.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshVirtualKeyAutoOff => 'Switching Otomatis Kunci Virtual';
|
||||
|
||||
@override
|
||||
String get start => 'Awal';
|
||||
|
||||
@override
|
||||
String get stat => 'Statistik';
|
||||
|
||||
@override
|
||||
String get stats => 'Statistik';
|
||||
|
||||
@override
|
||||
String get stop => 'Berhenti';
|
||||
|
||||
@override
|
||||
String get stopped => 'dihentikan';
|
||||
|
||||
@override
|
||||
String get storage => 'Penyimpanan';
|
||||
|
||||
@override
|
||||
String get supportFmtArgs => 'Parameter pemformatan berikut ini didukung:';
|
||||
|
||||
@override
|
||||
String get suspend => 'Suspend';
|
||||
|
||||
@override
|
||||
String get suspendTip => 'Fungsi penangguhan memerlukan hak akses root dan dukungan systemd.';
|
||||
|
||||
@override
|
||||
String switchTo(Object val) {
|
||||
return 'Beralih ke $val';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sync => 'Sinkronisasi';
|
||||
|
||||
@override
|
||||
String get syncTip => 'Pengaktifan ulang mungkin diperlukan agar beberapa perubahan dapat diterapkan.';
|
||||
|
||||
@override
|
||||
String get system => 'Sistem';
|
||||
|
||||
@override
|
||||
String get tag => 'Tag';
|
||||
|
||||
@override
|
||||
String get temperature => 'Suhu';
|
||||
|
||||
@override
|
||||
String get termFontSizeTip => 'Pengaturan ini akan memengaruhi ukuran terminal (lebar dan tinggi). Anda dapat melakukan zoom pada halaman terminal untuk menyesuaikan ukuran font sesi saat ini.';
|
||||
|
||||
@override
|
||||
String get terminal => 'Terminal';
|
||||
|
||||
@override
|
||||
String get test => 'pengujian';
|
||||
|
||||
@override
|
||||
String get textScaler => 'Penskalaan font';
|
||||
|
||||
@override
|
||||
String get textScalerTip => '1.0 => 100% (ukuran asli), hanya berfungsi pada bagian halaman server font, tidak disarankan untuk diubah.';
|
||||
|
||||
@override
|
||||
String get theme => ' Tema';
|
||||
|
||||
@override
|
||||
String get time => 'Waktu';
|
||||
|
||||
@override
|
||||
String get times => 'Waktu';
|
||||
|
||||
@override
|
||||
String get total => 'Total';
|
||||
|
||||
@override
|
||||
String get traffic => 'Lalu lintas';
|
||||
|
||||
@override
|
||||
String get trySudo => 'Cobalah menggunakan sudo';
|
||||
|
||||
@override
|
||||
String get ttl => 'TTL';
|
||||
|
||||
@override
|
||||
String get unknown => 'Tidak dikenal';
|
||||
|
||||
@override
|
||||
String get unkownConvertMode => 'Mode Konversi Tidak Diketahui';
|
||||
|
||||
@override
|
||||
String get update => 'Memperbarui';
|
||||
|
||||
@override
|
||||
String get updateIntervalEqual0 => 'Anda mengatur ke 0, tidak akan memperbarui secara otomatis.\nTidak dapat menghitung status CPU.';
|
||||
|
||||
@override
|
||||
String get updateServerStatusInterval => 'Interval Pembaruan Status Server';
|
||||
|
||||
@override
|
||||
String get upload => 'Mengunggah';
|
||||
|
||||
@override
|
||||
String get upsideDown => 'Terbalik';
|
||||
|
||||
@override
|
||||
String get uptime => 'Uptime';
|
||||
|
||||
@override
|
||||
String get useCdn => 'Menggunakan CDN';
|
||||
|
||||
@override
|
||||
String get useCdnTip => 'Pengguna non-Cina disarankan menggunakan CDN. Apakah Anda ingin menggunakannya?';
|
||||
|
||||
@override
|
||||
String get useNoPwd => 'Tidak ada kata sandi yang akan digunakan';
|
||||
|
||||
@override
|
||||
String get usePodmanByDefault => 'Menggunakan Podman sebagai bawaan';
|
||||
|
||||
@override
|
||||
String get used => 'Digunakan';
|
||||
|
||||
@override
|
||||
String get view => 'Tampilan';
|
||||
|
||||
@override
|
||||
String get viewErr => 'Lihat kesalahan';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpClipboard => 'Salin ke clipboard jika terminal yang dipilih tidak kosong, jika tidak, tempel isi clipboard ke terminal.';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpIME => 'Menyalakan/mematikan keyboard';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpSFTP => 'Buka direktori saat ini di SFTP.';
|
||||
|
||||
@override
|
||||
String get waitConnection => 'Harap tunggu koneksi akan dibuat.';
|
||||
|
||||
@override
|
||||
String get wakeLock => 'Tetap terjaga';
|
||||
|
||||
@override
|
||||
String get watchNotPaired => 'Tidak ada Apple Watch yang dipasangkan';
|
||||
|
||||
@override
|
||||
String get webdavSettingEmpty => 'Pengaturan webdav kosong';
|
||||
|
||||
@override
|
||||
String get whenOpenApp => 'Saat membuka aplikasi';
|
||||
|
||||
@override
|
||||
String get wolTip => 'Setelah mengonfigurasi WOL (Wake-on-LAN), permintaan WOL dikirim setiap kali server terhubung.';
|
||||
|
||||
@override
|
||||
String get write => 'Tulis';
|
||||
|
||||
@override
|
||||
String get writeScriptFailTip => 'Penulisan ke skrip gagal, mungkin karena tidak ada izin atau direktori tidak ada.';
|
||||
|
||||
@override
|
||||
String get writeScriptTip => 'Setelah terhubung ke server, sebuah skrip akan ditulis ke ~/.config/server_box untuk memantau status sistem. Anda dapat meninjau konten skrip tersebut.';
|
||||
}
|
||||
708
lib/generated/l10n/l10n_ja.dart
Normal file
708
lib/generated/l10n/l10n_ja.dart
Normal file
@@ -0,0 +1,708 @@
|
||||
import 'l10n.dart';
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
/// The translations for Japanese (`ja`).
|
||||
class AppLocalizationsJa extends AppLocalizations {
|
||||
AppLocalizationsJa([String locale = 'ja']) : super(locale);
|
||||
|
||||
@override
|
||||
String get aboutThanks => '以下の参加者に感謝します。';
|
||||
|
||||
@override
|
||||
String get acceptBeta => 'テストバージョンの更新を受け入れる';
|
||||
|
||||
@override
|
||||
String get addSystemPrivateKeyTip => '現在秘密鍵がありません。システムのデフォルト(~/.ssh/id_rsa)を追加しますか?';
|
||||
|
||||
@override
|
||||
String get added2List => 'タスクリストに追加されました';
|
||||
|
||||
@override
|
||||
String get addr => 'アドレス';
|
||||
|
||||
@override
|
||||
String get alreadyLastDir => 'すでに最上位のディレクトリです';
|
||||
|
||||
@override
|
||||
String get authFailTip => '認証に失敗しました。パスワード/鍵/ホスト/ユーザーなどが間違っていないか確認してください。';
|
||||
|
||||
@override
|
||||
String get autoBackupConflict => '自動バックアップは一度に一つしか開始できません';
|
||||
|
||||
@override
|
||||
String get autoConnect => '自動接続';
|
||||
|
||||
@override
|
||||
String get autoRun => '自動実行';
|
||||
|
||||
@override
|
||||
String get autoUpdateHomeWidget => 'ホームウィジェットを自動更新';
|
||||
|
||||
@override
|
||||
String get backupTip => 'エクスポートされたデータは簡単に暗号化されています。適切に保管してください。';
|
||||
|
||||
@override
|
||||
String get backupVersionNotMatch => 'バックアップバージョンが一致しないため、復元できません';
|
||||
|
||||
@override
|
||||
String get battery => 'バッテリー';
|
||||
|
||||
@override
|
||||
String get bgRun => 'バックグラウンド実行';
|
||||
|
||||
@override
|
||||
String get bgRunTip => 'このスイッチはプログラムがバックグラウンドで実行を試みることを意味しますが、実際にバックグラウンドで実行できるかどうかは、権限が有効になっているかに依存します。AOSPベースのAndroid ROMでは、このアプリの「バッテリー最適化」をオフにしてください。MIUIでは、省エネモードを「無制限」に変更してください。';
|
||||
|
||||
@override
|
||||
String get closeAfterSave => '保存して閉じる';
|
||||
|
||||
@override
|
||||
String get cmd => 'コマンド';
|
||||
|
||||
@override
|
||||
String get collapseUITip => 'UIの長いリストをデフォルトで折りたたむかどうか';
|
||||
|
||||
@override
|
||||
String get conn => '接続';
|
||||
|
||||
@override
|
||||
String get container => 'コンテナ';
|
||||
|
||||
@override
|
||||
String get containerTrySudoTip => '例:アプリ内でユーザーをaaaに設定しているが、Dockerがrootユーザーでインストールされている場合、このオプションを有効にする必要があります';
|
||||
|
||||
@override
|
||||
String get convert => '変換';
|
||||
|
||||
@override
|
||||
String get copyPath => 'パスをコピー';
|
||||
|
||||
@override
|
||||
String get cpuViewAsProgressTip => '各CPUの使用率をプログレスバースタイルで表示する(旧スタイル)';
|
||||
|
||||
@override
|
||||
String get cursorType => 'カーソルタイプ';
|
||||
|
||||
@override
|
||||
String get customCmd => 'カスタムコマンド';
|
||||
|
||||
@override
|
||||
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
|
||||
|
||||
@override
|
||||
String get customCmdHint => '\"コマンド名\": \"コマンド\"';
|
||||
|
||||
@override
|
||||
String get decode => 'デコード';
|
||||
|
||||
@override
|
||||
String get decompress => '解凍';
|
||||
|
||||
@override
|
||||
String get deleteServers => 'サーバーを一括削除';
|
||||
|
||||
@override
|
||||
String get dirEmpty => 'フォルダーが空であることを確認してください';
|
||||
|
||||
@override
|
||||
String get disconnected => '接続が切断されました';
|
||||
|
||||
@override
|
||||
String get disk => 'ディスク';
|
||||
|
||||
@override
|
||||
String get diskIgnorePath => '無視されたディスクパス';
|
||||
|
||||
@override
|
||||
String get displayCpuIndex => 'CPUインデックスを表示する';
|
||||
|
||||
@override
|
||||
String dl2Local(Object fileName) {
|
||||
return '$fileNameをローカルにダウンロードしますか?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerEmptyRunningItems => '実行中のコンテナがありません。\nこれは次の理由による可能性があります:\n- Dockerのインストールユーザーとアプリ内の設定されたユーザー名が異なる\n- 環境変数DOCKER_HOSTが正しく読み込まれていない。ターミナルで`echo \$DOCKER_HOST`を実行して取得できます。';
|
||||
|
||||
@override
|
||||
String dockerImagesFmt(Object count) {
|
||||
return '合計$countイメージ';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerNotInstalled => 'Dockerがインストールされていません';
|
||||
|
||||
@override
|
||||
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
|
||||
return '$runningCount個が実行中、$stoppedCount個が停止中';
|
||||
}
|
||||
|
||||
@override
|
||||
String dockerStatusRunningFmt(Object count) {
|
||||
return '$count個のコンテナが実行中';
|
||||
}
|
||||
|
||||
@override
|
||||
String get doubleColumnMode => 'ダブルカラムモード';
|
||||
|
||||
@override
|
||||
String get doubleColumnTip => 'このオプションは機能を有効にするだけで、実際に有効にできるかどうかはデバイスの幅に依存します';
|
||||
|
||||
@override
|
||||
String get editVirtKeys => '仮想キーを編集';
|
||||
|
||||
@override
|
||||
String get editor => 'エディター';
|
||||
|
||||
@override
|
||||
String get editorHighlightTip => '現在のコードハイライトのパフォーマンスはかなり悪いため、改善するために無効にすることを選択できます。';
|
||||
|
||||
@override
|
||||
String get encode => 'エンコード';
|
||||
|
||||
@override
|
||||
String get envVars => '環境変数';
|
||||
|
||||
@override
|
||||
String get experimentalFeature => '実験的な機能';
|
||||
|
||||
@override
|
||||
String get extraArgs => '追加引数';
|
||||
|
||||
@override
|
||||
String get fallbackSshDest => 'フォールバックSSH宛先';
|
||||
|
||||
@override
|
||||
String get fdroidReleaseTip => 'このアプリをF-Droidからダウンロードした場合、このオプションをオフにすることをお勧めします。';
|
||||
|
||||
@override
|
||||
String get fgService => 'フォアグラウンドサービス';
|
||||
|
||||
@override
|
||||
String get fgServiceTip => '有効にすると、一部の機種でクラッシュする可能性があります。無効にすると、一部の機種でバックグラウンドでのSSH接続を維持できなくなる可能性があります。システム設定でServerBoxの通知権限、バックグラウンド実行、自己起動を許可してください。';
|
||||
|
||||
@override
|
||||
String fileTooLarge(Object file, Object size, Object sizeMax) {
|
||||
return 'ファイル \'$file\' は大きすぎます \'$size\'、$sizeMax を超えています';
|
||||
}
|
||||
|
||||
@override
|
||||
String get followSystem => 'システムに従う';
|
||||
|
||||
@override
|
||||
String get font => 'フォント';
|
||||
|
||||
@override
|
||||
String get fontSize => 'フォントサイズ';
|
||||
|
||||
@override
|
||||
String get force => '強制';
|
||||
|
||||
@override
|
||||
String get fullScreen => 'フルスクリーンモード';
|
||||
|
||||
@override
|
||||
String get fullScreenJitter => 'フルスクリーンモードのジッター';
|
||||
|
||||
@override
|
||||
String get fullScreenJitterHelp => '焼き付き防止';
|
||||
|
||||
@override
|
||||
String get fullScreenTip => 'デバイスが横向きに回転したときにフルスクリーンモードを有効にしますか?このオプションはサーバータブにのみ適用されます。';
|
||||
|
||||
@override
|
||||
String get goBackQ => '戻りますか?';
|
||||
|
||||
@override
|
||||
String get goto => '移動';
|
||||
|
||||
@override
|
||||
String get hideTitleBar => 'タイトルバーを非表示にする';
|
||||
|
||||
@override
|
||||
String get highlight => 'コードハイライト';
|
||||
|
||||
@override
|
||||
String get homeWidgetUrlConfig => 'ホームウィジェットURL設定';
|
||||
|
||||
@override
|
||||
String get host => 'ホスト';
|
||||
|
||||
@override
|
||||
String httpFailedWithCode(Object code) {
|
||||
return 'リクエスト失敗、ステータスコード: $code';
|
||||
}
|
||||
|
||||
@override
|
||||
String get ignoreCert => '証明書を無視する';
|
||||
|
||||
@override
|
||||
String get image => 'イメージ';
|
||||
|
||||
@override
|
||||
String get imagesList => 'イメージリスト';
|
||||
|
||||
@override
|
||||
String get init => '初期化する';
|
||||
|
||||
@override
|
||||
String get inner => '内蔵';
|
||||
|
||||
@override
|
||||
String get install => 'インストール';
|
||||
|
||||
@override
|
||||
String get installDockerWithUrl => '最初に https://docs.docker.com/engine/install dockerをインストールしてください';
|
||||
|
||||
@override
|
||||
String get invalid => '無効';
|
||||
|
||||
@override
|
||||
String get jumpServer => 'ジャンプサーバー';
|
||||
|
||||
@override
|
||||
String get keepForeground => 'アプリを前面に保ってください!';
|
||||
|
||||
@override
|
||||
String get keepStatusWhenErr => 'エラー時に前回のサーバーステータスを保持';
|
||||
|
||||
@override
|
||||
String get keepStatusWhenErrTip => 'スクリプトの実行エラーに限ります';
|
||||
|
||||
@override
|
||||
String get keyAuth => 'キー認証';
|
||||
|
||||
@override
|
||||
String get letterCache => '文字キャッシング';
|
||||
|
||||
@override
|
||||
String get letterCacheTip => '無効にすることを推奨しますが、無効にした後はCJK文字を入力することができなくなります。';
|
||||
|
||||
@override
|
||||
String get license => 'オープンソースライセンス';
|
||||
|
||||
@override
|
||||
String get location => '場所';
|
||||
|
||||
@override
|
||||
String get loss => 'パケットロス';
|
||||
|
||||
@override
|
||||
String madeWithLove(Object myGithub) {
|
||||
return '$myGithubによって❤️で作成済み';
|
||||
}
|
||||
|
||||
@override
|
||||
String get manual => 'マニュアル';
|
||||
|
||||
@override
|
||||
String get max => '最大';
|
||||
|
||||
@override
|
||||
String get maxRetryCount => 'サーバーの再接続試行回数';
|
||||
|
||||
@override
|
||||
String get maxRetryCountEqual0 => '無限に再試行します';
|
||||
|
||||
@override
|
||||
String get min => '最小';
|
||||
|
||||
@override
|
||||
String get mission => 'ミッション';
|
||||
|
||||
@override
|
||||
String get more => 'もっと';
|
||||
|
||||
@override
|
||||
String get moveOutServerFuncBtnsHelp => '有効にする:サーバータブの各カードの下に表示されます。無効にする:サーバーの詳細ページの上部に表示されます。';
|
||||
|
||||
@override
|
||||
String get ms => 'ミリ秒';
|
||||
|
||||
@override
|
||||
String get needHomeDir => 'Synologyユーザーの場合は、[こちらをご覧ください](https://kb.synology.com/DSM/tutorial/user_enable_home_service)。他のシステムのユーザーは、ホームディレクトリの作成方法を検索する必要があります。';
|
||||
|
||||
@override
|
||||
String get needRestart => 'アプリを再起動する必要があります';
|
||||
|
||||
@override
|
||||
String get net => 'ネットワーク';
|
||||
|
||||
@override
|
||||
String get netViewType => 'ネットワークビュータイプ';
|
||||
|
||||
@override
|
||||
String get newContainer => '新しいコンテナを作成';
|
||||
|
||||
@override
|
||||
String get noLineChart => '折れ線グラフを使用しない';
|
||||
|
||||
@override
|
||||
String get noLineChartForCpu => 'CPUに折れ線グラフを使わない';
|
||||
|
||||
@override
|
||||
String get noPrivateKeyTip => '秘密鍵が存在しません。削除されたか、設定ミスがある可能性があります。';
|
||||
|
||||
@override
|
||||
String get noPromptAgain => '再度確認しない';
|
||||
|
||||
@override
|
||||
String get node => 'ノード';
|
||||
|
||||
@override
|
||||
String get notAvailable => '利用不可';
|
||||
|
||||
@override
|
||||
String get onServerDetailPage => 'サーバーの詳細ページで';
|
||||
|
||||
@override
|
||||
String get onlyOneLine => '一行のみ表示(スクロール可能)';
|
||||
|
||||
@override
|
||||
String get onlyWhenCoreBiggerThan8 => 'コア数が8より大きい場合にのみ有効';
|
||||
|
||||
@override
|
||||
String get openLastPath => '最後のパスを開く';
|
||||
|
||||
@override
|
||||
String get openLastPathTip => '異なるサーバーには異なる記録があり、記録されているのは退出時のパスです';
|
||||
|
||||
@override
|
||||
String get parseContainerStatsTip => 'Dockerの使用状況の解析は比較的遅いです';
|
||||
|
||||
@override
|
||||
String percentOfSize(Object percent, Object size) {
|
||||
return '$size の $percent%';
|
||||
}
|
||||
|
||||
@override
|
||||
String get permission => '権限';
|
||||
|
||||
@override
|
||||
String get pingAvg => '平均:';
|
||||
|
||||
@override
|
||||
String get pingInputIP => '対象のIPまたはドメインを入力してください';
|
||||
|
||||
@override
|
||||
String get pingNoServer => 'Pingに使用するサーバーがありません\nサーバータブでサーバーを追加してから再試行してください';
|
||||
|
||||
@override
|
||||
String get pkg => 'パッケージ管理';
|
||||
|
||||
@override
|
||||
String get plugInType => '挿入タイプ';
|
||||
|
||||
@override
|
||||
String get port => 'ポート';
|
||||
|
||||
@override
|
||||
String get preview => 'プレビュー';
|
||||
|
||||
@override
|
||||
String get privateKey => '秘密鍵';
|
||||
|
||||
@override
|
||||
String get process => 'プロセス';
|
||||
|
||||
@override
|
||||
String get pushToken => 'プッシュトークン';
|
||||
|
||||
@override
|
||||
String get pveIgnoreCertTip => 'オプションを有効にすることは推奨されません、セキュリティリスクに注意してください!PVEのデフォルト証明書を使用している場合は、このオプションを有効にする必要があります。';
|
||||
|
||||
@override
|
||||
String get pveLoginFailed => 'ログインに失敗しました。Linux PAMログインのためにサーバー構成からのユーザー名/パスワードで認証できません。';
|
||||
|
||||
@override
|
||||
String get pveVersionLow => 'この機能は現在テスト段階にあり、PVE 8+でのみテストされています。ご利用の際は慎重に。';
|
||||
|
||||
@override
|
||||
String get pwd => 'パスワード';
|
||||
|
||||
@override
|
||||
String get read => '読み取り';
|
||||
|
||||
@override
|
||||
String get reboot => '再起動';
|
||||
|
||||
@override
|
||||
String get rememberPwdInMem => 'メモリにパスワードを記憶する';
|
||||
|
||||
@override
|
||||
String get rememberPwdInMemTip => 'コンテナ、一時停止などに使用されます。';
|
||||
|
||||
@override
|
||||
String get rememberWindowSize => 'ウィンドウサイズを記憶する';
|
||||
|
||||
@override
|
||||
String get remotePath => 'リモートパス';
|
||||
|
||||
@override
|
||||
String get restart => '再開';
|
||||
|
||||
@override
|
||||
String get result => '結果';
|
||||
|
||||
@override
|
||||
String get rotateAngel => '回転角度';
|
||||
|
||||
@override
|
||||
String get route => 'ルーティング';
|
||||
|
||||
@override
|
||||
String get run => '実行';
|
||||
|
||||
@override
|
||||
String get running => '実行中';
|
||||
|
||||
@override
|
||||
String get sameIdServerExist => '同じIDのサーバーが既に存在します';
|
||||
|
||||
@override
|
||||
String get save => '保存';
|
||||
|
||||
@override
|
||||
String get saved => '保存されました';
|
||||
|
||||
@override
|
||||
String get second => '秒';
|
||||
|
||||
@override
|
||||
String get sensors => 'センサー';
|
||||
|
||||
@override
|
||||
String get sequence => '順序';
|
||||
|
||||
@override
|
||||
String get server => 'サーバー';
|
||||
|
||||
@override
|
||||
String get serverDetailOrder => '詳細ページのウィジェット順序';
|
||||
|
||||
@override
|
||||
String get serverFuncBtns => 'サーバー機能ボタン';
|
||||
|
||||
@override
|
||||
String get serverOrder => 'サーバー順序';
|
||||
|
||||
@override
|
||||
String get sftpDlPrepare => 'サーバーへの接続を準備中...';
|
||||
|
||||
@override
|
||||
String get sftpEditorTip => '空の場合は、アプリ内蔵のファイルエディタを使用します。値がある場合は、リモートサーバーのエディタ(例:`vim`)を使用します(`EDITOR` に従って自動検出することをお勧めします)。';
|
||||
|
||||
@override
|
||||
String get sftpRmrDirSummary => 'SFTPで`rm -r`を使用してフォルダーを削除';
|
||||
|
||||
@override
|
||||
String get sftpSSHConnected => 'SFTPに接続されました...';
|
||||
|
||||
@override
|
||||
String get sftpShowFoldersFirst => 'フォルダーを先に表示';
|
||||
|
||||
@override
|
||||
String get showDistLogo => 'ディストリビューションのロゴを表示';
|
||||
|
||||
@override
|
||||
String get shutdown => 'シャットダウン';
|
||||
|
||||
@override
|
||||
String get size => 'サイズ';
|
||||
|
||||
@override
|
||||
String get snippet => 'スニペット';
|
||||
|
||||
@override
|
||||
String get softWrap => 'ソフトラップ';
|
||||
|
||||
@override
|
||||
String get specifyDev => 'デバイスを指定';
|
||||
|
||||
@override
|
||||
String get specifyDevTip => '例えば、ネットワークトラフィック統計はデフォルトですべてのデバイスに対するものです。ここで特定のデバイスを指定できます。';
|
||||
|
||||
@override
|
||||
String get speed => '速度';
|
||||
|
||||
@override
|
||||
String spentTime(Object time) {
|
||||
return '費した時間: $time';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshTermHelp => 'ターミナルがスクロール可能な場合、横にドラッグするとテキストを選択できます。キーボードボタンをクリックするとキーボードのオン/オフが切り替わります。ファイルアイコンは現在のパスSFTPを開きます。クリップボードボタンは、テキストが選択されているときに内容をコピーし、テキストが選択されておらずクリップボードに内容がある場合には、その内容をターミナルに貼り付けます。コードアイコンは、コードスニペットをターミナルに貼り付けて実行します。';
|
||||
|
||||
@override
|
||||
String sshTip(Object url) {
|
||||
return 'この機能は現在テスト段階にあります。\n\n問題がある場合は、$urlでフィードバックしてください。';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshVirtualKeyAutoOff => '仮想キーの自動オフ';
|
||||
|
||||
@override
|
||||
String get start => '開始';
|
||||
|
||||
@override
|
||||
String get stat => '統計';
|
||||
|
||||
@override
|
||||
String get stats => '統計';
|
||||
|
||||
@override
|
||||
String get stop => '停止';
|
||||
|
||||
@override
|
||||
String get stopped => '停止しました';
|
||||
|
||||
@override
|
||||
String get storage => 'ストレージ';
|
||||
|
||||
@override
|
||||
String get supportFmtArgs => '以下のフォーマット引数がサポートされています:';
|
||||
|
||||
@override
|
||||
String get suspend => '中断';
|
||||
|
||||
@override
|
||||
String get suspendTip => 'suspend機能はroot権限とsystemdのサポートが必要です。';
|
||||
|
||||
@override
|
||||
String switchTo(Object val) {
|
||||
return '$valに切り替える';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sync => '同期する';
|
||||
|
||||
@override
|
||||
String get syncTip => '再起動が必要な場合があります。一部の変更はその後に有効になります。';
|
||||
|
||||
@override
|
||||
String get system => 'システム';
|
||||
|
||||
@override
|
||||
String get tag => 'タグ';
|
||||
|
||||
@override
|
||||
String get temperature => '温度';
|
||||
|
||||
@override
|
||||
String get termFontSizeTip => 'この設定は端末のサイズ(幅と高さ)に影響します。現在のセッションのフォントサイズを調整するために、端末ページを拡大縮小できます。';
|
||||
|
||||
@override
|
||||
String get terminal => 'ターミナル';
|
||||
|
||||
@override
|
||||
String get test => 'テスト';
|
||||
|
||||
@override
|
||||
String get textScaler => 'テキストスケーラー';
|
||||
|
||||
@override
|
||||
String get textScalerTip => '1.0 => 100%(デフォルトサイズ)。サーバーページの一部のテキストにのみ適用されます。変更をお勧めしません。';
|
||||
|
||||
@override
|
||||
String get theme => 'テーマ';
|
||||
|
||||
@override
|
||||
String get time => '時間';
|
||||
|
||||
@override
|
||||
String get times => '回';
|
||||
|
||||
@override
|
||||
String get total => '合計';
|
||||
|
||||
@override
|
||||
String get traffic => 'トラフィック';
|
||||
|
||||
@override
|
||||
String get trySudo => 'sudoを試みる';
|
||||
|
||||
@override
|
||||
String get ttl => 'TTL';
|
||||
|
||||
@override
|
||||
String get unknown => '不明';
|
||||
|
||||
@override
|
||||
String get unkownConvertMode => '未知の変換モード';
|
||||
|
||||
@override
|
||||
String get update => '更新';
|
||||
|
||||
@override
|
||||
String get updateIntervalEqual0 => '0に設定すると、サーバーの状態は自動的に更新されず、CPU使用率も計算できません。';
|
||||
|
||||
@override
|
||||
String get updateServerStatusInterval => 'サーバー状態の更新間隔';
|
||||
|
||||
@override
|
||||
String get upload => 'アップロード';
|
||||
|
||||
@override
|
||||
String get upsideDown => '上下逆転';
|
||||
|
||||
@override
|
||||
String get uptime => '稼働時間';
|
||||
|
||||
@override
|
||||
String get useCdn => 'CDNの使用';
|
||||
|
||||
@override
|
||||
String get useCdnTip => '中国以外のユーザーにはCDNの使用が推奨されています。ご利用しますか?';
|
||||
|
||||
@override
|
||||
String get useNoPwd => 'パスワードなしで使用します';
|
||||
|
||||
@override
|
||||
String get usePodmanByDefault => 'デフォルトでPodmanを使用';
|
||||
|
||||
@override
|
||||
String get used => '使用済み';
|
||||
|
||||
@override
|
||||
String get view => 'ビュー';
|
||||
|
||||
@override
|
||||
String get viewErr => 'エラーを表示';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpClipboard => '端末に選択された文字がある場合は、選択された文字をクリップボードにコピーします。そうでない場合は、クリップボードの内容を端末に貼り付けます。';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpIME => 'キーボードのオン/オフ';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpSFTP => '現在のパスでSFTPを開く。';
|
||||
|
||||
@override
|
||||
String get waitConnection => '接続の確立を待ってください';
|
||||
|
||||
@override
|
||||
String get wakeLock => '起動を保つ';
|
||||
|
||||
@override
|
||||
String get watchNotPaired => 'ペアリングされたApple Watchがありません';
|
||||
|
||||
@override
|
||||
String get webdavSettingEmpty => 'Webdavの設定が空です';
|
||||
|
||||
@override
|
||||
String get whenOpenApp => 'アプリを開くとき';
|
||||
|
||||
@override
|
||||
String get wolTip => 'WOL(Wake-on-LAN)を設定した後、サーバーに接続するたびにWOLリクエストが送信されます。';
|
||||
|
||||
@override
|
||||
String get write => '書き込み';
|
||||
|
||||
@override
|
||||
String get writeScriptFailTip => 'スクリプトの書き込みに失敗しました。権限がないかディレクトリが存在しない可能性があります。';
|
||||
|
||||
@override
|
||||
String get writeScriptTip => 'サーバーに接続すると、システムの状態を監視するためのスクリプトが ~/.config/server_box に書き込まれます。スクリプトの内容を確認できます。';
|
||||
}
|
||||
708
lib/generated/l10n/l10n_nl.dart
Normal file
708
lib/generated/l10n/l10n_nl.dart
Normal file
@@ -0,0 +1,708 @@
|
||||
import 'l10n.dart';
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
/// The translations for Dutch Flemish (`nl`).
|
||||
class AppLocalizationsNl extends AppLocalizations {
|
||||
AppLocalizationsNl([String locale = 'nl']) : super(locale);
|
||||
|
||||
@override
|
||||
String get aboutThanks => 'Met dank aan de volgende mensen die hebben deelgenomen aan.';
|
||||
|
||||
@override
|
||||
String get acceptBeta => 'Accepteer testversie-updates';
|
||||
|
||||
@override
|
||||
String get addSystemPrivateKeyTip => 'Er is momenteel geen privésleutel, wilt u degene toevoegen die bij het systeem wordt geleverd (~/.ssh/id_rsa)?';
|
||||
|
||||
@override
|
||||
String get added2List => 'Toegevoegd aan takenlijst';
|
||||
|
||||
@override
|
||||
String get addr => 'Adres';
|
||||
|
||||
@override
|
||||
String get alreadyLastDir => 'Al in de laatst gebruikte map.';
|
||||
|
||||
@override
|
||||
String get authFailTip => 'Authenticatie mislukt, controleer of het wachtwoord/sleutel/host/gebruiker, enz., incorrect zijn.';
|
||||
|
||||
@override
|
||||
String get autoBackupConflict => 'Er kan slechts één automatische back-up tegelijk worden ingeschakeld.';
|
||||
|
||||
@override
|
||||
String get autoConnect => 'Automatisch verbinden';
|
||||
|
||||
@override
|
||||
String get autoRun => 'Automatisch uitvoeren';
|
||||
|
||||
@override
|
||||
String get autoUpdateHomeWidget => 'Automatische update van home-widget';
|
||||
|
||||
@override
|
||||
String get backupTip => 'De geëxporteerde gegevens zijn simpelweg versleuteld. \nBewaar deze aub veilig.';
|
||||
|
||||
@override
|
||||
String get backupVersionNotMatch => 'Back-upversie komt niet overeen.';
|
||||
|
||||
@override
|
||||
String get battery => 'Batterij';
|
||||
|
||||
@override
|
||||
String get bgRun => 'Uitvoeren op de achtergrond';
|
||||
|
||||
@override
|
||||
String get bgRunTip => 'Deze schakelaar betekent alleen dat het programma zal proberen op de achtergrond uit te voeren, of het in de achtergrond kan worden uitgevoerd, hangt af van of de toestemming is ingeschakeld of niet. Voor native Android, schakel \"Batterijoptimalisatie\" uit in deze app, en voor miui, wijzig de energiebesparingsbeleid naar \"Onbeperkt\".';
|
||||
|
||||
@override
|
||||
String get closeAfterSave => 'Opslaan en sluiten';
|
||||
|
||||
@override
|
||||
String get cmd => 'Opdracht';
|
||||
|
||||
@override
|
||||
String get collapseUITip => 'Of lange lijsten in de UI standaard moeten worden ingeklapt';
|
||||
|
||||
@override
|
||||
String get conn => 'Verbinding';
|
||||
|
||||
@override
|
||||
String get container => 'Container';
|
||||
|
||||
@override
|
||||
String get containerTrySudoTip => 'Bijvoorbeeld: in de app is de gebruiker ingesteld op aaa, maar Docker is geïnstalleerd onder de rootgebruiker. In dit geval moet u deze optie inschakelen.';
|
||||
|
||||
@override
|
||||
String get convert => 'Converteren';
|
||||
|
||||
@override
|
||||
String get copyPath => 'Pad kopiëren';
|
||||
|
||||
@override
|
||||
String get cpuViewAsProgressTip => 'Toon het gebruik van elke CPU in een voortgangsbalkstijl (oude stijl)';
|
||||
|
||||
@override
|
||||
String get cursorType => 'Cursortype';
|
||||
|
||||
@override
|
||||
String get customCmd => 'Aangepaste opdrachten';
|
||||
|
||||
@override
|
||||
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
|
||||
|
||||
@override
|
||||
String get customCmdHint => '\"Opdrachtnaam\": \"Opdracht\"';
|
||||
|
||||
@override
|
||||
String get decode => 'Decoderen';
|
||||
|
||||
@override
|
||||
String get decompress => 'Decomprimeren';
|
||||
|
||||
@override
|
||||
String get deleteServers => 'Servers batchgewijs verwijderen';
|
||||
|
||||
@override
|
||||
String get dirEmpty => 'Zorg ervoor dat de map leeg is.';
|
||||
|
||||
@override
|
||||
String get disconnected => 'Verbroken';
|
||||
|
||||
@override
|
||||
String get disk => 'Schijf';
|
||||
|
||||
@override
|
||||
String get diskIgnorePath => 'Pad negeren voor schijf';
|
||||
|
||||
@override
|
||||
String get displayCpuIndex => 'Toon de CPU-index';
|
||||
|
||||
@override
|
||||
String dl2Local(Object fileName) {
|
||||
return 'Download $fileName naar lokaal?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerEmptyRunningItems => 'Er zijn geen actieve containers.\nDit kan komen doordat:\n- De Docker-installatiegebruiker niet overeenkomt met de gebruikersnaam die is geconfigureerd binnen de app.\n- De omgevingsvariabele DOCKER_HOST is niet correct gelezen. U kunt deze krijgen door `echo \$DOCKER_HOST` in de terminal uit te voeren.';
|
||||
|
||||
@override
|
||||
String dockerImagesFmt(Object count) {
|
||||
return '$count afbeeldingen';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerNotInstalled => 'Docker niet geïnstalleerd';
|
||||
|
||||
@override
|
||||
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
|
||||
return '$runningCount actief, $stoppedCount container gestopt.';
|
||||
}
|
||||
|
||||
@override
|
||||
String dockerStatusRunningFmt(Object count) {
|
||||
return '$count container actief.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get doubleColumnMode => 'Dubbele kolommodus';
|
||||
|
||||
@override
|
||||
String get doubleColumnTip => 'Deze optie schakelt alleen de functie in, of deze daadwerkelijk kan worden ingeschakeld, hangt af van de breedte van het apparaat';
|
||||
|
||||
@override
|
||||
String get editVirtKeys => 'Virtuele toetsen bewerken';
|
||||
|
||||
@override
|
||||
String get editor => 'Editor';
|
||||
|
||||
@override
|
||||
String get editorHighlightTip => 'De huidige codehighlighting-prestaties zijn slechter en kunnen optioneel worden uitgeschakeld om te verbeteren.';
|
||||
|
||||
@override
|
||||
String get encode => 'Coderen';
|
||||
|
||||
@override
|
||||
String get envVars => 'Omgevingsvariabele';
|
||||
|
||||
@override
|
||||
String get experimentalFeature => 'Experimentele functie';
|
||||
|
||||
@override
|
||||
String get extraArgs => 'Extra argumenten';
|
||||
|
||||
@override
|
||||
String get fallbackSshDest => 'Fallback SSH-bestemming';
|
||||
|
||||
@override
|
||||
String get fdroidReleaseTip => 'Als u deze app van F-Droid heeft gedownload, wordt aanbevolen deze optie uit te schakelen.';
|
||||
|
||||
@override
|
||||
String get fgService => 'Voorgrondservice';
|
||||
|
||||
@override
|
||||
String get fgServiceTip => 'Na het inschakelen kunnen sommige apparaatmodellen crashen. Uitschakelen kan ertoe leiden dat sommige modellen SSH-verbindingen niet op de achtergrond kunnen behouden. Sta ServerBox notificatierechten, achtergronduitvoering en zelf-ontwaken toe in systeeminstellingen.';
|
||||
|
||||
@override
|
||||
String fileTooLarge(Object file, Object size, Object sizeMax) {
|
||||
return 'Bestand \'$file\' te groot $size, max $sizeMax';
|
||||
}
|
||||
|
||||
@override
|
||||
String get followSystem => 'Volg systeem';
|
||||
|
||||
@override
|
||||
String get font => 'Lettertype';
|
||||
|
||||
@override
|
||||
String get fontSize => 'Lettergrootte';
|
||||
|
||||
@override
|
||||
String get force => 'Forceer';
|
||||
|
||||
@override
|
||||
String get fullScreen => 'Volledig schermmodus';
|
||||
|
||||
@override
|
||||
String get fullScreenJitter => 'Volledig scherm trilling';
|
||||
|
||||
@override
|
||||
String get fullScreenJitterHelp => 'Om inbranden van het scherm te voorkomen';
|
||||
|
||||
@override
|
||||
String get fullScreenTip => 'Moet de volledig schermmodus worden ingeschakeld wanneer het apparaat naar de liggende modus wordt gedraaid? Deze optie is alleen van toepassing op het servertabblad.';
|
||||
|
||||
@override
|
||||
String get goBackQ => 'Terug gaan?';
|
||||
|
||||
@override
|
||||
String get goto => 'Ga naar';
|
||||
|
||||
@override
|
||||
String get hideTitleBar => 'Titelbalk verbergen';
|
||||
|
||||
@override
|
||||
String get highlight => 'Code-highlight';
|
||||
|
||||
@override
|
||||
String get homeWidgetUrlConfig => 'Home-widget-url configureren';
|
||||
|
||||
@override
|
||||
String get host => 'Host';
|
||||
|
||||
@override
|
||||
String httpFailedWithCode(Object code) {
|
||||
return 'verzoek mislukt, statuscode: $code';
|
||||
}
|
||||
|
||||
@override
|
||||
String get ignoreCert => 'Certificaat negeren';
|
||||
|
||||
@override
|
||||
String get image => 'Afbeelding';
|
||||
|
||||
@override
|
||||
String get imagesList => 'Lijst met afbeeldingen';
|
||||
|
||||
@override
|
||||
String get init => 'Initialiseren';
|
||||
|
||||
@override
|
||||
String get inner => 'Intern';
|
||||
|
||||
@override
|
||||
String get install => 'Installeren';
|
||||
|
||||
@override
|
||||
String get installDockerWithUrl => 'Installeer eerst docker via https://docs.docker.com/engine/install.';
|
||||
|
||||
@override
|
||||
String get invalid => 'Ongeldig';
|
||||
|
||||
@override
|
||||
String get jumpServer => 'Spring naar server';
|
||||
|
||||
@override
|
||||
String get keepForeground => 'Houd de app op de voorgrond!';
|
||||
|
||||
@override
|
||||
String get keepStatusWhenErr => 'Behoud de laatste serverstatus';
|
||||
|
||||
@override
|
||||
String get keepStatusWhenErrTip => 'Alleen in geval van een fout tijdens de scriptuitvoering';
|
||||
|
||||
@override
|
||||
String get keyAuth => 'Sleutelauthenticatie';
|
||||
|
||||
@override
|
||||
String get letterCache => 'Lettercaching';
|
||||
|
||||
@override
|
||||
String get letterCacheTip => 'Aanbevolen om uit te schakelen, maar na het uitschakelen is het niet mogelijk om CJK-tekens in te voeren.';
|
||||
|
||||
@override
|
||||
String get license => 'Licentie';
|
||||
|
||||
@override
|
||||
String get location => 'Locatie';
|
||||
|
||||
@override
|
||||
String get loss => 'verlies';
|
||||
|
||||
@override
|
||||
String madeWithLove(Object myGithub) {
|
||||
return 'Gemaakt met ❤️ door $myGithub';
|
||||
}
|
||||
|
||||
@override
|
||||
String get manual => 'Handleiding';
|
||||
|
||||
@override
|
||||
String get max => 'max';
|
||||
|
||||
@override
|
||||
String get maxRetryCount => 'Aantal serverherverbindingen';
|
||||
|
||||
@override
|
||||
String get maxRetryCountEqual0 => 'Zal opnieuw blijven proberen.';
|
||||
|
||||
@override
|
||||
String get min => 'min';
|
||||
|
||||
@override
|
||||
String get mission => 'Missie';
|
||||
|
||||
@override
|
||||
String get more => 'Meer';
|
||||
|
||||
@override
|
||||
String get moveOutServerFuncBtnsHelp => 'Aan: kan worden weergegeven onder elke kaart op de Server-tabbladpagina. Uit: kan worden weergegeven bovenaan de Serverdetails-pagina.';
|
||||
|
||||
@override
|
||||
String get ms => 'ms';
|
||||
|
||||
@override
|
||||
String get needHomeDir => 'Als u een Synology-gebruiker bent, [zie hier](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Gebruikers van andere systemen moeten zoeken hoe ze een home directory kunnen creëren.';
|
||||
|
||||
@override
|
||||
String get needRestart => 'App moet opnieuw worden gestart';
|
||||
|
||||
@override
|
||||
String get net => 'Netwerk';
|
||||
|
||||
@override
|
||||
String get netViewType => 'Netweergavetype';
|
||||
|
||||
@override
|
||||
String get newContainer => 'Nieuwe container';
|
||||
|
||||
@override
|
||||
String get noLineChart => 'lijndiagrammen gebruiken';
|
||||
|
||||
@override
|
||||
String get noLineChartForCpu => 'Gebruik geen lijndiagrammen voor CPU';
|
||||
|
||||
@override
|
||||
String get noPrivateKeyTip => 'De privésleutel bestaat niet, deze is mogelijk verwijderd of er is een configuratiefout.';
|
||||
|
||||
@override
|
||||
String get noPromptAgain => 'Niet meer vragen';
|
||||
|
||||
@override
|
||||
String get node => 'Node';
|
||||
|
||||
@override
|
||||
String get notAvailable => 'Niet beschikbaar';
|
||||
|
||||
@override
|
||||
String get onServerDetailPage => 'Op serverdetailspagina';
|
||||
|
||||
@override
|
||||
String get onlyOneLine => 'Alleen als één regel weergeven (scrollbaar)';
|
||||
|
||||
@override
|
||||
String get onlyWhenCoreBiggerThan8 => 'Alleen effectief wanneer het aantal cores > 8';
|
||||
|
||||
@override
|
||||
String get openLastPath => 'Open het laatste pad';
|
||||
|
||||
@override
|
||||
String get openLastPathTip => 'Verschillende servers hebben verschillende logs, en de log is het pad naar de uitgang';
|
||||
|
||||
@override
|
||||
String get parseContainerStatsTip => 'Het parsen van de bezettingsstatus van Docker is relatief langzaam.';
|
||||
|
||||
@override
|
||||
String percentOfSize(Object percent, Object size) {
|
||||
return '$percent% van $size';
|
||||
}
|
||||
|
||||
@override
|
||||
String get permission => 'Machtigingen';
|
||||
|
||||
@override
|
||||
String get pingAvg => 'Gem:';
|
||||
|
||||
@override
|
||||
String get pingInputIP => 'Voer een doel-IP / domein in.';
|
||||
|
||||
@override
|
||||
String get pingNoServer => 'Geen server om te pingen.\nVoeg een server toe in het servertabblad.';
|
||||
|
||||
@override
|
||||
String get pkg => 'Pkg';
|
||||
|
||||
@override
|
||||
String get plugInType => 'Invoegingstype';
|
||||
|
||||
@override
|
||||
String get port => 'Poort';
|
||||
|
||||
@override
|
||||
String get preview => 'Voorbeeld';
|
||||
|
||||
@override
|
||||
String get privateKey => 'Privésleutel';
|
||||
|
||||
@override
|
||||
String get process => 'Proces';
|
||||
|
||||
@override
|
||||
String get pushToken => 'Push-token';
|
||||
|
||||
@override
|
||||
String get pveIgnoreCertTip => 'Niet aanbevolen om in te schakelen, let op beveiligingsrisico\'s! Als u de standaardcertificaat van PVE gebruikt, moet u deze optie inschakelen.';
|
||||
|
||||
@override
|
||||
String get pveLoginFailed => 'Aanmelden mislukt. Kan niet authenticeren met gebruikersnaam/wachtwoord van serverconfiguratie voor Linux PAM-login.';
|
||||
|
||||
@override
|
||||
String get pveVersionLow => 'Deze functie bevindt zich momenteel in de testfase en is alleen getest op PVE 8+. Gebruik het met voorzichtigheid.';
|
||||
|
||||
@override
|
||||
String get pwd => 'Wachtwoord';
|
||||
|
||||
@override
|
||||
String get read => 'Lezen';
|
||||
|
||||
@override
|
||||
String get reboot => 'Herstart';
|
||||
|
||||
@override
|
||||
String get rememberPwdInMem => 'Wachtwoord onthouden in geheugen';
|
||||
|
||||
@override
|
||||
String get rememberPwdInMemTip => 'Gebruikt voor containers, opschorting, enz.';
|
||||
|
||||
@override
|
||||
String get rememberWindowSize => 'Venstergrootte onthouden';
|
||||
|
||||
@override
|
||||
String get remotePath => 'Extern pad';
|
||||
|
||||
@override
|
||||
String get restart => 'Herstarten';
|
||||
|
||||
@override
|
||||
String get result => 'Resultaat';
|
||||
|
||||
@override
|
||||
String get rotateAngel => 'Rotatiehoek';
|
||||
|
||||
@override
|
||||
String get route => 'Route';
|
||||
|
||||
@override
|
||||
String get run => 'Uitvoeren';
|
||||
|
||||
@override
|
||||
String get running => 'Uitgevoerd';
|
||||
|
||||
@override
|
||||
String get sameIdServerExist => 'Er bestaat al een server met dezelfde ID';
|
||||
|
||||
@override
|
||||
String get save => 'Opslaan';
|
||||
|
||||
@override
|
||||
String get saved => 'Opgeslagen';
|
||||
|
||||
@override
|
||||
String get second => 's';
|
||||
|
||||
@override
|
||||
String get sensors => 'Sensor';
|
||||
|
||||
@override
|
||||
String get sequence => 'Volgorde';
|
||||
|
||||
@override
|
||||
String get server => 'Server';
|
||||
|
||||
@override
|
||||
String get serverDetailOrder => 'Volgorde van widget op detailpagina';
|
||||
|
||||
@override
|
||||
String get serverFuncBtns => 'Server functieknoppen';
|
||||
|
||||
@override
|
||||
String get serverOrder => 'Servervolgorde';
|
||||
|
||||
@override
|
||||
String get sftpDlPrepare => 'Voorbereiden om verbinding te maken...';
|
||||
|
||||
@override
|
||||
String get sftpEditorTip => 'Indien leeg, gebruik de ingebouwde bestandseditor van de app. Indien een waarde aanwezig is, gebruik de editor van de externe server, bijvoorbeeld `vim` (aanbevolen om automatisch te detecteren volgens `EDITOR`).';
|
||||
|
||||
@override
|
||||
String get sftpRmrDirSummary => 'Gebruik `rm -r` om een map te verwijderen in SFTP.';
|
||||
|
||||
@override
|
||||
String get sftpSSHConnected => 'SFTP Verbonden';
|
||||
|
||||
@override
|
||||
String get sftpShowFoldersFirst => 'Mappen eerst weergeven';
|
||||
|
||||
@override
|
||||
String get showDistLogo => 'Distributielogo weergeven';
|
||||
|
||||
@override
|
||||
String get shutdown => 'Afsluiten';
|
||||
|
||||
@override
|
||||
String get size => 'Grootte';
|
||||
|
||||
@override
|
||||
String get snippet => 'Fragment';
|
||||
|
||||
@override
|
||||
String get softWrap => 'Zachte wrap';
|
||||
|
||||
@override
|
||||
String get specifyDev => 'Apparaat specificeren';
|
||||
|
||||
@override
|
||||
String get specifyDevTip => 'Bijvoorbeeld, netwerkverkeersstatistieken zijn standaard voor alle apparaten. Hier kunt u een specifiek apparaat opgeven.';
|
||||
|
||||
@override
|
||||
String get speed => 'Snelheid';
|
||||
|
||||
@override
|
||||
String spentTime(Object time) {
|
||||
return 'Gebruikte tijd: $time';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshTermHelp => 'Wanneer het terminal scrollbaar is, kan horizontaal slepen tekst selecteren. Klikken op de toetsenbordknop schakelt het toetsenbord aan/uit. Het bestandsicoon opent de huidige pad SFTP. De klembordknop kopieert de inhoud wanneer tekst is geselecteerd en plakt inhoud van het klembord in de terminal wanneer geen tekst is geselecteerd en er inhoud op het klembord staat. Het code-icoon plakt codefragmenten in de terminal en voert ze uit.';
|
||||
|
||||
@override
|
||||
String sshTip(Object url) {
|
||||
return 'Deze functie bevindt zich momenteel in de experimentele fase.\n\nMeld alstublieft bugs op $url of sluit je aan bij onze ontwikkeling.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshVirtualKeyAutoOff => 'Automatisch schakelen van virtuele toetsen';
|
||||
|
||||
@override
|
||||
String get start => 'Starten';
|
||||
|
||||
@override
|
||||
String get stat => 'Statistieken';
|
||||
|
||||
@override
|
||||
String get stats => 'Statistieken';
|
||||
|
||||
@override
|
||||
String get stop => 'Stoppen';
|
||||
|
||||
@override
|
||||
String get stopped => 'Gestopt';
|
||||
|
||||
@override
|
||||
String get storage => 'Opslag';
|
||||
|
||||
@override
|
||||
String get supportFmtArgs => 'De volgende opmaakparameters worden ondersteund:';
|
||||
|
||||
@override
|
||||
String get suspend => 'Ophangen';
|
||||
|
||||
@override
|
||||
String get suspendTip => 'De opschortfunctie vereist rootrechten en systemd-ondersteuning.';
|
||||
|
||||
@override
|
||||
String switchTo(Object val) {
|
||||
return 'Overschakelen naar $val';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sync => 'Sync';
|
||||
|
||||
@override
|
||||
String get syncTip => 'Een herstart kan nodig zijn voor sommige wijzigingen om van kracht te worden.';
|
||||
|
||||
@override
|
||||
String get system => 'Systeem';
|
||||
|
||||
@override
|
||||
String get tag => 'Labels';
|
||||
|
||||
@override
|
||||
String get temperature => 'Temperatuur';
|
||||
|
||||
@override
|
||||
String get termFontSizeTip => 'Deze instelling heeft invloed op de terminalgrootte (breedte en hoogte). U kunt inzoomen op de terminalpagina om de lettergrootte van de huidige sessie aan te passen.';
|
||||
|
||||
@override
|
||||
String get terminal => 'Terminal';
|
||||
|
||||
@override
|
||||
String get test => 'Testen';
|
||||
|
||||
@override
|
||||
String get textScaler => 'Tekstschaler';
|
||||
|
||||
@override
|
||||
String get textScalerTip => '1.0 => 100% (oorspronkelijke grootte), werkt alleen op het gedeelte van de serverpagina van het lettertype, niet aanbevolen om te wijzigen.';
|
||||
|
||||
@override
|
||||
String get theme => 'Thema';
|
||||
|
||||
@override
|
||||
String get time => 'Tijd';
|
||||
|
||||
@override
|
||||
String get times => 'Keer';
|
||||
|
||||
@override
|
||||
String get total => 'Totaal';
|
||||
|
||||
@override
|
||||
String get traffic => 'Verkeer';
|
||||
|
||||
@override
|
||||
String get trySudo => 'Probeer sudo te gebruiken';
|
||||
|
||||
@override
|
||||
String get ttl => 'TTL';
|
||||
|
||||
@override
|
||||
String get unknown => 'Onbekend';
|
||||
|
||||
@override
|
||||
String get unkownConvertMode => 'Onbekende conversiemodus';
|
||||
|
||||
@override
|
||||
String get update => 'Bijwerken';
|
||||
|
||||
@override
|
||||
String get updateIntervalEqual0 => 'Het staat op 0, het zal niet automatisch bijwerken\nCPU status kan niet berekend worden.';
|
||||
|
||||
@override
|
||||
String get updateServerStatusInterval => 'Interne server status bijwerking interval';
|
||||
|
||||
@override
|
||||
String get upload => 'Upload';
|
||||
|
||||
@override
|
||||
String get upsideDown => 'Ondersteboven';
|
||||
|
||||
@override
|
||||
String get uptime => 'Uptime';
|
||||
|
||||
@override
|
||||
String get useCdn => 'Gebruikt CDN';
|
||||
|
||||
@override
|
||||
String get useCdnTip => 'Niet-chinese gebruikers worden aangeraden om deze CDN te gebruiken. Wil je dat?';
|
||||
|
||||
@override
|
||||
String get useNoPwd => 'Er zal geen wachtwoord gebruikt worden';
|
||||
|
||||
@override
|
||||
String get usePodmanByDefault => 'Valt terug op Podman';
|
||||
|
||||
@override
|
||||
String get used => 'Gebruikt';
|
||||
|
||||
@override
|
||||
String get view => 'Weergave';
|
||||
|
||||
@override
|
||||
String get viewErr => 'Zie foutmelding';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpClipboard => 'Kopiëren naar het klembord als de geselecteerde terminal niet leeg is, anders de inhoud van het klembord plakken in de terminal.';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpIME => 'Toetsenbord aan/uit zetten';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpSFTP => 'Huidige map openen in SFTP.';
|
||||
|
||||
@override
|
||||
String get waitConnection => 'Wacht alstublieft tot de verbinding tot stand is gebracht.';
|
||||
|
||||
@override
|
||||
String get wakeLock => 'Wakker houden';
|
||||
|
||||
@override
|
||||
String get watchNotPaired => 'Geen gekoppelde Apple Watch';
|
||||
|
||||
@override
|
||||
String get webdavSettingEmpty => 'Webdav-instelling is leeg';
|
||||
|
||||
@override
|
||||
String get whenOpenApp => 'Bij het openen van de app';
|
||||
|
||||
@override
|
||||
String get wolTip => 'Na het configureren van WOL (Wake-on-LAN), wordt elke keer dat de server wordt verbonden een WOL-verzoek verzonden.';
|
||||
|
||||
@override
|
||||
String get write => 'Schrijven';
|
||||
|
||||
@override
|
||||
String get writeScriptFailTip => 'Het schrijven naar het script is mislukt, mogelijk door gebrek aan rechten of omdat de map niet bestaat.';
|
||||
|
||||
@override
|
||||
String get writeScriptTip => 'Na het verbinden met de server wordt een script geschreven naar ~/.config/server_box om de systeemstatus te monitoren. U kunt de inhoud van het script controleren.';
|
||||
}
|
||||
708
lib/generated/l10n/l10n_pt.dart
Normal file
708
lib/generated/l10n/l10n_pt.dart
Normal file
@@ -0,0 +1,708 @@
|
||||
import 'l10n.dart';
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
/// The translations for Portuguese (`pt`).
|
||||
class AppLocalizationsPt extends AppLocalizations {
|
||||
AppLocalizationsPt([String locale = 'pt']) : super(locale);
|
||||
|
||||
@override
|
||||
String get aboutThanks => 'Agradecimentos a todos os participantes.';
|
||||
|
||||
@override
|
||||
String get acceptBeta => 'Aceitar atualizações da versão de teste';
|
||||
|
||||
@override
|
||||
String get addSystemPrivateKeyTip => 'Atualmente, não há nenhuma chave privada. Gostaria de adicionar a chave do sistema (~/.ssh/id_rsa)?';
|
||||
|
||||
@override
|
||||
String get added2List => 'Adicionado à lista de tarefas';
|
||||
|
||||
@override
|
||||
String get addr => 'Endereço';
|
||||
|
||||
@override
|
||||
String get alreadyLastDir => 'Já é o diretório mais alto';
|
||||
|
||||
@override
|
||||
String get authFailTip => 'Autenticação falhou, por favor verifique se a senha/chave/host/usuário, etc., estão incorretos.';
|
||||
|
||||
@override
|
||||
String get autoBackupConflict => 'Apenas um backup automático pode ser ativado por vez';
|
||||
|
||||
@override
|
||||
String get autoConnect => 'Conexão automática';
|
||||
|
||||
@override
|
||||
String get autoRun => 'Execução automática';
|
||||
|
||||
@override
|
||||
String get autoUpdateHomeWidget => 'Atualização automática do widget da tela inicial';
|
||||
|
||||
@override
|
||||
String get backupTip => 'Os dados exportados são criptografados de forma simples, por favor, guarde-os com segurança.';
|
||||
|
||||
@override
|
||||
String get backupVersionNotMatch => 'Versão de backup não compatível, não é possível restaurar';
|
||||
|
||||
@override
|
||||
String get battery => 'Bateria';
|
||||
|
||||
@override
|
||||
String get bgRun => 'Execução em segundo plano';
|
||||
|
||||
@override
|
||||
String get bgRunTip => 'Este interruptor indica que o programa tentará rodar em segundo plano, mas a capacidade de fazer isso depende das permissões concedidas. No Android nativo, desative a \'Otimização de bateria\' para este app, no MIUI, altere a estratégia de economia de energia para \'Sem restrições\'.';
|
||||
|
||||
@override
|
||||
String get closeAfterSave => 'Salvar e fechar';
|
||||
|
||||
@override
|
||||
String get cmd => 'Comando';
|
||||
|
||||
@override
|
||||
String get collapseUITip => 'Deve colapsar listas longas na UI por padrão?';
|
||||
|
||||
@override
|
||||
String get conn => 'Conectar';
|
||||
|
||||
@override
|
||||
String get container => 'Contêiner';
|
||||
|
||||
@override
|
||||
String get containerTrySudoTip => 'Por exemplo: se o usuário for definido como aaa dentro do app, mas o Docker estiver instalado sob o usuário root, esta opção precisará ser ativada';
|
||||
|
||||
@override
|
||||
String get convert => 'Converter';
|
||||
|
||||
@override
|
||||
String get copyPath => 'Copiar caminho';
|
||||
|
||||
@override
|
||||
String get cpuViewAsProgressTip => 'Exiba a taxa de uso de cada CPU em estilo de barra de progresso (estilo antigo)';
|
||||
|
||||
@override
|
||||
String get cursorType => 'Tipo de cursor';
|
||||
|
||||
@override
|
||||
String get customCmd => 'Comandos personalizados';
|
||||
|
||||
@override
|
||||
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
|
||||
|
||||
@override
|
||||
String get customCmdHint => '\"Nome do comando\": \"Comando\"';
|
||||
|
||||
@override
|
||||
String get decode => 'Decodificar';
|
||||
|
||||
@override
|
||||
String get decompress => 'Descomprimir';
|
||||
|
||||
@override
|
||||
String get deleteServers => 'Excluir servidores em lote';
|
||||
|
||||
@override
|
||||
String get dirEmpty => 'Certifique-se de que a pasta está vazia';
|
||||
|
||||
@override
|
||||
String get disconnected => 'Desconectado';
|
||||
|
||||
@override
|
||||
String get disk => 'Disco';
|
||||
|
||||
@override
|
||||
String get diskIgnorePath => 'Caminhos de disco ignorados';
|
||||
|
||||
@override
|
||||
String get displayCpuIndex => 'Exiba o índice de CPU';
|
||||
|
||||
@override
|
||||
String dl2Local(Object fileName) {
|
||||
return 'Baixar $fileName para o local?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerEmptyRunningItems => 'Não há contêineres em execução.\nIsso pode ser porque:\n- O usuário que instalou o Docker difere do usuário configurado no app\n- A variável de ambiente DOCKER_HOST não foi lida corretamente. Você pode verificar isso executando `echo \$DOCKER_HOST` no terminal.';
|
||||
|
||||
@override
|
||||
String dockerImagesFmt(Object count) {
|
||||
return 'Total de $count imagens';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerNotInstalled => 'Docker não instalado';
|
||||
|
||||
@override
|
||||
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
|
||||
return '$runningCount em execução, $stoppedCount parados';
|
||||
}
|
||||
|
||||
@override
|
||||
String dockerStatusRunningFmt(Object count) {
|
||||
return '$count contêiner(es) em execução';
|
||||
}
|
||||
|
||||
@override
|
||||
String get doubleColumnMode => 'Modo de coluna dupla';
|
||||
|
||||
@override
|
||||
String get doubleColumnTip => 'Esta opção apenas ativa a funcionalidade, se ela será ativada depende também da largura do dispositivo';
|
||||
|
||||
@override
|
||||
String get editVirtKeys => 'Editar teclas virtuais';
|
||||
|
||||
@override
|
||||
String get editor => 'Editor';
|
||||
|
||||
@override
|
||||
String get editorHighlightTip => 'O desempenho do destaque de código atualmente é ruim, pode optar por desativá-lo para melhorar.';
|
||||
|
||||
@override
|
||||
String get encode => 'Codificar';
|
||||
|
||||
@override
|
||||
String get envVars => 'Variável de ambiente';
|
||||
|
||||
@override
|
||||
String get experimentalFeature => 'Recurso experimental';
|
||||
|
||||
@override
|
||||
String get extraArgs => 'Argumentos extras';
|
||||
|
||||
@override
|
||||
String get fallbackSshDest => 'Destino SSH de fallback';
|
||||
|
||||
@override
|
||||
String get fdroidReleaseTip => 'Se você baixou este aplicativo do F-Droid, é recomendado desativar esta opção.';
|
||||
|
||||
@override
|
||||
String get fgService => 'Serviço em primeiro plano';
|
||||
|
||||
@override
|
||||
String get fgServiceTip => 'Após ativar, alguns modelos de dispositivos podem travar. Desativar pode fazer com que alguns modelos não consigam manter conexões SSH em segundo plano. Por favor, permita as permissões de notificação do ServerBox, execução em segundo plano e auto-despertar nas configurações do sistema.';
|
||||
|
||||
@override
|
||||
String fileTooLarge(Object file, Object size, Object sizeMax) {
|
||||
return 'Arquivo \'$file\' muito grande \'$size\', excedendo $sizeMax';
|
||||
}
|
||||
|
||||
@override
|
||||
String get followSystem => 'Seguir sistema';
|
||||
|
||||
@override
|
||||
String get font => 'Fonte';
|
||||
|
||||
@override
|
||||
String get fontSize => 'Tamanho da fonte';
|
||||
|
||||
@override
|
||||
String get force => 'Forçar';
|
||||
|
||||
@override
|
||||
String get fullScreen => 'Modo tela cheia';
|
||||
|
||||
@override
|
||||
String get fullScreenJitter => 'Tremulação em tela cheia';
|
||||
|
||||
@override
|
||||
String get fullScreenJitterHelp => 'Prevenir burn-in de tela';
|
||||
|
||||
@override
|
||||
String get fullScreenTip => 'Deve ser ativado o modo de tela cheia quando o dispositivo é girado para o modo paisagem? Esta opção aplica-se apenas à aba do servidor.';
|
||||
|
||||
@override
|
||||
String get goBackQ => 'Voltar?';
|
||||
|
||||
@override
|
||||
String get goto => 'Ir para';
|
||||
|
||||
@override
|
||||
String get hideTitleBar => 'Ocultar barra de título';
|
||||
|
||||
@override
|
||||
String get highlight => 'Destaque de código';
|
||||
|
||||
@override
|
||||
String get homeWidgetUrlConfig => 'Configuração de URL do widget da tela inicial';
|
||||
|
||||
@override
|
||||
String get host => 'Host';
|
||||
|
||||
@override
|
||||
String httpFailedWithCode(Object code) {
|
||||
return 'Falha na solicitação, código de status: $code';
|
||||
}
|
||||
|
||||
@override
|
||||
String get ignoreCert => 'Ignorar certificado';
|
||||
|
||||
@override
|
||||
String get image => 'Imagem';
|
||||
|
||||
@override
|
||||
String get imagesList => 'Lista de imagens';
|
||||
|
||||
@override
|
||||
String get init => 'Inicializar';
|
||||
|
||||
@override
|
||||
String get inner => 'Interno';
|
||||
|
||||
@override
|
||||
String get install => 'Instalar';
|
||||
|
||||
@override
|
||||
String get installDockerWithUrl => 'Por favor, instale o Docker primeiro em https://docs.docker.com/engine/install';
|
||||
|
||||
@override
|
||||
String get invalid => 'Inválido';
|
||||
|
||||
@override
|
||||
String get jumpServer => 'Servidor de salto';
|
||||
|
||||
@override
|
||||
String get keepForeground => 'Por favor, mantenha o app em primeiro plano!';
|
||||
|
||||
@override
|
||||
String get keepStatusWhenErr => 'Manter o status anterior do servidor';
|
||||
|
||||
@override
|
||||
String get keepStatusWhenErrTip => 'Limitado a erros de execução de scripts';
|
||||
|
||||
@override
|
||||
String get keyAuth => 'Autenticação por chave';
|
||||
|
||||
@override
|
||||
String get letterCache => 'Cache de letras';
|
||||
|
||||
@override
|
||||
String get letterCacheTip => 'Recomendado desativar, mas após desativar, será impossível inserir caracteres CJK.';
|
||||
|
||||
@override
|
||||
String get license => 'Licença de código aberto';
|
||||
|
||||
@override
|
||||
String get location => 'Localização';
|
||||
|
||||
@override
|
||||
String get loss => 'Taxa de perda';
|
||||
|
||||
@override
|
||||
String madeWithLove(Object myGithub) {
|
||||
return 'Feito com ❤️ por $myGithub';
|
||||
}
|
||||
|
||||
@override
|
||||
String get manual => 'Manual';
|
||||
|
||||
@override
|
||||
String get max => 'Máximo';
|
||||
|
||||
@override
|
||||
String get maxRetryCount => 'Número de tentativas de reconexão com o servidor';
|
||||
|
||||
@override
|
||||
String get maxRetryCountEqual0 => 'Irá tentar indefinidamente';
|
||||
|
||||
@override
|
||||
String get min => 'Mínimo';
|
||||
|
||||
@override
|
||||
String get mission => 'Missão';
|
||||
|
||||
@override
|
||||
String get more => 'Mais';
|
||||
|
||||
@override
|
||||
String get moveOutServerFuncBtnsHelp => 'Ativado: Mostra abaixo de cada cartão na aba do servidor. Desativado: Mostra no topo da página de detalhes do servidor.';
|
||||
|
||||
@override
|
||||
String get ms => 'ms';
|
||||
|
||||
@override
|
||||
String get needHomeDir => 'Se você é usuário de Synology, [veja aqui](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Usuários de outros sistemas precisam pesquisar como criar um diretório home.';
|
||||
|
||||
@override
|
||||
String get needRestart => 'Necessita reiniciar o app';
|
||||
|
||||
@override
|
||||
String get net => 'Rede';
|
||||
|
||||
@override
|
||||
String get netViewType => 'Tipo de visualização de rede';
|
||||
|
||||
@override
|
||||
String get newContainer => 'Novo contêiner';
|
||||
|
||||
@override
|
||||
String get noLineChart => 'Não usar gráficos de linha';
|
||||
|
||||
@override
|
||||
String get noLineChartForCpu => 'Não utilizar gráficos de linhas para a CPU';
|
||||
|
||||
@override
|
||||
String get noPrivateKeyTip => 'A chave privada não existe, pode ter sido deletada ou há um erro de configuração.';
|
||||
|
||||
@override
|
||||
String get noPromptAgain => 'Não perguntar novamente';
|
||||
|
||||
@override
|
||||
String get node => 'Nó';
|
||||
|
||||
@override
|
||||
String get notAvailable => 'Indisponível';
|
||||
|
||||
@override
|
||||
String get onServerDetailPage => 'Na página de detalhes do servidor';
|
||||
|
||||
@override
|
||||
String get onlyOneLine => 'Exibir apenas como uma linha (rolável)';
|
||||
|
||||
@override
|
||||
String get onlyWhenCoreBiggerThan8 => 'Efetivo apenas quando o número de núcleos > 8';
|
||||
|
||||
@override
|
||||
String get openLastPath => 'Abrir o último caminho';
|
||||
|
||||
@override
|
||||
String get openLastPathTip => 'Registros diferentes para servidores diferentes, e registra o caminho ao sair';
|
||||
|
||||
@override
|
||||
String get parseContainerStatsTip => 'Análise de status do Docker pode ser lenta';
|
||||
|
||||
@override
|
||||
String percentOfSize(Object percent, Object size) {
|
||||
return '$percent% de $size';
|
||||
}
|
||||
|
||||
@override
|
||||
String get permission => 'Permissões';
|
||||
|
||||
@override
|
||||
String get pingAvg => 'Média:';
|
||||
|
||||
@override
|
||||
String get pingInputIP => 'Por favor, insira o IP ou domínio alvo';
|
||||
|
||||
@override
|
||||
String get pingNoServer => 'Nenhum servidor disponível para Ping\nPor favor, adicione um servidor na aba de servidores e tente novamente';
|
||||
|
||||
@override
|
||||
String get pkg => 'Gerenciamento de pacotes';
|
||||
|
||||
@override
|
||||
String get plugInType => 'Tipo de Inserção';
|
||||
|
||||
@override
|
||||
String get port => 'Porta';
|
||||
|
||||
@override
|
||||
String get preview => 'Pré-visualização';
|
||||
|
||||
@override
|
||||
String get privateKey => 'Chave privada';
|
||||
|
||||
@override
|
||||
String get process => 'Processo';
|
||||
|
||||
@override
|
||||
String get pushToken => 'Token de notificação push';
|
||||
|
||||
@override
|
||||
String get pveIgnoreCertTip => 'Não recomendado para ativar, cuidado com os riscos de segurança! Se estiver usando o certificado padrão do PVE, você precisa habilitar esta opção.';
|
||||
|
||||
@override
|
||||
String get pveLoginFailed => 'Falha no login. Não é possível autenticar com o nome de usuário/senha da configuração do servidor para login no Linux PAM.';
|
||||
|
||||
@override
|
||||
String get pveVersionLow => 'Esta funcionalidade está atualmente em fase de teste e foi testada apenas no PVE 8+. Por favor, use com cautela.';
|
||||
|
||||
@override
|
||||
String get pwd => 'Senha';
|
||||
|
||||
@override
|
||||
String get read => 'Leitura';
|
||||
|
||||
@override
|
||||
String get reboot => 'Reiniciar';
|
||||
|
||||
@override
|
||||
String get rememberPwdInMem => 'Lembrar senha na memória';
|
||||
|
||||
@override
|
||||
String get rememberPwdInMemTip => 'Usado para contêineres, suspensão, etc.';
|
||||
|
||||
@override
|
||||
String get rememberWindowSize => 'Lembrar o tamanho da janela';
|
||||
|
||||
@override
|
||||
String get remotePath => 'Caminho remoto';
|
||||
|
||||
@override
|
||||
String get restart => 'Reiniciar';
|
||||
|
||||
@override
|
||||
String get result => 'Resultado';
|
||||
|
||||
@override
|
||||
String get rotateAngel => 'Ângulo de rotação';
|
||||
|
||||
@override
|
||||
String get route => 'Roteamento';
|
||||
|
||||
@override
|
||||
String get run => 'Executar';
|
||||
|
||||
@override
|
||||
String get running => 'Executando';
|
||||
|
||||
@override
|
||||
String get sameIdServerExist => 'Já existe um servidor com o mesmo ID';
|
||||
|
||||
@override
|
||||
String get save => 'Salvar';
|
||||
|
||||
@override
|
||||
String get saved => 'Salvo';
|
||||
|
||||
@override
|
||||
String get second => 'Segundo';
|
||||
|
||||
@override
|
||||
String get sensors => 'Sensores';
|
||||
|
||||
@override
|
||||
String get sequence => 'Sequência';
|
||||
|
||||
@override
|
||||
String get server => 'Servidor';
|
||||
|
||||
@override
|
||||
String get serverDetailOrder => 'Ordem dos componentes na página de detalhes do servidor';
|
||||
|
||||
@override
|
||||
String get serverFuncBtns => 'Botões de função do servidor';
|
||||
|
||||
@override
|
||||
String get serverOrder => 'Ordem do servidor';
|
||||
|
||||
@override
|
||||
String get sftpDlPrepare => 'Preparando para conectar ao servidor...';
|
||||
|
||||
@override
|
||||
String get sftpEditorTip => 'Se vazio, use o editor de arquivos integrado do aplicativo. Se houver um valor, use o editor do servidor remoto, por exemplo, `vim` (recomendado detectar automaticamente de acordo com `EDITOR`).';
|
||||
|
||||
@override
|
||||
String get sftpRmrDirSummary => 'Usar `rm -r` em SFTP para excluir pastas';
|
||||
|
||||
@override
|
||||
String get sftpSSHConnected => 'SFTP conectado...';
|
||||
|
||||
@override
|
||||
String get sftpShowFoldersFirst => 'Mostrar pastas primeiro';
|
||||
|
||||
@override
|
||||
String get showDistLogo => 'Mostrar logo da distribuição';
|
||||
|
||||
@override
|
||||
String get shutdown => 'Desligar';
|
||||
|
||||
@override
|
||||
String get size => 'Tamanho';
|
||||
|
||||
@override
|
||||
String get snippet => 'Snippet';
|
||||
|
||||
@override
|
||||
String get softWrap => 'Quebra de linha suave';
|
||||
|
||||
@override
|
||||
String get specifyDev => 'Especificar dispositivo';
|
||||
|
||||
@override
|
||||
String get specifyDevTip => 'Por exemplo, as estatísticas de tráfego de rede são por padrão para todos os dispositivos. Você pode especificar um dispositivo específico aqui.';
|
||||
|
||||
@override
|
||||
String get speed => 'Velocidade';
|
||||
|
||||
@override
|
||||
String spentTime(Object time) {
|
||||
return 'Tempo gasto: $time';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshTermHelp => 'Quando o terminal é rolável, arrastar horizontalmente pode selecionar texto. Clicar no botão do teclado ativa/desativa o teclado. O ícone de arquivo abre o SFTP do caminho atual. O botão da área de transferência copia o conteúdo quando o texto é selecionado e cola o conteúdo da área de transferência no terminal quando nenhum texto é selecionado e há conteúdo na área de transferência. O ícone de código cola trechos de código no terminal e os executa.';
|
||||
|
||||
@override
|
||||
String sshTip(Object url) {
|
||||
return 'Esta funcionalidade está em fase de teste.\n\nPor favor, reporte problemas em $url ou junte-se a nós no desenvolvimento.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshVirtualKeyAutoOff => 'Desativação automática das teclas virtuais';
|
||||
|
||||
@override
|
||||
String get start => 'Iniciar';
|
||||
|
||||
@override
|
||||
String get stat => 'Estatísticas';
|
||||
|
||||
@override
|
||||
String get stats => 'Estatísticas';
|
||||
|
||||
@override
|
||||
String get stop => 'Parar';
|
||||
|
||||
@override
|
||||
String get stopped => 'Parado';
|
||||
|
||||
@override
|
||||
String get storage => 'Armazenamento';
|
||||
|
||||
@override
|
||||
String get supportFmtArgs => 'Suporta os seguintes argumentos formatados:';
|
||||
|
||||
@override
|
||||
String get suspend => 'Suspender';
|
||||
|
||||
@override
|
||||
String get suspendTip => 'A função de suspensão requer permissões de root e suporte do systemd.';
|
||||
|
||||
@override
|
||||
String switchTo(Object val) {
|
||||
return 'Mudar para $val';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sync => 'Sincronizar';
|
||||
|
||||
@override
|
||||
String get syncTip => 'Pode ser necessário reiniciar para algumas mudanças surtirem efeito.';
|
||||
|
||||
@override
|
||||
String get system => 'Sistema';
|
||||
|
||||
@override
|
||||
String get tag => 'Tag';
|
||||
|
||||
@override
|
||||
String get temperature => 'Temperatura';
|
||||
|
||||
@override
|
||||
String get termFontSizeTip => 'Esta configuração afetará o tamanho do terminal (largura e altura). Você pode dar zoom na página do terminal para ajustar o tamanho da fonte da sessão atual.';
|
||||
|
||||
@override
|
||||
String get terminal => 'Terminal';
|
||||
|
||||
@override
|
||||
String get test => 'Teste';
|
||||
|
||||
@override
|
||||
String get textScaler => 'Escala de texto';
|
||||
|
||||
@override
|
||||
String get textScalerTip => '1.0 => 100% (tamanho original), afeta apenas algumas fontes na página do servidor, não é recomendado alterar.';
|
||||
|
||||
@override
|
||||
String get theme => 'Tema';
|
||||
|
||||
@override
|
||||
String get time => 'Tempo';
|
||||
|
||||
@override
|
||||
String get times => 'Vezes';
|
||||
|
||||
@override
|
||||
String get total => 'Total';
|
||||
|
||||
@override
|
||||
String get traffic => 'Tráfego';
|
||||
|
||||
@override
|
||||
String get trySudo => 'Tentar usar sudo';
|
||||
|
||||
@override
|
||||
String get ttl => 'TTL';
|
||||
|
||||
@override
|
||||
String get unknown => 'Desconhecido';
|
||||
|
||||
@override
|
||||
String get unkownConvertMode => 'Modo de conversão desconhecido';
|
||||
|
||||
@override
|
||||
String get update => 'Atualizar';
|
||||
|
||||
@override
|
||||
String get updateIntervalEqual0 => 'Se definido como 0, o estado do servidor não será atualizado automaticamente.\nE o uso da CPU não poderá ser calculado.';
|
||||
|
||||
@override
|
||||
String get updateServerStatusInterval => 'Intervalo de atualização do estado do servidor';
|
||||
|
||||
@override
|
||||
String get upload => 'Upload';
|
||||
|
||||
@override
|
||||
String get upsideDown => 'Inverter verticalmente';
|
||||
|
||||
@override
|
||||
String get uptime => 'Tempo de atividade';
|
||||
|
||||
@override
|
||||
String get useCdn => 'Utilizando CDN';
|
||||
|
||||
@override
|
||||
String get useCdnTip => 'Recomenda-se que usuários não chineses usem CDN. Gostaria de usá-lo?';
|
||||
|
||||
@override
|
||||
String get useNoPwd => 'Será usado sem senha';
|
||||
|
||||
@override
|
||||
String get usePodmanByDefault => 'Usar Podman por padrão';
|
||||
|
||||
@override
|
||||
String get used => 'Usado';
|
||||
|
||||
@override
|
||||
String get view => 'Visualização';
|
||||
|
||||
@override
|
||||
String get viewErr => 'Ver erro';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpClipboard => 'Se houver texto selecionado no terminal, copia para a área de transferência, caso contrário, cola o conteúdo da área de transferência no terminal.';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpIME => 'Ligar/desligar o teclado';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpSFTP => 'Abre o caminho atual em SFTP.';
|
||||
|
||||
@override
|
||||
String get waitConnection => 'Por favor, aguarde a conexão ser estabelecida';
|
||||
|
||||
@override
|
||||
String get wakeLock => 'Manter acordado';
|
||||
|
||||
@override
|
||||
String get watchNotPaired => 'Não há Apple Watch pareado';
|
||||
|
||||
@override
|
||||
String get webdavSettingEmpty => 'Configurações de Webdav estão vazias';
|
||||
|
||||
@override
|
||||
String get whenOpenApp => 'Ao abrir o app';
|
||||
|
||||
@override
|
||||
String get wolTip => 'Após configurar o WOL (Wake-on-LAN), um pedido de WOL é enviado cada vez que o servidor é conectado.';
|
||||
|
||||
@override
|
||||
String get write => 'Escrita';
|
||||
|
||||
@override
|
||||
String get writeScriptFailTip => 'Falha ao escrever no script, possivelmente devido à falta de permissões ou o diretório não existe.';
|
||||
|
||||
@override
|
||||
String get writeScriptTip => 'Após conectar ao servidor, um script será escrito em ~/.config/server_box para monitorar o status do sistema. Você pode revisar o conteúdo do script.';
|
||||
}
|
||||
708
lib/generated/l10n/l10n_ru.dart
Normal file
708
lib/generated/l10n/l10n_ru.dart
Normal file
@@ -0,0 +1,708 @@
|
||||
import 'l10n.dart';
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
/// The translations for Russian (`ru`).
|
||||
class AppLocalizationsRu extends AppLocalizations {
|
||||
AppLocalizationsRu([String locale = 'ru']) : super(locale);
|
||||
|
||||
@override
|
||||
String get aboutThanks => 'Благодарности всем участникам.';
|
||||
|
||||
@override
|
||||
String get acceptBeta => 'Принять обновления тестовой версии';
|
||||
|
||||
@override
|
||||
String get addSystemPrivateKeyTip => 'В данный момент приватные ключи отсутствуют. Добавить системный приватный ключ (~/.ssh/id_rsa)?';
|
||||
|
||||
@override
|
||||
String get added2List => 'Добавлено в список задач';
|
||||
|
||||
@override
|
||||
String get addr => 'Адрес';
|
||||
|
||||
@override
|
||||
String get alreadyLastDir => 'Уже в корневом каталоге';
|
||||
|
||||
@override
|
||||
String get authFailTip => 'Аутентификация не удалась, пожалуйста, проверьте, правильны ли пароль/ключ/хост/пользователь и т.д.';
|
||||
|
||||
@override
|
||||
String get autoBackupConflict => 'Может быть включено только одно автоматическое резервное копирование';
|
||||
|
||||
@override
|
||||
String get autoConnect => 'Автоматическое подключение';
|
||||
|
||||
@override
|
||||
String get autoRun => 'Автозапуск';
|
||||
|
||||
@override
|
||||
String get autoUpdateHomeWidget => 'Автоматическое обновление виджета на главном экране';
|
||||
|
||||
@override
|
||||
String get backupTip => 'Экспортированные данные зашифрованы простым способом \nПожалуйста, храните их в безопасности.';
|
||||
|
||||
@override
|
||||
String get backupVersionNotMatch => 'Версия резервной копии не совпадает, восстановление невозможно';
|
||||
|
||||
@override
|
||||
String get battery => 'Батарея';
|
||||
|
||||
@override
|
||||
String get bgRun => 'Работа в фоновом режиме';
|
||||
|
||||
@override
|
||||
String get bgRunTip => 'Этот переключатель означает, что программа будет пытаться работать в фоновом режиме, но фактическое выполнение зависит от того, включено ли разрешение. Для нативного Android отключите «Оптимизацию батареи» для этого приложения, для MIUI измените контроль активности на «Нет ограничений».';
|
||||
|
||||
@override
|
||||
String get closeAfterSave => 'Сохранить и закрыть';
|
||||
|
||||
@override
|
||||
String get cmd => 'Команда';
|
||||
|
||||
@override
|
||||
String get collapseUITip => 'Свернуть длинные списки в UI по умолчанию';
|
||||
|
||||
@override
|
||||
String get conn => 'Подключение';
|
||||
|
||||
@override
|
||||
String get container => 'Контейнер';
|
||||
|
||||
@override
|
||||
String get containerTrySudoTip => 'Например: если пользователь в приложении установлен как aaa, но Docker установлен под пользователем root, тогда нужно включить эту опцию';
|
||||
|
||||
@override
|
||||
String get convert => 'Конвертировать';
|
||||
|
||||
@override
|
||||
String get copyPath => 'Копировать путь';
|
||||
|
||||
@override
|
||||
String get cpuViewAsProgressTip => 'Отобразите уровень использования каждого процессора в виде индикатора выполнения (старый стиль)';
|
||||
|
||||
@override
|
||||
String get cursorType => 'Тип курсора';
|
||||
|
||||
@override
|
||||
String get customCmd => 'Пользовательские команды';
|
||||
|
||||
@override
|
||||
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
|
||||
|
||||
@override
|
||||
String get customCmdHint => '\"Имя команды\": \"Команда\"';
|
||||
|
||||
@override
|
||||
String get decode => 'Декодировать';
|
||||
|
||||
@override
|
||||
String get decompress => 'Разархивировать';
|
||||
|
||||
@override
|
||||
String get deleteServers => 'Удалить серверы пакетно';
|
||||
|
||||
@override
|
||||
String get dirEmpty => 'Пожалуйста, убедитесь, что папка пуста';
|
||||
|
||||
@override
|
||||
String get disconnected => 'Отключено';
|
||||
|
||||
@override
|
||||
String get disk => 'Диск';
|
||||
|
||||
@override
|
||||
String get diskIgnorePath => 'Игнорировать путь к диску';
|
||||
|
||||
@override
|
||||
String get displayCpuIndex => 'Отобразить индекс ЦП';
|
||||
|
||||
@override
|
||||
String dl2Local(Object fileName) {
|
||||
return 'Загрузить $fileName на локальный диск?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerEmptyRunningItems => 'Нет запущенных контейнеров.\nЭто может быть из-за:\n- пользователя Docker, отличного от пользователя, настроенного в приложении\n- переменной окружения DOCKER_HOST, которая не была правильно считана. Вы можете выполнить `echo \$DOCKER_HOST` в терминале, чтобы увидеть ее значение.';
|
||||
|
||||
@override
|
||||
String dockerImagesFmt(Object count) {
|
||||
return 'Всего $count образов';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerNotInstalled => 'Docker не установлен';
|
||||
|
||||
@override
|
||||
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
|
||||
return '$runningCount запущено, $stoppedCount остановлено';
|
||||
}
|
||||
|
||||
@override
|
||||
String dockerStatusRunningFmt(Object count) {
|
||||
return '$count контейнеров запущено';
|
||||
}
|
||||
|
||||
@override
|
||||
String get doubleColumnMode => 'Режим двойной колонки';
|
||||
|
||||
@override
|
||||
String get doubleColumnTip => 'Эта опция лишь включает функцию; фактическое применение зависит от ширины устройства';
|
||||
|
||||
@override
|
||||
String get editVirtKeys => 'Редактировать виртуальные клавиши';
|
||||
|
||||
@override
|
||||
String get editor => 'Редактор';
|
||||
|
||||
@override
|
||||
String get editorHighlightTip => 'Текущая производительность подсветки кода неудовлетворительна, можно отключить для улучшения.';
|
||||
|
||||
@override
|
||||
String get encode => 'Кодировать';
|
||||
|
||||
@override
|
||||
String get envVars => 'Переменная окружения';
|
||||
|
||||
@override
|
||||
String get experimentalFeature => 'Экспериментальная функция';
|
||||
|
||||
@override
|
||||
String get extraArgs => 'Дополнительные аргументы';
|
||||
|
||||
@override
|
||||
String get fallbackSshDest => 'Резервное место назначения SSH';
|
||||
|
||||
@override
|
||||
String get fdroidReleaseTip => 'Если вы скачали это приложение с F-Droid, рекомендуется отключить эту опцию.';
|
||||
|
||||
@override
|
||||
String get fgService => 'Сервис переднего плана';
|
||||
|
||||
@override
|
||||
String get fgServiceTip => 'После включения некоторые модели устройств могут вылетать. Отключение может привести к тому, что некоторые модели не смогут поддерживать SSH-соединения в фоновом режиме. Пожалуйста, разрешите ServerBox права на уведомления, фоновую работу и самопробуждение в системных настройках.';
|
||||
|
||||
@override
|
||||
String fileTooLarge(Object file, Object size, Object sizeMax) {
|
||||
return 'Файл \'$file\' слишком большой \'$size\', превышает $sizeMax';
|
||||
}
|
||||
|
||||
@override
|
||||
String get followSystem => 'Следовать за системой';
|
||||
|
||||
@override
|
||||
String get font => 'Шрифт';
|
||||
|
||||
@override
|
||||
String get fontSize => 'Размер шрифта';
|
||||
|
||||
@override
|
||||
String get force => 'Принудительно';
|
||||
|
||||
@override
|
||||
String get fullScreen => 'Полноэкранный режим';
|
||||
|
||||
@override
|
||||
String get fullScreenJitter => 'Вибрация в полноэкранном режиме';
|
||||
|
||||
@override
|
||||
String get fullScreenJitterHelp => 'Предотвращение выгорания экрана';
|
||||
|
||||
@override
|
||||
String get fullScreenTip => 'Следует ли включить полноэкранный режим, когда устройство поворачивается в альбомный режим? Эта опция применяется только к вкладке сервера.';
|
||||
|
||||
@override
|
||||
String get goBackQ => 'Вернуться?';
|
||||
|
||||
@override
|
||||
String get goto => 'Перейти к';
|
||||
|
||||
@override
|
||||
String get hideTitleBar => 'Скрыть заголовок';
|
||||
|
||||
@override
|
||||
String get highlight => 'Подсветка кода';
|
||||
|
||||
@override
|
||||
String get homeWidgetUrlConfig => 'Конфигурация URL виджета домашнего экрана';
|
||||
|
||||
@override
|
||||
String get host => 'Хост';
|
||||
|
||||
@override
|
||||
String httpFailedWithCode(Object code) {
|
||||
return 'ошибка запроса, код: $code';
|
||||
}
|
||||
|
||||
@override
|
||||
String get ignoreCert => 'Игнорировать сертификат';
|
||||
|
||||
@override
|
||||
String get image => 'Образ';
|
||||
|
||||
@override
|
||||
String get imagesList => 'Список образов';
|
||||
|
||||
@override
|
||||
String get init => 'Инициализировать';
|
||||
|
||||
@override
|
||||
String get inner => 'Встроенный';
|
||||
|
||||
@override
|
||||
String get install => 'установить';
|
||||
|
||||
@override
|
||||
String get installDockerWithUrl => 'Пожалуйста, сначала установите Docker по адресу https://docs.docker.com/engine/install';
|
||||
|
||||
@override
|
||||
String get invalid => 'Недействительный';
|
||||
|
||||
@override
|
||||
String get jumpServer => 'прыжковый сервер';
|
||||
|
||||
@override
|
||||
String get keepForeground => 'Пожалуйста, держите приложение в фокусе!';
|
||||
|
||||
@override
|
||||
String get keepStatusWhenErr => 'Сохранять статус сервера при ошибке';
|
||||
|
||||
@override
|
||||
String get keepStatusWhenErrTip => 'Применимо только в случае ошибки выполнения скрипта';
|
||||
|
||||
@override
|
||||
String get keyAuth => 'Аутентификация по ключу';
|
||||
|
||||
@override
|
||||
String get letterCache => 'Кэширование букв';
|
||||
|
||||
@override
|
||||
String get letterCacheTip => 'Рекомендуется отключить, но после отключения будет невозможно вводить символы CJK.';
|
||||
|
||||
@override
|
||||
String get license => 'Лицензия';
|
||||
|
||||
@override
|
||||
String get location => 'Местоположение';
|
||||
|
||||
@override
|
||||
String get loss => 'Потери пакетов';
|
||||
|
||||
@override
|
||||
String madeWithLove(Object myGithub) {
|
||||
return 'Создано с ❤️ by $myGithub';
|
||||
}
|
||||
|
||||
@override
|
||||
String get manual => 'Вручную';
|
||||
|
||||
@override
|
||||
String get max => 'максимум';
|
||||
|
||||
@override
|
||||
String get maxRetryCount => 'Максимальное количество попыток переподключения к серверу';
|
||||
|
||||
@override
|
||||
String get maxRetryCountEqual0 => 'Будет бесконечно пытаться переподключиться';
|
||||
|
||||
@override
|
||||
String get min => 'минимум';
|
||||
|
||||
@override
|
||||
String get mission => 'Задача';
|
||||
|
||||
@override
|
||||
String get more => 'Больше';
|
||||
|
||||
@override
|
||||
String get moveOutServerFuncBtnsHelp => 'Включено: кнопки функций сервера отображаются под каждой карточкой на вкладке сервера. Выключено: отображается в верхней части страницы деталей сервера.';
|
||||
|
||||
@override
|
||||
String get ms => 'мс';
|
||||
|
||||
@override
|
||||
String get needHomeDir => 'Если вы пользователь Synology, [смотрите здесь](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Пользователям других систем нужно искать, как создать домашний каталог.';
|
||||
|
||||
@override
|
||||
String get needRestart => 'Требуется перезапуск приложения';
|
||||
|
||||
@override
|
||||
String get net => 'Сеть';
|
||||
|
||||
@override
|
||||
String get netViewType => 'Тип визуализации сети';
|
||||
|
||||
@override
|
||||
String get newContainer => 'Создать контейнер';
|
||||
|
||||
@override
|
||||
String get noLineChart => 'Не использовать линейные графики';
|
||||
|
||||
@override
|
||||
String get noLineChartForCpu => 'Не используйте линейные графики для ЦП';
|
||||
|
||||
@override
|
||||
String get noPrivateKeyTip => 'Приватный ключ не существует, возможно, он был удален или есть ошибка в настройках.';
|
||||
|
||||
@override
|
||||
String get noPromptAgain => 'Больше не спрашивать';
|
||||
|
||||
@override
|
||||
String get node => 'Узел';
|
||||
|
||||
@override
|
||||
String get notAvailable => 'Недоступно';
|
||||
|
||||
@override
|
||||
String get onServerDetailPage => 'На странице деталей сервера';
|
||||
|
||||
@override
|
||||
String get onlyOneLine => 'Отображать только в одной строке (прокручивается)';
|
||||
|
||||
@override
|
||||
String get onlyWhenCoreBiggerThan8 => 'Действует только при количестве ядер больше 8';
|
||||
|
||||
@override
|
||||
String get openLastPath => 'Открыть последний путь';
|
||||
|
||||
@override
|
||||
String get openLastPathTip => 'Для разных серверов будут сохранены разные записи, записывается путь при выходе';
|
||||
|
||||
@override
|
||||
String get parseContainerStatsTip => 'Анализ статуса использования Docker может быть медленным';
|
||||
|
||||
@override
|
||||
String percentOfSize(Object percent, Object size) {
|
||||
return '$percent% от $size';
|
||||
}
|
||||
|
||||
@override
|
||||
String get permission => 'Разрешения';
|
||||
|
||||
@override
|
||||
String get pingAvg => 'В среднем:';
|
||||
|
||||
@override
|
||||
String get pingInputIP => 'Пожалуйста, введите целевой IP или домен';
|
||||
|
||||
@override
|
||||
String get pingNoServer => 'Нет доступных серверов для Ping\nПожалуйста, добавьте их на вкладке «Сервер» и попробуйте снова';
|
||||
|
||||
@override
|
||||
String get pkg => 'Менеджер пакетов';
|
||||
|
||||
@override
|
||||
String get plugInType => 'Тип вставки';
|
||||
|
||||
@override
|
||||
String get port => 'Порт';
|
||||
|
||||
@override
|
||||
String get preview => 'Предпросмотр';
|
||||
|
||||
@override
|
||||
String get privateKey => 'Приватный ключ';
|
||||
|
||||
@override
|
||||
String get process => 'Процесс';
|
||||
|
||||
@override
|
||||
String get pushToken => 'Токен уведомлений';
|
||||
|
||||
@override
|
||||
String get pveIgnoreCertTip => 'Не рекомендуется включать, обратите внимание на риски безопасности! Если вы используете стандартный сертификат от PVE, вам нужно включить эту опцию.';
|
||||
|
||||
@override
|
||||
String get pveLoginFailed => 'Ошибка входа. Невозможно аутентифицироваться с помощью имени пользователя/пароля из конфигурации сервера для входа в Linux PAM.';
|
||||
|
||||
@override
|
||||
String get pveVersionLow => 'Эта функция в настоящее время находится на стадии тестирования и была протестирована только на PVE 8+. Используйте ее с осторожностью.';
|
||||
|
||||
@override
|
||||
String get pwd => 'Пароль';
|
||||
|
||||
@override
|
||||
String get read => 'Чтение';
|
||||
|
||||
@override
|
||||
String get reboot => 'Перезагрузка';
|
||||
|
||||
@override
|
||||
String get rememberPwdInMem => 'Запомнить пароль в памяти';
|
||||
|
||||
@override
|
||||
String get rememberPwdInMemTip => 'Используется для контейнеров, приостановки и т. д.';
|
||||
|
||||
@override
|
||||
String get rememberWindowSize => 'Запомнить размер окна';
|
||||
|
||||
@override
|
||||
String get remotePath => 'Удаленный путь';
|
||||
|
||||
@override
|
||||
String get restart => 'Перезапустить';
|
||||
|
||||
@override
|
||||
String get result => 'Результат';
|
||||
|
||||
@override
|
||||
String get rotateAngel => 'Угол поворота';
|
||||
|
||||
@override
|
||||
String get route => 'Маршрутизация';
|
||||
|
||||
@override
|
||||
String get run => 'Запустить';
|
||||
|
||||
@override
|
||||
String get running => 'Запущено';
|
||||
|
||||
@override
|
||||
String get sameIdServerExist => 'Сервер с таким ID уже существует';
|
||||
|
||||
@override
|
||||
String get save => 'Сохранить';
|
||||
|
||||
@override
|
||||
String get saved => 'Сохранено';
|
||||
|
||||
@override
|
||||
String get second => 'с';
|
||||
|
||||
@override
|
||||
String get sensors => 'Датчики';
|
||||
|
||||
@override
|
||||
String get sequence => 'Последовательность';
|
||||
|
||||
@override
|
||||
String get server => 'Сервер';
|
||||
|
||||
@override
|
||||
String get serverDetailOrder => 'Порядок элементов на странице деталей сервера';
|
||||
|
||||
@override
|
||||
String get serverFuncBtns => 'Кнопки функций сервера';
|
||||
|
||||
@override
|
||||
String get serverOrder => 'Порядок серверов';
|
||||
|
||||
@override
|
||||
String get sftpDlPrepare => 'Подготовка подключения...';
|
||||
|
||||
@override
|
||||
String get sftpEditorTip => 'Если пусто, используйте встроенный редактор файлов приложения. Если значение указано, используйте редактор удаленного сервера, например, `vim` (рекомендуется автоматически определять согласно `EDITOR`).';
|
||||
|
||||
@override
|
||||
String get sftpRmrDirSummary => 'Использовать `rm -r` в SFTP для удаления папок';
|
||||
|
||||
@override
|
||||
String get sftpSSHConnected => 'SFTP подключен...';
|
||||
|
||||
@override
|
||||
String get sftpShowFoldersFirst => 'Показывать папки в начале';
|
||||
|
||||
@override
|
||||
String get showDistLogo => 'Показать лого дистрибутива';
|
||||
|
||||
@override
|
||||
String get shutdown => 'Выключение';
|
||||
|
||||
@override
|
||||
String get size => 'Размер';
|
||||
|
||||
@override
|
||||
String get snippet => 'Фрагмент';
|
||||
|
||||
@override
|
||||
String get softWrap => 'Мягкий перенос';
|
||||
|
||||
@override
|
||||
String get specifyDev => 'Указать устройство';
|
||||
|
||||
@override
|
||||
String get specifyDevTip => 'Например, статистика сетевого трафика по умолчанию относится ко всем устройствам. Здесь вы можете указать конкретное устройство.';
|
||||
|
||||
@override
|
||||
String get speed => 'Скорость';
|
||||
|
||||
@override
|
||||
String spentTime(Object time) {
|
||||
return 'Затрачено времени: $time';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshTermHelp => 'Когда терминал можно прокручивать, горизонтальное перетаскивание позволяет выделить текст. Нажатие на кнопку клавиатуры включает/выключает клавиатуру. Иконка файла открывает текущий путь SFTP. Кнопка буфера обмена копирует содержимое, когда текст выделен, и вставляет содержимое из буфера обмена в терминал, когда текст не выделен, а в буфере есть содержимое. Иконка кода вставляет фрагменты кода в терминал и выполняет их.';
|
||||
|
||||
@override
|
||||
String sshTip(Object url) {
|
||||
return 'Эта функция находится в стадии тестирования.\n\nПожалуйста, отправляйте отчеты о проблемах на $url или присоединяйтесь к нашей разработке.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshVirtualKeyAutoOff => 'Автоматическое переключение виртуальных клавиш';
|
||||
|
||||
@override
|
||||
String get start => 'Старт';
|
||||
|
||||
@override
|
||||
String get stat => 'Статистика';
|
||||
|
||||
@override
|
||||
String get stats => 'Статистика';
|
||||
|
||||
@override
|
||||
String get stop => 'Остановить';
|
||||
|
||||
@override
|
||||
String get stopped => 'Остановлено';
|
||||
|
||||
@override
|
||||
String get storage => 'Хранение';
|
||||
|
||||
@override
|
||||
String get supportFmtArgs => 'Поддерживаются следующие форматы аргументов:';
|
||||
|
||||
@override
|
||||
String get suspend => 'Приостановить';
|
||||
|
||||
@override
|
||||
String get suspendTip => 'Функция приостановки требует прав root и поддержки systemd.';
|
||||
|
||||
@override
|
||||
String switchTo(Object val) {
|
||||
return 'Переключиться на $val';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sync => 'Синхронизировать';
|
||||
|
||||
@override
|
||||
String get syncTip => 'Возможно, потребуется перезагрузка, чтобы некоторые изменения вступили в силу.';
|
||||
|
||||
@override
|
||||
String get system => 'Система';
|
||||
|
||||
@override
|
||||
String get tag => 'Теги';
|
||||
|
||||
@override
|
||||
String get temperature => 'Температура';
|
||||
|
||||
@override
|
||||
String get termFontSizeTip => 'Эта настройка повлияет на размер терминала (ширина и высота). Вы можете масштабировать страницу терминала, чтобы调整 размер шрифта текущей сессии.';
|
||||
|
||||
@override
|
||||
String get terminal => 'Терминал';
|
||||
|
||||
@override
|
||||
String get test => 'Тест';
|
||||
|
||||
@override
|
||||
String get textScaler => 'Масштабирование текста';
|
||||
|
||||
@override
|
||||
String get textScalerTip => '1.0 => 100% (исходный размер), применяется только к части шрифтов на странице сервера, изменение не рекомендуется.';
|
||||
|
||||
@override
|
||||
String get theme => 'Тема';
|
||||
|
||||
@override
|
||||
String get time => 'Время';
|
||||
|
||||
@override
|
||||
String get times => 'Раз';
|
||||
|
||||
@override
|
||||
String get total => 'Всего';
|
||||
|
||||
@override
|
||||
String get traffic => 'Трафик';
|
||||
|
||||
@override
|
||||
String get trySudo => 'Попробовать использовать sudo';
|
||||
|
||||
@override
|
||||
String get ttl => 'TTL';
|
||||
|
||||
@override
|
||||
String get unknown => 'Неизвестно';
|
||||
|
||||
@override
|
||||
String get unkownConvertMode => 'Неизвестный режим конвертации';
|
||||
|
||||
@override
|
||||
String get update => 'Обновление';
|
||||
|
||||
@override
|
||||
String get updateIntervalEqual0 => 'Если установлено 0, статус сервера не будет автоматически обновляться.\nТакже не будет рассчитано использование ЦП.';
|
||||
|
||||
@override
|
||||
String get updateServerStatusInterval => 'Интервал обновления статуса сервера';
|
||||
|
||||
@override
|
||||
String get upload => 'Загрузить';
|
||||
|
||||
@override
|
||||
String get upsideDown => 'Перевернуть';
|
||||
|
||||
@override
|
||||
String get uptime => 'Время работы';
|
||||
|
||||
@override
|
||||
String get useCdn => 'Использование CDN';
|
||||
|
||||
@override
|
||||
String get useCdnTip => 'Не китайским пользователям рекомендуется использовать CDN. Хотели бы вы его использовать?';
|
||||
|
||||
@override
|
||||
String get useNoPwd => 'Будет использоваться без пароля';
|
||||
|
||||
@override
|
||||
String get usePodmanByDefault => 'Использовать Podman по умолчанию';
|
||||
|
||||
@override
|
||||
String get used => 'Использовано';
|
||||
|
||||
@override
|
||||
String get view => 'Вид';
|
||||
|
||||
@override
|
||||
String get viewErr => 'Просмотр ошибок';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpClipboard => 'Если в терминале выделен текст, то он копируется в буфер обмена, в противном случае содержимое буфера вставляется в терминал.';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpIME => 'Включить/выключить клавиатуру';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpSFTP => 'Открыть текущий путь в SFTP.';
|
||||
|
||||
@override
|
||||
String get waitConnection => 'Пожалуйста, дождитесь установки соединения';
|
||||
|
||||
@override
|
||||
String get wakeLock => 'Держать включенным';
|
||||
|
||||
@override
|
||||
String get watchNotPaired => 'Apple Watch не сопряжены';
|
||||
|
||||
@override
|
||||
String get webdavSettingEmpty => 'Настройки Webdav пусты';
|
||||
|
||||
@override
|
||||
String get whenOpenApp => 'При открытии приложения';
|
||||
|
||||
@override
|
||||
String get wolTip => 'После настройки WOL (Wake-on-LAN) при каждом подключении к серверу отправляется запрос WOL.';
|
||||
|
||||
@override
|
||||
String get write => 'Запись';
|
||||
|
||||
@override
|
||||
String get writeScriptFailTip => 'Запись скрипта не удалась, возможно, из-за отсутствия прав или потому что, директории не существует.';
|
||||
|
||||
@override
|
||||
String get writeScriptTip => 'После подключения к серверу скрипт будет записан в ~/.config/server_box для мониторинга состояния системы. Вы можете проверить содержимое скрипта.';
|
||||
}
|
||||
708
lib/generated/l10n/l10n_tr.dart
Normal file
708
lib/generated/l10n/l10n_tr.dart
Normal file
@@ -0,0 +1,708 @@
|
||||
import 'l10n.dart';
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
/// The translations for Turkish (`tr`).
|
||||
class AppLocalizationsTr extends AppLocalizations {
|
||||
AppLocalizationsTr([String locale = 'tr']) : super(locale);
|
||||
|
||||
@override
|
||||
String get aboutThanks => 'Katılım gösteren aşağıdaki kişilere teşekkür ederiz.';
|
||||
|
||||
@override
|
||||
String get acceptBeta => 'Beta sürüm güncellemelerini kabul et';
|
||||
|
||||
@override
|
||||
String get addSystemPrivateKeyTip => 'Şu anda özel anahtar yok, sistemle geleni (~/.ssh/id_rsa) eklemek ister misiniz?';
|
||||
|
||||
@override
|
||||
String get added2List => 'Görev listesine eklendi';
|
||||
|
||||
@override
|
||||
String get addr => 'Adres';
|
||||
|
||||
@override
|
||||
String get alreadyLastDir => 'Zaten son klasörde.';
|
||||
|
||||
@override
|
||||
String get authFailTip => 'Kimlik doğrulama başarısız, kimlik bilgilerinin doğru olup olmadığını kontrol edin';
|
||||
|
||||
@override
|
||||
String get autoBackupConflict => 'Aynı anda yalnızca bir otomatik yedekleme etkinleştirilebilir.';
|
||||
|
||||
@override
|
||||
String get autoConnect => 'Otomatik bağlan';
|
||||
|
||||
@override
|
||||
String get autoRun => 'Otomatik çalıştır';
|
||||
|
||||
@override
|
||||
String get autoUpdateHomeWidget => 'Ana widget\'ı otomatik güncelle';
|
||||
|
||||
@override
|
||||
String get backupTip => 'Dışa aktarılan veriler zayıf bir şekilde şifrelenmiştir. \nLütfen güvenli bir yerde saklayın.';
|
||||
|
||||
@override
|
||||
String get backupVersionNotMatch => 'Yedekleme sürümü uyumlu değil.';
|
||||
|
||||
@override
|
||||
String get battery => 'Pil';
|
||||
|
||||
@override
|
||||
String get bgRun => 'Arka planda çalıştır';
|
||||
|
||||
@override
|
||||
String get bgRunTip => 'Bu anahtar yalnızca programın arka planda çalışmayı deneyeceğini ifade eder. Arka planda çalışıp çalışamayacağı, iznin etkinleştirilip etkinleştirilmediğine bağlıdır. AOSP tabanlı Android ROM\'larda, bu uygulamada \"Pil Optimizasyonunu\" devre dışı bırakın. MIUI / HyperOS için, güç tasarrufu politikasını \"Sınırsız\" olarak değiştirin.';
|
||||
|
||||
@override
|
||||
String get closeAfterSave => 'Kaydet ve kapat';
|
||||
|
||||
@override
|
||||
String get cmd => 'Komut';
|
||||
|
||||
@override
|
||||
String get collapseUITip => 'UI\'daki uzun listeleri varsayılan olarak gizleyip gizlememeyi belirler';
|
||||
|
||||
@override
|
||||
String get conn => 'Bağlantı';
|
||||
|
||||
@override
|
||||
String get container => 'Konteyner';
|
||||
|
||||
@override
|
||||
String get containerTrySudoTip => 'Örneğin: Uygulamada kullanıcı aaa olarak ayarlanmış, ancak Docker root kullanıcısı altında kurulmuş. Bu durumda, bu seçeneği etkinleştirmeniz gerekir.';
|
||||
|
||||
@override
|
||||
String get convert => 'Dönüştür';
|
||||
|
||||
@override
|
||||
String get copyPath => 'Yolu kopyala';
|
||||
|
||||
@override
|
||||
String get cpuViewAsProgressTip => 'Her CPU\'nun kullanımını bir ilerleme çubuğu tarzında görüntüle (eski tarz)';
|
||||
|
||||
@override
|
||||
String get cursorType => 'İmleç türü';
|
||||
|
||||
@override
|
||||
String get customCmd => 'Özel komutlar';
|
||||
|
||||
@override
|
||||
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
|
||||
|
||||
@override
|
||||
String get customCmdHint => '\"Komut Adı\": \"Komut\"';
|
||||
|
||||
@override
|
||||
String get decode => 'Çöz';
|
||||
|
||||
@override
|
||||
String get decompress => 'Sıkıştırmayı aç';
|
||||
|
||||
@override
|
||||
String get deleteServers => 'Toplu sunucu silme';
|
||||
|
||||
@override
|
||||
String get dirEmpty => 'Klasörün boş olduğundan emin olun.';
|
||||
|
||||
@override
|
||||
String get disconnected => 'Bağlantı kesildi';
|
||||
|
||||
@override
|
||||
String get disk => 'Disk';
|
||||
|
||||
@override
|
||||
String get diskIgnorePath => 'Disk için göz ardı edilen yol';
|
||||
|
||||
@override
|
||||
String get displayCpuIndex => 'CPU dizinini görüntüle';
|
||||
|
||||
@override
|
||||
String dl2Local(Object fileName) {
|
||||
return '$fileName dosyasını yerel olarak indirmek istiyor musunuz?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerEmptyRunningItems => 'Çalışan konteyner yok.\nBu şu sebeplerden kaynaklanabilir:\n- Docker kurulumu kullanıcı adı, uygulamada yapılandırılan kullanıcı adıyla aynı değil.\n- DOCKER_HOST ortam değişkeni doğru okunmadı. Terminalde `echo \$DOCKER_HOST` komutunu çalıştırarak elde edebilirsiniz.';
|
||||
|
||||
@override
|
||||
String dockerImagesFmt(Object count) {
|
||||
return '$count görüntü';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerNotInstalled => 'Docker kurulu değil';
|
||||
|
||||
@override
|
||||
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
|
||||
return '$runningCount çalışıyor, $stoppedCount konteyner durduruldu.';
|
||||
}
|
||||
|
||||
@override
|
||||
String dockerStatusRunningFmt(Object count) {
|
||||
return '$count konteyner çalışıyor.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get doubleColumnMode => 'Çift sütun modu';
|
||||
|
||||
@override
|
||||
String get doubleColumnTip => 'Bu seçenek yalnızca özelliği etkinleştirir, gerçekten etkinleştirilebilir olup olmadığını cihazın genişliği belirler';
|
||||
|
||||
@override
|
||||
String get editVirtKeys => 'Sanal tuşları düzenle';
|
||||
|
||||
@override
|
||||
String get editor => 'Editör';
|
||||
|
||||
@override
|
||||
String get editorHighlightTip => 'Mevcut kod vurgulama performansı ideal değil ve isteğe bağlı olarak kapatılabilir.';
|
||||
|
||||
@override
|
||||
String get encode => 'Kodla';
|
||||
|
||||
@override
|
||||
String get envVars => 'Ortam değişkeni';
|
||||
|
||||
@override
|
||||
String get experimentalFeature => 'Deneysel özellik';
|
||||
|
||||
@override
|
||||
String get extraArgs => 'Ek argümanlar';
|
||||
|
||||
@override
|
||||
String get fallbackSshDest => 'Yedek SSH hedefi';
|
||||
|
||||
@override
|
||||
String get fdroidReleaseTip => 'Bu uygulamayı F-Droid\'den indirdiyseniz, bu seçeneği kapatmanız önerilir.';
|
||||
|
||||
@override
|
||||
String get fgService => 'Ön plan hizmeti';
|
||||
|
||||
@override
|
||||
String get fgServiceTip => 'Etkinleştirdikten sonra, bazı cihaz modellerinde çökme olabilir. Devre dışı bırakmak, bazı modellerin SSH bağlantılarını arka planda sürdürememesine neden olabilir. Lütfen sistem ayarlarında ServerBox bildirim izinlerine, arka planda çalışmaya ve kendiliğinden uyanmaya izin verin.';
|
||||
|
||||
@override
|
||||
String fileTooLarge(Object file, Object size, Object sizeMax) {
|
||||
return '\'$file\' dosyası çok büyük $size, maksimum $sizeMax';
|
||||
}
|
||||
|
||||
@override
|
||||
String get followSystem => 'Sistemi takip et';
|
||||
|
||||
@override
|
||||
String get font => 'Yazı tipi';
|
||||
|
||||
@override
|
||||
String get fontSize => 'Yazı tipi boyutu';
|
||||
|
||||
@override
|
||||
String get force => 'Zorla';
|
||||
|
||||
@override
|
||||
String get fullScreen => 'Tam ekran modu';
|
||||
|
||||
@override
|
||||
String get fullScreenJitter => 'Tam ekran titremesi';
|
||||
|
||||
@override
|
||||
String get fullScreenJitterHelp => 'Ekran yanıklarını önlemek için';
|
||||
|
||||
@override
|
||||
String get fullScreenTip => 'Cihaz yatay moda döndürüldüğünde tam ekran modu etkinleştirilsin mi? Bu seçenek yalnızca sunucu sekmesi için geçerlidir.';
|
||||
|
||||
@override
|
||||
String get goBackQ => 'Geri dön?';
|
||||
|
||||
@override
|
||||
String get goto => 'Git';
|
||||
|
||||
@override
|
||||
String get hideTitleBar => 'Başlık çubuğunu gizle';
|
||||
|
||||
@override
|
||||
String get highlight => 'Kod vurgulama';
|
||||
|
||||
@override
|
||||
String get homeWidgetUrlConfig => 'Ana sayfa widget URL\'sini yapılandır';
|
||||
|
||||
@override
|
||||
String get host => 'Sunucu';
|
||||
|
||||
@override
|
||||
String httpFailedWithCode(Object code) {
|
||||
return 'İstek başarısız oldu, durum kodu: $code';
|
||||
}
|
||||
|
||||
@override
|
||||
String get ignoreCert => 'Sertifikayı yoksay';
|
||||
|
||||
@override
|
||||
String get image => 'Resim';
|
||||
|
||||
@override
|
||||
String get imagesList => 'Resim listesi';
|
||||
|
||||
@override
|
||||
String get init => 'Başlat';
|
||||
|
||||
@override
|
||||
String get inner => 'İç';
|
||||
|
||||
@override
|
||||
String get install => 'Kur';
|
||||
|
||||
@override
|
||||
String get installDockerWithUrl => 'Lütfen önce Docker\'ı https://docs.docker.com/engine/install adresinden kurun.';
|
||||
|
||||
@override
|
||||
String get invalid => 'Geçersiz';
|
||||
|
||||
@override
|
||||
String get jumpServer => 'Atlama sunucusu';
|
||||
|
||||
@override
|
||||
String get keepForeground => 'Uygulama ön planda kalsın!';
|
||||
|
||||
@override
|
||||
String get keepStatusWhenErr => 'Son sunucu durumunu koru';
|
||||
|
||||
@override
|
||||
String get keepStatusWhenErrTip => 'Yalnızca betik yürütme sırasında bir hata oluştuğunda';
|
||||
|
||||
@override
|
||||
String get keyAuth => 'Anahtar Doğrulama';
|
||||
|
||||
@override
|
||||
String get letterCache => 'Harf önbelleği';
|
||||
|
||||
@override
|
||||
String get letterCacheTip => 'Devre dışı bırakılması önerilir, ancak devre dışı bırakıldıktan sonra CJK karakterleri girilemez.';
|
||||
|
||||
@override
|
||||
String get license => 'Lisans';
|
||||
|
||||
@override
|
||||
String get location => 'Konum';
|
||||
|
||||
@override
|
||||
String get loss => 'kayıp';
|
||||
|
||||
@override
|
||||
String madeWithLove(Object myGithub) {
|
||||
return '$myGithub tarafından ❤️ ile yapıldı';
|
||||
}
|
||||
|
||||
@override
|
||||
String get manual => 'Kılavuz';
|
||||
|
||||
@override
|
||||
String get max => 'maks';
|
||||
|
||||
@override
|
||||
String get maxRetryCount => 'Sunucu yeniden bağlanma sayısı';
|
||||
|
||||
@override
|
||||
String get maxRetryCountEqual0 => 'Sürekli olarak tekrar denenecek.';
|
||||
|
||||
@override
|
||||
String get min => 'min';
|
||||
|
||||
@override
|
||||
String get mission => 'Görev';
|
||||
|
||||
@override
|
||||
String get more => 'Daha fazla';
|
||||
|
||||
@override
|
||||
String get moveOutServerFuncBtnsHelp => 'Açık: Sunucu sekmesi sayfasındaki her kartın altında görüntülenebilir. Kapalı: Sunucu Detayları sayfasının üst kısmında görüntülenebilir.';
|
||||
|
||||
@override
|
||||
String get ms => 'ms';
|
||||
|
||||
@override
|
||||
String get needHomeDir => 'Synology kullanıcısıysanız, [buraya bakın](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Diğer sistem kullanıcılarının bir ana dizin oluşturmayı öğrenmeleri gerekir.';
|
||||
|
||||
@override
|
||||
String get needRestart => 'Uygulamanın yeniden başlatılması gerekiyor';
|
||||
|
||||
@override
|
||||
String get net => 'Ağ';
|
||||
|
||||
@override
|
||||
String get netViewType => 'Ağ görünümü türü';
|
||||
|
||||
@override
|
||||
String get newContainer => 'Yeni konteyner';
|
||||
|
||||
@override
|
||||
String get noLineChart => 'Çizgi grafik kullanma';
|
||||
|
||||
@override
|
||||
String get noLineChartForCpu => 'CPU için çizgi grafik kullanma';
|
||||
|
||||
@override
|
||||
String get noPrivateKeyTip => 'Özel anahtar mevcut değil, silinmiş olabilir veya bir yapılandırma hatası vardır.';
|
||||
|
||||
@override
|
||||
String get noPromptAgain => 'Tekrar hatırlatma';
|
||||
|
||||
@override
|
||||
String get node => 'Düğüm';
|
||||
|
||||
@override
|
||||
String get notAvailable => 'Kullanılamaz';
|
||||
|
||||
@override
|
||||
String get onServerDetailPage => 'Sunucu detay sayfasında';
|
||||
|
||||
@override
|
||||
String get onlyOneLine => 'Yalnızca bir satır olarak göster (kaydırılabilir)';
|
||||
|
||||
@override
|
||||
String get onlyWhenCoreBiggerThan8 => 'Yalnızca çekirdek sayısı 8\'den fazla olduğunda çalışır';
|
||||
|
||||
@override
|
||||
String get openLastPath => 'Son yolu aç';
|
||||
|
||||
@override
|
||||
String get openLastPathTip => 'Farklı sunucuların farklı günlükleri olacaktır ve çıkış yolu log dosyasıdır';
|
||||
|
||||
@override
|
||||
String get parseContainerStatsTip => 'Docker\'ın işgal durumunu analiz etmek nispeten yavaştır.';
|
||||
|
||||
@override
|
||||
String percentOfSize(Object percent, Object size) {
|
||||
return '$size\'nin %$percent\'i';
|
||||
}
|
||||
|
||||
@override
|
||||
String get permission => 'İzinler';
|
||||
|
||||
@override
|
||||
String get pingAvg => 'Ortalama:';
|
||||
|
||||
@override
|
||||
String get pingInputIP => 'Lütfen bir hedef IP / etki alanı girin.';
|
||||
|
||||
@override
|
||||
String get pingNoServer => 'Ping yapılacak sunucu yok.\nLütfen sunucu sekmesine bir sunucu ekleyin.';
|
||||
|
||||
@override
|
||||
String get pkg => 'Paket';
|
||||
|
||||
@override
|
||||
String get plugInType => 'Takma Türü';
|
||||
|
||||
@override
|
||||
String get port => 'Port';
|
||||
|
||||
@override
|
||||
String get preview => 'Önizleme';
|
||||
|
||||
@override
|
||||
String get privateKey => 'Özel Anahtar';
|
||||
|
||||
@override
|
||||
String get process => 'Süreç';
|
||||
|
||||
@override
|
||||
String get pushToken => 'Push token';
|
||||
|
||||
@override
|
||||
String get pveIgnoreCertTip => 'Etkinleştirilmesi önerilmez, güvenlik risklerine dikkat edin! PVE\'nin varsayılan sertifikasını kullanıyorsanız, bu seçeneği etkinleştirmeniz gerekir.';
|
||||
|
||||
@override
|
||||
String get pveLoginFailed => 'Giriş başarısız. Linux PAM girişi için sunucu yapılandırmasındaki kullanıcı adı/şifre ile kimlik doğrulaması yapılamadı.';
|
||||
|
||||
@override
|
||||
String get pveVersionLow => 'Bu özellik şu anda test aşamasında ve sadece PVE 8+ üzerinde test edilmiştir. Lütfen dikkatli kullanın.';
|
||||
|
||||
@override
|
||||
String get pwd => 'Şifre';
|
||||
|
||||
@override
|
||||
String get read => 'Oku';
|
||||
|
||||
@override
|
||||
String get reboot => 'Yeniden başlat';
|
||||
|
||||
@override
|
||||
String get rememberPwdInMem => 'Şifreyi bellekte sakla';
|
||||
|
||||
@override
|
||||
String get rememberPwdInMemTip => 'Konteynerler, askıya alma vb. için kullanılır.';
|
||||
|
||||
@override
|
||||
String get rememberWindowSize => 'Pencere boyutunu hatırla';
|
||||
|
||||
@override
|
||||
String get remotePath => 'Uzak yol';
|
||||
|
||||
@override
|
||||
String get restart => 'Yeniden başlat';
|
||||
|
||||
@override
|
||||
String get result => 'Sonuç';
|
||||
|
||||
@override
|
||||
String get rotateAngel => 'Dönme açısı';
|
||||
|
||||
@override
|
||||
String get route => 'Yönlendirme';
|
||||
|
||||
@override
|
||||
String get run => 'Çalıştır';
|
||||
|
||||
@override
|
||||
String get running => 'Çalışıyor';
|
||||
|
||||
@override
|
||||
String get sameIdServerExist => 'Aynı kimliğe sahip bir sunucu zaten var';
|
||||
|
||||
@override
|
||||
String get save => 'Kaydet';
|
||||
|
||||
@override
|
||||
String get saved => 'Kaydedildi';
|
||||
|
||||
@override
|
||||
String get second => 's';
|
||||
|
||||
@override
|
||||
String get sensors => 'Sensör';
|
||||
|
||||
@override
|
||||
String get sequence => 'Dizi';
|
||||
|
||||
@override
|
||||
String get server => 'Sunucu';
|
||||
|
||||
@override
|
||||
String get serverDetailOrder => 'Ayrıntı sayfası widget sırası';
|
||||
|
||||
@override
|
||||
String get serverFuncBtns => 'Sunucu işlev düğmeleri';
|
||||
|
||||
@override
|
||||
String get serverOrder => 'Sunucu sırası';
|
||||
|
||||
@override
|
||||
String get sftpDlPrepare => 'Bağlantı hazırlığı yapılıyor...';
|
||||
|
||||
@override
|
||||
String get sftpEditorTip => 'Boşsa, uygulamanın yerleşik dosya düzenleyicisini kullanın. Bir değer varsa, uzak sunucunun düzenleyicisini kullanın, örneğin, `vim` (otomatik olarak `EDITOR`\'a göre algılamanız önerilir).';
|
||||
|
||||
@override
|
||||
String get sftpRmrDirSummary => 'SFTP\'de bir klasörü silmek için `rm -r` kullanın.';
|
||||
|
||||
@override
|
||||
String get sftpSSHConnected => 'SFTP Bağlantısı';
|
||||
|
||||
@override
|
||||
String get sftpShowFoldersFirst => 'Önce klasörleri göster';
|
||||
|
||||
@override
|
||||
String get showDistLogo => 'Dağıtım logosunu göster';
|
||||
|
||||
@override
|
||||
String get shutdown => 'Kapat';
|
||||
|
||||
@override
|
||||
String get size => 'Boyut';
|
||||
|
||||
@override
|
||||
String get snippet => 'Parça';
|
||||
|
||||
@override
|
||||
String get softWrap => 'Yumuşak kaydırma';
|
||||
|
||||
@override
|
||||
String get specifyDev => 'Cihazı belirle';
|
||||
|
||||
@override
|
||||
String get specifyDevTip => 'Örneğin, ağ trafiği istatistikleri varsayılan olarak tüm cihazlar içindir. Burada belirli bir cihazı belirtebilirsiniz.';
|
||||
|
||||
@override
|
||||
String get speed => 'Hız';
|
||||
|
||||
@override
|
||||
String spentTime(Object time) {
|
||||
return 'Harcanan zaman: $time';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshTermHelp => 'Terminal kaydırılabilir olduğunda, yatay sürükleme metni seçebilir. Klavye düğmesine tıklamak klavyeyi açar/kapatır. Dosya simgesi mevcut yolu SFTP\'de açar. Pano düğmesi metin seçildiğinde içeriği kopyalar ve metin seçilmediğinde ve panoda içerik olduğunda panodaki içeriği terminale yapıştırır. Kod simgesi kod parçacıklarını terminale yapıştırır ve çalıştırır.';
|
||||
|
||||
@override
|
||||
String sshTip(Object url) {
|
||||
return 'Bu işlev şu anda deneme aşamasındadır.\n\nLütfen hataları $url adresine bildirin veya geliştirmemize katılın.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshVirtualKeyAutoOff => 'Sanal tuşların otomatik geçişi';
|
||||
|
||||
@override
|
||||
String get start => 'Başlat';
|
||||
|
||||
@override
|
||||
String get stat => 'İstatistik';
|
||||
|
||||
@override
|
||||
String get stats => 'İstatistikler';
|
||||
|
||||
@override
|
||||
String get stop => 'Durdur';
|
||||
|
||||
@override
|
||||
String get stopped => 'Durduruldu';
|
||||
|
||||
@override
|
||||
String get storage => 'Depolama';
|
||||
|
||||
@override
|
||||
String get supportFmtArgs => 'Aşağıdaki biçimlendirme parametreleri desteklenir:';
|
||||
|
||||
@override
|
||||
String get suspend => 'Askıya al';
|
||||
|
||||
@override
|
||||
String get suspendTip => 'Askıya alma işlevi kök izinleri ve systemd desteği gerektirir.';
|
||||
|
||||
@override
|
||||
String switchTo(Object val) {
|
||||
return '$val öğesine geç';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sync => 'Senkronize et';
|
||||
|
||||
@override
|
||||
String get syncTip => 'Bazı değişikliklerin etkili olması için yeniden başlatma gerekebilir.';
|
||||
|
||||
@override
|
||||
String get system => 'Sistem';
|
||||
|
||||
@override
|
||||
String get tag => 'Etiketler';
|
||||
|
||||
@override
|
||||
String get temperature => 'Sıcaklık';
|
||||
|
||||
@override
|
||||
String get termFontSizeTip => 'Bu ayar terminal boyutunu (genişlik ve yükseklik) etkileyecektir. Terminal sayfasında yakınlaştırarak mevcut oturumun yazı tipi boyutunu ayarlayabilirsiniz.';
|
||||
|
||||
@override
|
||||
String get terminal => 'Terminal';
|
||||
|
||||
@override
|
||||
String get test => 'Test';
|
||||
|
||||
@override
|
||||
String get textScaler => 'Metin ölçekleyici';
|
||||
|
||||
@override
|
||||
String get textScalerTip => '1.0 => %100 (orijinal boyut), yalnızca sunucu sayfası kısmındaki yazı tipine çalışır, değiştirilmesi önerilmez.';
|
||||
|
||||
@override
|
||||
String get theme => 'Tema';
|
||||
|
||||
@override
|
||||
String get time => 'Zaman';
|
||||
|
||||
@override
|
||||
String get times => 'Zamanlar';
|
||||
|
||||
@override
|
||||
String get total => 'Toplam';
|
||||
|
||||
@override
|
||||
String get traffic => 'Trafik';
|
||||
|
||||
@override
|
||||
String get trySudo => 'Sudo kullanmayı deneyin';
|
||||
|
||||
@override
|
||||
String get ttl => 'TTL';
|
||||
|
||||
@override
|
||||
String get unknown => 'Bilinmeyen';
|
||||
|
||||
@override
|
||||
String get unkownConvertMode => 'Bilinmeyen dönüştürme modu';
|
||||
|
||||
@override
|
||||
String get update => 'Güncelle';
|
||||
|
||||
@override
|
||||
String get updateIntervalEqual0 => '0 olarak ayarladınız, otomatik olarak güncellenmeyecek.\nCPU durumunu hesaplayamıyor.';
|
||||
|
||||
@override
|
||||
String get updateServerStatusInterval => 'Sunucu durumu güncelleme aralığı';
|
||||
|
||||
@override
|
||||
String get upload => 'Yükle';
|
||||
|
||||
@override
|
||||
String get upsideDown => 'Ters';
|
||||
|
||||
@override
|
||||
String get uptime => 'Çalışma süresi';
|
||||
|
||||
@override
|
||||
String get useCdn => 'CDN kullanılıyor';
|
||||
|
||||
@override
|
||||
String get useCdnTip => 'Çin dışındaki kullanıcıların CDN kullanması önerilir. Kullanmak ister misiniz?';
|
||||
|
||||
@override
|
||||
String get useNoPwd => 'Şifre kullanılmayacak';
|
||||
|
||||
@override
|
||||
String get usePodmanByDefault => 'Varsayılan olarak Podman kullan';
|
||||
|
||||
@override
|
||||
String get used => 'Kullanıldı';
|
||||
|
||||
@override
|
||||
String get view => 'Görünüm';
|
||||
|
||||
@override
|
||||
String get viewErr => 'Hataya bakın';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpClipboard => 'Seçilen terminal boş değilse panoya kopyalayın, aksi takdirde panodaki içeriği terminale yapıştırın.';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpIME => 'Klavye aç/kapat';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpSFTP => 'Geçerli dizini SFTP\'de açın.';
|
||||
|
||||
@override
|
||||
String get waitConnection => 'Lütfen bağlantının kurulmasını bekleyin.';
|
||||
|
||||
@override
|
||||
String get wakeLock => 'Uyanık tut';
|
||||
|
||||
@override
|
||||
String get watchNotPaired => 'Eşlenmiş Apple Watch yok';
|
||||
|
||||
@override
|
||||
String get webdavSettingEmpty => 'WebDav ayarı boş';
|
||||
|
||||
@override
|
||||
String get whenOpenApp => 'Uygulamayı açarken';
|
||||
|
||||
@override
|
||||
String get wolTip => 'WOL (Wake-on-LAN) yapılandırıldıktan sonra, her sunucuya bağlandığınızda bir WOL isteği gönderilir.';
|
||||
|
||||
@override
|
||||
String get write => 'Yaz';
|
||||
|
||||
@override
|
||||
String get writeScriptFailTip => 'Komut dosyasına yazma başarısız oldu, muhtemelen izin eksikliğinden veya dizin mevcut olmadığından kaynaklanıyor olabilir.';
|
||||
|
||||
@override
|
||||
String get writeScriptTip => 'Sunucuya bağlandıktan sonra, sistem durumunu izlemek için ~/.config/server_box\'a bir komut dosyası yazılacaktır. Komut dosyası içeriğini inceleyebilirsiniz.';
|
||||
}
|
||||
708
lib/generated/l10n/l10n_uk.dart
Normal file
708
lib/generated/l10n/l10n_uk.dart
Normal file
@@ -0,0 +1,708 @@
|
||||
import 'l10n.dart';
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
|
||||
/// The translations for Ukrainian (`uk`).
|
||||
class AppLocalizationsUk extends AppLocalizations {
|
||||
AppLocalizationsUk([String locale = 'uk']) : super(locale);
|
||||
|
||||
@override
|
||||
String get aboutThanks => 'Дякуємо наступним особам, які взяли участь.';
|
||||
|
||||
@override
|
||||
String get acceptBeta => 'Прийняти оновлення бета-версії';
|
||||
|
||||
@override
|
||||
String get addSystemPrivateKeyTip => 'Наразі приватних ключів нема, хочете додати той, що йде з системою (~/.ssh/id_rsa)?';
|
||||
|
||||
@override
|
||||
String get added2List => 'Додано до списку завдань';
|
||||
|
||||
@override
|
||||
String get addr => 'Адреса';
|
||||
|
||||
@override
|
||||
String get alreadyLastDir => 'Вже в останньому каталозі.';
|
||||
|
||||
@override
|
||||
String get authFailTip => 'Авторизація не вдалася, будь ласка, перевірте правильність облікових даних';
|
||||
|
||||
@override
|
||||
String get autoBackupConflict => 'Тільки одне автоматичне резервне копіювання може бути активне одночасно.';
|
||||
|
||||
@override
|
||||
String get autoConnect => 'Авто підключення';
|
||||
|
||||
@override
|
||||
String get autoRun => 'Авто запуск';
|
||||
|
||||
@override
|
||||
String get autoUpdateHomeWidget => 'Автоматичне оновлення віджетів на головному екрані';
|
||||
|
||||
@override
|
||||
String get backupTip => 'Експортовані дані слабо зашифровані. \nБудь ласка, зберігайте їх у безпеці.';
|
||||
|
||||
@override
|
||||
String get backupVersionNotMatch => 'Версія резервного копіювання не збіглася.';
|
||||
|
||||
@override
|
||||
String get battery => 'Акумулятор';
|
||||
|
||||
@override
|
||||
String get bgRun => 'Запуск у фоновому режимі';
|
||||
|
||||
@override
|
||||
String get bgRunTip => 'Цей перемикач лише вказує на те, що програма намагатиметься працювати у фоновому режимі. Чи може вона працювати у фоновому режимі, залежить від прав доступу. Для AOSP-орієнтованих Android ROM, будь ласка, вимкніть \"Оптимізацію акумулятора\" в цьому додатку. Для MIUI / HyperOS, будь ласка, змініть політику економії енергії на \"Нескінченна\".';
|
||||
|
||||
@override
|
||||
String get closeAfterSave => 'Зберегти та закрити';
|
||||
|
||||
@override
|
||||
String get cmd => 'Команда';
|
||||
|
||||
@override
|
||||
String get collapseUITip => 'Сховати довгі списки, що є у UI за замовчуванням';
|
||||
|
||||
@override
|
||||
String get conn => 'З\'єднання';
|
||||
|
||||
@override
|
||||
String get container => 'Контейнер';
|
||||
|
||||
@override
|
||||
String get containerTrySudoTip => 'Наприклад: У застосунку користувач це aaa, але Docker встановлений під користувачем root. У цьому випадку вам потрібно активувати цю опцію.';
|
||||
|
||||
@override
|
||||
String get convert => 'Конвертувати';
|
||||
|
||||
@override
|
||||
String get copyPath => 'Скопіювати шлях';
|
||||
|
||||
@override
|
||||
String get cpuViewAsProgressTip => 'Відобразити використання кожного процесора у вигляді стовпчикової діаграми (старий стиль)';
|
||||
|
||||
@override
|
||||
String get cursorType => 'Тип курсора';
|
||||
|
||||
@override
|
||||
String get customCmd => 'Користувацькі команди';
|
||||
|
||||
@override
|
||||
String get customCmdDocUrl => 'https://github.com/lollipopkit/flutter_server_box/wiki#custom-commands';
|
||||
|
||||
@override
|
||||
String get customCmdHint => '\"Ім\'я Команди\": \"Команда\"';
|
||||
|
||||
@override
|
||||
String get decode => 'Декодувати';
|
||||
|
||||
@override
|
||||
String get decompress => 'Розпакувати';
|
||||
|
||||
@override
|
||||
String get deleteServers => 'Масове видалення серверів';
|
||||
|
||||
@override
|
||||
String get dirEmpty => 'Переконайтеся, що директорія пуста.';
|
||||
|
||||
@override
|
||||
String get disconnected => 'Відключено';
|
||||
|
||||
@override
|
||||
String get disk => 'Диск';
|
||||
|
||||
@override
|
||||
String get diskIgnorePath => 'Ігнорувати шлях для диска';
|
||||
|
||||
@override
|
||||
String get displayCpuIndex => 'Відобразити індекс ЦП';
|
||||
|
||||
@override
|
||||
String dl2Local(Object fileName) {
|
||||
return 'Завантажити $fileName на локальний комп\'ютер?';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerEmptyRunningItems => 'Немає запущених контейнерів.\nЦе може бути через:\n- Користувача Docker, відмінного від користувача, налаштованого в додатку\n- змінну оточення DOCKER_HOST, яка не була правильно зчитана. Ви можете виконати `echo \$DOCKER_HOST` у терміналі, щоб побачити її значення.';
|
||||
|
||||
@override
|
||||
String dockerImagesFmt(Object count) {
|
||||
return 'Всього $count образів';
|
||||
}
|
||||
|
||||
@override
|
||||
String get dockerNotInstalled => 'Docker не встановлено';
|
||||
|
||||
@override
|
||||
String dockerStatusRunningAndStoppedFmt(Object runningCount, Object stoppedCount) {
|
||||
return '$runningCount запущено, $stoppedCount контейнерів зупинено.';
|
||||
}
|
||||
|
||||
@override
|
||||
String dockerStatusRunningFmt(Object count) {
|
||||
return '$count контейнер(и) запущено.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get doubleColumnMode => 'Режим подвійної колонки';
|
||||
|
||||
@override
|
||||
String get doubleColumnTip => 'Ця опція лише активує функцію, чи можна її насправді включити, залежить від ширини пристрою';
|
||||
|
||||
@override
|
||||
String get editVirtKeys => 'Редагувати віртуальні клавіші';
|
||||
|
||||
@override
|
||||
String get editor => 'Редактор';
|
||||
|
||||
@override
|
||||
String get editorHighlightTip => 'Поточна підсвітка коду не ідеальна і може бути вимкнена для покращення.';
|
||||
|
||||
@override
|
||||
String get encode => 'Кодувати';
|
||||
|
||||
@override
|
||||
String get envVars => 'Змінні середовища';
|
||||
|
||||
@override
|
||||
String get experimentalFeature => 'Експериментальна функція';
|
||||
|
||||
@override
|
||||
String get extraArgs => 'Додаткові аргументи';
|
||||
|
||||
@override
|
||||
String get fallbackSshDest => 'Резервна SSH адреса';
|
||||
|
||||
@override
|
||||
String get fdroidReleaseTip => 'Якщо ви завантажили цей застосунок з F-Droid, рекомендується відключити цю опцію.';
|
||||
|
||||
@override
|
||||
String get fgService => 'Служба переднього плану';
|
||||
|
||||
@override
|
||||
String get fgServiceTip => 'Після увімкнення деякі моделі пристроїв можуть вилітати. Вимкнення може призвести до того, що деякі моделі не зможуть підтримувати SSH-з\'єднання у фоновому режимі. Будь ласка, дозвольте ServerBox права на сповіщення, фонову роботу та самопробудження в системних налаштуваннях.';
|
||||
|
||||
@override
|
||||
String fileTooLarge(Object file, Object size, Object sizeMax) {
|
||||
return 'Файл \'$file\' занадто великий ($size), макс $sizeMax';
|
||||
}
|
||||
|
||||
@override
|
||||
String get followSystem => 'Слідувати системі';
|
||||
|
||||
@override
|
||||
String get font => 'Шрифт';
|
||||
|
||||
@override
|
||||
String get fontSize => 'Розмір шрифту';
|
||||
|
||||
@override
|
||||
String get force => 'Примусово';
|
||||
|
||||
@override
|
||||
String get fullScreen => 'Повноекранний режим';
|
||||
|
||||
@override
|
||||
String get fullScreenJitter => 'Тремтіння в повноекранному режимі';
|
||||
|
||||
@override
|
||||
String get fullScreenJitterHelp => 'Щоб уникнути вигоряння екрану';
|
||||
|
||||
@override
|
||||
String get fullScreenTip => 'Чи слід увімкнути повноекранний режим під час повороту пристрою в горизонтальне положення? Ця опція стосується лише вкладки сервера.';
|
||||
|
||||
@override
|
||||
String get goBackQ => 'Повернутися назад?';
|
||||
|
||||
@override
|
||||
String get goto => 'Перейти до';
|
||||
|
||||
@override
|
||||
String get hideTitleBar => 'Сховати заголовок';
|
||||
|
||||
@override
|
||||
String get highlight => 'Підсвітка коду';
|
||||
|
||||
@override
|
||||
String get homeWidgetUrlConfig => 'Налаштувати URL віджета на головному екрані';
|
||||
|
||||
@override
|
||||
String get host => 'Хост';
|
||||
|
||||
@override
|
||||
String httpFailedWithCode(Object code) {
|
||||
return 'Запит не вдався, код статусу: $code';
|
||||
}
|
||||
|
||||
@override
|
||||
String get ignoreCert => 'Ігнорувати сертифікат';
|
||||
|
||||
@override
|
||||
String get image => 'Зображення';
|
||||
|
||||
@override
|
||||
String get imagesList => 'Список зображень';
|
||||
|
||||
@override
|
||||
String get init => 'Ініціалізувати';
|
||||
|
||||
@override
|
||||
String get inner => 'Внутрішній';
|
||||
|
||||
@override
|
||||
String get install => 'Встановити';
|
||||
|
||||
@override
|
||||
String get installDockerWithUrl => 'Будь ласка, спочатку встановіть Docker. (https://docs.docker.com/engine/install)';
|
||||
|
||||
@override
|
||||
String get invalid => 'Недійсний';
|
||||
|
||||
@override
|
||||
String get jumpServer => 'Стрибковий Сервер';
|
||||
|
||||
@override
|
||||
String get keepForeground => 'Тримати застосунок на передньому плані!';
|
||||
|
||||
@override
|
||||
String get keepStatusWhenErr => 'Зберегати останній стан сервера';
|
||||
|
||||
@override
|
||||
String get keepStatusWhenErrTip => 'Тільки в разі виникнення помилки під час виконання скрипту';
|
||||
|
||||
@override
|
||||
String get keyAuth => 'Аутентифікація ключем';
|
||||
|
||||
@override
|
||||
String get letterCache => 'Кешування букв';
|
||||
|
||||
@override
|
||||
String get letterCacheTip => 'Рекомендується відключити, але після вимкнення стане неможливим введення CJK (китайських, японських, корейських) символів.';
|
||||
|
||||
@override
|
||||
String get license => 'Ліцензія';
|
||||
|
||||
@override
|
||||
String get location => 'Місцезнаходження';
|
||||
|
||||
@override
|
||||
String get loss => 'втрата пакетів';
|
||||
|
||||
@override
|
||||
String madeWithLove(Object myGithub) {
|
||||
return 'Зроблено з ❤️ від $myGithub';
|
||||
}
|
||||
|
||||
@override
|
||||
String get manual => 'Посібник';
|
||||
|
||||
@override
|
||||
String get max => 'макс.';
|
||||
|
||||
@override
|
||||
String get maxRetryCount => 'Кількість повторних спроб підключення до сервера';
|
||||
|
||||
@override
|
||||
String get maxRetryCountEqual0 => 'Знову і знову буде намагатися повторно підключитися.';
|
||||
|
||||
@override
|
||||
String get min => 'мін.';
|
||||
|
||||
@override
|
||||
String get mission => 'Місія';
|
||||
|
||||
@override
|
||||
String get more => 'Більше';
|
||||
|
||||
@override
|
||||
String get moveOutServerFuncBtnsHelp => 'Включено: може відображатися під кожною карткою на вкладці Сервер. Вимкнено: може відображатися вгорі на сторінці деталей сервера.';
|
||||
|
||||
@override
|
||||
String get ms => 'мс.';
|
||||
|
||||
@override
|
||||
String get needHomeDir => 'Якщо ви користувач Synology, [дивіться тут](https://kb.synology.com/DSM/tutorial/user_enable_home_service). Користувачі інших систем повинні знайти інформацію про те, як створити домашній каталог.';
|
||||
|
||||
@override
|
||||
String get needRestart => 'Необхідно перезапустити застосунок';
|
||||
|
||||
@override
|
||||
String get net => 'Мережа';
|
||||
|
||||
@override
|
||||
String get netViewType => 'Тип перегляду мережі';
|
||||
|
||||
@override
|
||||
String get newContainer => 'Новий контейнер';
|
||||
|
||||
@override
|
||||
String get noLineChart => 'Не використовувати лінійні діаграми';
|
||||
|
||||
@override
|
||||
String get noLineChartForCpu => 'Не використовувати лінійні діаграми для ЦП';
|
||||
|
||||
@override
|
||||
String get noPrivateKeyTip => 'Приватного ключа немає, можливо, він був видалений або сталася помилка конфігурації.';
|
||||
|
||||
@override
|
||||
String get noPromptAgain => 'Більше не запитувати';
|
||||
|
||||
@override
|
||||
String get node => 'Вузол';
|
||||
|
||||
@override
|
||||
String get notAvailable => 'Недоступний';
|
||||
|
||||
@override
|
||||
String get onServerDetailPage => 'На сторінці деталі сервера';
|
||||
|
||||
@override
|
||||
String get onlyOneLine => 'Відображати лише в один рядок (прокрутка)';
|
||||
|
||||
@override
|
||||
String get onlyWhenCoreBiggerThan8 => 'Працює лише тоді, коли кількість ядер перевищує 8';
|
||||
|
||||
@override
|
||||
String get openLastPath => 'Відкрити останній шлях';
|
||||
|
||||
@override
|
||||
String get openLastPathTip => 'Для різних серверів будуть збережені різні логи. Записується шлях при виході';
|
||||
|
||||
@override
|
||||
String get parseContainerStatsTip => 'Парсинг статусу зайнятості Docker є відносно повільним.';
|
||||
|
||||
@override
|
||||
String percentOfSize(Object percent, Object size) {
|
||||
return '$percent% з $size';
|
||||
}
|
||||
|
||||
@override
|
||||
String get permission => 'Дозволи';
|
||||
|
||||
@override
|
||||
String get pingAvg => 'Середнє:';
|
||||
|
||||
@override
|
||||
String get pingInputIP => 'Будь ласка, введіть цільовий IP / Домен.';
|
||||
|
||||
@override
|
||||
String get pingNoServer => 'Немає сервера для пінгування.\nБудь ласка, додайте сервер у вкладці `Сервер`.';
|
||||
|
||||
@override
|
||||
String get pkg => 'Пакет';
|
||||
|
||||
@override
|
||||
String get plugInType => 'Тип вставки';
|
||||
|
||||
@override
|
||||
String get port => 'Порт';
|
||||
|
||||
@override
|
||||
String get preview => 'Попередній перегляд';
|
||||
|
||||
@override
|
||||
String get privateKey => 'Приватний ключ';
|
||||
|
||||
@override
|
||||
String get process => 'Процес';
|
||||
|
||||
@override
|
||||
String get pushToken => 'Надіслати токен';
|
||||
|
||||
@override
|
||||
String get pveIgnoreCertTip => 'Не рекомендується включати, будьте обережні з ризиками безпеки! Якщо ви використовуєте стандартний сертифікат від PVE, вам потрібно увімкнути цю опцію.';
|
||||
|
||||
@override
|
||||
String get pveLoginFailed => 'Не вдалося увійти. Неможливо пройти аутентифікацію за допомогою імені користувача/пароля з конфігурації сервера для входу Linux PAM.';
|
||||
|
||||
@override
|
||||
String get pveVersionLow => 'Ця функція наразі перебуває на стадії тестування та випробувалася лише на PVE 8+. Будь ласка, використовуйте її з обережністю.';
|
||||
|
||||
@override
|
||||
String get pwd => 'Пароль';
|
||||
|
||||
@override
|
||||
String get read => 'Читати';
|
||||
|
||||
@override
|
||||
String get reboot => 'Перезавантажити';
|
||||
|
||||
@override
|
||||
String get rememberPwdInMem => 'Запам\'ятати пароль у пам\'яті';
|
||||
|
||||
@override
|
||||
String get rememberPwdInMemTip => 'Використовується для контейнерів, призупинення тощо.';
|
||||
|
||||
@override
|
||||
String get rememberWindowSize => 'Запам\'ятати розмір вікна';
|
||||
|
||||
@override
|
||||
String get remotePath => 'Віддалений шлях';
|
||||
|
||||
@override
|
||||
String get restart => 'Перезапустити';
|
||||
|
||||
@override
|
||||
String get result => 'Результат';
|
||||
|
||||
@override
|
||||
String get rotateAngel => 'Кут повороту';
|
||||
|
||||
@override
|
||||
String get route => 'Маршрут';
|
||||
|
||||
@override
|
||||
String get run => 'Запустити';
|
||||
|
||||
@override
|
||||
String get running => 'Виконання';
|
||||
|
||||
@override
|
||||
String get sameIdServerExist => 'Сервер з таким ID вже існує';
|
||||
|
||||
@override
|
||||
String get save => 'Зберегти';
|
||||
|
||||
@override
|
||||
String get saved => 'Збережено';
|
||||
|
||||
@override
|
||||
String get second => 'сек.';
|
||||
|
||||
@override
|
||||
String get sensors => 'Датчики';
|
||||
|
||||
@override
|
||||
String get sequence => 'Послідовність';
|
||||
|
||||
@override
|
||||
String get server => 'Сервер';
|
||||
|
||||
@override
|
||||
String get serverDetailOrder => 'Порядок віджетів на сторінці деталі';
|
||||
|
||||
@override
|
||||
String get serverFuncBtns => 'Кнопки функцій сервера';
|
||||
|
||||
@override
|
||||
String get serverOrder => 'Порядок сервера';
|
||||
|
||||
@override
|
||||
String get sftpDlPrepare => 'Підготовка до підключення...';
|
||||
|
||||
@override
|
||||
String get sftpEditorTip => 'Якщо порожньо, використовуйте вбудований редактор файлів програми. Якщо є значення, використовуйте редактор віддаленого сервера, наприклад, `vim` (рекомендується автоматично визначити відповідно до `EDITOR`).';
|
||||
|
||||
@override
|
||||
String get sftpRmrDirSummary => 'Використовуйте `rm -r`, щоб видалити папку в SFTP.';
|
||||
|
||||
@override
|
||||
String get sftpSSHConnected => 'SFTP підключено';
|
||||
|
||||
@override
|
||||
String get sftpShowFoldersFirst => 'Спочатку відображати директорії';
|
||||
|
||||
@override
|
||||
String get showDistLogo => 'Показати логотип дистрибутива';
|
||||
|
||||
@override
|
||||
String get shutdown => 'Вимкнення';
|
||||
|
||||
@override
|
||||
String get size => 'Розмір';
|
||||
|
||||
@override
|
||||
String get snippet => 'Фрагмент';
|
||||
|
||||
@override
|
||||
String get softWrap => 'М\'ягкий перенос';
|
||||
|
||||
@override
|
||||
String get specifyDev => 'Вказати пристрій';
|
||||
|
||||
@override
|
||||
String get specifyDevTip => 'Наприклад, статистика мережевого трафіку за замовчуванням є для всіх пристроїв. Ви можете вказати певний пристрій тут.';
|
||||
|
||||
@override
|
||||
String get speed => 'Швидкість';
|
||||
|
||||
@override
|
||||
String spentTime(Object time) {
|
||||
return 'Витрачений час: $time';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshTermHelp => 'Коли термінал прокрутний, горизонтальне проведення вибирає текст. Натискання кнопки клавіатури вмикає/вимикає клавіатуру. Іконка файлу відкриває поточний шлях SFTP. Кнопка буфера обміну копіює вміст, коли текст вибрано, і вставляє вміст з буфера обміну в термінал, коли текст не вибрано і є вміст у буфері обміну. Іконка коду вставляє фрагменти коду в термінал і виконує їх.';
|
||||
|
||||
@override
|
||||
String sshTip(Object url) {
|
||||
return 'Ця функція наразі в експериментальній стадії. Будь ласка, повідомте про помилки за адресою $url або приєднуйтеся до нашої розробки.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sshVirtualKeyAutoOff => 'Автоматичне переключення віртуальних клавіш';
|
||||
|
||||
@override
|
||||
String get start => 'Старт';
|
||||
|
||||
@override
|
||||
String get stat => 'Статистика';
|
||||
|
||||
@override
|
||||
String get stats => 'Статистики';
|
||||
|
||||
@override
|
||||
String get stop => 'Зупинити';
|
||||
|
||||
@override
|
||||
String get stopped => 'Зупинено';
|
||||
|
||||
@override
|
||||
String get storage => 'Сховище';
|
||||
|
||||
@override
|
||||
String get supportFmtArgs => 'Підтримуються такі параметри форматування:';
|
||||
|
||||
@override
|
||||
String get suspend => 'Призупинити';
|
||||
|
||||
@override
|
||||
String get suspendTip => 'Функція призупинення потребує адміністративних прав та підтримки systemd.';
|
||||
|
||||
@override
|
||||
String switchTo(Object val) {
|
||||
return 'Переключитися на $val';
|
||||
}
|
||||
|
||||
@override
|
||||
String get sync => 'Синхронізація';
|
||||
|
||||
@override
|
||||
String get syncTip => 'Може знадобитися перезапуск, щоб деякі зміни набрали чинності.';
|
||||
|
||||
@override
|
||||
String get system => 'Система';
|
||||
|
||||
@override
|
||||
String get tag => 'Теги';
|
||||
|
||||
@override
|
||||
String get temperature => 'Температура';
|
||||
|
||||
@override
|
||||
String get termFontSizeTip => 'Це налаштування вплине на розмір терміналу (ширину та висоту). Ви можете масштабувати на сторінці терміналу, щоб налаштувати розмір шрифту поточної сесії.';
|
||||
|
||||
@override
|
||||
String get terminal => 'Термінал';
|
||||
|
||||
@override
|
||||
String get test => 'Тест';
|
||||
|
||||
@override
|
||||
String get textScaler => 'Масштабування тексту';
|
||||
|
||||
@override
|
||||
String get textScalerTip => '1.0 => 100% (оригінальний розмір), працює лише на частині шрифта сторінки сервера, не рекомендується змінювати.';
|
||||
|
||||
@override
|
||||
String get theme => 'Тема';
|
||||
|
||||
@override
|
||||
String get time => 'Час';
|
||||
|
||||
@override
|
||||
String get times => 'Рази';
|
||||
|
||||
@override
|
||||
String get total => 'Всього';
|
||||
|
||||
@override
|
||||
String get traffic => 'Трафік';
|
||||
|
||||
@override
|
||||
String get trySudo => 'Спробуйте використовувати sudo';
|
||||
|
||||
@override
|
||||
String get ttl => 'TTL';
|
||||
|
||||
@override
|
||||
String get unknown => 'Невідомо';
|
||||
|
||||
@override
|
||||
String get unkownConvertMode => 'Невідомий режим конвертації';
|
||||
|
||||
@override
|
||||
String get update => 'Оновити';
|
||||
|
||||
@override
|
||||
String get updateIntervalEqual0 => 'Ви встановили 0, автоматичне оновлення не відбудеться.\nНе можна розрахувати статус ЦП.';
|
||||
|
||||
@override
|
||||
String get updateServerStatusInterval => 'Інтервал оновлення статусу сервера';
|
||||
|
||||
@override
|
||||
String get upload => 'Завантаження';
|
||||
|
||||
@override
|
||||
String get upsideDown => 'Доверху дном';
|
||||
|
||||
@override
|
||||
String get uptime => 'Час роботи';
|
||||
|
||||
@override
|
||||
String get useCdn => 'Використання CDN';
|
||||
|
||||
@override
|
||||
String get useCdnTip => 'Нереспонсивним користувачам рекомендується використовувати CDN. Чи хочете ви його використовувати?';
|
||||
|
||||
@override
|
||||
String get useNoPwd => 'Пароль не буде використовуватися';
|
||||
|
||||
@override
|
||||
String get usePodmanByDefault => 'Використовувати Podman за замовчуванням';
|
||||
|
||||
@override
|
||||
String get used => 'Використано';
|
||||
|
||||
@override
|
||||
String get view => 'Переглянути';
|
||||
|
||||
@override
|
||||
String get viewErr => 'Переглянути помилку';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpClipboard => 'Копіювати в буфер обміну, якщо вибраний термінал не порожній, в іншому випадку вставити вміст буфера обміну в термінал.';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpIME => 'Увімкнути/вимкнути клавіатуру';
|
||||
|
||||
@override
|
||||
String get virtKeyHelpSFTP => 'Відкрити поточний каталог у SFTP.';
|
||||
|
||||
@override
|
||||
String get waitConnection => 'Будь ласка, зачекайте, доки з\'єднання буде встановлено.';
|
||||
|
||||
@override
|
||||
String get wakeLock => 'Залишити активним';
|
||||
|
||||
@override
|
||||
String get watchNotPaired => 'Немає спарованого Apple Watch';
|
||||
|
||||
@override
|
||||
String get webdavSettingEmpty => 'Налаштування WebDav порожнє';
|
||||
|
||||
@override
|
||||
String get whenOpenApp => 'При відкритті програми';
|
||||
|
||||
@override
|
||||
String get wolTip => 'Після налаштування WOL (Wake-on-LAN), при кожному підключенні до сервера відправляється запит WOL.';
|
||||
|
||||
@override
|
||||
String get write => 'Записати';
|
||||
|
||||
@override
|
||||
String get writeScriptFailTip => 'Запис у скрипт не вдався, можливо, через брак дозволів або каталог не існує.';
|
||||
|
||||
@override
|
||||
String get writeScriptTip => 'Після підключення до сервера скрипт буде записано у ~/.config/server_box для моніторингу стану системи. Ви можете переглянути вміст скрипта.';
|
||||
}
|
||||
1413
lib/generated/l10n/l10n_zh.dart
Normal file
1413
lib/generated/l10n/l10n_zh.dart
Normal file
File diff suppressed because it is too large
Load Diff
@@ -59,8 +59,10 @@ final class _IntroPage extends StatelessWidget {
|
||||
).cardx,
|
||||
ListTile(
|
||||
leading: const Icon(Icons.update),
|
||||
title: Text(libL10n.autoCheckUpdate),
|
||||
subtitle: Text(l10n.fdroidReleaseTip, style: UIs.textGrey),
|
||||
title: Text(libL10n.checkUpdate),
|
||||
subtitle: isAndroid
|
||||
? Text(l10n.fdroidReleaseTip, style: UIs.textGrey)
|
||||
: null,
|
||||
trailing: StoreSwitch(prop: _setting.autoCheckAppUpdate),
|
||||
).cardx,
|
||||
ListTile(
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
"battery": "Batterie",
|
||||
"bgRun": "Hintergrundaktualisierung",
|
||||
"bgRunTip": "Dieser Schalter bedeutet nur, dass die App versuchen wird, im Hintergrund zu laufen. Ob sie im Hintergrund laufen kann, hängt davon ab, ob die Berechtigungen aktiviert sind oder nicht. Bei nativem Android deaktivieren Sie bitte \"Batterieoptimierung\" in dieser App, und bei miui ändern Sie bitte die Energiesparrichtlinie auf \"Unbegrenzt\".",
|
||||
"closeAfterSave": "Speichern und schließen",
|
||||
"cmd": "Command",
|
||||
"collapseUITip": "Ob lange Listen in der Benutzeroberfläche standardmäßig eingeklappt werden sollen oder nicht",
|
||||
"conn": "Verbindung",
|
||||
@@ -53,6 +54,8 @@
|
||||
"extraArgs": "Extra args",
|
||||
"fallbackSshDest": "SSH-Fallback-Ziel",
|
||||
"fdroidReleaseTip": "Wenn Sie diese App von F-Droid heruntergeladen haben, wird empfohlen, diese Option zu deaktivieren.",
|
||||
"fgService": "Vordergrund-Dienst",
|
||||
"fgServiceTip": "Nach dem Einschalten kann es bei einigen Gerätemodellen zu Abstürzen kommen. Das Ausschalten kann bei einigen Modellen dazu führen, dass SSH-Verbindungen im Hintergrund nicht aufrechterhalten werden können. Bitte erlauben Sie ServerBox in den Systemeinstellungen Benachrichtigungsrechte, Hintergrundausführung und Selbstaktivierung.",
|
||||
"fileTooLarge": "Datei '{file}' ist zu groß {size}, max {sizeMax}",
|
||||
"followSystem": "System verfolgen",
|
||||
"font": "Schriftarten",
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
"battery": "Battery",
|
||||
"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 AOSP-based Android ROMs, please disable \"Battery Optimization\" in this app. For MIUI / HyperOS, please change the power saving policy to \"Unlimited\".",
|
||||
"closeAfterSave": "Save and close",
|
||||
"cmd": "Command",
|
||||
"collapseUITip": "Whether to collapse long lists present in the UI by default",
|
||||
"conn": "Connection",
|
||||
@@ -53,6 +54,8 @@
|
||||
"extraArgs": "Extra arguments",
|
||||
"fallbackSshDest": "Fallback SSH destination",
|
||||
"fdroidReleaseTip": "If you downloaded this app from F-Droid, it is recommended to turn off this option.",
|
||||
"fgService": "Foreground Service",
|
||||
"fgServiceTip": "After enabling, some device models may crash. Disabling it may cause some models to be unable to maintain SSH connections in the background. Please allow ServerBox notification permissions, background running, and self-wake-up in system settings.",
|
||||
"fileTooLarge": "File '{file}' too large {size}, max {sizeMax}",
|
||||
"followSystem": "Follow system",
|
||||
"font": "Font",
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
"battery": "Batería",
|
||||
"bgRun": "Ejecución en segundo plano",
|
||||
"bgRunTip": "Este interruptor solo indica que la aplicación intentará correr en segundo plano, si puede hacerlo o no depende de si tiene el permiso correspondiente. En Android puro, por favor desactiva la “optimización de batería” para esta app, en MIUI por favor cambia la estrategia de ahorro de energía a “Sin restricciones”.",
|
||||
"closeAfterSave": "Guardar y cerrar",
|
||||
"cmd": "Comando",
|
||||
"collapseUITip": "¿Colapsar por defecto las listas largas en la UI?",
|
||||
"conn": "Conectar",
|
||||
@@ -53,6 +54,8 @@
|
||||
"extraArgs": "Argumentos extra",
|
||||
"fallbackSshDest": "Destino SSH alternativo",
|
||||
"fdroidReleaseTip": "Si descargaste esta aplicación desde F-Droid, se recomienda desactivar esta opción.",
|
||||
"fgService": "Servicio en primer plano",
|
||||
"fgServiceTip": "Después de activarlo, algunos modelos de dispositivos pueden bloquearse. Desactivarlo puede hacer que algunos modelos no puedan mantener las conexiones SSH en segundo plano. Por favor, permita los permisos de notificación de ServerBox, la ejecución en segundo plano y el auto-despertar en la configuración del sistema.",
|
||||
"fileTooLarge": "El archivo '{file}' es demasiado grande '{size}', supera el {sizeMax}",
|
||||
"followSystem": "Seguir al sistema",
|
||||
"font": "Fuente",
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
"battery": "Batterie",
|
||||
"bgRun": "Exécution en arrière-plan",
|
||||
"bgRunTip": "Cette option signifie seulement que le programme essaiera de s'exécuter en arrière-plan, que cela soit possible dépend de l'autorisation activée ou non. Pour Android natif, veuillez désactiver l'« Optimisation de la batterie » dans cette application, et pour MIUI, veuillez changer la politique d'économie d'énergie en « Illimité ».",
|
||||
"closeAfterSave": "Enregistrer et fermer",
|
||||
"cmd": "Commande",
|
||||
"collapseUITip": "Indique si les longues listes présentées dans l'interface utilisateur doivent être réduites par défaut.",
|
||||
"conn": "Connexion",
|
||||
@@ -53,6 +54,8 @@
|
||||
"extraArgs": "Arguments supplémentaires",
|
||||
"fallbackSshDest": "Destino SSH alternativo",
|
||||
"fdroidReleaseTip": "Si vous avez téléchargé cette application depuis F-Droid, il est recommandé de désactiver cette option.",
|
||||
"fgService": "Service de premier plan",
|
||||
"fgServiceTip": "Après l'activation, certains modèles d'appareils peuvent planter. La désactivation peut empêcher certains modèles de maintenir les connexions SSH en arrière-plan. Veuillez autoriser les permissions de notification ServerBox, l'exécution en arrière-plan et l'auto-réveil dans les paramètres système.",
|
||||
"fileTooLarge": "Fichier '{file}' trop volumineux {size}, max {sizeMax}",
|
||||
"followSystem": "Suivre le système",
|
||||
"font": "Police",
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
"battery": "Baterai",
|
||||
"bgRun": "Jalankan di Backgroud",
|
||||
"bgRunTip": "Sakelar ini hanya berarti aplikasi akan mencoba berjalan di latar belakang, apakah aplikasi dapat berjalan di latar belakang tergantung pada apakah izin diaktifkan atau tidak. Untuk Android asli, nonaktifkan \"Pengoptimalan Baterai\" di aplikasi ini, dan untuk miui, ubah kebijakan penghematan daya ke \"Tidak Terbatas\".",
|
||||
"closeAfterSave": "Simpan dan tutup",
|
||||
"cmd": "Memerintah",
|
||||
"collapseUITip": "Apakah akan menciutkan daftar panjang yang ada di UI secara default atau tidak",
|
||||
"conn": "Koneksi",
|
||||
@@ -53,6 +54,8 @@
|
||||
"extraArgs": "Args ekstra",
|
||||
"fallbackSshDest": "Tujuan SSH mundur",
|
||||
"fdroidReleaseTip": "Jika Anda mengunduh aplikasi ini dari F-Droid, disarankan untuk mematikan opsi ini.",
|
||||
"fgService": "Layanan Latar Depan",
|
||||
"fgServiceTip": "Setelah diaktifkan, beberapa model perangkat mungkin crash. Menonaktifkannya dapat menyebabkan beberapa model tidak dapat mempertahankan koneksi SSH di latar belakang. Harap izinkan perizinan notifikasi ServerBox, menjalankan di latar belakang, dan bangun mandiri di pengaturan sistem.",
|
||||
"fileTooLarge": "File '{file}' terlalu besar {size}, max {sizeMax}",
|
||||
"followSystem": "Ikuti sistem",
|
||||
"font": "Font",
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
"battery": "バッテリー",
|
||||
"bgRun": "バックグラウンド実行",
|
||||
"bgRunTip": "このスイッチはプログラムがバックグラウンドで実行を試みることを意味しますが、実際にバックグラウンドで実行できるかどうかは、権限が有効になっているかに依存します。AOSPベースのAndroid ROMでは、このアプリの「バッテリー最適化」をオフにしてください。MIUIでは、省エネモードを「無制限」に変更してください。",
|
||||
"closeAfterSave": "保存して閉じる",
|
||||
"cmd": "コマンド",
|
||||
"collapseUITip": "UIの長いリストをデフォルトで折りたたむかどうか",
|
||||
"conn": "接続",
|
||||
@@ -53,6 +54,8 @@
|
||||
"extraArgs": "追加引数",
|
||||
"fallbackSshDest": "フォールバックSSH宛先",
|
||||
"fdroidReleaseTip": "このアプリをF-Droidからダウンロードした場合、このオプションをオフにすることをお勧めします。",
|
||||
"fgService": "フォアグラウンドサービス",
|
||||
"fgServiceTip": "有効にすると、一部の機種でクラッシュする可能性があります。無効にすると、一部の機種でバックグラウンドでのSSH接続を維持できなくなる可能性があります。システム設定でServerBoxの通知権限、バックグラウンド実行、自己起動を許可してください。",
|
||||
"fileTooLarge": "ファイル '{file}' は大きすぎます '{size}'、{sizeMax} を超えています",
|
||||
"followSystem": "システムに従う",
|
||||
"font": "フォント",
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
"battery": "Batterij",
|
||||
"bgRun": "Uitvoeren op de achtergrond",
|
||||
"bgRunTip": "Deze schakelaar betekent alleen dat het programma zal proberen op de achtergrond uit te voeren, of het in de achtergrond kan worden uitgevoerd, hangt af van of de toestemming is ingeschakeld of niet. Voor native Android, schakel \"Batterijoptimalisatie\" uit in deze app, en voor miui, wijzig de energiebesparingsbeleid naar \"Onbeperkt\".",
|
||||
"closeAfterSave": "Opslaan en sluiten",
|
||||
"cmd": "Opdracht",
|
||||
"collapseUITip": "Of lange lijsten in de UI standaard moeten worden ingeklapt",
|
||||
"conn": "Verbinding",
|
||||
@@ -53,6 +54,8 @@
|
||||
"extraArgs": "Extra argumenten",
|
||||
"fallbackSshDest": "Fallback SSH-bestemming",
|
||||
"fdroidReleaseTip": "Als u deze app van F-Droid heeft gedownload, wordt aanbevolen deze optie uit te schakelen.",
|
||||
"fgService": "Voorgrondservice",
|
||||
"fgServiceTip": "Na het inschakelen kunnen sommige apparaatmodellen crashen. Uitschakelen kan ertoe leiden dat sommige modellen SSH-verbindingen niet op de achtergrond kunnen behouden. Sta ServerBox notificatierechten, achtergronduitvoering en zelf-ontwaken toe in systeeminstellingen.",
|
||||
"fileTooLarge": "Bestand '{file}' te groot {size}, max {sizeMax}",
|
||||
"followSystem": "Volg systeem",
|
||||
"font": "Lettertype",
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
"battery": "Bateria",
|
||||
"bgRun": "Execução em segundo plano",
|
||||
"bgRunTip": "Este interruptor indica que o programa tentará rodar em segundo plano, mas a capacidade de fazer isso depende das permissões concedidas. No Android nativo, desative a 'Otimização de bateria' para este app, no MIUI, altere a estratégia de economia de energia para 'Sem restrições'.",
|
||||
"closeAfterSave": "Salvar e fechar",
|
||||
"cmd": "Comando",
|
||||
"collapseUITip": "Deve colapsar listas longas na UI por padrão?",
|
||||
"conn": "Conectar",
|
||||
@@ -53,6 +54,8 @@
|
||||
"extraArgs": "Argumentos extras",
|
||||
"fallbackSshDest": "Destino SSH de fallback",
|
||||
"fdroidReleaseTip": "Se você baixou este aplicativo do F-Droid, é recomendado desativar esta opção.",
|
||||
"fgService": "Serviço em primeiro plano",
|
||||
"fgServiceTip": "Após ativar, alguns modelos de dispositivos podem travar. Desativar pode fazer com que alguns modelos não consigam manter conexões SSH em segundo plano. Por favor, permita as permissões de notificação do ServerBox, execução em segundo plano e auto-despertar nas configurações do sistema.",
|
||||
"fileTooLarge": "Arquivo '{file}' muito grande '{size}', excedendo {sizeMax}",
|
||||
"followSystem": "Seguir sistema",
|
||||
"font": "Fonte",
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
"battery": "Батарея",
|
||||
"bgRun": "Работа в фоновом режиме",
|
||||
"bgRunTip": "Этот переключатель означает, что программа будет пытаться работать в фоновом режиме, но фактическое выполнение зависит от того, включено ли разрешение. Для нативного Android отключите «Оптимизацию батареи» для этого приложения, для MIUI измените контроль активности на «Нет ограничений».",
|
||||
"closeAfterSave": "Сохранить и закрыть",
|
||||
"cmd": "Команда",
|
||||
"collapseUITip": "Свернуть длинные списки в UI по умолчанию",
|
||||
"conn": "Подключение",
|
||||
@@ -53,6 +54,8 @@
|
||||
"extraArgs": "Дополнительные аргументы",
|
||||
"fallbackSshDest": "Резервное место назначения SSH",
|
||||
"fdroidReleaseTip": "Если вы скачали это приложение с F-Droid, рекомендуется отключить эту опцию.",
|
||||
"fgService": "Сервис переднего плана",
|
||||
"fgServiceTip": "После включения некоторые модели устройств могут вылетать. Отключение может привести к тому, что некоторые модели не смогут поддерживать SSH-соединения в фоновом режиме. Пожалуйста, разрешите ServerBox права на уведомления, фоновую работу и самопробуждение в системных настройках.",
|
||||
"fileTooLarge": "Файл '{file}' слишком большой '{size}', превышает {sizeMax}",
|
||||
"followSystem": "Следовать за системой",
|
||||
"font": "Шрифт",
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
"battery": "Pil",
|
||||
"bgRun": "Arka planda çalıştır",
|
||||
"bgRunTip": "Bu anahtar yalnızca programın arka planda çalışmayı deneyeceğini ifade eder. Arka planda çalışıp çalışamayacağı, iznin etkinleştirilip etkinleştirilmediğine bağlıdır. AOSP tabanlı Android ROM'larda, bu uygulamada \"Pil Optimizasyonunu\" devre dışı bırakın. MIUI / HyperOS için, güç tasarrufu politikasını \"Sınırsız\" olarak değiştirin.",
|
||||
"closeAfterSave": "Kaydet ve kapat",
|
||||
"cmd": "Komut",
|
||||
"collapseUITip": "UI'daki uzun listeleri varsayılan olarak gizleyip gizlememeyi belirler",
|
||||
"conn": "Bağlantı",
|
||||
@@ -53,6 +54,8 @@
|
||||
"extraArgs": "Ek argümanlar",
|
||||
"fallbackSshDest": "Yedek SSH hedefi",
|
||||
"fdroidReleaseTip": "Bu uygulamayı F-Droid'den indirdiyseniz, bu seçeneği kapatmanız önerilir.",
|
||||
"fgService": "Ön plan hizmeti",
|
||||
"fgServiceTip": "Etkinleştirdikten sonra, bazı cihaz modellerinde çökme olabilir. Devre dışı bırakmak, bazı modellerin SSH bağlantılarını arka planda sürdürememesine neden olabilir. Lütfen sistem ayarlarında ServerBox bildirim izinlerine, arka planda çalışmaya ve kendiliğinden uyanmaya izin verin.",
|
||||
"fileTooLarge": "'{file}' dosyası çok büyük {size}, maksimum {sizeMax}",
|
||||
"followSystem": "Sistemi takip et",
|
||||
"font": "Yazı tipi",
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
"battery": "Акумулятор",
|
||||
"bgRun": "Запуск у фоновому режимі",
|
||||
"bgRunTip": "Цей перемикач лише вказує на те, що програма намагатиметься працювати у фоновому режимі. Чи може вона працювати у фоновому режимі, залежить від прав доступу. Для AOSP-орієнтованих Android ROM, будь ласка, вимкніть \"Оптимізацію акумулятора\" в цьому додатку. Для MIUI / HyperOS, будь ласка, змініть політику економії енергії на \"Нескінченна\".",
|
||||
"closeAfterSave": "Зберегти та закрити",
|
||||
"cmd": "Команда",
|
||||
"collapseUITip": "Сховати довгі списки, що є у UI за замовчуванням",
|
||||
"conn": "З'єднання",
|
||||
@@ -53,6 +54,8 @@
|
||||
"extraArgs": "Додаткові аргументи",
|
||||
"fallbackSshDest": "Резервна SSH адреса",
|
||||
"fdroidReleaseTip": "Якщо ви завантажили цей застосунок з F-Droid, рекомендується відключити цю опцію.",
|
||||
"fgService": "Служба переднього плану",
|
||||
"fgServiceTip": "Після увімкнення деякі моделі пристроїв можуть вилітати. Вимкнення може призвести до того, що деякі моделі не зможуть підтримувати SSH-з'єднання у фоновому режимі. Будь ласка, дозвольте ServerBox права на сповіщення, фонову роботу та самопробудження в системних налаштуваннях.",
|
||||
"fileTooLarge": "Файл '{file}' занадто великий ({size}), макс {sizeMax}",
|
||||
"followSystem": "Слідувати системі",
|
||||
"font": "Шрифт",
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
"battery": "电池",
|
||||
"bgRun": "后台运行",
|
||||
"bgRunTip": "此开关只代表程序会尝试在后台运行,具体能否后台运行取决于是否开启了权限。原生 Android 请关闭本 App 的“电池优化”,MIUI / HyperOS 请修改省电策略为“无限制”。",
|
||||
"closeAfterSave": "保存后关闭",
|
||||
"cmd": "命令",
|
||||
"collapseUITip": "是否默认折叠 UI 中的长列表",
|
||||
"conn": "连接",
|
||||
@@ -53,6 +54,8 @@
|
||||
"extraArgs": "额外参数",
|
||||
"fallbackSshDest": "备选 SSH 目标",
|
||||
"fdroidReleaseTip": "如果你是从 F-Droid 下载的本应用,推荐关闭此选项",
|
||||
"fgService": "前台服务",
|
||||
"fgServiceTip": "开启后,可能会导致部分机型闪退。关闭可能导致部分机型无法后台保持 SSH 连接。请在系统设置内允许 ServerBox 通知权限、后台运行、自我唤醒。",
|
||||
"fileTooLarge": "文件 '{file}' 过大 '{size}',超过了 {sizeMax}",
|
||||
"followSystem": "跟随系统",
|
||||
"font": "字体",
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
"battery": "電池",
|
||||
"bgRun": "後台運行",
|
||||
"bgRunTip": "此開關只代表程式會嘗試在後台運行,具體能否在後臺運行取決於是否開啟了權限。 原生 Android 請關閉本 App 的“電池優化”,MIUI / HyperOS 請修改省電策略為“無限制”。",
|
||||
"closeAfterSave": "儲存後關閉",
|
||||
"cmd": "命令",
|
||||
"collapseUITip": "是否預設折疊 UI 中存在的長列表",
|
||||
"conn": "連接",
|
||||
@@ -53,6 +54,8 @@
|
||||
"extraArgs": "額外參數",
|
||||
"fallbackSshDest": "備選 SSH 目標",
|
||||
"fdroidReleaseTip": "如果你是從 F-Droid 下載的本應用,推薦關閉此選項",
|
||||
"fgService": "前台服務",
|
||||
"fgServiceTip": "開啟後,可能會導致部分機型閃退。關閉可能導致部分機型無法後台保持 SSH 連接。請在系統設置內允許 ServerBox 通知權限、後台運行、自我喚醒。",
|
||||
"fileTooLarge": "文件 '{file}' 過大 '{size}',超過了 {sizeMax}",
|
||||
"followSystem": "跟隨系統",
|
||||
"font": "字型",
|
||||
|
||||
@@ -25,7 +25,6 @@ import 'package:server_box/data/provider/sftp.dart';
|
||||
import 'package:server_box/data/provider/snippet.dart';
|
||||
import 'package:server_box/data/res/build_data.dart';
|
||||
import 'package:server_box/data/res/store.dart';
|
||||
import 'package:server_box/data/store/no_backup.dart';
|
||||
|
||||
Future<void> main() async {
|
||||
_runInZone(() async {
|
||||
@@ -81,7 +80,7 @@ Future<void> _initData() async {
|
||||
Hive.registerAdapter(ServerCustomAdapter()); // 7
|
||||
Hive.registerAdapter(WakeOnLanCfgAdapter()); // 8
|
||||
|
||||
await PrefStore.init(); // Call this before accessing any store
|
||||
await PrefStore.shared.init(); // Call this before accessing any store
|
||||
await Stores.init();
|
||||
|
||||
// DO NOT change the order of these providers.
|
||||
@@ -112,7 +111,7 @@ void _doPlatformRelated() async {
|
||||
FlutterDisplayMode.setHighRefreshRate();
|
||||
}
|
||||
|
||||
final serversCount = Stores.server.box.keys.length;
|
||||
final serversCount = Stores.server.keys().length;
|
||||
// Plus 1 to avoid 0.
|
||||
Computer.shared.turnOn(workersCount: (serversCount / 3).round() + 1);
|
||||
|
||||
@@ -121,14 +120,13 @@ void _doPlatformRelated() async {
|
||||
|
||||
// It may contains some async heavy funcs.
|
||||
Future<void> _doVersionRelated() async {
|
||||
final curVer = Stores.setting.lastVer.fetch();
|
||||
final lastVer = Stores.setting.lastVer.fetch();
|
||||
const newVer = BuildData.build;
|
||||
// It's only the version upgrade trigger logic.
|
||||
// How to upgrade the data is inside each own func.
|
||||
if (curVer < newVer) {
|
||||
if (lastVer < newVer) {
|
||||
ServerDetailCards.autoAddNewCards(newVer);
|
||||
ServerFuncBtn.autoAddNewFuncs(newVer);
|
||||
NoBackupStore.instance.migrate();
|
||||
Stores.setting.lastVer.put(newVer);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ import 'package:server_box/data/provider/snippet.dart';
|
||||
import 'package:server_box/data/res/misc.dart';
|
||||
import 'package:server_box/data/res/store.dart';
|
||||
import 'package:icons_plus/icons_plus.dart';
|
||||
import 'package:server_box/data/store/no_backup.dart';
|
||||
import 'package:webdav_client/webdav_client.dart';
|
||||
|
||||
class BackupPage extends StatefulWidget {
|
||||
const BackupPage({super.key});
|
||||
@@ -24,7 +24,6 @@ class BackupPage extends StatefulWidget {
|
||||
|
||||
final class _BackupPageState extends State<BackupPage>
|
||||
with AutomaticKeepAliveClientMixin {
|
||||
final _noBak = NoBackupStore.instance;
|
||||
final icloudLoading = false.vn;
|
||||
final webdavLoading = false.vn;
|
||||
|
||||
@@ -105,9 +104,9 @@ final class _BackupPageState extends State<BackupPage>
|
||||
leading: const Icon(Icons.cloud),
|
||||
title: const Text('iCloud'),
|
||||
trailing: StoreSwitch(
|
||||
prop: _noBak.icloudSync,
|
||||
prop: PrefProps.icloudSync,
|
||||
validator: (p0) {
|
||||
if (p0 && _noBak.webdavSync.fetch()) {
|
||||
if (p0 && PrefProps.webdavSync.get()) {
|
||||
context.showSnackBar(l10n.autoBackupConflict);
|
||||
return false;
|
||||
}
|
||||
@@ -140,17 +139,26 @@ final class _BackupPageState extends State<BackupPage>
|
||||
ListTile(
|
||||
title: Text(libL10n.auto),
|
||||
trailing: StoreSwitch(
|
||||
prop: _noBak.webdavSync,
|
||||
prop: PrefProps.webdavSync,
|
||||
validator: (p0) {
|
||||
if (p0) {
|
||||
if (_noBak.webdavUrl.fetch().isEmpty ||
|
||||
_noBak.webdavUser.fetch().isEmpty ||
|
||||
_noBak.webdavPwd.fetch().isEmpty) {
|
||||
final url = PrefProps.webdavUrl.get();
|
||||
final user = PrefProps.webdavUser.get();
|
||||
final pwd = PrefProps.webdavPwd.get();
|
||||
|
||||
final anyNull = url == null || user == null || pwd == null;
|
||||
if (anyNull) {
|
||||
context.showSnackBar(l10n.webdavSettingEmpty);
|
||||
return false;
|
||||
}
|
||||
|
||||
final anyEmpty = url.isEmpty || user.isEmpty || pwd.isEmpty;
|
||||
if (anyEmpty) {
|
||||
context.showSnackBar(l10n.webdavSettingEmpty);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (_noBak.icloudSync.fetch()) {
|
||||
if (PrefProps.icloudSync.get()) {
|
||||
context.showSnackBar(l10n.autoBackupConflict);
|
||||
return false;
|
||||
}
|
||||
@@ -159,7 +167,7 @@ final class _BackupPageState extends State<BackupPage>
|
||||
callback: (val) async {
|
||||
if (val) {
|
||||
webdavLoading.value = true;
|
||||
await bakSync.sync(rs: webdav);
|
||||
await bakSync.sync(rs: Webdav.shared);
|
||||
webdavLoading.value = false;
|
||||
}
|
||||
},
|
||||
@@ -326,7 +334,7 @@ final class _BackupPageState extends State<BackupPage>
|
||||
Future<void> _onTapWebdavDl(BuildContext context) async {
|
||||
webdavLoading.value = true;
|
||||
try {
|
||||
final files = await webdav.list();
|
||||
final files = await Webdav.shared.list();
|
||||
if (files.isEmpty) return context.showSnackBar(l10n.dirEmpty);
|
||||
|
||||
final fileName = await context.showPickSingleDialog(
|
||||
@@ -335,7 +343,7 @@ final class _BackupPageState extends State<BackupPage>
|
||||
);
|
||||
if (fileName == null) return;
|
||||
|
||||
await webdav.download(relativePath: fileName);
|
||||
await Webdav.shared.download(relativePath: fileName);
|
||||
final dlFile = await File('${Paths.doc}/$fileName').readAsString();
|
||||
final dlBak = await Computer.shared.start(Backup.fromJsonString, dlFile);
|
||||
await dlBak.merge(force: true);
|
||||
@@ -353,7 +361,7 @@ final class _BackupPageState extends State<BackupPage>
|
||||
final bakName = '$date-${Miscs.bakFileName}';
|
||||
try {
|
||||
await Backup.backup(bakName);
|
||||
await webdav.upload(relativePath: bakName);
|
||||
await Webdav.shared.upload(relativePath: bakName);
|
||||
Loggers.app.info('Upload webdav backup success');
|
||||
} catch (e, s) {
|
||||
context.showErrDialog(e, s, l10n.upload);
|
||||
@@ -364,9 +372,9 @@ final class _BackupPageState extends State<BackupPage>
|
||||
}
|
||||
|
||||
Future<void> _onTapWebdavSetting(BuildContext context) async {
|
||||
final url = TextEditingController(text: _noBak.webdavUrl.fetch());
|
||||
final user = TextEditingController(text: _noBak.webdavUser.fetch());
|
||||
final pwd = TextEditingController(text: _noBak.webdavPwd.fetch());
|
||||
final url = TextEditingController(text: PrefProps.webdavUrl.get());
|
||||
final user = TextEditingController(text: PrefProps.webdavUser.get());
|
||||
final pwd = TextEditingController(text: PrefProps.webdavPwd.get());
|
||||
final nodeUser = FocusNode();
|
||||
final nodePwd = FocusNode();
|
||||
final result = await context.showRoundDialog<bool>(
|
||||
@@ -376,7 +384,7 @@ final class _BackupPageState extends State<BackupPage>
|
||||
children: [
|
||||
Input(
|
||||
label: 'URL',
|
||||
hint: 'https://example.com/webdav/',
|
||||
hint: 'https://example.com/sub/',
|
||||
controller: url,
|
||||
suggestion: false,
|
||||
onSubmitted: (p0) => FocusScope.of(context).requestFocus(nodeUser),
|
||||
@@ -401,14 +409,17 @@ final class _BackupPageState extends State<BackupPage>
|
||||
);
|
||||
if (result == true) {
|
||||
try {
|
||||
await Webdav.test(url.text, user.text, pwd.text);
|
||||
final url_ = url.text;
|
||||
final user_ = user.text;
|
||||
final pwd_ = pwd.text;
|
||||
|
||||
await Webdav.test(url_, user_, pwd_);
|
||||
context.showSnackBar(libL10n.success);
|
||||
webdav.init(WebdavInitArgs(
|
||||
url: url.text,
|
||||
user: user.text,
|
||||
pwd: pwd.text,
|
||||
prefix: 'serverbox/',
|
||||
));
|
||||
|
||||
Webdav.shared.client = WebdavClient(url: url_, user: user_, pwd: pwd_);
|
||||
PrefProps.webdavUrl.set(url_);
|
||||
PrefProps.webdavUser.set(user_);
|
||||
PrefProps.webdavPwd.set(pwd_);
|
||||
} catch (e, s) {
|
||||
context.showErrDialog(e, s, 'Webdav');
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ class _ContainerPageState extends State<ContainerPage> {
|
||||
builder: (_, __) => Consumer<ContainerProvider>(
|
||||
builder: (_, ___, __) {
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(
|
||||
appBar: AppBar(
|
||||
centerTitle: true,
|
||||
title: TwoLineText(up: l10n.container, down: widget.spi.name),
|
||||
actions: [
|
||||
@@ -175,7 +175,7 @@ class _ContainerPageState extends State<ContainerPage> {
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(_container.type.name.upperFirst),
|
||||
Text(_container.type.name.capitalize),
|
||||
Text(_container.version ?? l10n.unknown),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -11,17 +11,17 @@ import 'package:flutter_highlight/themes/monokai.dart';
|
||||
import 'package:server_box/core/extension/context/locale.dart';
|
||||
import 'package:server_box/data/res/highlight.dart';
|
||||
import 'package:server_box/data/res/store.dart';
|
||||
import 'package:server_box/data/store/setting.dart';
|
||||
|
||||
import 'package:server_box/view/widget/two_line_text.dart';
|
||||
|
||||
enum EditorPageRetType { path, text }
|
||||
|
||||
final class EditorPageRet {
|
||||
/// If edit text, this includes the edited result
|
||||
final String? result;
|
||||
final EditorPageRetType typ;
|
||||
final String val;
|
||||
|
||||
/// Indicates whether it's ok to edit existing file
|
||||
final bool? editExistedOk;
|
||||
|
||||
const EditorPageRet({this.result, this.editExistedOk});
|
||||
const EditorPageRet(this.typ, this.val);
|
||||
}
|
||||
|
||||
final class EditorPageArgs {
|
||||
@@ -38,11 +38,14 @@ final class EditorPageArgs {
|
||||
|
||||
final String? title;
|
||||
|
||||
final void Function(BuildContext, EditorPageRet) onSave;
|
||||
|
||||
const EditorPageArgs({
|
||||
this.path,
|
||||
this.text,
|
||||
this.langCode,
|
||||
this.title,
|
||||
required this.onSave,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -51,7 +54,7 @@ class EditorPage extends StatefulWidget {
|
||||
|
||||
const EditorPage({super.key, this.args});
|
||||
|
||||
static const route = AppRoute<EditorPageRet, EditorPageArgs>(
|
||||
static const route = AppRoute<void, EditorPageArgs>(
|
||||
page: EditorPage.new,
|
||||
path: '/editor',
|
||||
);
|
||||
@@ -69,6 +72,7 @@ class _EditorPageState extends State<EditorPage> {
|
||||
TextStyle(fontSize: Stores.setting.editorFontSize.fetch());
|
||||
|
||||
String? _langCode;
|
||||
var _saved = false;
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
@@ -80,7 +84,94 @@ class _EditorPageState extends State<EditorPage> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_init();
|
||||
}
|
||||
|
||||
@override
|
||||
void didChangeDependencies() {
|
||||
super.didChangeDependencies();
|
||||
|
||||
if (context.isDark) {
|
||||
_codeTheme =
|
||||
themeMap[Stores.setting.editorDarkTheme.fetch()] ?? monokaiTheme;
|
||||
} else {
|
||||
_codeTheme =
|
||||
themeMap[Stores.setting.editorTheme.fetch()] ?? a11yLightTheme;
|
||||
}
|
||||
_focusNode.requestFocus();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return PopScope(
|
||||
canPop: false,
|
||||
onPopInvokedWithResult: (didPop, result) {
|
||||
_pop();
|
||||
},
|
||||
child: Scaffold(
|
||||
backgroundColor: _codeTheme['root']?.backgroundColor,
|
||||
appBar: _buildAppBar(),
|
||||
body: _buildBody(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
PreferredSizeWidget _buildAppBar() {
|
||||
return AppBar(
|
||||
centerTitle: true,
|
||||
title: TwoLineText(
|
||||
up: widget.args?.title ??
|
||||
widget.args?.path?.getFileName() ??
|
||||
l10n.unknown,
|
||||
down: l10n.editor,
|
||||
),
|
||||
actions: [
|
||||
PopupMenuButton<String>(
|
||||
icon: const Icon(Icons.language),
|
||||
tooltip: libL10n.language,
|
||||
onSelected: (value) {
|
||||
_controller.language = Highlights.all[value];
|
||||
_langCode = value;
|
||||
},
|
||||
initialValue: _langCode,
|
||||
itemBuilder: (BuildContext context) {
|
||||
return Highlights.all.keys.map((e) {
|
||||
return PopupMenuItem(
|
||||
value: e,
|
||||
child: Text(e),
|
||||
);
|
||||
}).toList();
|
||||
},
|
||||
),
|
||||
IconButton(
|
||||
icon: const Icon(Icons.save),
|
||||
tooltip: l10n.save,
|
||||
onPressed: _onSave,
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildBody() {
|
||||
return SingleChildScrollView(
|
||||
child: CodeTheme(
|
||||
data: CodeThemeData(styles: _codeTheme),
|
||||
child: CodeField(
|
||||
wrap: Stores.setting.editorSoftWrap.fetch(),
|
||||
focusNode: _focusNode,
|
||||
controller: _controller,
|
||||
textStyle: _textStyle,
|
||||
lineNumberStyle: const LineNumberStyle(
|
||||
width: 47,
|
||||
margin: 7,
|
||||
),
|
||||
),
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
extension on _EditorPageState {
|
||||
Future<void> _init() async {
|
||||
/// Higher priority than [path]
|
||||
if (Stores.setting.editorHighlight.fetch()) {
|
||||
_langCode =
|
||||
@@ -112,97 +203,43 @@ class _EditorPageState extends State<EditorPage> {
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void didChangeDependencies() {
|
||||
super.didChangeDependencies();
|
||||
void _onSave() async {
|
||||
// If path is not null, then it's a file editor
|
||||
final path = widget.args?.path;
|
||||
if (path != null) {
|
||||
final (res, _) = await context.showLoadingDialog(
|
||||
fn: () => File(path).writeAsString(_controller.text),
|
||||
);
|
||||
if (res == null) {
|
||||
context.showSnackBar(libL10n.fail);
|
||||
return;
|
||||
}
|
||||
final ret = EditorPageRet(EditorPageRetType.path, path);
|
||||
widget.args?.onSave(context, ret);
|
||||
_saved = true;
|
||||
|
||||
if (context.isDark) {
|
||||
_codeTheme =
|
||||
themeMap[Stores.setting.editorDarkTheme.fetch()] ?? monokaiTheme;
|
||||
} else {
|
||||
_codeTheme =
|
||||
themeMap[Stores.setting.editorTheme.fetch()] ?? a11yLightTheme;
|
||||
final pop_ = SettingStore.instance.closeAfterSave.fetch();
|
||||
if (pop_) _pop();
|
||||
return;
|
||||
}
|
||||
_focusNode.requestFocus();
|
||||
// it's a text editor
|
||||
final ret = EditorPageRet(EditorPageRetType.text, _controller.text);
|
||||
widget.args?.onSave(context, ret);
|
||||
_saved = true;
|
||||
|
||||
final pop_ = SettingStore.instance.closeAfterSave.fetch();
|
||||
if (pop_) _pop();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: _codeTheme['root']?.backgroundColor,
|
||||
appBar: _buildAppBar(),
|
||||
body: _buildBody(),
|
||||
);
|
||||
}
|
||||
|
||||
PreferredSizeWidget _buildAppBar() {
|
||||
return CustomAppBar(
|
||||
centerTitle: true,
|
||||
title: TwoLineText(
|
||||
up: widget.args?.title ??
|
||||
widget.args?.path?.getFileName() ??
|
||||
l10n.unknown,
|
||||
down: l10n.editor,
|
||||
),
|
||||
actions: [
|
||||
PopupMenuButton<String>(
|
||||
icon: const Icon(Icons.language),
|
||||
tooltip: libL10n.language,
|
||||
onSelected: (value) {
|
||||
_controller.language = Highlights.all[value];
|
||||
_langCode = value;
|
||||
},
|
||||
initialValue: _langCode,
|
||||
itemBuilder: (BuildContext context) {
|
||||
return Highlights.all.keys.map((e) {
|
||||
return PopupMenuItem(
|
||||
value: e,
|
||||
child: Text(e),
|
||||
);
|
||||
}).toList();
|
||||
},
|
||||
),
|
||||
IconButton(
|
||||
icon: const Icon(Icons.save),
|
||||
tooltip: l10n.save,
|
||||
onPressed: () async {
|
||||
// If path is not null, then it's a file editor
|
||||
// save the text and return true to pop the page
|
||||
final path = widget.args?.path;
|
||||
if (path != null) {
|
||||
final (res, _) = await context.showLoadingDialog(
|
||||
fn: () => File(path).writeAsString(_controller.text),
|
||||
);
|
||||
if (res == null) {
|
||||
context.showSnackBar(libL10n.fail);
|
||||
return;
|
||||
}
|
||||
context.pop(const EditorPageRet(editExistedOk: true));
|
||||
return;
|
||||
}
|
||||
// else it's a text editor
|
||||
// return the text to the previous page
|
||||
context.pop(EditorPageRet(result: _controller.text));
|
||||
},
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildBody() {
|
||||
return SingleChildScrollView(
|
||||
child: CodeTheme(
|
||||
data: CodeThemeData(styles: _codeTheme),
|
||||
child: CodeField(
|
||||
wrap: Stores.setting.editorSoftWrap.fetch(),
|
||||
focusNode: _focusNode,
|
||||
controller: _controller,
|
||||
textStyle: _textStyle,
|
||||
lineNumberStyle: const LineNumberStyle(
|
||||
width: 47,
|
||||
margin: 7,
|
||||
),
|
||||
),
|
||||
));
|
||||
void _pop() async {
|
||||
if (!_saved) {
|
||||
final ret = await context.showRoundDialog(
|
||||
title: libL10n.attention,
|
||||
child: Text(libL10n.askContinue(libL10n.exit)),
|
||||
actions: Btnx.cancelOk,
|
||||
);
|
||||
if (ret != true) return;
|
||||
}
|
||||
context.pop();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,9 +9,26 @@ final class _AppBar extends StatelessWidget implements PreferredSizeWidget {
|
||||
Widget build(BuildContext context) {
|
||||
return SizedBox(
|
||||
height: preferredSize.height,
|
||||
child: isIOS
|
||||
? const Center(child: Text(BuildData.name, style: UIs.text15Bold))
|
||||
: null,
|
||||
child: isIOS ? Center(child: _buildLogo()) : null,
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildLogo() {
|
||||
final text = Text(
|
||||
BuildData.name,
|
||||
style: TextStyle(
|
||||
fontSize: 10,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: UIs.primaryColor.isBrightColor ? Colors.black : Colors.white,
|
||||
),
|
||||
);
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
color: UIs.primaryColor,
|
||||
borderRadius: BorderRadius.circular(11),
|
||||
),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 1),
|
||||
child: text,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -23,4 +40,4 @@ final class _AppBar extends StatelessWidget implements PreferredSizeWidget {
|
||||
};
|
||||
return Size.fromHeight(height);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import 'package:fl_lib/fl_lib.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:server_box/core/channel/home_widget.dart';
|
||||
import 'package:server_box/core/chan.dart';
|
||||
import 'package:server_box/data/model/app/tab.dart';
|
||||
import 'package:server_box/data/provider/app.dart';
|
||||
import 'package:server_box/data/provider/server.dart';
|
||||
@@ -76,7 +76,7 @@ class _HomePageState extends State<HomePage>
|
||||
if (!ServerProvider.isAutoRefreshOn) {
|
||||
ServerProvider.startAutoRefresh();
|
||||
}
|
||||
HomeWidgetMC.update();
|
||||
MethodChans.updateHomeWidget();
|
||||
break;
|
||||
case AppLifecycleState.paused:
|
||||
_shouldAuth = true;
|
||||
@@ -172,7 +172,7 @@ class _HomePageState extends State<HomePage>
|
||||
context: context,
|
||||
);
|
||||
}
|
||||
HomeWidgetMC.update();
|
||||
MethodChans.updateHomeWidget();
|
||||
await ServerProvider.refresh();
|
||||
}
|
||||
|
||||
|
||||
@@ -26,8 +26,8 @@ class _IPerfPageState extends State<IPerfPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: const CustomAppBar(
|
||||
title: Text('iperf'),
|
||||
appBar: AppBar(
|
||||
title: const Text('iperf'),
|
||||
),
|
||||
body: _buildBody(),
|
||||
floatingActionButton: _buildFAB(),
|
||||
|
||||
@@ -78,7 +78,7 @@ class _PrivateKeyEditPageState extends State<PrivateKeyEditPage> {
|
||||
);
|
||||
}
|
||||
|
||||
CustomAppBar _buildAppBar() {
|
||||
AppBar _buildAppBar() {
|
||||
final actions = [
|
||||
IconButton(
|
||||
tooltip: libL10n.delete,
|
||||
@@ -101,7 +101,7 @@ class _PrivateKeyEditPageState extends State<PrivateKeyEditPage> {
|
||||
icon: const Icon(Icons.delete),
|
||||
)
|
||||
];
|
||||
return CustomAppBar(
|
||||
return AppBar(
|
||||
title: Text(libL10n.edit),
|
||||
actions: widget.pki == null ? null : actions,
|
||||
);
|
||||
|
||||
@@ -123,7 +123,7 @@ class _ProcessPageState extends State<ProcessPage> {
|
||||
);
|
||||
}
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(
|
||||
appBar: AppBar(
|
||||
centerTitle: true,
|
||||
title: TwoLineText(up: widget.spi.name, down: l10n.process),
|
||||
actions: actions,
|
||||
|
||||
@@ -52,7 +52,7 @@ final class _PvePageState extends State<PvePage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(
|
||||
appBar: AppBar(
|
||||
title: TwoLineText(up: 'PVE', down: widget.spi.name),
|
||||
actions: [
|
||||
ValBuilder(
|
||||
|
||||
@@ -87,7 +87,7 @@ class _ServerDetailPageState extends State<ServerDetailPage>
|
||||
final s = widget.spi.server;
|
||||
if (s == null) {
|
||||
return Scaffold(
|
||||
appBar: const CustomAppBar(),
|
||||
appBar: AppBar(),
|
||||
body: Center(child: Text(libL10n.empty)),
|
||||
);
|
||||
}
|
||||
@@ -120,9 +120,22 @@ class _ServerDetailPageState extends State<ServerDetailPage>
|
||||
);
|
||||
}
|
||||
|
||||
CustomAppBar _buildAppBar(Server si) {
|
||||
return CustomAppBar(
|
||||
title: Text(si.spi.name),
|
||||
AppBar _buildAppBar(Server si) {
|
||||
return AppBar(
|
||||
title: Hero(
|
||||
tag: 'home_card_title_${si.spi.id}',
|
||||
transitionOnUserGestures: true,
|
||||
child: Material(
|
||||
color: Colors.transparent,
|
||||
child: Text(
|
||||
si.spi.name,
|
||||
style: TextStyle(
|
||||
fontSize: 20,
|
||||
color: context.isDark ? Colors.white : Colors.black,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
actions: [
|
||||
QrShareBtn(
|
||||
data: si.spi.toJsonString(),
|
||||
@@ -144,7 +157,7 @@ class _ServerDetailPageState extends State<ServerDetailPage>
|
||||
|
||||
Widget _buildLogo(Server si) {
|
||||
var logoUrl = si.spi.custom?.logoUrl ??
|
||||
_settings.serverLogoUrl.fetch().selfIfNotNullEmpty;
|
||||
_settings.serverLogoUrl.fetch().selfNotEmptyOrNull;
|
||||
if (logoUrl == null) return UIs.placeholder;
|
||||
|
||||
final dist = si.status.more[StatusCmdType.sys]?.dist;
|
||||
|
||||
@@ -110,7 +110,7 @@ class _ServerEditPageState extends State<ServerEditPage> with AfterLayoutMixin {
|
||||
return GestureDetector(
|
||||
onTap: () => _focusScope.unfocus(),
|
||||
child: Scaffold(
|
||||
appBar: CustomAppBar(title: Text(libL10n.edit), actions: actions),
|
||||
appBar: AppBar(title: Text(libL10n.edit), actions: actions),
|
||||
body: _buildForm(),
|
||||
floatingActionButton: _buildFAB(),
|
||||
),
|
||||
@@ -438,7 +438,7 @@ class _ServerEditPageState extends State<ServerEditPage> with AfterLayoutMixin {
|
||||
leading: const Icon(MingCute.doc_line),
|
||||
title: Text(libL10n.doc),
|
||||
trailing: const Icon(Icons.open_in_new, size: 17),
|
||||
onTap: () => l10n.customCmdDocUrl.launch(),
|
||||
onTap: l10n.customCmdDocUrl.launchUrl,
|
||||
).cardx,
|
||||
],
|
||||
);
|
||||
@@ -572,13 +572,13 @@ class _ServerEditPageState extends State<ServerEditPage> with AfterLayoutMixin {
|
||||
}
|
||||
final customCmds = _customCmds.value;
|
||||
final custom = ServerCustom(
|
||||
pveAddr: _pveAddrCtrl.text.selfIfNotNullEmpty,
|
||||
pveAddr: _pveAddrCtrl.text.selfNotEmptyOrNull,
|
||||
pveIgnoreCert: _pveIgnoreCert.value,
|
||||
cmds: customCmds.isEmpty ? null : customCmds,
|
||||
preferTempDev: _preferTempDevCtrl.text.selfIfNotNullEmpty,
|
||||
logoUrl: _logoUrlCtrl.text.selfIfNotNullEmpty,
|
||||
netDev: _netDevCtrl.text.selfIfNotNullEmpty,
|
||||
scriptDir: _scriptDirCtrl.text.selfIfNotNullEmpty,
|
||||
preferTempDev: _preferTempDevCtrl.text.selfNotEmptyOrNull,
|
||||
logoUrl: _logoUrlCtrl.text.selfNotEmptyOrNull,
|
||||
netDev: _netDevCtrl.text.selfNotEmptyOrNull,
|
||||
scriptDir: _scriptDirCtrl.text.selfNotEmptyOrNull,
|
||||
);
|
||||
|
||||
final wolEmpty = _wolMacCtrl.text.isEmpty &&
|
||||
@@ -589,7 +589,7 @@ class _ServerEditPageState extends State<ServerEditPage> with AfterLayoutMixin {
|
||||
: WakeOnLanCfg(
|
||||
mac: _wolMacCtrl.text,
|
||||
ip: _wolIpCtrl.text,
|
||||
pwd: _wolPwdCtrl.text.selfIfNotNullEmpty,
|
||||
pwd: _wolPwdCtrl.text.selfNotEmptyOrNull,
|
||||
);
|
||||
if (wol != null) {
|
||||
final wolValidation = wol.validate();
|
||||
@@ -606,12 +606,12 @@ class _ServerEditPageState extends State<ServerEditPage> with AfterLayoutMixin {
|
||||
ip: _ipController.text,
|
||||
port: int.parse(_portController.text),
|
||||
user: _usernameController.text,
|
||||
pwd: _passwordController.text.selfIfNotNullEmpty,
|
||||
pwd: _passwordController.text.selfNotEmptyOrNull,
|
||||
keyId: _keyIdx.value != null
|
||||
? PrivateKeyProvider.pkis.value.elementAt(_keyIdx.value!).id
|
||||
: null,
|
||||
tags: _tags.value.isEmpty ? null : _tags.value.toList(),
|
||||
alterUrl: _altUrlController.text.selfIfNotNullEmpty,
|
||||
alterUrl: _altUrlController.text.selfNotEmptyOrNull,
|
||||
autoConnect: _autoConnect.value,
|
||||
jumpId: _jumpServer.value,
|
||||
custom: custom,
|
||||
|
||||
@@ -49,14 +49,14 @@ class _ServerPageState extends State<ServerPage>
|
||||
bool _useDoubleColumn = false;
|
||||
|
||||
final _scrollController = ScrollController();
|
||||
final _autoHideKey = GlobalKey<AutoHideState>();
|
||||
final _autoHideCtrl = AutoHideController();
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
_timer?.cancel();
|
||||
_scrollController.dispose();
|
||||
_autoHideKey.currentState?.dispose();
|
||||
_autoHideCtrl.dispose();
|
||||
_tag.dispose();
|
||||
}
|
||||
|
||||
@@ -105,7 +105,7 @@ class _ServerPageState extends State<ServerPage>
|
||||
),
|
||||
body: GestureDetector(
|
||||
behavior: HitTestBehavior.opaque,
|
||||
onTap: () => _autoHideKey.currentState?.show(),
|
||||
onTap: () => _autoHideCtrl.show(),
|
||||
child: ListenableBuilder(
|
||||
listenable: Stores.setting.textFactor.listenable(),
|
||||
builder: (_, __) {
|
||||
@@ -115,10 +115,10 @@ class _ServerPageState extends State<ServerPage>
|
||||
),
|
||||
),
|
||||
floatingActionButton: AutoHide(
|
||||
key: _autoHideKey,
|
||||
direction: AxisDirection.right,
|
||||
offset: 75,
|
||||
controller: _scrollController,
|
||||
scrollController: _scrollController,
|
||||
hideController: _autoHideCtrl,
|
||||
child: FloatingActionButton(
|
||||
heroTag: 'addServer',
|
||||
onPressed: () => ServerEditPage.route.go(context),
|
||||
@@ -316,44 +316,41 @@ class _ServerPageState extends State<ServerPage>
|
||||
final cardStatus = _getCardNoti(id);
|
||||
final title = _buildServerCardTitle(srv);
|
||||
|
||||
return ListenableBuilder(
|
||||
listenable: cardStatus,
|
||||
builder: (_, __) {
|
||||
final List<Widget> children = [title];
|
||||
if (srv.conn == ServerConn.finished) {
|
||||
if (cardStatus.value.flip) {
|
||||
children.addAll(_buildFlippedCard(srv));
|
||||
} else {
|
||||
children.addAll(_buildNormalCard(srv.status, srv.spi));
|
||||
}
|
||||
return cardStatus.listenVal((_) {
|
||||
final List<Widget> children = [title];
|
||||
if (srv.conn == ServerConn.finished) {
|
||||
if (cardStatus.value.flip) {
|
||||
children.add(_buildFlippedCard(srv));
|
||||
} else {
|
||||
children.addAll(_buildNormalCard(srv.status, srv.spi));
|
||||
}
|
||||
}
|
||||
|
||||
final height = _calcCardHeight(srv.conn, cardStatus.value.flip);
|
||||
return AnimatedContainer(
|
||||
duration: const Duration(milliseconds: 377),
|
||||
curve: Curves.fastEaseInToSlowEaseOut,
|
||||
height: height,
|
||||
// Use [OverflowBox] to dismiss the warning of [Column] overflow.
|
||||
child: OverflowBox(
|
||||
// If `height == _kCardHeightMin`, the `maxHeight` will be ignored.
|
||||
//
|
||||
// You can comment the `maxHeight` then connect&disconnect the server
|
||||
// to see the difference.
|
||||
maxHeight: height != _kCardHeightMin ? height : null,
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: children,
|
||||
),
|
||||
final height = _calcCardHeight(srv.conn, cardStatus.value.flip);
|
||||
return AnimatedContainer(
|
||||
duration: const Duration(milliseconds: 377),
|
||||
curve: Curves.fastEaseInToSlowEaseOut,
|
||||
height: height,
|
||||
// Use [OverflowBox] to dismiss the warning of [Column] overflow.
|
||||
child: OverflowBox(
|
||||
// If `height == _kCardHeightMin`, the `maxHeight` will be ignored.
|
||||
//
|
||||
// You can comment the `maxHeight` then connect&disconnect the server
|
||||
// to see the difference.
|
||||
maxHeight: height != _kCardHeightMin ? height : null,
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: children,
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
List<Widget> _buildFlippedCard(Server srv) {
|
||||
const textStyle = TextStyle(color: Colors.grey);
|
||||
Widget _buildFlippedCard(Server srv) {
|
||||
const color = Colors.grey;
|
||||
const textStyle = TextStyle(fontSize: 13, color: color);
|
||||
final children = [
|
||||
Btn.column(
|
||||
onTap: () => _askFor(
|
||||
@@ -374,7 +371,7 @@ class _ServerPageState extends State<ServerPage>
|
||||
typ: l10n.suspend,
|
||||
name: srv.spi.name,
|
||||
),
|
||||
icon: const Icon(Icons.stop, color: Colors.grey),
|
||||
icon: const Icon(Icons.stop, color: color),
|
||||
text: l10n.suspend,
|
||||
textStyle: textStyle,
|
||||
),
|
||||
@@ -388,7 +385,7 @@ class _ServerPageState extends State<ServerPage>
|
||||
typ: l10n.shutdown,
|
||||
name: srv.spi.name,
|
||||
),
|
||||
icon: const Icon(Icons.power_off, color: Colors.grey),
|
||||
icon: const Icon(Icons.power_off, color: color),
|
||||
text: l10n.shutdown,
|
||||
textStyle: textStyle,
|
||||
),
|
||||
@@ -402,29 +399,29 @@ class _ServerPageState extends State<ServerPage>
|
||||
typ: l10n.reboot,
|
||||
name: srv.spi.name,
|
||||
),
|
||||
icon: const Icon(Icons.restart_alt, color: Colors.grey),
|
||||
icon: const Icon(Icons.restart_alt, color: color),
|
||||
text: l10n.reboot,
|
||||
textStyle: textStyle,
|
||||
),
|
||||
Btn.column(
|
||||
onTap: () => ServerEditPage.route.go(context, args: srv.spi),
|
||||
icon: const Icon(Icons.edit, color: Colors.grey),
|
||||
icon: const Icon(Icons.edit, color: color),
|
||||
text: libL10n.edit,
|
||||
textStyle: textStyle,
|
||||
)
|
||||
];
|
||||
|
||||
final width = (_media.size.width - _cardPad) / children.length;
|
||||
return [
|
||||
UIs.height13,
|
||||
Row(
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(top: 9),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
children: children.map((e) {
|
||||
if (width == 0) return e;
|
||||
return SizedBox(width: width, child: e);
|
||||
}).toList(),
|
||||
),
|
||||
];
|
||||
);
|
||||
}
|
||||
|
||||
List<Widget> _buildNormalCard(ServerStatus ss, Spi spi) {
|
||||
@@ -461,11 +458,20 @@ class _ServerPageState extends State<ServerPage>
|
||||
children: [
|
||||
ConstrainedBox(
|
||||
constraints: BoxConstraints(maxWidth: _media.size.width / 2.3),
|
||||
child: Text(
|
||||
s.spi.name,
|
||||
style: UIs.text13Bold,
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
child: Hero(
|
||||
tag: 'home_card_title_${s.spi.id}',
|
||||
transitionOnUserGestures: true,
|
||||
child: Material(
|
||||
color: Colors.transparent,
|
||||
child: Text(
|
||||
s.spi.name,
|
||||
style: UIs.text13Bold.copyWith(
|
||||
color: context.isDark ? Colors.white : Colors.black,
|
||||
),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
const Icon(
|
||||
@@ -509,10 +515,6 @@ class _ServerPageState extends State<ServerPage>
|
||||
const Icon(MingCute.unlink_2_line, size: 17, color: Colors.grey),
|
||||
() => ServerProvider.closeServer(id: s.spi.id),
|
||||
),
|
||||
_ when Stores.setting.serverTabUseOldUI.fetch() => (
|
||||
ServerFuncBtnsTopRight(spi: s.spi),
|
||||
null,
|
||||
),
|
||||
};
|
||||
|
||||
// Or the loading icon will be rescaled.
|
||||
|
||||
@@ -18,29 +18,26 @@ final class _TopBar extends StatelessWidget implements PreferredSizeWidget {
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Center(
|
||||
child: InkWell(
|
||||
borderRadius: BorderRadius.circular(13),
|
||||
onTap: () => DebugPage.route.go(
|
||||
context,
|
||||
args: const DebugPageArgs(title: 'Logs(${BuildData.build})'),
|
||||
),
|
||||
child: const Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 7),
|
||||
child: Row(
|
||||
children: [
|
||||
Text(
|
||||
BuildData.name,
|
||||
style: TextStyle(fontSize: 20),
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
Icon(
|
||||
Icons.keyboard_arrow_right,
|
||||
color: Colors.grey,
|
||||
size: 17,
|
||||
),
|
||||
],
|
||||
),
|
||||
// Keep this btn. For issue #657.
|
||||
InkWell(
|
||||
borderRadius: BorderRadius.circular(13),
|
||||
onTap: () {
|
||||
SettingsPage.route.go(context);
|
||||
},
|
||||
child: const Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 7, vertical: 3),
|
||||
child: Row(
|
||||
children: [
|
||||
Text(
|
||||
BuildData.name,
|
||||
style: TextStyle(fontSize: 19),
|
||||
),
|
||||
SizedBox(width: 5),
|
||||
Icon(
|
||||
Icons.settings,
|
||||
size: 17,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
@@ -4,7 +4,9 @@ import 'dart:io';
|
||||
import 'package:fl_lib/fl_lib.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_highlight/theme_map.dart';
|
||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||
import 'package:server_box/data/store/setting.dart';
|
||||
|
||||
import 'package:server_box/generated/l10n/l10n.dart';
|
||||
import 'package:icons_plus/icons_plus.dart';
|
||||
import 'package:server_box/core/extension/context/locale.dart';
|
||||
import 'package:server_box/data/res/github_id.dart';
|
||||
@@ -69,38 +71,49 @@ class _SettingsPageState extends State<SettingsPage>
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: TabBar(
|
||||
controller: _tabCtrl,
|
||||
dividerHeight: 0,
|
||||
tabAlignment: TabAlignment.center,
|
||||
isScrollable: true,
|
||||
tabs: SettingsTabs.values
|
||||
.map((e) => Tab(text: e.i18n))
|
||||
.toList(growable: false),
|
||||
appBar: AppBar(
|
||||
title: Text(libL10n.setting, style: const TextStyle(fontSize: 20)),
|
||||
bottom: TabBar(
|
||||
controller: _tabCtrl,
|
||||
dividerHeight: 0,
|
||||
tabAlignment: TabAlignment.center,
|
||||
isScrollable: true,
|
||||
tabs: SettingsTabs.values
|
||||
.map((e) => Tab(text: e.i18n))
|
||||
.toList(growable: false),
|
||||
),
|
||||
actions: [
|
||||
Btn.text(
|
||||
text: 'Logs',
|
||||
onTap: () => DebugPage.route.go(
|
||||
context,
|
||||
args: const DebugPageArgs(title: 'Logs(${BuildData.build})'),
|
||||
),
|
||||
),
|
||||
Btn.icon(
|
||||
icon: const Icon(Icons.delete),
|
||||
onTap: () => context.showRoundDialog(
|
||||
title: libL10n.attention,
|
||||
child: SimpleMarkdown(
|
||||
data: libL10n.askContinue(
|
||||
'${libL10n.delete} **${libL10n.all}** ${libL10n.setting}',
|
||||
),
|
||||
),
|
||||
actions: [
|
||||
CountDownBtn(
|
||||
onTap: () {
|
||||
context.pop();
|
||||
final keys = SettingStore.instance.box.keys;
|
||||
SettingStore.instance.box.deleteAll(keys);
|
||||
context.showSnackBar(libL10n.success);
|
||||
},
|
||||
afterColor: Colors.red,
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
// actions: [
|
||||
// IconButton(
|
||||
// icon: const Icon(Icons.delete),
|
||||
// onPressed: () => context.showRoundDialog(
|
||||
// title: libL10n.attention,
|
||||
// child: SimpleMarkdown(
|
||||
// data: libL10n.askContinue(
|
||||
// '${libL10n.delete} **${libL10n.all}** ${libL10n.setting}',
|
||||
// ),
|
||||
// ),
|
||||
// actions: [
|
||||
// CountDownBtn(
|
||||
// onTap: () {
|
||||
// context.pop();
|
||||
// _setting.box.deleteAll(_setting.box.keys);
|
||||
// context.showSnackBar(libL10n.success);
|
||||
// },
|
||||
// afterColor: Colors.red,
|
||||
// )
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
body: TabBarView(controller: _tabCtrl, children: SettingsTabs.pages),
|
||||
);
|
||||
}
|
||||
@@ -133,19 +146,20 @@ final class _AppAboutPageState extends State<AppAboutPage>
|
||||
),
|
||||
UIs.height13,
|
||||
SizedBox(
|
||||
height: 47,
|
||||
height: 77,
|
||||
child: ListView(
|
||||
padding: const EdgeInsets.symmetric(vertical: 13, horizontal: 7),
|
||||
scrollDirection: Axis.horizontal,
|
||||
children: <Widget>[
|
||||
Btn.elevated(
|
||||
icon: const Icon(Icons.edit_document),
|
||||
text: 'Wiki',
|
||||
onTap: Urls.appWiki.launch,
|
||||
onTap: Urls.appWiki.launchUrl,
|
||||
),
|
||||
Btn.elevated(
|
||||
icon: const Icon(Icons.feedback),
|
||||
text: libL10n.feedback,
|
||||
onTap: Urls.appHelp.launch,
|
||||
onTap: Urls.appHelp.launchUrl,
|
||||
),
|
||||
Btn.elevated(
|
||||
icon: const Icon(MingCute.question_fill),
|
||||
@@ -291,6 +305,7 @@ final class _AppSettingsPageState extends State<AppSettingsPage> {
|
||||
_buildEditorTheme(),
|
||||
_buildEditorDarkTheme(),
|
||||
_buildEditorHighlight(),
|
||||
_buildEditorCloseAfterEdit(),
|
||||
].map((e) => CardX(child: e)).toList(),
|
||||
);
|
||||
}
|
||||
@@ -298,7 +313,7 @@ final class _AppSettingsPageState extends State<AppSettingsPage> {
|
||||
Widget _buildCheckUpdate() {
|
||||
return ListTile(
|
||||
leading: const Icon(Icons.update),
|
||||
title: Text(libL10n.autoCheckUpdate),
|
||||
title: Text(libL10n.checkUpdate),
|
||||
subtitle: ValBuilder(
|
||||
listenable: AppUpdateIface.newestBuild,
|
||||
builder: (val) {
|
||||
@@ -378,19 +393,10 @@ final class _AppSettingsPageState extends State<AppSettingsPage> {
|
||||
)
|
||||
];
|
||||
if (!_setting.useSystemPrimaryColor.fetch()) {
|
||||
children.addAll([
|
||||
Input(
|
||||
onSubmitted: _onSaveColor,
|
||||
controller: ctrl,
|
||||
hint: '#8b2252',
|
||||
icon: Icons.colorize,
|
||||
suggestion: false,
|
||||
),
|
||||
ColorPicker(
|
||||
color: Color(_setting.colorSeed.fetch()),
|
||||
onColorChanged: (c) => ctrl.text = c.toHex,
|
||||
)
|
||||
]);
|
||||
children.add(ColorPicker(
|
||||
color: Color(_setting.colorSeed.fetch()),
|
||||
onColorChanged: (c) => ctrl.text = c.toHex,
|
||||
));
|
||||
}
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
@@ -404,13 +410,13 @@ final class _AppSettingsPageState extends State<AppSettingsPage> {
|
||||
}
|
||||
|
||||
void _onSaveColor(String s) {
|
||||
final color = s.hexToColor;
|
||||
final color = s.fromColorHex;
|
||||
if (color == null) {
|
||||
context.showSnackBar(libL10n.fail);
|
||||
return;
|
||||
}
|
||||
UIs.colorSeed = color;
|
||||
_setting.colorSeed.put(color.value);
|
||||
_setting.colorSeed.put(color.value255);
|
||||
context.pop();
|
||||
Future.delayed(Durations.medium1, RNodes.app.notify);
|
||||
}
|
||||
@@ -837,15 +843,10 @@ final class _AppSettingsPageState extends State<AppSettingsPage> {
|
||||
leading: const Icon(Icons.delete_forever),
|
||||
trailing: const Icon(Icons.keyboard_arrow_right),
|
||||
onTap: () async {
|
||||
final keys = Stores.server.box.keys.toList();
|
||||
keys.removeWhere((element) => element == BoxX.lastModifiedKey);
|
||||
final strKeys = List<String>.empty(growable: true);
|
||||
for (final key in keys) {
|
||||
if (key is String) strKeys.add(key);
|
||||
}
|
||||
final keys = Stores.server.keys();
|
||||
final deleteKeys = await context.showPickDialog<String>(
|
||||
clearable: true,
|
||||
items: strKeys,
|
||||
items: keys.toList(),
|
||||
);
|
||||
if (deleteKeys == null) return;
|
||||
|
||||
@@ -965,8 +966,8 @@ final class _AppSettingsPageState extends State<AppSettingsPage> {
|
||||
);
|
||||
}
|
||||
|
||||
void _showFontSizeDialog(StorePropertyBase<double> property) {
|
||||
final ctrller = TextEditingController(text: property.fetch().toString());
|
||||
void _showFontSizeDialog(HiveProp<double> property) {
|
||||
final ctrller = TextEditingController(text: property.get().toString());
|
||||
void onSave() {
|
||||
context.pop();
|
||||
final fontSize = double.tryParse(ctrller.text);
|
||||
@@ -977,7 +978,7 @@ final class _AppSettingsPageState extends State<AppSettingsPage> {
|
||||
);
|
||||
return;
|
||||
}
|
||||
property.put(fontSize);
|
||||
property.set(fontSize);
|
||||
}
|
||||
|
||||
context.showRoundDialog(
|
||||
@@ -1081,7 +1082,7 @@ final class _AppSettingsPageState extends State<AppSettingsPage> {
|
||||
return ExpandTile(
|
||||
leading: const Icon(MingCute.more_3_fill),
|
||||
title: Text(l10n.more),
|
||||
initiallyExpanded: isDesktop,
|
||||
initiallyExpanded: false,
|
||||
children: [
|
||||
_buildRememberPwdInMem(),
|
||||
_buildTextScaler(),
|
||||
@@ -1144,7 +1145,7 @@ final class _AppSettingsPageState extends State<AppSettingsPage> {
|
||||
return ExpandTile(
|
||||
leading: const Icon(MingCute.more_3_fill),
|
||||
title: Text(l10n.more),
|
||||
initiallyExpanded: isDesktop,
|
||||
initiallyExpanded: false,
|
||||
children: [
|
||||
_buildBeta(),
|
||||
if (isMobile) _buildWakeLock(),
|
||||
@@ -1249,7 +1250,7 @@ final class _AppSettingsPageState extends State<AppSettingsPage> {
|
||||
ListTile(
|
||||
title: Text(libL10n.doc),
|
||||
trailing: const Icon(Icons.open_in_new),
|
||||
onTap: () => Urls.appWiki.launch(),
|
||||
onTap: Urls.appWiki.launchUrl,
|
||||
),
|
||||
],
|
||||
),
|
||||
@@ -1326,35 +1327,52 @@ final class _AppSettingsPageState extends State<AppSettingsPage> {
|
||||
}
|
||||
|
||||
Future<void> _editRawSettings() async {
|
||||
final map = Stores.setting.box.toJson(includeInternal: false);
|
||||
final map = await Stores.setting.getAllMap(includeInternalKeys: true);
|
||||
final keys = map.keys;
|
||||
|
||||
void onSave(BuildContext context, EditorPageRet ret) {
|
||||
if (ret.typ != EditorPageRetType.text) {
|
||||
context.showRoundDialog(
|
||||
title: libL10n.fail,
|
||||
child: Text(l10n.invalid),
|
||||
);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
final newSettings = json.decode(ret.val) as Map<String, dynamic>;
|
||||
Stores.setting.box.putAll(newSettings);
|
||||
final newKeys = newSettings.keys;
|
||||
final removedKeys = keys.where((e) => !newKeys.contains(e));
|
||||
for (final key in removedKeys) {
|
||||
Stores.setting.box.delete(key);
|
||||
}
|
||||
} catch (e, trace) {
|
||||
context.showRoundDialog(
|
||||
title: libL10n.error,
|
||||
child: Text('${l10n.save}:\n$e'),
|
||||
);
|
||||
Loggers.app.warning('Update json settings failed', e, trace);
|
||||
}
|
||||
}
|
||||
|
||||
/// Encode [map] to String with indent `\t`
|
||||
final text = jsonIndentEncoder.convert(map);
|
||||
final ret = await EditorPage.route.go(
|
||||
await EditorPage.route.go(
|
||||
context,
|
||||
args: EditorPageArgs(
|
||||
text: text,
|
||||
langCode: 'json',
|
||||
title: libL10n.setting,
|
||||
onSave: onSave,
|
||||
),
|
||||
);
|
||||
final result = ret?.result;
|
||||
if (result == null) return;
|
||||
try {
|
||||
final newSettings = json.decode(result) as Map<String, dynamic>;
|
||||
Stores.setting.box.putAll(newSettings);
|
||||
final newKeys = newSettings.keys;
|
||||
final removedKeys = keys.where((e) => !newKeys.contains(e));
|
||||
for (final key in removedKeys) {
|
||||
Stores.setting.box.delete(key);
|
||||
}
|
||||
} catch (e, trace) {
|
||||
context.showRoundDialog(
|
||||
title: libL10n.error,
|
||||
child: Text('${l10n.save}:\n$e'),
|
||||
);
|
||||
Loggers.app.warning('Update json settings failed', e, trace);
|
||||
}
|
||||
}
|
||||
|
||||
Widget _buildEditorCloseAfterEdit() {
|
||||
return ListTile(
|
||||
leading: const Icon(MingCute.edit_fill),
|
||||
title: Text(l10n.closeAfterSave),
|
||||
trailing: StoreSwitch(prop: _setting.closeAfterSave),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,10 +17,11 @@ class _AndroidSettingsPageState extends State<AndroidSettingsPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: const CustomAppBar(title: Text('Android')),
|
||||
appBar: AppBar(title: const Text('Android')),
|
||||
body: ListView(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 17),
|
||||
children: [
|
||||
// _buildFgService(),
|
||||
_buildBgRun(),
|
||||
_buildAndroidWidgetSharedPreference(),
|
||||
if (BioAuth.isPlatformSupported)
|
||||
@@ -30,6 +31,13 @@ class _AndroidSettingsPageState extends State<AndroidSettingsPage> {
|
||||
);
|
||||
}
|
||||
|
||||
// Widget _buildFgService() {
|
||||
// return ListTile(
|
||||
// title: TipText(l10n.fgService, l10n.fgServiceTip),
|
||||
// trailing: StoreSwitch(prop: Stores.setting.fgService),
|
||||
// );
|
||||
// }
|
||||
|
||||
Widget _buildBgRun() {
|
||||
return ListTile(
|
||||
title: TipText(l10n.bgRun, l10n.bgRunTip),
|
||||
@@ -42,11 +50,11 @@ class _AndroidSettingsPageState extends State<AndroidSettingsPage> {
|
||||
final keysDel = old.keys.toSet().difference(map.keys.toSet());
|
||||
for (final key in keysDel) {
|
||||
if (!key.startsWith(_homeWidgetPrefPrefix)) continue;
|
||||
PrefStore.remove(key);
|
||||
PrefStore.shared.remove(key);
|
||||
}
|
||||
for (final entry in map.entries) {
|
||||
if (!entry.key.startsWith(_homeWidgetPrefPrefix)) continue;
|
||||
PrefStore.set(entry.key, entry.value);
|
||||
PrefStore.shared.set(entry.key, entry.value);
|
||||
}
|
||||
context.showSnackBar(libL10n.success);
|
||||
} catch (e) {
|
||||
@@ -60,8 +68,10 @@ class _AndroidSettingsPageState extends State<AndroidSettingsPage> {
|
||||
trailing: const Icon(Icons.keyboard_arrow_right),
|
||||
onTap: () async {
|
||||
final data = <String, String>{};
|
||||
for (final key in PrefStore.keys()) {
|
||||
final val = PrefStore.get<String>(key);
|
||||
final keys = await PrefStore.shared.keys();
|
||||
|
||||
for (final key in keys) {
|
||||
final val = PrefStore.shared.get<String>(key);
|
||||
if (val != null) {
|
||||
data[key] = val;
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ class _IOSSettingsPageState extends State<IOSSettingsPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: const CustomAppBar(title: Text('iOS')),
|
||||
appBar: AppBar(title: const Text('iOS')),
|
||||
body: ListView(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 17),
|
||||
children: [
|
||||
|
||||
@@ -17,7 +17,7 @@ class _ServerDetailOrderPageState extends State<ServerDetailOrderPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(title: Text(l10n.serverDetailOrder)),
|
||||
appBar: AppBar(title: Text(l10n.serverDetailOrder)),
|
||||
body: _buildBody(),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ class _ServerDetailOrderPageState extends State<ServerFuncBtnsOrderPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(title: Text(l10n.sequence)),
|
||||
appBar: AppBar(title: Text(l10n.sequence)),
|
||||
body: _buildBody(),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ class _ServerOrderPageState extends State<ServerOrderPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(title: Text(l10n.serverOrder)),
|
||||
appBar: AppBar(title: Text(l10n.serverOrder)),
|
||||
body: _buildBody(),
|
||||
);
|
||||
}
|
||||
@@ -45,20 +45,20 @@ class _ServerOrderPageState extends State<ServerOrderPage> {
|
||||
}
|
||||
|
||||
Widget _buildBody() {
|
||||
final orderNode = ServerProvider.serverOrder;
|
||||
return orderNode.listenVal((order) {
|
||||
final orders = ServerProvider.serverOrder;
|
||||
return orders.listenVal((order) {
|
||||
if (order.isEmpty) {
|
||||
return Center(child: Text(libL10n.empty));
|
||||
}
|
||||
return ReorderableListView.builder(
|
||||
footer: const SizedBox(height: 77),
|
||||
onReorder: (oldIndex, newIndex) => setState(() {
|
||||
orderNode.value.move(
|
||||
orders.value.move(
|
||||
oldIndex,
|
||||
newIndex,
|
||||
property: Stores.setting.serverOrder,
|
||||
);
|
||||
orderNode.notify();
|
||||
orders.notify();
|
||||
}),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 7, vertical: 3),
|
||||
buildDefaultDragHandles: false,
|
||||
|
||||
@@ -17,7 +17,7 @@ class _SSHVirtKeySettingPageState extends State<SSHVirtKeySettingPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(title: Text(l10n.editVirtKeys)),
|
||||
appBar: AppBar(title: Text(l10n.editVirtKeys)),
|
||||
body: Column(
|
||||
children: [
|
||||
Padding(
|
||||
|
||||
@@ -38,7 +38,7 @@ class _SnippetEditPageState extends State<SnippetEditPage>
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(
|
||||
appBar: AppBar(
|
||||
title: Text(libL10n.edit),
|
||||
actions: _buildAppBarActions(),
|
||||
),
|
||||
|
||||
@@ -11,7 +11,7 @@ class SnippetResultPage extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(title: Text(l10n.result)),
|
||||
appBar: AppBar(title: Text(l10n.result)),
|
||||
body: _buildBody(),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ import 'package:fl_lib/fl_lib.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:server_box/core/channel/bg_run.dart';
|
||||
import 'package:server_box/core/chan.dart';
|
||||
import 'package:server_box/core/extension/context/locale.dart';
|
||||
import 'package:server_box/core/utils/ssh_auth.dart';
|
||||
import 'package:server_box/core/utils/server.dart';
|
||||
@@ -76,7 +76,6 @@ class SSHPageState extends State<SSHPage>
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
_virtKeyLongPressTimer?.cancel();
|
||||
_terminalController.dispose();
|
||||
_discontinuityTimer?.cancel();
|
||||
@@ -84,9 +83,10 @@ class SSHPageState extends State<SSHPage>
|
||||
if (--_sshConnCount <= 0) {
|
||||
WakelockPlus.disable();
|
||||
if (isAndroid) {
|
||||
BgRunMC.stopService();
|
||||
MethodChans.stopService();
|
||||
}
|
||||
}
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -99,7 +99,7 @@ class SSHPageState extends State<SSHPage>
|
||||
if (++_sshConnCount == 1) {
|
||||
WakelockPlus.enable();
|
||||
if (isAndroid) {
|
||||
BgRunMC.startService();
|
||||
MethodChans.startService();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -112,7 +112,7 @@ class SSHPageState extends State<SSHPage>
|
||||
2 => true,
|
||||
_ => context.isDark,
|
||||
};
|
||||
_media = context.media;
|
||||
_media = context.mediaQuery;
|
||||
|
||||
_terminalTheme = _isDark ? TerminalThemes.dark : TerminalThemes.light;
|
||||
_terminalTheme = _terminalTheme.copyWith(selectionCursor: UIs.primaryColor);
|
||||
@@ -270,6 +270,161 @@ class SSHPageState extends State<SSHPage>
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
bool get wantKeepAlive => true;
|
||||
|
||||
void _initStoredCfg() {
|
||||
final fontFamilly = Stores.setting.fontPath.fetch().getFileName();
|
||||
final textSize = Stores.setting.termFontSize.fetch();
|
||||
final textStyle = TextStyle(
|
||||
fontFamily: fontFamilly,
|
||||
fontSize: textSize,
|
||||
);
|
||||
|
||||
_terminalStyle = TerminalStyle.fromTextStyle(textStyle);
|
||||
}
|
||||
|
||||
Future<void> _showHelp() async {
|
||||
if (Stores.setting.sshTermHelpShown.fetch()) return;
|
||||
|
||||
return await context.showRoundDialog(
|
||||
title: libL10n.doc,
|
||||
child: Text(l10n.sshTermHelp),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
Stores.setting.sshTermHelpShown.put(true);
|
||||
context.pop();
|
||||
},
|
||||
child: Text(l10n.noPromptAgain),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
FutureOr<void> afterFirstLayout(BuildContext context) async {
|
||||
await _showHelp();
|
||||
await _initTerminal();
|
||||
|
||||
if (Stores.setting.sshWakeLock.fetch()) WakelockPlus.enable();
|
||||
}
|
||||
}
|
||||
|
||||
extension _Init on SSHPageState {
|
||||
Future<void> _initTerminal() async {
|
||||
_writeLn(l10n.waitConnection);
|
||||
_client ??= await genClient(
|
||||
widget.spi,
|
||||
onStatus: (p0) {
|
||||
_writeLn(p0.toString());
|
||||
},
|
||||
onKeyboardInteractive: _onKeyboardInteractive,
|
||||
);
|
||||
|
||||
_writeLn('${libL10n.execute}: Shell');
|
||||
final session = await _client?.shell(
|
||||
pty: SSHPtyConfig(
|
||||
width: _terminal.viewWidth,
|
||||
height: _terminal.viewHeight,
|
||||
),
|
||||
environment: widget.spi.envs,
|
||||
);
|
||||
|
||||
//_setupDiscontinuityTimer();
|
||||
|
||||
if (session == null) {
|
||||
_writeLn(libL10n.fail);
|
||||
return;
|
||||
}
|
||||
|
||||
_terminal.buffer.clear();
|
||||
_terminal.buffer.setCursor(0, 0);
|
||||
|
||||
_terminal.onOutput = (data) {
|
||||
session.write(utf8.encode(data));
|
||||
};
|
||||
_terminal.onResize = (width, height, pixelWidth, pixelHeight) {
|
||||
session.resizeTerminal(width, height);
|
||||
};
|
||||
|
||||
_listen(session.stdout);
|
||||
_listen(session.stderr);
|
||||
|
||||
for (final snippet in SnippetProvider.snippets.value) {
|
||||
if (snippet.autoRunOn?.contains(widget.spi.id) == true) {
|
||||
snippet.runInTerm(_terminal, widget.spi);
|
||||
}
|
||||
}
|
||||
|
||||
if (widget.initCmd != null) {
|
||||
_terminal.textInput(widget.initCmd!);
|
||||
_terminal.keyInput(TerminalKey.enter);
|
||||
}
|
||||
|
||||
if (widget.initSnippet != null) {
|
||||
widget.initSnippet!.runInTerm(_terminal, widget.spi);
|
||||
}
|
||||
|
||||
widget.focusNode?.requestFocus();
|
||||
|
||||
await session.done;
|
||||
if (mounted && widget.notFromTab) {
|
||||
context.pop();
|
||||
}
|
||||
widget.onSessionEnd?.call();
|
||||
}
|
||||
|
||||
void _listen(Stream<Uint8List>? stream) {
|
||||
if (stream == null) {
|
||||
return;
|
||||
}
|
||||
stream
|
||||
.cast<List<int>>()
|
||||
.transform(const Utf8Decoder())
|
||||
.listen(_terminal.write);
|
||||
}
|
||||
|
||||
void _setupDiscontinuityTimer() {
|
||||
_discontinuityTimer = Timer.periodic(
|
||||
const Duration(seconds: 5),
|
||||
(_) async {
|
||||
var throwTimeout = true;
|
||||
Future.delayed(const Duration(seconds: 3), () {
|
||||
if (throwTimeout) {
|
||||
_catchTimeout();
|
||||
}
|
||||
});
|
||||
await _client?.ping();
|
||||
throwTimeout = false;
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
void _catchTimeout() {
|
||||
_discontinuityTimer?.cancel();
|
||||
if (!mounted) return;
|
||||
_writeLn('\n\nConnection lost\r\n');
|
||||
context.showRoundDialog(
|
||||
title: libL10n.attention,
|
||||
child: Text('${l10n.disconnected}\n${l10n.goBackQ}'),
|
||||
barrierDismiss: false,
|
||||
actions: Btn.ok(
|
||||
onTap: () {
|
||||
if (mounted) {
|
||||
context.pop();
|
||||
}
|
||||
},
|
||||
).toList,
|
||||
);
|
||||
}
|
||||
|
||||
void _writeLn(String p0) {
|
||||
_terminal.write('$p0\r\n');
|
||||
}
|
||||
}
|
||||
|
||||
extension _VirtKey on SSHPageState {
|
||||
void _doVirtualKey(VirtKey item) {
|
||||
if (item.func != null) {
|
||||
HapticFeedback.mediumImpact();
|
||||
@@ -380,10 +535,6 @@ class SSHPageState extends State<SSHPage>
|
||||
return _terminal.buffer.getText(range);
|
||||
}
|
||||
|
||||
void _writeLn(String p0) {
|
||||
_terminal.write('$p0\r\n');
|
||||
}
|
||||
|
||||
void _initVirtKeys() {
|
||||
final virtKeys = VirtKeyX.loadFromStore();
|
||||
for (int len = 0; len < virtKeys.length; len += 7) {
|
||||
@@ -398,151 +549,4 @@ class SSHPageState extends State<SSHPage>
|
||||
FutureOr<List<String>?> _onKeyboardInteractive(SSHUserInfoRequest req) {
|
||||
return KeybordInteractive.defaultHandle(widget.spi, ctx: context);
|
||||
}
|
||||
|
||||
Future<void> _initTerminal() async {
|
||||
_writeLn(l10n.waitConnection);
|
||||
_client ??= await genClient(
|
||||
widget.spi,
|
||||
onStatus: (p0) {
|
||||
_writeLn(p0.toString());
|
||||
},
|
||||
onKeyboardInteractive: _onKeyboardInteractive,
|
||||
);
|
||||
|
||||
_writeLn('${libL10n.execute}: Shell');
|
||||
final session = await _client?.shell(
|
||||
pty: SSHPtyConfig(
|
||||
width: _terminal.viewWidth,
|
||||
height: _terminal.viewHeight,
|
||||
),
|
||||
environment: widget.spi.envs,
|
||||
);
|
||||
|
||||
//_setupDiscontinuityTimer();
|
||||
|
||||
if (session == null) {
|
||||
_writeLn(libL10n.fail);
|
||||
return;
|
||||
}
|
||||
|
||||
_terminal.buffer.clear();
|
||||
_terminal.buffer.setCursor(0, 0);
|
||||
|
||||
_terminal.onOutput = (data) {
|
||||
session.write(utf8.encode(data));
|
||||
};
|
||||
_terminal.onResize = (width, height, pixelWidth, pixelHeight) {
|
||||
session.resizeTerminal(width, height);
|
||||
};
|
||||
|
||||
_listen(session.stdout);
|
||||
_listen(session.stderr);
|
||||
|
||||
for (final snippet in SnippetProvider.snippets.value) {
|
||||
if (snippet.autoRunOn?.contains(widget.spi.id) == true) {
|
||||
snippet.runInTerm(_terminal, widget.spi);
|
||||
}
|
||||
}
|
||||
|
||||
if (widget.initCmd != null) {
|
||||
_terminal.textInput(widget.initCmd!);
|
||||
_terminal.keyInput(TerminalKey.enter);
|
||||
}
|
||||
|
||||
if (widget.initSnippet != null) {
|
||||
widget.initSnippet!.runInTerm(_terminal, widget.spi);
|
||||
}
|
||||
|
||||
widget.focusNode?.requestFocus();
|
||||
|
||||
await session.done;
|
||||
if (mounted && widget.notFromTab) {
|
||||
context.pop();
|
||||
}
|
||||
widget.onSessionEnd?.call();
|
||||
}
|
||||
|
||||
void _listen(Stream<Uint8List>? stream) {
|
||||
if (stream == null) {
|
||||
return;
|
||||
}
|
||||
stream
|
||||
.cast<List<int>>()
|
||||
.transform(const Utf8Decoder())
|
||||
.listen(_terminal.write);
|
||||
}
|
||||
|
||||
void _setupDiscontinuityTimer() {
|
||||
_discontinuityTimer = Timer.periodic(
|
||||
const Duration(seconds: 5),
|
||||
(_) async {
|
||||
var throwTimeout = true;
|
||||
Future.delayed(const Duration(seconds: 3), () {
|
||||
if (throwTimeout) {
|
||||
_catchTimeout();
|
||||
}
|
||||
});
|
||||
await _client?.ping();
|
||||
throwTimeout = false;
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
void _catchTimeout() {
|
||||
_discontinuityTimer?.cancel();
|
||||
if (!mounted) return;
|
||||
_writeLn('\n\nConnection lost\r\n');
|
||||
context.showRoundDialog(
|
||||
title: libL10n.attention,
|
||||
child: Text('${l10n.disconnected}\n${l10n.goBackQ}'),
|
||||
barrierDismiss: false,
|
||||
actions: Btn.ok(
|
||||
onTap: () {
|
||||
if (mounted) {
|
||||
context.pop();
|
||||
}
|
||||
},
|
||||
).toList,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
bool get wantKeepAlive => true;
|
||||
|
||||
void _initStoredCfg() {
|
||||
final fontFamilly = Stores.setting.fontPath.fetch().getFileName();
|
||||
final textSize = Stores.setting.termFontSize.fetch();
|
||||
final textStyle = TextStyle(
|
||||
fontFamily: fontFamilly,
|
||||
fontSize: textSize,
|
||||
);
|
||||
|
||||
_terminalStyle = TerminalStyle.fromTextStyle(textStyle);
|
||||
}
|
||||
|
||||
Future<void> _showHelp() async {
|
||||
if (Stores.setting.sshTermHelpShown.fetch()) return;
|
||||
|
||||
return await context.showRoundDialog(
|
||||
title: libL10n.doc,
|
||||
child: Text(l10n.sshTermHelp),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
Stores.setting.sshTermHelpShown.put(true);
|
||||
context.pop();
|
||||
},
|
||||
child: Text(l10n.noPromptAgain),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
FutureOr<void> afterFirstLayout(BuildContext context) async {
|
||||
await _showHelp();
|
||||
await _initTerminal();
|
||||
|
||||
if (Stores.setting.sshWakeLock.fetch()) WakelockPlus.enable();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,30 +67,6 @@ class _SSHTabPageState extends State<SSHTabPage>
|
||||
);
|
||||
}
|
||||
|
||||
void _onTapTab(int idx) async {
|
||||
await _toPage(idx);
|
||||
}
|
||||
|
||||
void _onTapClose(String name) async {
|
||||
final confirm = await showDialog<bool>(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return AlertDialog(
|
||||
title: Text(libL10n.attention),
|
||||
content: Text('${libL10n.close} SSH ${l10n.conn}($name) ?'),
|
||||
actions: Btnx.okReds,
|
||||
);
|
||||
},
|
||||
);
|
||||
Future.delayed(Durations.short1, FocusScope.of(context).unfocus);
|
||||
if (confirm != true) return;
|
||||
|
||||
_tabMap.remove(name);
|
||||
_tabRN.notify();
|
||||
_pageCtrl.previousPage(
|
||||
duration: Durations.medium1, curve: Curves.fastEaseInToSlowEaseOut);
|
||||
}
|
||||
|
||||
Widget _buildBody() {
|
||||
return ListenBuilder(
|
||||
listenable: _tabRN,
|
||||
@@ -109,6 +85,11 @@ class _SSHTabPageState extends State<SSHTabPage>
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
bool get wantKeepAlive => true;
|
||||
}
|
||||
|
||||
extension on _SSHTabPageState {
|
||||
void _onTapInitCard(Spi spi) async {
|
||||
final name = () {
|
||||
final reg = RegExp('${spi.name}\\((\\d+)\\)');
|
||||
@@ -155,8 +136,29 @@ class _SSHTabPageState extends State<SSHTabPage>
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
bool get wantKeepAlive => true;
|
||||
void _onTapTab(int idx) async {
|
||||
await _toPage(idx);
|
||||
}
|
||||
|
||||
void _onTapClose(String name) async {
|
||||
final confirm = await showDialog<bool>(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return AlertDialog(
|
||||
title: Text(libL10n.attention),
|
||||
content: Text('${libL10n.close} SSH ${l10n.conn}($name) ?'),
|
||||
actions: Btnx.okReds,
|
||||
);
|
||||
},
|
||||
);
|
||||
Future.delayed(Durations.short1, FocusScope.of(context).unfocus);
|
||||
if (confirm != true) return;
|
||||
|
||||
_tabMap.remove(name);
|
||||
_tabRN.notify();
|
||||
_pageCtrl.previousPage(
|
||||
duration: Durations.medium1, curve: Curves.fastEaseInToSlowEaseOut);
|
||||
}
|
||||
}
|
||||
|
||||
final class _TabBar extends StatelessWidget implements PreferredSizeWidget {
|
||||
@@ -268,7 +270,7 @@ class _AddPage extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
const viewPadding = 7.0;
|
||||
final viewWidth = context.media.size.width - 2 * viewPadding;
|
||||
final viewWidth = context.mediaQuery.size.width - 2 * viewPadding;
|
||||
|
||||
final itemCount = ServerProvider.servers.length;
|
||||
const itemPadding = 1.0;
|
||||
|
||||
@@ -51,9 +51,9 @@ class _LocalFilePageState extends State<LocalFilePage>
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
super.build(context);
|
||||
final title = _path.path.fileName ?? libL10n.file;
|
||||
final title = _path.path.fileNameGetter ?? libL10n.file;
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(
|
||||
appBar: AppBar(
|
||||
title: AnimatedSwitcher(
|
||||
duration: Durations.short3,
|
||||
child: Text(title, key: ValueKey(title)),
|
||||
@@ -65,6 +65,10 @@ class _LocalFilePageState extends State<LocalFilePage>
|
||||
final path = await Pfs.pickFilePath();
|
||||
if (path == null) return;
|
||||
final name = path.getFileName() ?? 'imported';
|
||||
final destinationDir = Directory(_path.path);
|
||||
if (!await destinationDir.exists()) {
|
||||
await destinationDir.create(recursive: true);
|
||||
}
|
||||
await File(path).copy(_path.path.joinPath(name));
|
||||
setState(() {});
|
||||
},
|
||||
@@ -213,14 +217,17 @@ class _LocalFilePageState extends State<LocalFilePage>
|
||||
);
|
||||
return;
|
||||
}
|
||||
final ret = await EditorPage.route.go(
|
||||
|
||||
await EditorPage.route.go(
|
||||
context,
|
||||
args: EditorPageArgs(path: file.absolute.path),
|
||||
args: EditorPageArgs(
|
||||
path: file.absolute.path,
|
||||
onSave: (context, _) {
|
||||
context.showSnackBar(l10n.saved);
|
||||
setState(() {});
|
||||
},
|
||||
),
|
||||
);
|
||||
if (ret?.editExistedOk == true) {
|
||||
context.showSnackBar(l10n.saved);
|
||||
setState(() {});
|
||||
}
|
||||
},
|
||||
),
|
||||
Btn.tile(
|
||||
|
||||
@@ -62,7 +62,7 @@ class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
|
||||
if (isDesktop) children.add(_buildRefreshBtn());
|
||||
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(
|
||||
appBar: AppBar(
|
||||
title: TwoLineText(up: 'SFTP', down: widget.spi.name),
|
||||
actions: children,
|
||||
),
|
||||
@@ -317,19 +317,21 @@ class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
|
||||
);
|
||||
if (suc == null || err != null) return;
|
||||
|
||||
final ret = await EditorPage.route.go(
|
||||
await EditorPage.route.go(
|
||||
context,
|
||||
args: EditorPageArgs(path: localPath),
|
||||
args: EditorPageArgs(
|
||||
path: localPath,
|
||||
onSave: (context, _) {
|
||||
SftpProvider.add(SftpReq(
|
||||
req.spi,
|
||||
remotePath,
|
||||
localPath,
|
||||
SftpReqType.upload,
|
||||
));
|
||||
context.showSnackBar(l10n.added2List);
|
||||
},
|
||||
),
|
||||
);
|
||||
if (ret?.editExistedOk == true) {
|
||||
SftpProvider.add(SftpReq(
|
||||
req.spi,
|
||||
remotePath,
|
||||
localPath,
|
||||
SftpReqType.upload,
|
||||
));
|
||||
context.showSnackBar(l10n.added2List);
|
||||
}
|
||||
}
|
||||
|
||||
void _download(SftpName name) {
|
||||
@@ -591,7 +593,7 @@ class _SftpPageState extends State<SftpPage> with AfterLayoutMixin {
|
||||
String _getRemotePath(SftpName name) {
|
||||
final prePath = _status.path.path;
|
||||
// Only support Linux as remote now, so the seperator is '/'
|
||||
return prePath.joinPath(name.filename, seperator: '/');
|
||||
return prePath.joinPath(name.filename, separator: '/');
|
||||
}
|
||||
|
||||
/// Local file dir + server id + remote path
|
||||
|
||||
@@ -16,7 +16,7 @@ class _SftpMissionPageState extends State<SftpMissionPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(
|
||||
appBar: AppBar(
|
||||
title: Text(l10n.mission, style: UIs.text18),
|
||||
),
|
||||
body: _buildBody(),
|
||||
|
||||
@@ -42,7 +42,7 @@ final class _SystemdPageState extends State<SystemdPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: CustomAppBar(
|
||||
appBar: AppBar(
|
||||
title: const Text('Systemd'),
|
||||
actions: isDesktop
|
||||
? [Btn.icon(icon: const Icon(Icons.refresh), onTap: _pro.getUnits)]
|
||||
@@ -137,28 +137,28 @@ final class _SystemdPageState extends State<SystemdPage> {
|
||||
children: [
|
||||
Icon(func.icon, size: 19),
|
||||
const SizedBox(width: 10),
|
||||
Text(func.name.upperFirst),
|
||||
Text(func.name.capitalize),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildScopeTag(SystemdUnitScope scope) {
|
||||
return _buildTag(scope.name.upperFirst, scope.color, true);
|
||||
return _buildTag(scope.name.capitalize, scope.color, true);
|
||||
}
|
||||
|
||||
Widget _buildStateTag(SystemdUnitState state) {
|
||||
return _buildTag(state.name.upperFirst, state.color);
|
||||
return _buildTag(state.name.capitalize, state.color);
|
||||
}
|
||||
|
||||
Widget _buildTypeTag(SystemdUnitType type) {
|
||||
return _buildTag(type.name.upperFirst);
|
||||
return _buildTag(type.name.capitalize);
|
||||
}
|
||||
|
||||
Widget _buildTag(String tag, [Color? color, bool noPad = false]) {
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
color: color?.withOpacity(0.7) ?? UIs.halfAlpha,
|
||||
color: color?.withValues(alpha: 0.7) ?? UIs.halfAlpha,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: Text(tag, style: UIs.text11)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user