Various updates

This commit is contained in:
JHubi1 2025-03-04 17:24:01 +01:00
parent ad719bc561
commit 7d1d749977
No known key found for this signature in database
GPG Key ID: F538DC3FC5B07498
38 changed files with 4380 additions and 543 deletions

View File

@ -32,7 +32,7 @@ jobs:
- uses: actions/checkout@v4
- uses: subosito/flutter-action@v2
with:
flutter-version: 3.24.5
flutter-version: 3.29.0
- name: Get flutter version
id: version
uses: mikefarah/yq@master

View File

@ -4,7 +4,7 @@
# This file should be version controlled and should not be manually edited.
version:
revision: "761747bfc538b5af34aa0d3fac380f1bc331ec49"
revision: "35c388afb57ef061d06a39b537336c87e0e3d1b1"
channel: "stable"
project_type: app
@ -13,17 +13,11 @@ project_type: app
migration:
platforms:
- platform: root
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1
base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1
- platform: android
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
- platform: web
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
- platform: windows
create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49
create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1
base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1
# User provided section

3
android/.gitignore vendored
View File

@ -5,9 +5,10 @@ gradle-wrapper.jar
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java
.cxx/
# Remember to never publicly share your keystore.
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
# See https://flutter.dev/to/reference-keystore
key.properties
**/*.keystore
**/*.jks

View File

@ -1,70 +0,0 @@
plugins {
id "com.android.application"
id "kotlin-android"
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
id "dev.flutter.flutter-gradle-plugin"
}
def localProperties = new Properties()
def localPropertiesFile = rootProject.file("local.properties")
if (localPropertiesFile.exists()) {
localPropertiesFile.withReader("UTF-8") { reader ->
localProperties.load(reader)
}
}
def flutterVersionCode = localProperties.getProperty("flutter.versionCode")
if (flutterVersionCode == null) {
flutterVersionCode = "1"
}
def flutterVersionName = localProperties.getProperty("flutter.versionName")
if (flutterVersionName == null) {
flutterVersionName = "1.0"
}
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
android {
namespace = "com.freakurl.apps.ollama"
compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
defaultConfig {
applicationId = "com.freakurl.apps.ollama"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdk = flutter.minSdkVersion
targetSdk = flutter.targetSdkVersion
versionCode = flutterVersionCode.toInteger()
versionName = flutterVersionName
}
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
flutter {
source = "../.."
}

View File

@ -0,0 +1,59 @@
import java.util.Properties
import java.io.FileInputStream
plugins {
id("com.android.application")
id("kotlin-android")
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
id("dev.flutter.flutter-gradle-plugin")
}
val keystoreProperties = Properties()
val keystorePropertiesFile = rootProject.file("key.properties")
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}
android {
namespace = "com.freakurl.apps.ollama"
compileSdk = flutter.compileSdkVersion
ndkVersion = "27.0.12077973" // flutter.ndkVersion
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_11.toString()
}
defaultConfig {
applicationId = "com.freakurl.apps.ollama"
// You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion
targetSdk = flutter.targetSdkVersion
versionCode = flutter.versionCode
versionName = flutter.versionName
}
signingConfigs {
create("release") {
keyAlias = keystoreProperties["keyAlias"] as String
keyPassword = keystoreProperties["keyPassword"] as String
storeFile = keystoreProperties["storeFile"]?.let { file(it) }
storePassword = keystoreProperties["storePassword"] as String
}
}
buildTypes {
release {
signingConfig = signingConfigs.getByName("release")
}
}
}
flutter {
source = "../.."
}

View File

@ -2,4 +2,4 @@ package com.freakurl.apps.ollama
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity()
class MainActivity : FlutterActivity()

View File

@ -1,18 +0,0 @@
allprojects {
repositories {
google()
mavenCentral()
}
}
rootProject.buildDir = "../build"
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(":app")
}
tasks.register("clean", Delete) {
delete rootProject.buildDir
}

21
android/build.gradle.kts Normal file
View File

@ -0,0 +1,21 @@
allprojects {
repositories {
google()
mavenCentral()
}
}
val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get()
rootProject.layout.buildDirectory.value(newBuildDir)
subprojects {
val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)
project.layout.buildDirectory.value(newSubprojectBuildDir)
}
subprojects {
project.evaluationDependsOn(":app")
}
tasks.register<Delete>("clean") {
delete(rootProject.layout.buildDirectory)
}

View File

@ -1,3 +1,3 @@
org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError
org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true
android.enableJetifier=true

View File

@ -2,4 +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
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip

View File

@ -1,25 +0,0 @@
pluginManagement {
def flutterSdkPath = {
def properties = new Properties()
file("local.properties").withInputStream { properties.load(it) }
def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
return flutterSdkPath
}()
includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "7.3.0" apply false
id "org.jetbrains.kotlin.android" version "1.9.10" apply false
}
include ":app"

View File

@ -0,0 +1,25 @@
pluginManagement {
val flutterSdkPath = run {
val properties = java.util.Properties()
file("local.properties").inputStream().use { properties.load(it) }
val flutterSdkPath = properties.getProperty("flutter.sdk")
require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" }
flutterSdkPath
}
includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
plugins {
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
id("com.android.application") version "8.7.0" apply false
id("org.jetbrains.kotlin.android") version "1.8.22" apply false
}
include(":app")

3
devtools_options.yaml Normal file
View File

@ -0,0 +1,3 @@
description: This file stores settings for Dart & Flutter DevTools.
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
extensions:

View File

@ -3,3 +3,5 @@ template-arb-file: app_en.arb
preferred-supported-locales: en
output-localization-file: app_localizations.dart
untranslated-messages-file: untranslated_messages.json
synthetic-package: false
output-dir: lib/l10n/gen

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,484 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for German (`de`).
class AppLocalizationsDe extends AppLocalizations {
AppLocalizationsDe([String locale = 'de']) : super(locale);
@override
String get appTitle => 'Ollama';
@override
String get optionNewChat => 'Neuer Chat';
@override
String get optionSettings => 'Einstellungen';
@override
String get optionInstallPwa => 'Webapp installieren';
@override
String get optionNoChatFound => 'Keine Chats gefunden';
@override
String get tipPrefix => 'Tipp: ';
@override
String get tip0 => 'Bearbeite Nachrichten durch langes Tippen';
@override
String get tip1 => 'Lösche Nachrichten durch Doppeltippen';
@override
String get tip2 => 'Das Thema kann in den Einstellungen geändert werden';
@override
String get tip3 => 'Wähle ein multimodales Modell zum Anhängen von Bildern';
@override
String get tip4 => 'Chats werden automatisch gespeichert';
@override
String get deleteChat => 'Löschen';
@override
String get renameChat => 'Umbenennen';
@override
String get takeImage => 'Bild Aufnehmen';
@override
String get uploadImage => 'Bild Hochladen';
@override
String get notAValidImage => 'Kein gültiges Bild';
@override
String get imageOnlyConversation => 'Nur Bild Unterhaltung';
@override
String get messageInputPlaceholder => 'Nachricht';
@override
String get tooltipAttachment => 'Anhang hinzufügen';
@override
String get tooltipSend => 'Senden';
@override
String get tooltipSave => 'Speichern';
@override
String get tooltipLetAIThink => 'Lass KI denken';
@override
String get tooltipAddHostHeaders => 'Host-Header festlegen';
@override
String get tooltipReset => 'Aktuellen Chat zurücksetzen';
@override
String get tooltipOptions => 'Optionen anzeigen';
@override
String get noModelSelected => 'Kein Modell ausgewählt';
@override
String get noHostSelected => 'Kein Host ausgewählt, öffne zum Auswählen die Einstellungen';
@override
String get noSelectedModel => '<selektor>';
@override
String get newChatTitle => 'Unbenannter Chat';
@override
String get modelDialogAddModel => 'Hinzufügen';
@override
String get modelDialogAddPromptTitle => 'Neues Modell hinzufügen';
@override
String get modelDialogAddPromptDescription => 'Das kann entweder ein normaler Name (z.B. \'llama3\') oder Name und Tag (z.B. \'llama3:70b\') sein.';
@override
String get modelDialogAddPromptAlreadyExists => 'Modell existiert bereits';
@override
String get modelDialogAddPromptInvalid => 'Ungültiger Modellname';
@override
String get modelDialogAddAllowanceTitle => 'Proxy erlauben';
@override
String get modelDialogAddAllowanceDescription => 'Ollama App muss überprüfen, ob das eingegebene Modell gültig ist. Dafür senden wir normalerweise eine Webanfrage an die Ollama-Modellliste und überprüfen den Statuscode, aber da gerade der Webclient verwendet wird, können wir das nicht direkt tun. Stattdessen sendet die App die Anfrage an eine andere API, gehostet von JHubi1, um dies für uns zu überprüfen.\nDies ist eine einmalige Anfrage und wird nur gesendet, wenn du ein neues Modell hinzufügst.\nIhre IP-Adresse wird mit der Anfrage gesendet und kann bis zu zehn Minuten gespeichert werden, um Spamming mit potenziell schädlichen Absichten zu verhindern.\nWenn du zustimmst, wird deine Auswahl für die Zukunft gespeichert; wenn nicht, wird nichts gesendet und das Modell wird nicht hinzugefügt.';
@override
String get modelDialogAddAllowanceAllow => 'Erlauben';
@override
String get modelDialogAddAllowanceDeny => 'Ablehnen';
@override
String modelDialogAddAssuranceTitle(String model) {
return '$model hinzufügen?';
}
@override
String modelDialogAddAssuranceDescription(String model) {
return 'Durch Drücken von \'Hinzufügen\' wird das Modell \'$model\' direkt vom Ollama-Server auf deinen Host heruntergeladen.\nJe nach Internetverbindung kann dies eine Weile dauern. Der Vorgang kann nicht abgebrochen werden.\nWenn die App während des Downloads geschlossen wird, wird der Download fortgesetzt, wenn du den Namen erneut in den Modelldialog eingibst.';
}
@override
String get modelDialogAddAssuranceAdd => 'Hinzufügen';
@override
String get modelDialogAddAssuranceCancel => 'Abbrechen';
@override
String get modelDialogAddDownloadPercentLoading => 'lade Fortschritt';
@override
String modelDialogAddDownloadPercent(String percent) {
return 'Download bei $percent%';
}
@override
String get modelDialogAddDownloadFailed => 'Getrennt, versuche es erneut';
@override
String get modelDialogAddDownloadSuccess => 'Download erfolgreich';
@override
String get deleteDialogTitle => 'Chat löschen';
@override
String get deleteDialogDescription => 'Bist du sicher, dass du fortfahren möchtest? Dies wird alle Erinnerungen dieses Chats löschen und kann nicht rückgängig gemacht werden.\nUm diesen Dialog zu deaktivieren, besuche die Einstellungen.';
@override
String get deleteDialogDelete => 'Löschen';
@override
String get deleteDialogCancel => 'Abbrechen';
@override
String get dialogEnterNewTitle => 'Gib bitte einen neuen Titel ein';
@override
String get dialogEditMessageTitle => 'Nachricht bearbeiten';
@override
String get settingsTitleBehavior => 'Verhalten';
@override
String get settingsDescriptionBehavior => 'Ändere das Verhalten der KI nach deinen Wünschen.';
@override
String get settingsTitleInterface => 'Oberfläche';
@override
String get settingsDescriptionInterface => 'Bearbeite das Aussehen und Verhalten von Ollama App.';
@override
String get settingsTitleVoice => 'Voice';
@override
String get settingsDescriptionVoice => 'Voice Mode aktivieren und Spracheinstellungen anpassen.';
@override
String get settingsTitleExport => 'Exportieren';
@override
String get settingsDescriptionExport => 'Exportiere und importiere deinen Chat-Verlauf.';
@override
String get settingsTitleAbout => 'Über';
@override
String get settingsDescriptionAbout => 'Suche nach Updates und erfahre mehr über Ollama App.';
@override
String get settingsSavedAutomatically => 'Einstellungen werden automatisch gespeichert';
@override
String get settingsExperimentalAlpha => 'alpha';
@override
String get settingsExperimentalAlphaDescription => 'Diese Funktion befindet sich im Alpha-Status und funktioniert möglicherweise nicht wie beabsichtigt oder erwartet.\nKritische Probleme und/oder dauerhafte kritische Schäden am Gerät und/oder den verwendeten Diensten können nicht ausgeschlossen werden.\nBenutzung auf eigene Gefahr. Keine Haftung seitens des App-Autors.';
@override
String get settingsExperimentalAlphaFeature => 'Alpha-Funktion, halte, um mehr zu erfahren';
@override
String get settingsExperimentalBeta => 'beta';
@override
String get settingsExperimentalBetaDescription => 'Diese Funktion befindet sich im Beta-Test und funktioniert möglicherweise nicht wie beabsichtigt oder erwartet.\nWeniger schwerwiegende Probleme können auftreten oder auch nicht. Schäden sollten nicht kritisch sein.\nVerwendung auf eigene Gefahr.';
@override
String get settingsExperimentalBetaFeature => 'Beta-Funktion, halte, um mehr zu erfahren';
@override
String get settingsExperimentalDeprecated => 'veraltet';
@override
String get settingsExperimentalDeprecatedDescription => 'Diese Funktion ist veraltet und wird in einer zukünftigen Version entfernt werden.\nEs funktioniert möglicherweise nicht wie beabsichtigt oder erwartet. Benutzung auf eigenes Gefahr.';
@override
String get settingsExperimentalDeprecatedFeature => 'Veraltete Funktion, halte, um mehr zu erfahren';
@override
String get settingsHost => 'Host';
@override
String get settingsHostValid => 'Gültiger Host';
@override
String get settingsHostChecking => 'Host wird Überprüft';
@override
String settingsHostInvalid(String type) {
String _temp0 = intl.Intl.selectLogic(
type,
{
'url': 'Ungültige URL',
'host': 'Ungültiger Host',
'timeout': 'Request Fehlgeschlagen. Server Fehler',
'ratelimit': 'Zu viele Anfragen',
'other': 'Request Fehlgeschlagen',
},
);
return 'Fehler: $_temp0';
}
@override
String get settingsHostHeaderTitle => 'Host-Header festlegen';
@override
String get settingsHostHeaderInvalid => 'Der eingegebene Text ist kein gültiges Header-JSON-Objekt';
@override
String settingsHostInvalidDetailed(String type) {
String _temp0 = intl.Intl.selectLogic(
type,
{
'url': 'Die eingegebene URL ist ungültig. Es handelt sich nicht um ein standardisiertes URL-Format.',
'other': 'Der eingegebene Host ist ungültig. Er kann nicht erreicht werden. Bitte überprüfe den Host und versuche es erneut.',
},
);
return '$_temp0';
}
@override
String get settingsSystemMessage => 'Systemnachricht';
@override
String get settingsUseSystem => 'Systemnachricht verwenden';
@override
String get settingsUseSystemDescription => 'Deaktiviere das Setzen der obigen Systemnachricht und benutze stattdessen die des Modells. Kann nützlich für Modelle mit Model-Files sein';
@override
String get settingsDisableMarkdown => 'Markdown deaktivieren';
@override
String get settingsBehaviorNotUpdatedForOlderChats => 'Verhaltenseinstellungen werden nicht für ältere Chats aktualisiert';
@override
String get settingsShowModelTags => 'Model-Tags anzeigen';
@override
String get settingsPreloadModels => 'Modelle vorladen';
@override
String get settingsResetOnModelChange => 'Zurücksetzen bei Modelländerung';
@override
String get settingsRequestTypeStream => 'Stream';
@override
String get settingsRequestTypeRequest => 'Request';
@override
String get settingsGenerateTitles => 'Titel generieren';
@override
String get settingsEnableEditing => 'Nachrichtenbearbeitung aktivieren';
@override
String get settingsAskBeforeDelete => 'Vor Löschung des Chats fragen';
@override
String get settingsShowTips => 'Tipps in der Seitenleiste anzeigen';
@override
String get settingsKeepModelLoadedAlways => 'Modell immer geladen lassen';
@override
String get settingsKeepModelLoadedNever => 'Modell nicht dauerhaft laden';
@override
String get settingsKeepModelLoadedFor => 'Bestimmte Modell-Ladedauer festlegen';
@override
String settingsKeepModelLoadedSet(String minutes) {
return 'Modell für $minutes Minuten geladen behalten';
}
@override
String get settingsTimeoutMultiplier => 'Timeout Multiplikator';
@override
String get settingsTimeoutMultiplierDescription => 'Wähle den Multiplikator aus, der auf jeden Timeout-Wert in der App angewendet wird. Kann bei einer langsamen Internetverbindung oder einem langsamen Host nützlich sein.';
@override
String get settingsTimeoutMultiplierExample => 'Z.b. Nachrichten-Timeout:';
@override
String get settingsEnableHapticFeedback => 'Haptisches Feedback aktivieren';
@override
String get settingsMaximizeOnStart => 'Maximiert starten';
@override
String get settingsBrightnessSystem => 'System';
@override
String get settingsBrightnessLight => 'Hell';
@override
String get settingsBrightnessDark => 'Dunkel';
@override
String get settingsThemeDevice => 'Gerät';
@override
String get settingsThemeOllama => 'Ollama';
@override
String get settingsTemporaryFixes => 'Temporäre Interface Korrekturen';
@override
String get settingsTemporaryFixesDescription => 'Temporäre Korrekturen für Interface-Probleme aktivieren.\nDrücke lange auf die einzelnen Optionen, um mehr zu erfahren.';
@override
String get settingsTemporaryFixesInstructions => 'Aktiviere keine dieser Einstellungen, solltest du nicht wissen, was sie machen! Die gegebene Lösung funktioniert möglicherweise nicht wie erwartet.\nSie können nicht als final gesehen werden und sollten nicht als dieses bewertet werden. Probleme können auftreten.';
@override
String get settingsTemporaryFixesNoFixes => 'Keine Korrekturen verfügbar';
@override
String get settingsVoicePermissionLoading => 'Lade Sprachberechtigungen ...';
@override
String get settingsVoiceTtsNotSupported => 'Sprachausgabe nicht unterstützt';
@override
String get settingsVoiceTtsNotSupportedDescription => 'Sprachausgabedienste sind nicht für die ausgewählte Sprache verfügbar. Wähle eine andere Sprache im Sprachwähler, um diese wieder zu aktivieren.\nAndere Dienste, wie Spracherkennung und KI-Denken werden noch immer wie gewohnt funktionieren, doch die Interaktion könnte möglicherweise nicht gleich fließend sein.';
@override
String get settingsVoicePermissionNot => 'Berechtigungen nicht erteilt';
@override
String get settingsVoiceNotEnabled => 'Voice Mode nicht aktiviert';
@override
String get settingsVoiceNotSupported => 'Voice-Modus wird nicht unterstützt';
@override
String get settingsVoiceEnable => 'Voice-Modus aktivieren';
@override
String get settingsVoiceNoLanguage => 'Keine Sprache ausgewählt';
@override
String get settingsVoiceLimitLanguage => 'Auf gewählte Sprache beschränken';
@override
String get settingsVoicePunctuation => 'KI Satzzeichen aktivieren';
@override
String get settingsExportChats => 'Chats exportieren';
@override
String get settingsExportChatsSuccess => 'Chats erfolgreich exportiert';
@override
String get settingsImportChats => 'Chats importieren';
@override
String get settingsImportChatsTitle => 'Importieren';
@override
String get settingsImportChatsDescription => 'Der folgende Schritt importiert die Chats aus der ausgewählten Datei. Dadurch werden alle aktuell verfügbaren Chats überschrieben.\nMöchtest du fortfahren?';
@override
String get settingsImportChatsImport => 'Importieren und Löschen';
@override
String get settingsImportChatsCancel => 'Abbrechen';
@override
String get settingsImportChatsSuccess => 'Chats erfolgreich importiert';
@override
String get settingsExportInfo => 'Diese Optionen ermöglichen es dir, deinen Chat-Verlauf zu exportieren und zu importieren. Dies kann nützlich sein, wenn du deinen Chat-Verlauf auf ein anderes Gerät übertragen oder deinen Chat-Verlauf sichern möchtest';
@override
String get settingsExportWarning => 'Mehrere Chatverläufe werden nicht zusammengeführt! Du verlierst deinen aktuellen Chatverlauf, wenn du einen neuen importierst';
@override
String get settingsUpdateCheck => 'Nach Updates suchen';
@override
String get settingsUpdateChecking => 'Suchen nach Updates ...';
@override
String get settingsUpdateLatest => 'Du verwendest die neueste Version';
@override
String settingsUpdateAvailable(String version) {
return 'Update verfügbar (v$version)';
}
@override
String get settingsUpdateRateLimit => 'Kann nicht überprüfen, API-Limit';
@override
String get settingsUpdateIssue => 'Ein Problem ist aufgetreten';
@override
String get settingsUpdateDialogTitle => 'Neue Version verfügbar';
@override
String get settingsUpdateDialogDescription => 'Eine neue Version von Ollama ist verfügbar. Möchtest du sie jetzt herunterladen und installieren?';
@override
String get settingsUpdateChangeLog => 'Versionshinweise';
@override
String get settingsUpdateDialogUpdate => 'Aktualisieren';
@override
String get settingsUpdateDialogCancel => 'Abbrechen';
@override
String get settingsCheckForUpdates => 'Beim Öffnen nach Updates suchen';
@override
String get settingsGithub => 'GitHub';
@override
String get settingsReportIssue => 'Einen Fehler melden';
@override
String get settingsLicenses => 'Lizenzen';
@override
String settingsVersion(String version) {
return 'Ollama App v$version';
}
}

View File

@ -0,0 +1,484 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for English (`en`).
class AppLocalizationsEn extends AppLocalizations {
AppLocalizationsEn([String locale = 'en']) : super(locale);
@override
String get appTitle => 'Ollama';
@override
String get optionNewChat => 'New Chat';
@override
String get optionSettings => 'Settings';
@override
String get optionInstallPwa => 'Install Webapp';
@override
String get optionNoChatFound => 'No chats found';
@override
String get tipPrefix => 'Tip: ';
@override
String get tip0 => 'Edit messages by long taping on them';
@override
String get tip1 => 'Delete messages by double tapping on them';
@override
String get tip2 => 'You can change the theme in settings';
@override
String get tip3 => 'Select a multimodal model to input images';
@override
String get tip4 => 'Chats are automatically saved';
@override
String get deleteChat => 'Delete';
@override
String get renameChat => 'Rename';
@override
String get takeImage => 'Take Image';
@override
String get uploadImage => 'Upload Image';
@override
String get notAValidImage => 'Not a valid image';
@override
String get imageOnlyConversation => 'Image Only Conversation';
@override
String get messageInputPlaceholder => 'Message';
@override
String get tooltipAttachment => 'Add attachment';
@override
String get tooltipSend => 'Send';
@override
String get tooltipSave => 'Save';
@override
String get tooltipLetAIThink => 'Let AI think';
@override
String get tooltipAddHostHeaders => 'Add host headers';
@override
String get tooltipReset => 'Reset current chat';
@override
String get tooltipOptions => 'Show options';
@override
String get noModelSelected => 'No model selected';
@override
String get noHostSelected => 'No host selected, open setting to set one';
@override
String get noSelectedModel => '<selector>';
@override
String get newChatTitle => 'Unnamed Chat';
@override
String get modelDialogAddModel => 'Add';
@override
String get modelDialogAddPromptTitle => 'Add new model';
@override
String get modelDialogAddPromptDescription => 'This can have either be a normal name (e.g. \'llama3\') or name and tag (e.g. \'llama3:70b\').';
@override
String get modelDialogAddPromptAlreadyExists => 'Model already exists';
@override
String get modelDialogAddPromptInvalid => 'Invalid model name';
@override
String get modelDialogAddAllowanceTitle => 'Allow Proxy';
@override
String get modelDialogAddAllowanceDescription => 'Ollama App must check if the entered model is valid. For that, we normally send a web request to the Ollama model list and check the status code, but because you\'re using the web client, we can\'t do that directly. Instead, the app will send the request to a different api, hosted by JHubi1, to check for us.\nThis is a one-time request and will only be sent when you add a new model.\nYour IP address will be sent with the request and might be stored for up to ten minutes to prevent spamming with potential harmful intentions.\nIf you accept, your selection will be remembered in the future; if not, nothing will be sent and the model won\'t be added.';
@override
String get modelDialogAddAllowanceAllow => 'Allow';
@override
String get modelDialogAddAllowanceDeny => 'Deny';
@override
String modelDialogAddAssuranceTitle(String model) {
return 'Add $model?';
}
@override
String modelDialogAddAssuranceDescription(String model) {
return 'Pressing \'Add\' will download the model \'$model\' directly from the Ollama server to your host.\nThis can take a while depending on your internet connection. The action cannot be canceled.\nIf the app is closed during the download, it\'ll resume if you enter the name into the model dialog again.';
}
@override
String get modelDialogAddAssuranceAdd => 'Add';
@override
String get modelDialogAddAssuranceCancel => 'Cancel';
@override
String get modelDialogAddDownloadPercentLoading => 'loading progress';
@override
String modelDialogAddDownloadPercent(String percent) {
return 'download at $percent%';
}
@override
String get modelDialogAddDownloadFailed => 'Disconnected, try again';
@override
String get modelDialogAddDownloadSuccess => 'Download successful';
@override
String get deleteDialogTitle => 'Delete Chat';
@override
String get deleteDialogDescription => 'Are you sure you want to continue? This will wipe all memory of this chat and cannot be undone.\nTo disable this dialog, visit the settings.';
@override
String get deleteDialogDelete => 'Delete';
@override
String get deleteDialogCancel => 'Cancel';
@override
String get dialogEnterNewTitle => 'Enter new title';
@override
String get dialogEditMessageTitle => 'Edit message';
@override
String get settingsTitleBehavior => 'Behavior';
@override
String get settingsDescriptionBehavior => 'Change the behavior of the AI to your liking.';
@override
String get settingsTitleInterface => 'Interface';
@override
String get settingsDescriptionInterface => 'Edit how Ollama App looks and behaves.';
@override
String get settingsTitleVoice => 'Voice';
@override
String get settingsDescriptionVoice => 'Enable voice mode and configure voice settings.';
@override
String get settingsTitleExport => 'Export';
@override
String get settingsDescriptionExport => 'Export and import your chat history.';
@override
String get settingsTitleAbout => 'About';
@override
String get settingsDescriptionAbout => 'Check for updates and learn more about Ollama App.';
@override
String get settingsSavedAutomatically => 'Settings are saved automatically';
@override
String get settingsExperimentalAlpha => 'alpha';
@override
String get settingsExperimentalAlphaDescription => 'This feature is in alpha and may not work as intended or expected.\nCritical issues and/or permanent critical damage to device and/or used services cannot be ruled out.\nUse at your own risk. No liability on the part of the app author.';
@override
String get settingsExperimentalAlphaFeature => 'Alpha feature, hold to learn more';
@override
String get settingsExperimentalBeta => 'beta';
@override
String get settingsExperimentalBetaDescription => 'This feature is in beta and may not work intended or expected.\nLess severe issues may or may not occur. Damage shouldn\'t be critical.\nUse at your own risk.';
@override
String get settingsExperimentalBetaFeature => 'Beta feature, hold to learn more';
@override
String get settingsExperimentalDeprecated => 'deprecated';
@override
String get settingsExperimentalDeprecatedDescription => 'This feature is deprecated and will be removed in a future version.\nIt may not work as intended or expected. Use at your own risk.';
@override
String get settingsExperimentalDeprecatedFeature => 'Deprecated feature, hold to learn more';
@override
String get settingsHost => 'Host';
@override
String get settingsHostValid => 'Valid Host';
@override
String get settingsHostChecking => 'Checking Host';
@override
String settingsHostInvalid(String type) {
String _temp0 = intl.Intl.selectLogic(
type,
{
'url': 'Invalid URL',
'host': 'Invalid Host',
'timeout': 'Request Failed. Server issues',
'ratelimit': 'Too many requests',
'other': 'Request Failed',
},
);
return 'Issue: $_temp0';
}
@override
String get settingsHostHeaderTitle => 'Set host header';
@override
String get settingsHostHeaderInvalid => 'The entered text isn\'t a valid header JSON object';
@override
String settingsHostInvalidDetailed(String type) {
String _temp0 = intl.Intl.selectLogic(
type,
{
'url': 'The URL you entered is invalid. It isn\'t an a standardized URL format.',
'other': 'The host you entered is invalid. It cannot be reached. Please check the host and try again.',
},
);
return '$_temp0';
}
@override
String get settingsSystemMessage => 'System message';
@override
String get settingsUseSystem => 'Use system message';
@override
String get settingsUseSystemDescription => 'Disables setting the system message above and use the one of the model instead. Can be useful for models with model files';
@override
String get settingsDisableMarkdown => 'Disable markdown';
@override
String get settingsBehaviorNotUpdatedForOlderChats => 'Behavior settings are not updated for older chats';
@override
String get settingsShowModelTags => 'Show model tags';
@override
String get settingsPreloadModels => 'Preload models';
@override
String get settingsResetOnModelChange => 'Reset on model change';
@override
String get settingsRequestTypeStream => 'Stream';
@override
String get settingsRequestTypeRequest => 'Request';
@override
String get settingsGenerateTitles => 'Generate titles';
@override
String get settingsEnableEditing => 'Message editing';
@override
String get settingsAskBeforeDelete => 'Ask before chat deletion';
@override
String get settingsShowTips => 'Show tips in sidebar';
@override
String get settingsKeepModelLoadedAlways => 'Keep model always loaded';
@override
String get settingsKeepModelLoadedNever => 'Don\'t keep model loaded';
@override
String get settingsKeepModelLoadedFor => 'Set specific time to keep model loaded';
@override
String settingsKeepModelLoadedSet(String minutes) {
return 'Keep model loaded for $minutes minutes';
}
@override
String get settingsTimeoutMultiplier => 'Timeout multiplier';
@override
String get settingsTimeoutMultiplierDescription => 'Select the multiplier that is applied to every timeout value in the app. Can be useful with a slow internet connection or a slow host.';
@override
String get settingsTimeoutMultiplierExample => 'E.g. message timeout:';
@override
String get settingsEnableHapticFeedback => 'Enable haptic feedback';
@override
String get settingsMaximizeOnStart => 'Start maximized';
@override
String get settingsBrightnessSystem => 'System';
@override
String get settingsBrightnessLight => 'Light';
@override
String get settingsBrightnessDark => 'Dark';
@override
String get settingsThemeDevice => 'Device';
@override
String get settingsThemeOllama => 'Ollama';
@override
String get settingsTemporaryFixes => 'Temporary interface fixes';
@override
String get settingsTemporaryFixesDescription => 'Enable temporary fixes for interface issues.\nLong press on the individual options to learn more.';
@override
String get settingsTemporaryFixesInstructions => 'Do not toggle any of these settings unless you know what you are doing! The given solutions might not work as expected.\nThey cannot be seen as final or should be judged as such. Issues might occur.';
@override
String get settingsTemporaryFixesNoFixes => 'No fixes available';
@override
String get settingsVoicePermissionLoading => 'Loading voice permissions ...';
@override
String get settingsVoiceTtsNotSupported => 'Text-to-speech not supported';
@override
String get settingsVoiceTtsNotSupportedDescription => 'Text-to-speech services are not supported for the selected language. Select a different language in the language drawer to reenable them.\nOther services like voice recognition and AI thinking will still work as usual, but interaction might not be as fluent.';
@override
String get settingsVoicePermissionNot => 'Permissions not granted';
@override
String get settingsVoiceNotEnabled => 'Voice mode not enabled';
@override
String get settingsVoiceNotSupported => 'Voice mode not supported';
@override
String get settingsVoiceEnable => 'Enable voice mode';
@override
String get settingsVoiceNoLanguage => 'No language selected';
@override
String get settingsVoiceLimitLanguage => 'Limit to selected language';
@override
String get settingsVoicePunctuation => 'Enable AI punctuation';
@override
String get settingsExportChats => 'Export chats';
@override
String get settingsExportChatsSuccess => 'Chats exported successfully';
@override
String get settingsImportChats => 'Import chats';
@override
String get settingsImportChatsTitle => 'Import';
@override
String get settingsImportChatsDescription => 'The following step will import the chats from the selected file. This will overwrite all currently available chats.\nDo you want to continue?';
@override
String get settingsImportChatsImport => 'Import and Erase';
@override
String get settingsImportChatsCancel => 'Cancel';
@override
String get settingsImportChatsSuccess => 'Chats imported successfully';
@override
String get settingsExportInfo => 'This options allows you to export and import your chat history. This can be useful if you want to transfer your chat history to another device or backup your chat history';
@override
String get settingsExportWarning => 'Multiple chat histories won\'t be merged! You\'ll loose your current chat history if you import a new one';
@override
String get settingsUpdateCheck => 'Check for updates';
@override
String get settingsUpdateChecking => 'Checking for updates ...';
@override
String get settingsUpdateLatest => 'You are on the latest version';
@override
String settingsUpdateAvailable(String version) {
return 'Update available (v$version)';
}
@override
String get settingsUpdateRateLimit => 'Can\'t check, API rate limit exceeded';
@override
String get settingsUpdateIssue => 'An issue occurred';
@override
String get settingsUpdateDialogTitle => 'New version available';
@override
String get settingsUpdateDialogDescription => 'A new version of Ollama is available. Do you want to download and install it now?';
@override
String get settingsUpdateChangeLog => 'Change Log';
@override
String get settingsUpdateDialogUpdate => 'Update';
@override
String get settingsUpdateDialogCancel => 'Cancel';
@override
String get settingsCheckForUpdates => 'Check for updates on open';
@override
String get settingsGithub => 'GitHub';
@override
String get settingsReportIssue => 'Report Issue';
@override
String get settingsLicenses => 'Licenses';
@override
String settingsVersion(String version) {
return 'Ollama App v$version';
}
}

View File

@ -0,0 +1,484 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Persian (`fa`).
class AppLocalizationsFa extends AppLocalizations {
AppLocalizationsFa([String locale = 'fa']) : super(locale);
@override
String get appTitle => 'Ollama';
@override
String get optionNewChat => 'New Chat';
@override
String get optionSettings => 'Settings';
@override
String get optionInstallPwa => 'Install Webapp';
@override
String get optionNoChatFound => 'No chats found';
@override
String get tipPrefix => 'Tip: ';
@override
String get tip0 => 'Edit messages by long taping on them';
@override
String get tip1 => 'Delete messages by double tapping on them';
@override
String get tip2 => 'You can change the theme in settings';
@override
String get tip3 => 'Select a multimodal model to input images';
@override
String get tip4 => 'Chats are automatically saved';
@override
String get deleteChat => 'Delete';
@override
String get renameChat => 'Rename';
@override
String get takeImage => 'Take Image';
@override
String get uploadImage => 'Upload Image';
@override
String get notAValidImage => 'Not a valid image';
@override
String get imageOnlyConversation => 'Image Only Conversation';
@override
String get messageInputPlaceholder => 'Message';
@override
String get tooltipAttachment => 'Add attachment';
@override
String get tooltipSend => 'Send';
@override
String get tooltipSave => 'Save';
@override
String get tooltipLetAIThink => 'Let AI think';
@override
String get tooltipAddHostHeaders => 'Add host headers';
@override
String get tooltipReset => 'Reset current chat';
@override
String get tooltipOptions => 'Show options';
@override
String get noModelSelected => 'No model selected';
@override
String get noHostSelected => 'No host selected, open setting to set one';
@override
String get noSelectedModel => '<selector>';
@override
String get newChatTitle => 'Unnamed Chat';
@override
String get modelDialogAddModel => 'Add';
@override
String get modelDialogAddPromptTitle => 'Add new model';
@override
String get modelDialogAddPromptDescription => 'This can have either be a normal name (e.g. \'llama3\') or name and tag (e.g. \'llama3:70b\').';
@override
String get modelDialogAddPromptAlreadyExists => 'Model already exists';
@override
String get modelDialogAddPromptInvalid => 'Invalid model name';
@override
String get modelDialogAddAllowanceTitle => 'Allow Proxy';
@override
String get modelDialogAddAllowanceDescription => 'Ollama App must check if the entered model is valid. For that, we normally send a web request to the Ollama model list and check the status code, but because you\'re using the web client, we can\'t do that directly. Instead, the app will send the request to a different api, hosted by JHubi1, to check for us.\nThis is a one-time request and will only be sent when you add a new model.\nYour IP address will be sent with the request and might be stored for up to ten minutes to prevent spamming with potential harmful intentions.\nIf you accept, your selection will be remembered in the future; if not, nothing will be sent and the model won\'t be added.';
@override
String get modelDialogAddAllowanceAllow => 'Allow';
@override
String get modelDialogAddAllowanceDeny => 'Deny';
@override
String modelDialogAddAssuranceTitle(String model) {
return 'Add $model?';
}
@override
String modelDialogAddAssuranceDescription(String model) {
return 'Pressing \'Add\' will download the model \'$model\' directly from the Ollama server to your host.\nThis can take a while depending on your internet connection. The action cannot be canceled.\nIf the app is closed during the download, it\'ll resume if you enter the name into the model dialog again.';
}
@override
String get modelDialogAddAssuranceAdd => 'Add';
@override
String get modelDialogAddAssuranceCancel => 'Cancel';
@override
String get modelDialogAddDownloadPercentLoading => 'loading progress';
@override
String modelDialogAddDownloadPercent(String percent) {
return 'download at $percent%';
}
@override
String get modelDialogAddDownloadFailed => 'Disconnected, try again';
@override
String get modelDialogAddDownloadSuccess => 'Download successful';
@override
String get deleteDialogTitle => 'Delete Chat';
@override
String get deleteDialogDescription => 'Are you sure you want to continue? This will wipe all memory of this chat and cannot be undone.\nTo disable this dialog, visit the settings.';
@override
String get deleteDialogDelete => 'Delete';
@override
String get deleteDialogCancel => 'Cancel';
@override
String get dialogEnterNewTitle => 'Enter new title';
@override
String get dialogEditMessageTitle => 'Edit message';
@override
String get settingsTitleBehavior => 'Behavior';
@override
String get settingsDescriptionBehavior => 'Change the behavior of the AI to your liking.';
@override
String get settingsTitleInterface => 'Interface';
@override
String get settingsDescriptionInterface => 'Edit how Ollama App looks and behaves.';
@override
String get settingsTitleVoice => 'Voice';
@override
String get settingsDescriptionVoice => 'Enable voice mode and configure voice settings.';
@override
String get settingsTitleExport => 'Export';
@override
String get settingsDescriptionExport => 'Export and import your chat history.';
@override
String get settingsTitleAbout => 'About';
@override
String get settingsDescriptionAbout => 'Check for updates and learn more about Ollama App.';
@override
String get settingsSavedAutomatically => 'Settings are saved automatically';
@override
String get settingsExperimentalAlpha => 'alpha';
@override
String get settingsExperimentalAlphaDescription => 'This feature is in alpha and may not work as intended or expected.\nCritical issues and/or permanent critical damage to device and/or used services cannot be ruled out.\nUse at your own risk. No liability on the part of the app author.';
@override
String get settingsExperimentalAlphaFeature => 'Alpha feature, hold to learn more';
@override
String get settingsExperimentalBeta => 'beta';
@override
String get settingsExperimentalBetaDescription => 'This feature is in beta and may not work intended or expected.\nLess severe issues may or may not occur. Damage shouldn\'t be critical.\nUse at your own risk.';
@override
String get settingsExperimentalBetaFeature => 'Beta feature, hold to learn more';
@override
String get settingsExperimentalDeprecated => 'deprecated';
@override
String get settingsExperimentalDeprecatedDescription => 'This feature is deprecated and will be removed in a future version.\nIt may not work as intended or expected. Use at your own risk.';
@override
String get settingsExperimentalDeprecatedFeature => 'Deprecated feature, hold to learn more';
@override
String get settingsHost => 'Host';
@override
String get settingsHostValid => 'Valid Host';
@override
String get settingsHostChecking => 'Checking Host';
@override
String settingsHostInvalid(String type) {
String _temp0 = intl.Intl.selectLogic(
type,
{
'url': 'Invalid URL',
'host': 'Invalid Host',
'timeout': 'Request Failed. Server issues',
'ratelimit': 'Too many requests',
'other': 'Request Failed',
},
);
return 'Issue: $_temp0';
}
@override
String get settingsHostHeaderTitle => 'Set host header';
@override
String get settingsHostHeaderInvalid => 'The entered text isn\'t a valid header JSON object';
@override
String settingsHostInvalidDetailed(String type) {
String _temp0 = intl.Intl.selectLogic(
type,
{
'url': 'The URL you entered is invalid. It isn\'t an a standardized URL format.',
'other': 'The host you entered is invalid. It cannot be reached. Please check the host and try again.',
},
);
return '$_temp0';
}
@override
String get settingsSystemMessage => 'System message';
@override
String get settingsUseSystem => 'Use system message';
@override
String get settingsUseSystemDescription => 'Disables setting the system message above and use the one of the model instead. Can be useful for models with model files';
@override
String get settingsDisableMarkdown => 'Disable markdown';
@override
String get settingsBehaviorNotUpdatedForOlderChats => 'Behavior settings are not updated for older chats';
@override
String get settingsShowModelTags => 'Show model tags';
@override
String get settingsPreloadModels => 'Preload models';
@override
String get settingsResetOnModelChange => 'Reset on model change';
@override
String get settingsRequestTypeStream => 'Stream';
@override
String get settingsRequestTypeRequest => 'Request';
@override
String get settingsGenerateTitles => 'Generate titles';
@override
String get settingsEnableEditing => 'Enable editing of messages';
@override
String get settingsAskBeforeDelete => 'Ask before chat deletion';
@override
String get settingsShowTips => 'Show tips in sidebar';
@override
String get settingsKeepModelLoadedAlways => 'Keep model always loaded';
@override
String get settingsKeepModelLoadedNever => 'Don\'t keep model loaded';
@override
String get settingsKeepModelLoadedFor => 'Set specific time to keep model loaded';
@override
String settingsKeepModelLoadedSet(String minutes) {
return 'Keep model loaded for $minutes minutes';
}
@override
String get settingsTimeoutMultiplier => 'Timeout multiplier';
@override
String get settingsTimeoutMultiplierDescription => 'Select the multiplier that is applied to every timeout value in the app. Can be useful with a slow internet connection or a slow host.';
@override
String get settingsTimeoutMultiplierExample => 'E.g. message timeout:';
@override
String get settingsEnableHapticFeedback => 'Enable haptic feedback';
@override
String get settingsMaximizeOnStart => 'Start maximized';
@override
String get settingsBrightnessSystem => 'System';
@override
String get settingsBrightnessLight => 'Light';
@override
String get settingsBrightnessDark => 'Dark';
@override
String get settingsThemeDevice => 'Device';
@override
String get settingsThemeOllama => 'Ollama';
@override
String get settingsTemporaryFixes => 'Temporary interface fixes';
@override
String get settingsTemporaryFixesDescription => 'Enable temporary fixes for interface issues.\nLong press on the individual options to learn more.';
@override
String get settingsTemporaryFixesInstructions => 'Do not toggle any of these settings unless you know what you are doing! The given solutions might not work as expected.\nThey cannot be seen as final or should be judged as such. Issues might occur.';
@override
String get settingsTemporaryFixesNoFixes => 'No fixes available';
@override
String get settingsVoicePermissionLoading => 'Loading voice permissions ...';
@override
String get settingsVoiceTtsNotSupported => 'Text-to-speech not supported';
@override
String get settingsVoiceTtsNotSupportedDescription => 'Text-to-speech services are not supported for the selected language. Select a different language in the language drawer to reenable them.\nOther services like voice recognition and AI thinking will still work as usual, but interaction might not be as fluent.';
@override
String get settingsVoicePermissionNot => 'Permissions not granted';
@override
String get settingsVoiceNotEnabled => 'Voice mode not enabled';
@override
String get settingsVoiceNotSupported => 'Voice mode not supported';
@override
String get settingsVoiceEnable => 'Enable voice mode';
@override
String get settingsVoiceNoLanguage => 'No language selected';
@override
String get settingsVoiceLimitLanguage => 'Limit to selected language';
@override
String get settingsVoicePunctuation => 'Enable AI punctuation';
@override
String get settingsExportChats => 'Export chats';
@override
String get settingsExportChatsSuccess => 'Chats exported successfully';
@override
String get settingsImportChats => 'Import chats';
@override
String get settingsImportChatsTitle => 'Import';
@override
String get settingsImportChatsDescription => 'The following step will import the chats from the selected file. This will overwrite all currently available chats.\nDo you want to continue?';
@override
String get settingsImportChatsImport => 'Import and Erase';
@override
String get settingsImportChatsCancel => 'Cancel';
@override
String get settingsImportChatsSuccess => 'Chats imported successfully';
@override
String get settingsExportInfo => 'This options allows you to export and import your chat history. This can be useful if you want to transfer your chat history to another device or backup your chat history';
@override
String get settingsExportWarning => 'Multiple chat histories won\'t be merged! You\'ll loose your current chat history if you import a new one';
@override
String get settingsUpdateCheck => 'Check for updates';
@override
String get settingsUpdateChecking => 'Checking for updates ...';
@override
String get settingsUpdateLatest => 'You are on the latest version';
@override
String settingsUpdateAvailable(String version) {
return 'Update available (v$version)';
}
@override
String get settingsUpdateRateLimit => 'Can\'t check, API rate limit exceeded';
@override
String get settingsUpdateIssue => 'An issue occurred';
@override
String get settingsUpdateDialogTitle => 'New version available';
@override
String get settingsUpdateDialogDescription => 'A new version of Ollama is available. Do you want to download and install it now?';
@override
String get settingsUpdateChangeLog => 'Change Log';
@override
String get settingsUpdateDialogUpdate => 'Update';
@override
String get settingsUpdateDialogCancel => 'Cancel';
@override
String get settingsCheckForUpdates => 'Check for updates on open';
@override
String get settingsGithub => 'GitHub';
@override
String get settingsReportIssue => 'Report Issue';
@override
String get settingsLicenses => 'Licenses';
@override
String settingsVersion(String version) {
return 'Ollama App v$version';
}
}

View File

@ -0,0 +1,484 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Italian (`it`).
class AppLocalizationsIt extends AppLocalizations {
AppLocalizationsIt([String locale = 'it']) : super(locale);
@override
String get appTitle => 'Ollama';
@override
String get optionNewChat => 'Nuova Chat';
@override
String get optionSettings => 'Impostazioni';
@override
String get optionInstallPwa => 'Installa Webapp';
@override
String get optionNoChatFound => 'Nessuna Chat trovata';
@override
String get tipPrefix => 'Suggerimento: ';
@override
String get tip0 => 'Modifica il messaggio tenendo premuto su di esso';
@override
String get tip1 => 'Elimina il messaggio premendo due volte su di esso';
@override
String get tip2 => 'Puoi cambiare il tema dalle impostazioni';
@override
String get tip3 => 'Seleziona un modello multimodale per inserire le immagini';
@override
String get tip4 => 'Le chat sono state automaticamente salvate';
@override
String get deleteChat => 'Elimina';
@override
String get renameChat => 'Rinomina';
@override
String get takeImage => 'Seleziona immagine';
@override
String get uploadImage => 'Carica immagine';
@override
String get notAValidImage => 'Immagine non valida';
@override
String get imageOnlyConversation => 'Conversazione di sole immagini';
@override
String get messageInputPlaceholder => 'Messaggio';
@override
String get tooltipAttachment => 'Aggiungi allegato';
@override
String get tooltipSend => 'Invia';
@override
String get tooltipSave => 'Salva';
@override
String get tooltipLetAIThink => 'Lasciamo che sia IA a pensare';
@override
String get tooltipAddHostHeaders => 'Aggiungi host headers';
@override
String get tooltipReset => 'Reimposta la chat corrente';
@override
String get tooltipOptions => 'Mostra opzioni';
@override
String get noModelSelected => 'Nessun modello selezionato';
@override
String get noHostSelected => 'Nessun host selezionato, apri le impostazioni per farlo';
@override
String get noSelectedModel => '<modelli>';
@override
String get newChatTitle => 'Chat senza nome';
@override
String get modelDialogAddModel => 'Aggiungi';
@override
String get modelDialogAddPromptTitle => 'Aggiungi nuovo modello';
@override
String get modelDialogAddPromptDescription => 'Questo può essere un nome normale (ad es. \'llama3\') o nome e tag (ad es. \'llama3:70b\').';
@override
String get modelDialogAddPromptAlreadyExists => 'Il modello esiste già';
@override
String get modelDialogAddPromptInvalid => 'Nome del modello non valido';
@override
String get modelDialogAddAllowanceTitle => 'Abilita Proxy';
@override
String get modelDialogAddAllowanceDescription => 'Ollama App deve controllare se il modello inserito è valido. Per questo, normalmente inviamo una richiesta web alla lista dei modelli Ollama e controlliamo il codice di stato, ma perché stai usando il web client, non possiamo farlo direttamente. Invece, l\'app invierà la richiesta a un altro api, ospitato da JHubi1, per eseguire il controllo.\nQuesta è una richiesta verrà inviata solo quando aggiungi un nuovo modello.\nIl tuo indirizzo IP verrà inviato con la richiesta e potrebbe essere memorizzato per un massimo di dieci minuti per evitare lo spamming con potenziali intenzioni nocive.\nSe accetti, la tua selezione sarà ricordata in futuro; in caso contrario, non verrà inviato nulla e il modello non verrà aggiunto.';
@override
String get modelDialogAddAllowanceAllow => 'Consenti';
@override
String get modelDialogAddAllowanceDeny => 'Nega';
@override
String modelDialogAddAssuranceTitle(String model) {
return 'Aggiungi $model?';
}
@override
String modelDialogAddAssuranceDescription(String model) {
return 'Premendo \'Aggiungi\' scaricherà il modello \'$model\' direttamente dal server Ollama al tuo host.\nQuesto può richiedere un po\' di tempo a seconda della tua connessione internet. L\'azione non può essere annullata.\nSe l\'app è chiusa durante il download, riprenderà se inserisci di nuovo il nome nella finestra del modello.';
}
@override
String get modelDialogAddAssuranceAdd => 'Aggiungi';
@override
String get modelDialogAddAssuranceCancel => 'Annulla';
@override
String get modelDialogAddDownloadPercentLoading => 'Caricamento in corso';
@override
String modelDialogAddDownloadPercent(String percent) {
return 'scarica al $percent%';
}
@override
String get modelDialogAddDownloadFailed => 'Disconnesso, riprova';
@override
String get modelDialogAddDownloadSuccess => 'Download completato con successo';
@override
String get deleteDialogTitle => 'Elimina Chat';
@override
String get deleteDialogDescription => 'Sei sicuro di voler continuare? Tale operazione cancellerà tutta questa chat e non potrà essere annullata.\nPer disattivare questa finestra di dialogo, vai alle impostazioni.';
@override
String get deleteDialogDelete => 'Elimina';
@override
String get deleteDialogCancel => 'Annulla';
@override
String get dialogEnterNewTitle => 'Immetti nuovo titolo';
@override
String get dialogEditMessageTitle => 'Modifica Messaggio';
@override
String get settingsTitleBehavior => 'Comportamento';
@override
String get settingsDescriptionBehavior => 'Modifica il comportamento dell\'AI a tuo piacimento.';
@override
String get settingsTitleInterface => 'Interfaccia';
@override
String get settingsDescriptionInterface => 'Modifica l\'aspetto e il comportamento dell\'app Ollama.';
@override
String get settingsTitleVoice => 'Voce';
@override
String get settingsDescriptionVoice => 'Abilita la modalità vocale e configura le impostazioni vocali.';
@override
String get settingsTitleExport => 'Esporta';
@override
String get settingsDescriptionExport => 'Esporta e importa la cronologia delle tue chat.';
@override
String get settingsTitleAbout => 'Informazioni';
@override
String get settingsDescriptionAbout => 'Controlla gli aggiornamenti e scopri di più su Ollama App.';
@override
String get settingsSavedAutomatically => 'Le impostazioni vengono salvate automaticamente';
@override
String get settingsExperimentalAlpha => 'alpha';
@override
String get settingsExperimentalAlphaDescription => 'Questa funzionalità è in versione alpha e potrebbe non funzionare come previsto o previsto.\nNon si possono escludere problemi critici e/o danni critici permanenti al dispositivo e/o ai servizi utilizzati.\nL\'utilizzo è a proprio rischio. Nessuna responsabilità da parte dell\'autore dell\'app.';
@override
String get settingsExperimentalAlphaFeature => 'Funzione Alpha, tieni premuto per saperne di più';
@override
String get settingsExperimentalBeta => 'beta';
@override
String get settingsExperimentalBetaDescription => 'Questa funzionalità è in versione beta e potrebbe non funzionare come previsto o previsto.\nPotrebbero verificarsi o meno problemi meno gravi. I danni non dovrebbero essere critici.\nUtilizza a tuo rischio e pericolo.';
@override
String get settingsExperimentalBetaFeature => 'Funzione Beta, tieni premuto per saperne di più';
@override
String get settingsExperimentalDeprecated => 'deprecato';
@override
String get settingsExperimentalDeprecatedDescription => 'Questa funzionalità è deprecata e verrà rimossa in una versione futura.\nPotrebbe non funzionare come previsto o atteso. Usare a proprio rischio.';
@override
String get settingsExperimentalDeprecatedFeature => 'Funzionalità deprecata, tenere premuto per saperne di più';
@override
String get settingsHost => 'Host';
@override
String get settingsHostValid => 'Host valido';
@override
String get settingsHostChecking => 'Controllo Host';
@override
String settingsHostInvalid(String type) {
String _temp0 = intl.Intl.selectLogic(
type,
{
'url': 'URL invalido',
'host': 'Host invalido',
'timeout': 'Richiesta fallita. Problema col server',
'ratelimit': 'Troppe richieste',
'other': 'Richiesta fallita',
},
);
return 'Problema: $_temp0';
}
@override
String get settingsHostHeaderTitle => 'Imposta header host';
@override
String get settingsHostHeaderInvalid => 'Il testo immesso non è un valido oggetto JSON';
@override
String settingsHostInvalidDetailed(String type) {
String _temp0 = intl.Intl.selectLogic(
type,
{
'url': 'L\'URL inserito non è valido. Non è un formato URL standardizzato.',
'other': 'L\'host inserito non è valido. Non può essere raggiunto. Controlla l\'host e riprova.',
},
);
return '$_temp0';
}
@override
String get settingsSystemMessage => 'Messaggio di sistema';
@override
String get settingsUseSystem => 'Usa Messaggio di sistema';
@override
String get settingsUseSystemDescription => 'Disabilita l\'impostazione del messaggio di sistema sopra e utilizza invece quello del modello. Può essere utile per i modelli con file di modello';
@override
String get settingsDisableMarkdown => 'Disabilita markdown';
@override
String get settingsBehaviorNotUpdatedForOlderChats => 'Le impostazioni sul comportamento non vengono aggiornate per le chat meno recenti';
@override
String get settingsShowModelTags => 'Visualizza tags modello';
@override
String get settingsPreloadModels => 'Precarica modello';
@override
String get settingsResetOnModelChange => 'Reimposta al cambio modello';
@override
String get settingsRequestTypeStream => 'Stream';
@override
String get settingsRequestTypeRequest => 'Request';
@override
String get settingsGenerateTitles => 'Genera titoli';
@override
String get settingsEnableEditing => 'Abilita modifica di messaggi';
@override
String get settingsAskBeforeDelete => 'Chiedi prima di eliminare la chat';
@override
String get settingsShowTips => 'Mostra suggerimenti nella barra laterale';
@override
String get settingsKeepModelLoadedAlways => 'Mantieni modello sempre caricato';
@override
String get settingsKeepModelLoadedNever => 'Non mantenere modello sempre caricato';
@override
String get settingsKeepModelLoadedFor => 'Imposta un tempo specifico per mantenere il modello caricato';
@override
String settingsKeepModelLoadedSet(String minutes) {
return 'Mantieni modello caricato per $minutes minuti';
}
@override
String get settingsTimeoutMultiplier => 'Moltiplicatore di timeout';
@override
String get settingsTimeoutMultiplierDescription => 'Seleziona il moltiplicatore che viene applicato a ogni valore di timeout nell\'applicazione. Può essere utile con una connessione internet lenta o un host lento.';
@override
String get settingsTimeoutMultiplierExample => 'Es. messaggio di timeout:';
@override
String get settingsEnableHapticFeedback => 'Abilita il feedback tattile';
@override
String get settingsMaximizeOnStart => 'Inizzia massimizzato';
@override
String get settingsBrightnessSystem => 'Sistema';
@override
String get settingsBrightnessLight => 'Chiaro';
@override
String get settingsBrightnessDark => 'Scuro';
@override
String get settingsThemeDevice => 'Dispositivo';
@override
String get settingsThemeOllama => 'Ollama';
@override
String get settingsTemporaryFixes => 'Aggiustamenti temporanei dell\'interfaccia';
@override
String get settingsTemporaryFixesDescription => 'Abilita correzioni temporanee per problemi dell\'interfaccia.\nPremi a lungo sulle opzioni individuali per saperne di più.';
@override
String get settingsTemporaryFixesInstructions => 'Non attivare nessuna di queste impostazioni a meno che tu non sappia cosa stai facendo! Le soluzioni fornite potrebbero non funzionare come previsto. \nNon possono essere considerate definitive o giudicate come tali. Potrebbero verificarsi problemi.';
@override
String get settingsTemporaryFixesNoFixes => 'Nessuna correzione disponibile';
@override
String get settingsVoicePermissionLoading => 'Caricamento permessi voce ...';
@override
String get settingsVoiceTtsNotSupported => 'Text-to-speech non supportato';
@override
String get settingsVoiceTtsNotSupportedDescription => 'I servizi di text-to-speech non sono supportati per la lingua selezionata. Seleziona una lingua diversa nel menu a discesa delle lingue per riattivarli.\nAltri servizi come il riconoscimento vocale e il pensiero dell\'IA funzioneranno comunque normalmente, ma l\'interazione potrebbe non essere fluida.';
@override
String get settingsVoicePermissionNot => 'Permessi non concessi';
@override
String get settingsVoiceNotEnabled => 'Modalità vocale non abilitata';
@override
String get settingsVoiceNotSupported => 'Modalità vocale non supportata';
@override
String get settingsVoiceEnable => 'Abilita modalità vocale';
@override
String get settingsVoiceNoLanguage => 'Nessuna lingua selezionata';
@override
String get settingsVoiceLimitLanguage => 'Limita alla lingua selezionata';
@override
String get settingsVoicePunctuation => 'Abilita la punteggiatura AI';
@override
String get settingsExportChats => 'Esporta chats';
@override
String get settingsExportChatsSuccess => 'Chat esportate con successo';
@override
String get settingsImportChats => 'Importa chats';
@override
String get settingsImportChatsTitle => 'Importa';
@override
String get settingsImportChatsDescription => 'Il passaggio successivo importerà le chat dal file selezionato. Ciò sovrascriverà tutte le chat attualmente disponibili.\nVuoi continuare?';
@override
String get settingsImportChatsImport => 'Importa e cancella';
@override
String get settingsImportChatsCancel => 'Annulla';
@override
String get settingsImportChatsSuccess => 'Chats importate con successo';
@override
String get settingsExportInfo => 'Questa opzione ti consente di esportare e importare la cronologia chat. Questo può essere utile se desideri trasferire la cronologia chat su un altro dispositivo o eseguire il backup della cronologia chat';
@override
String get settingsExportWarning => 'Più cronologie di chat non verranno unite! Perderai la cronologia chat attuale se ne importi una nuova';
@override
String get settingsUpdateCheck => 'Controlla aggiornamenti';
@override
String get settingsUpdateChecking => 'Sto cercando aggiornamenti ...';
@override
String get settingsUpdateLatest => 'Hai l\'ultima versione';
@override
String settingsUpdateAvailable(String version) {
return 'Aggiornamento disponibile (v$version)';
}
@override
String get settingsUpdateRateLimit => 'Impossibile verificare, limite di accesso API superato';
@override
String get settingsUpdateIssue => 'Si è verificato un errore';
@override
String get settingsUpdateDialogTitle => 'Nuova versione disponibile';
@override
String get settingsUpdateDialogDescription => 'È disponibile una nuova versione di Ollama. Vuoi scaricarla e installarla adesso?';
@override
String get settingsUpdateChangeLog => 'Cambiamenti';
@override
String get settingsUpdateDialogUpdate => 'Aggiorna';
@override
String get settingsUpdateDialogCancel => 'Annulla';
@override
String get settingsCheckForUpdates => 'Controlla gli aggiornamenti all\'apertura';
@override
String get settingsGithub => 'GitHub';
@override
String get settingsReportIssue => 'Riporta problema';
@override
String get settingsLicenses => 'Licenze';
@override
String settingsVersion(String version) {
return 'Ollama App v$version';
}
}

View File

@ -0,0 +1,484 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Turkish (`tr`).
class AppLocalizationsTr extends AppLocalizations {
AppLocalizationsTr([String locale = 'tr']) : super(locale);
@override
String get appTitle => 'Ollama';
@override
String get optionNewChat => 'Yeni Sohbet';
@override
String get optionSettings => 'Ayarlar';
@override
String get optionInstallPwa => 'Web Uygulamasını Yükle';
@override
String get optionNoChatFound => 'Sohbet bulunamadı';
@override
String get tipPrefix => 'İpucu: ';
@override
String get tip0 => 'Mesajları düzenlemek için üzerlerine uzun basın';
@override
String get tip1 => 'Mesajları silmek için üzerlerine çift dokunun';
@override
String get tip2 => 'Temayı ayarlardan değiştirebilirsiniz';
@override
String get tip3 => 'Görsel girmek için çoklu modlu bir model seçin';
@override
String get tip4 => 'Sohbetler otomatik olarak kaydedilir';
@override
String get deleteChat => 'Sil';
@override
String get renameChat => 'Yeniden adlandır';
@override
String get takeImage => 'Fotoğraf Çek';
@override
String get uploadImage => 'Görsel Yükle';
@override
String get notAValidImage => 'Geçerli bir görsel değil';
@override
String get imageOnlyConversation => 'Sadece Görsel İçeren Konuşma';
@override
String get messageInputPlaceholder => 'Mesaj';
@override
String get tooltipAttachment => 'Ek ekle';
@override
String get tooltipSend => 'Gönder';
@override
String get tooltipSave => 'Kaydet';
@override
String get tooltipLetAIThink => 'AI\'\'nın düşünmesine izin ver';
@override
String get tooltipAddHostHeaders => 'Ana bilgisayar başlıkları ekle';
@override
String get tooltipReset => 'Mevcut sohbeti sıfırla';
@override
String get tooltipOptions => 'Seçenekleri göster';
@override
String get noModelSelected => 'Model seçilmedi';
@override
String get noHostSelected => 'Ana bilgisayar seçilmedi, ayarlarııp bir tane belirleyin';
@override
String get noSelectedModel => '<seçici>';
@override
String get newChatTitle => 'İsimsiz Sohbet';
@override
String get modelDialogAddModel => 'Ekle';
@override
String get modelDialogAddPromptTitle => 'Yeni model ekle';
@override
String get modelDialogAddPromptDescription => 'Bu normal bir isim (örneğin \'llama3\') ya da isim ve etiket (örneğin \'llama3:70b\') olabilir.';
@override
String get modelDialogAddPromptAlreadyExists => 'Model zaten mevcut';
@override
String get modelDialogAddPromptInvalid => 'Geçersiz model adı';
@override
String get modelDialogAddAllowanceTitle => 'Proxy\'e İzin Ver';
@override
String get modelDialogAddAllowanceDescription => 'Ollama Uygulaması, girilen modelin geçerli olup olmadığını kontrol etmelidir. Bunun için normalde Ollama model listesine bir web isteği gönderir ve durum kodunu kontrol ederiz, ancak siz web istemcisini kullandığınız için bunu doğrudan yapamayız. Bunun yerine, uygulama bizim için kontrol etmek amacıyla JHubi1 tarafından barındırılan farklı bir API\'ye istek gönderecek. \nBu, yalnızca bir kez yapılan bir istektir ve yalnızca yeni bir model eklediğinizde gönderilecektir. \nIP adresiniz istekle birlikte gönderilecek ve olası zararlı niyetlerle spam yapılmasını önlemek amacıyla on dakikaya kadar saklanabilir. \nKabul ederseniz, seçiminiz gelecekte hatırlanacaktır; kabul etmezseniz, hiçbir şey gönderilmeyecek ve model eklenmeyecektir.';
@override
String get modelDialogAddAllowanceAllow => 'İzin ver';
@override
String get modelDialogAddAllowanceDeny => 'Reddet';
@override
String modelDialogAddAssuranceTitle(String model) {
return '$model Ekle?';
}
@override
String modelDialogAddAssuranceDescription(String model) {
return '\'Ekle\' tuşuna basmak, \'$model\' modelini doğrudan Ollama sunucusundan bilgisayarınıza indirecektir. İnternet bağlantınıza bağlı olarak bu işlem biraz zaman alabilir. Bu işlem iptal edilemez. Uygulama indirme sırasında kapatılırsa, model adını tekrar model diyaloguna girerseniz indirme işlemi kaldığı yerden devam eder.';
}
@override
String get modelDialogAddAssuranceAdd => 'Ekle';
@override
String get modelDialogAddAssuranceCancel => 'İptal';
@override
String get modelDialogAddDownloadPercentLoading => 'yükleme ilerleme durumu';
@override
String modelDialogAddDownloadPercent(String percent) {
return '%$percent oranında indir';
}
@override
String get modelDialogAddDownloadFailed => 'Bağlantı kesildi, yeniden deneyin';
@override
String get modelDialogAddDownloadSuccess => 'İndirme tamamlandı';
@override
String get deleteDialogTitle => 'Sohbeti Sil';
@override
String get deleteDialogDescription => 'Devam etmek istediğinizden emin misiniz? Bu işlem, bu sohbetin tüm hafızasını silecek ve geri alınamaz.\nBu dialogu devre dışı bırakmak için ayarları ziyaret edin.';
@override
String get deleteDialogDelete => 'Sil';
@override
String get deleteDialogCancel => 'İptal';
@override
String get dialogEnterNewTitle => 'Yeni başlık girin';
@override
String get dialogEditMessageTitle => 'Mesajı düzenle';
@override
String get settingsTitleBehavior => 'Davranış';
@override
String get settingsDescriptionBehavior => 'Yapay zekanın davranışını istediğiniz gibi değiştirin.';
@override
String get settingsTitleInterface => 'Arayüz';
@override
String get settingsDescriptionInterface => 'Ollama Uygulamasının görünümünü ve davranışını düzenleyin.';
@override
String get settingsTitleVoice => 'Ses';
@override
String get settingsDescriptionVoice => 'Ses modunu etkinleştirin ve ses ayarlarını yapılandırın.';
@override
String get settingsTitleExport => 'Dışa Aktar';
@override
String get settingsDescriptionExport => 'Sohbet geçmişinizi dışa ve içe aktarın.';
@override
String get settingsTitleAbout => 'Hakkında';
@override
String get settingsDescriptionAbout => 'Güncellemeleri kontrol edin ve Ollama Uygulaması hakkında daha fazla bilgi edinin.';
@override
String get settingsSavedAutomatically => 'Ayarlar otomatik olarak kaydedilir';
@override
String get settingsExperimentalAlpha => 'alfa';
@override
String get settingsExperimentalAlphaDescription => 'Bu özellik alfa aşamasındadır ve beklendiği gibi çalışmayabilir.\nKritik sorunlar ve/veya cihaza ve/veya kullanılan hizmetlere kalıcı kritik hasar verilebilme ihtimali göz ardı edilemez.\nKendi sorumluluğunuzda kullanın. Uygulama yazarının hiçbir sorumluluğu yoktur.';
@override
String get settingsExperimentalAlphaFeature => 'Alfa özelliği, daha fazla bilgi için basılı tutun';
@override
String get settingsExperimentalBeta => 'beta';
@override
String get settingsExperimentalBetaDescription => 'Bu özellik beta aşamasındadır ve beklendiği gibi çalışmayabilir.\nDaha az ciddi sorunlar ortaya çıkabilir. Hasar kritik olmamalıdır.\nKendi sorumluluğunuzda kullanın.';
@override
String get settingsExperimentalBetaFeature => 'Beta özelliği, daha fazla bilgi için basılı tutun';
@override
String get settingsExperimentalDeprecated => 'kullanım dışı';
@override
String get settingsExperimentalDeprecatedDescription => 'Bu özellik kullanımdan kaldırılmıştır ve gelecekteki bir sürümde kaldırılacaktır.\nAmaçlandığı veya beklendiği gibi çalışmayabilir. Kullanım riski size aittir.';
@override
String get settingsExperimentalDeprecatedFeature => 'Kullanımdan kaldırılan özellik, daha fazla bilgi için bekleyin';
@override
String get settingsHost => 'Ana bilgisayar';
@override
String get settingsHostValid => 'Geçerli Ana Bilgisayar';
@override
String get settingsHostChecking => 'Ana Bilgisayar Kontrol Ediliyor';
@override
String settingsHostInvalid(String type) {
String _temp0 = intl.Intl.selectLogic(
type,
{
'url': 'Geçersiz URL',
'host': 'Geçersiz Ana Bilgisayar',
'timeout': 'İstek Başarısız. Sunucu sorunları',
'ratelimit': 'Çok fazla istek',
'other': 'İstek Başarısız',
},
);
return 'Sorun: $_temp0';
}
@override
String get settingsHostHeaderTitle => 'Ana bilgisayar başlığını ayarla';
@override
String get settingsHostHeaderInvalid => 'Girilen metin geçerli bir başlık JSON nesnesi değil';
@override
String settingsHostInvalidDetailed(String type) {
String _temp0 = intl.Intl.selectLogic(
type,
{
'url': 'Girdiğiniz URL geçersiz. Standart bir URL formatında değil.',
'other': 'Girdiğiniz ana bilgisayar geçersiz. Ulaşılamıyor. Lütfen ana bilgisayarı kontrol edin ve tekrar deneyin.',
},
);
return '$_temp0';
}
@override
String get settingsSystemMessage => 'Sistem mesajı';
@override
String get settingsUseSystem => 'Sistem mesajını kullan';
@override
String get settingsUseSystemDescription => 'Yukarıdaki sistem mesajını ayarlamayı devre dışı bırakır ve bunun yerine modelin mesajını kullanır. Model dosyaları olan modeller için yararlı olabilir';
@override
String get settingsDisableMarkdown => 'Markdown\'\'ı devre dışı bırak';
@override
String get settingsBehaviorNotUpdatedForOlderChats => 'Davranış ayarları eski sohbetler için güncellenmez';
@override
String get settingsShowModelTags => 'Model etiketlerini göster';
@override
String get settingsPreloadModels => 'Ön yükleme modelleri';
@override
String get settingsResetOnModelChange => 'Model değiştiğinde sıfırla';
@override
String get settingsRequestTypeStream => 'Akış';
@override
String get settingsRequestTypeRequest => 'İstek';
@override
String get settingsGenerateTitles => 'Başlıklar oluştur';
@override
String get settingsEnableEditing => 'Mesaj düzenlemeyi etkinleştir';
@override
String get settingsAskBeforeDelete => 'Sohbet silmeden önce sor';
@override
String get settingsShowTips => 'Kenar çubuğunda ipuçlarını göster';
@override
String get settingsKeepModelLoadedAlways => 'Modeli her zaman yüklü tut';
@override
String get settingsKeepModelLoadedNever => 'Modeli yüklü tutma';
@override
String get settingsKeepModelLoadedFor => 'Modelin yüklü kalacağı belirli bir süre ayarla';
@override
String settingsKeepModelLoadedSet(String minutes) {
return 'Modeli $minutes dakika boyunca yüklü tut';
}
@override
String get settingsTimeoutMultiplier => 'Zaman aşımı çarpanı';
@override
String get settingsTimeoutMultiplierDescription => 'Uygulamadaki her zaman aşımı değerine uygulanacak çarpanı seçin. Yavaş bir internet bağlantısı veya yavaş bir ana bilgisayar ile yararlı olabilir.';
@override
String get settingsTimeoutMultiplierExample => 'Örn. mesaj zaman aşımı:';
@override
String get settingsEnableHapticFeedback => 'Dokunsal geri bildirimi etkinleştir';
@override
String get settingsMaximizeOnStart => 'Başlangıçta maksimize et';
@override
String get settingsBrightnessSystem => 'Sistem';
@override
String get settingsBrightnessLight => 'ık';
@override
String get settingsBrightnessDark => 'Koyu';
@override
String get settingsThemeDevice => 'Cihaz';
@override
String get settingsThemeOllama => 'Ollama';
@override
String get settingsTemporaryFixes => 'Geçici arayüz düzeltmeleri';
@override
String get settingsTemporaryFixesDescription => 'Arayüz sorunları için geçici düzeltmeleri etkinleştirin. \nDaha fazla bilgi edinmek için tek tek seçeneklere uzun basın.';
@override
String get settingsTemporaryFixesInstructions => 'Ne yaptığınızı bilmiyorsanız bu ayarlardan herhangi birini değiştirmeyin! Verilen çözümler beklendiği gibi çalışmayabilir.\nBunlar nihai olarak görülemez veya bu şekilde değerlendirilmemelidir. Sorunlar ortaya çıkabilir.';
@override
String get settingsTemporaryFixesNoFixes => 'Herhangi bir düzeltme mevcut değil';
@override
String get settingsVoicePermissionLoading => 'Ses izinleri yükleniyor ...';
@override
String get settingsVoiceTtsNotSupported => 'Metinden sese desteklenmiyor';
@override
String get settingsVoiceTtsNotSupportedDescription => 'Metinden sese hizmetleri seçilen dil için desteklenmiyor. Bunları yeniden etkinleştirmek için dil çekmecesinde farklı bir dil seçin.\nSes tanıma ve yapay zeka ile düşünme gibi diğer hizmetler her zamanki gibi çalışmaya devam eder, ancak etkileşim o kadar akıcı olmayabilir.';
@override
String get settingsVoicePermissionNot => 'İzinler verilmedi';
@override
String get settingsVoiceNotEnabled => 'Ses modu etkin değil';
@override
String get settingsVoiceNotSupported => 'Ses modu desteklenmiyor';
@override
String get settingsVoiceEnable => 'Ses modunu etkinleştir';
@override
String get settingsVoiceNoLanguage => 'Dil seçilmedi';
@override
String get settingsVoiceLimitLanguage => 'Seçili dille sınırla';
@override
String get settingsVoicePunctuation => 'Yapay zeka noktalama işaretlerini etkinleştir';
@override
String get settingsExportChats => 'Sohbetleri dışa aktar';
@override
String get settingsExportChatsSuccess => 'Sohbetler başarıyla dışa aktarıldı';
@override
String get settingsImportChats => 'Sohbetleri içe aktar';
@override
String get settingsImportChatsTitle => 'İçe Aktar';
@override
String get settingsImportChatsDescription => 'Sonraki adım, seçilen dosyadan sohbetleri içe aktaracaktır. Bu işlem, şu anda mevcut olan tüm sohbetlerin üzerine yazacaktır.\nDevam etmek istiyor musunuz?';
@override
String get settingsImportChatsImport => 'İçe Aktar ve Sil';
@override
String get settingsImportChatsCancel => 'İptal';
@override
String get settingsImportChatsSuccess => 'Sohbetler başarıyla içe aktarıldı';
@override
String get settingsExportInfo => 'Bu seçenekler, sohbet geçmişinizi dışa ve içe aktarmanıza olanak tanır. Bu, sohbet geçmişinizi başka bir cihaza aktarmak veya yedeklemek istediğinizde kullanışlı olabilir';
@override
String get settingsExportWarning => 'Birden fazla sohbet geçmişi birleştirilmeyecek! Yeni bir sohbet geçmişi içe aktarırsanız mevcut sohbet geçmişinizi kaybedeceksiniz';
@override
String get settingsUpdateCheck => 'Güncellemeleri kontrol et';
@override
String get settingsUpdateChecking => 'Güncellemeler kontrol ediliyor ...';
@override
String get settingsUpdateLatest => 'En son sürümü kullanıyorsunuz';
@override
String settingsUpdateAvailable(String version) {
return 'Güncelleme mevcut (v$version)';
}
@override
String get settingsUpdateRateLimit => 'Kontrol edilemiyor, API hız sınırııldı';
@override
String get settingsUpdateIssue => 'Bir sorun oluştu';
@override
String get settingsUpdateDialogTitle => 'Yeni sürüm mevcut';
@override
String get settingsUpdateDialogDescription => 'Ollama\'\'nın yeni bir sürümü mevcut. Şimdi indirip kurmak istiyor musunuz?';
@override
String get settingsUpdateChangeLog => 'Değişiklik Günlüğü';
@override
String get settingsUpdateDialogUpdate => 'Güncelle';
@override
String get settingsUpdateDialogCancel => 'İptal';
@override
String get settingsCheckForUpdates => 'ılışta güncellemeleri kontrol et';
@override
String get settingsGithub => 'GitHub';
@override
String get settingsReportIssue => 'Sorun Bildir';
@override
String get settingsLicenses => 'Lisanslar';
@override
String settingsVersion(String version) {
return 'Ollama App v$version';
}
}

View File

@ -0,0 +1,483 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Chinese (`zh`).
class AppLocalizationsZh extends AppLocalizations {
AppLocalizationsZh([String locale = 'zh']) : super(locale);
@override
String get appTitle => 'Ollama';
@override
String get optionNewChat => '新建聊天';
@override
String get optionSettings => '设置';
@override
String get optionInstallPwa => '安装 Webapp';
@override
String get optionNoChatFound => '暂无聊天消息';
@override
String get tipPrefix => '提示: ';
@override
String get tip0 => '长按编辑消息';
@override
String get tip1 => '双击删除消息';
@override
String get tip2 => '您可以在设置中更改主题';
@override
String get tip3 => '选择一个多模态模型来输入图像';
@override
String get tip4 => '聊天记录会自动保存';
@override
String get deleteChat => '删除';
@override
String get renameChat => '重命名';
@override
String get takeImage => '拍摄图像';
@override
String get uploadImage => '上传图像';
@override
String get notAValidImage => '不是一个有效的图片文件.';
@override
String get imageOnlyConversation => '仅图片对话';
@override
String get messageInputPlaceholder => '消息';
@override
String get tooltipAttachment => '添加附件';
@override
String get tooltipSend => '发送';
@override
String get tooltipSave => '保存';
@override
String get tooltipLetAIThink => '让AI思考';
@override
String get tooltipAddHostHeaders => '设置主机请求头';
@override
String get tooltipReset => '重置当前聊天';
@override
String get tooltipOptions => '显示选项';
@override
String get noModelSelected => '未选择模型';
@override
String get noHostSelected => '没有填写主机地址,请打开设置以进行设置';
@override
String get noSelectedModel => '<模型选择>';
@override
String get newChatTitle => '未命名的聊天';
@override
String get modelDialogAddModel => '添加';
@override
String get modelDialogAddPromptTitle => '添加新模型';
@override
String get modelDialogAddPromptDescription => '可以是一个普通名称(如:\'llama3\'),也可以是名称加标签(如:\'llama3:70b\')。';
@override
String get modelDialogAddPromptAlreadyExists => '模型已存在';
@override
String get modelDialogAddPromptInvalid => '无效的模型名称';
@override
String get modelDialogAddAllowanceTitle => '允许代理服务器';
@override
String get modelDialogAddAllowanceDescription => 'Ollama 应用程序必须检查输入的模型是否有效。 为此我们通常向Ollama模型列表发送一个网络请求并检查状态。 由于您正在使用 Web 客户端,我们不能直接做到这一点。 因此,应用将把请求发送到另一个由 JHubi 1 部署的api 上进行检查。\n这是一个一次性请求,只有当您添加一个新模型时才会发送。\n您的IP地址将与请求一起发送可能会被存储长达10分钟以防止潜在的有害故障。\n如果您接受,您的选择将在将来被记住;如果不接受,将不会发送任何内容,也不会添加模型。';
@override
String get modelDialogAddAllowanceAllow => '允许';
@override
String get modelDialogAddAllowanceDeny => '拒绝';
@override
String modelDialogAddAssuranceTitle(String model) {
return '添加$model?';
}
@override
String modelDialogAddAssuranceDescription(String model) {
return '按下“添加”将直接从 Ollama 服务器下载模型“$model”到您的主机。\n这可能需要一些时间,取决于您的互联网连接。该操作不能被取消。\n如果在下载过程中关闭应用,当您再次在模型对话框中输入名称,它将恢复之前的下载。';
}
@override
String get modelDialogAddAssuranceAdd => '添加';
@override
String get modelDialogAddAssuranceCancel => '取消';
@override
String get modelDialogAddDownloadPercentLoading => '加载进度';
@override
String modelDialogAddDownloadPercent(String percent) {
return '已下载 $percent%';
}
@override
String get modelDialogAddDownloadFailed => '连接断开,请重试';
@override
String get modelDialogAddDownloadSuccess => '下载成功';
@override
String get deleteDialogTitle => '删除聊天';
@override
String get deleteDialogDescription => '您确定要继续吗?这将删除此聊天的所有记录,且无法撤消。\n要禁用此对话框,请访问设置。';
@override
String get deleteDialogDelete => '删除';
@override
String get deleteDialogCancel => '取消';
@override
String get dialogEnterNewTitle => '输入新标题';
@override
String get dialogEditMessageTitle => '编辑消息';
@override
String get settingsTitleBehavior => '行为';
@override
String get settingsDescriptionBehavior => '根据您的喜好修改AI的行为';
@override
String get settingsTitleInterface => '界面';
@override
String get settingsDescriptionInterface => '修改 Ollama App的外观和行为';
@override
String get settingsTitleVoice => '语音';
@override
String get settingsDescriptionVoice => '启用语音模式并进行设置。';
@override
String get settingsTitleExport => '导出';
@override
String get settingsDescriptionExport => '导出和导入您的聊天记录。';
@override
String get settingsTitleAbout => '关于';
@override
String get settingsDescriptionAbout => '检查更新并了解更多关于Ollama App的信息。';
@override
String get settingsSavedAutomatically => '设置已自动保存';
@override
String get settingsExperimentalAlpha => 'alpha';
@override
String get settingsExperimentalAlphaDescription => '此功能处于 Alpha 测试阶段,可能无法按预期工作。\n无法排除会对设备、服务造成严重问题或永久性重大损害。\n使用需自行承担风险。应用作者不承担任何责任。';
@override
String get settingsExperimentalAlphaFeature => 'Alpha功能按住以了解更多';
@override
String get settingsExperimentalBeta => 'beta';
@override
String get settingsExperimentalBetaDescription => '此功能处于 Beta 测试阶段,可能无法按预期工作。\n可能会出现较轻微的问题,损害预期不严重。\n使用需自行承担风险。';
@override
String get settingsExperimentalBetaFeature => 'Beta测试版功能按住以了解更多';
@override
String get settingsExperimentalDeprecated => '已弃用';
@override
String get settingsExperimentalDeprecatedDescription => '此功能已被弃用,并将在将来的版本中删除。\n它可能无法像预期的那样工作。请自行承担风险。';
@override
String get settingsExperimentalDeprecatedFeature => '已弃用的功能,按住以了解更多';
@override
String get settingsHost => '主机地址';
@override
String get settingsHostValid => '有效主机地址';
@override
String get settingsHostChecking => '正在检查主机地址';
@override
String settingsHostInvalid(String type) {
String _temp0 = intl.Intl.selectLogic(
type,
{
'url': '无效的URL',
'host': '无效的主机地址',
'timeout': '请求失败。服务器问题',
'other': '请求失败',
},
);
return '问题:$_temp0';
}
@override
String get settingsHostHeaderTitle => '设置主机请求头';
@override
String get settingsHostHeaderInvalid => '输入的文本不是有效的标题 JSON 对象';
@override
String settingsHostInvalidDetailed(String type) {
String _temp0 = intl.Intl.selectLogic(
type,
{
'url': '您输入的 URL 无效。它不是一个标准的 URL 格式。',
'other': '您输入的主机地址无效。无法连接。请检查主机地址并再试一次',
},
);
return '$_temp0';
}
@override
String get settingsSystemMessage => '系统信息';
@override
String get settingsUseSystem => '使用系统信息';
@override
String get settingsUseSystemDescription => '使用模型内嵌代替系统级别的消息。对于具有模型描述文件的模型可能会有用。';
@override
String get settingsDisableMarkdown => '禁用Markdown';
@override
String get settingsBehaviorNotUpdatedForOlderChats => '行为设置未针对旧聊天进行更新';
@override
String get settingsShowModelTags => '显示模型标签';
@override
String get settingsPreloadModels => '预加载模型';
@override
String get settingsResetOnModelChange => '模型更改时重置';
@override
String get settingsRequestTypeStream => '流式';
@override
String get settingsRequestTypeRequest => '请求';
@override
String get settingsGenerateTitles => '生成标题';
@override
String get settingsEnableEditing => '启用消息编辑';
@override
String get settingsAskBeforeDelete => '删除聊天前确认';
@override
String get settingsShowTips => '在侧边栏显示提示';
@override
String get settingsKeepModelLoadedAlways => '始终保持模型加载';
@override
String get settingsKeepModelLoadedNever => '不保持模型加载';
@override
String get settingsKeepModelLoadedFor => '设置模型加载的时间';
@override
String settingsKeepModelLoadedSet(String minutes) {
return '保持模型加载 $minutes 分钟';
}
@override
String get settingsTimeoutMultiplier => '超时时间倍倍数';
@override
String get settingsTimeoutMultiplierDescription => '选择应用程序中每个超时时间的倍数。适用于较慢的网络连接或远程主机。';
@override
String get settingsTimeoutMultiplierExample => '例如:消息超时:';
@override
String get settingsEnableHapticFeedback => '启用触觉反馈';
@override
String get settingsMaximizeOnStart => '最大化';
@override
String get settingsBrightnessSystem => '系统';
@override
String get settingsBrightnessLight => '明亮';
@override
String get settingsBrightnessDark => '黑暗';
@override
String get settingsThemeDevice => '设备主题';
@override
String get settingsThemeOllama => 'Ollama主题';
@override
String get settingsTemporaryFixes => '临时界面修复';
@override
String get settingsTemporaryFixesDescription => '启用界面问题的临时修复。\n长按选项以了解更多信息。';
@override
String get settingsTemporaryFixesInstructions => '不要切换这些设置,除非你知道自己在做什么!描述的行为可能不会按照预期工作。\n它们不能被视为最终结果。可能会导致一些问题。';
@override
String get settingsTemporaryFixesNoFixes => '没有可用的修复';
@override
String get settingsVoicePermissionLoading => '加载语音权限...';
@override
String get settingsVoiceTtsNotSupported => '不支持文本转语音';
@override
String get settingsVoiceTtsNotSupportedDescription => '所选的语言不支持文字转语音服务,您可能需要选择其他语言以启用该功能。\n语音识别和 AI 等其他服务仍可正常工作,但交互可能无法流畅运行。';
@override
String get settingsVoicePermissionNot => '未授予权限';
@override
String get settingsVoiceNotEnabled => '语音模式未启用';
@override
String get settingsVoiceNotSupported => '不支持语音模式';
@override
String get settingsVoiceEnable => '启用语音模式';
@override
String get settingsVoiceNoLanguage => '未选择语言';
@override
String get settingsVoiceLimitLanguage => '限制为所选语言';
@override
String get settingsVoicePunctuation => '启用AI标点';
@override
String get settingsExportChats => '导出聊天记录';
@override
String get settingsExportChatsSuccess => '聊天记录导出成功';
@override
String get settingsImportChats => '导入聊天记录';
@override
String get settingsImportChatsTitle => '导入';
@override
String get settingsImportChatsDescription => '以下步骤将从所选文件导入聊天记录。这将覆盖所有当前的聊天记录。\n您要继续吗?';
@override
String get settingsImportChatsImport => '导入并删除';
@override
String get settingsImportChatsCancel => '取消';
@override
String get settingsImportChatsSuccess => '聊天记录导入成功';
@override
String get settingsExportInfo => '这个选项允许您导出和导入您的聊天记录。如果您想将聊天记录转移到另一台设备或备份您的聊天记录,这可能会很有用。';
@override
String get settingsExportWarning => '多个聊天记录将不会合并!如果导入新的聊天记录,您将丢失当前的聊天记录';
@override
String get settingsUpdateCheck => '检查更新';
@override
String get settingsUpdateChecking => '检查更新中...';
@override
String get settingsUpdateLatest => '当前为最新版本';
@override
String settingsUpdateAvailable(String version) {
return '有可用更新 (v$version)';
}
@override
String get settingsUpdateRateLimit => '无法检查API使用已超过速率限制';
@override
String get settingsUpdateIssue => '更新服务出错';
@override
String get settingsUpdateDialogTitle => '有可用的新版本';
@override
String get settingsUpdateDialogDescription => 'Ollama有新版本可用。是否下载并安装';
@override
String get settingsUpdateChangeLog => '更新日志';
@override
String get settingsUpdateDialogUpdate => '更新';
@override
String get settingsUpdateDialogCancel => '取消';
@override
String get settingsCheckForUpdates => '启动时检查更新';
@override
String get settingsGithub => 'GitHub';
@override
String get settingsReportIssue => '问题反馈';
@override
String get settingsLicenses => '开源许可证';
@override
String settingsVersion(String version) {
return 'Ollama App v$version';
}
}

View File

@ -6,7 +6,7 @@ import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:ollama_app/l10n/gen/app_localizations.dart';
import 'screen_settings.dart';
import 'screen_voice.dart';
@ -496,7 +496,9 @@ class _MainAppState extends State<MainApp> {
: () async {
selectionHaptic();
if (!chatAllowed &&
chatUuid == jsonDecode(item)["uuid"]) return;
chatUuid == jsonDecode(item)["uuid"]) {
return;
}
if (!allowSettings) return;
String oldTitle = jsonDecode(item)["title"];
var newTitle = await prompt(context,
@ -770,10 +772,6 @@ class _MainAppState extends State<MainApp> {
}
if (!(allowSettings || useHost)) {
// ignore: use_build_context_synchronously
resetSystemNavigation(context,
statusBarColor: Colors.black,
systemNavigationBarColor: Colors.black);
showDialog(
// ignore: use_build_context_synchronously
context: context,
@ -836,8 +834,6 @@ class _MainAppState extends State<MainApp> {
@override
Widget build(BuildContext context) {
resetSystemNavigation(context);
Widget selector = InkWell(
onTap: !useModel
? () {

View File

@ -8,7 +8,8 @@ import 'worker/haptic.dart';
import 'worker/update.dart';
import 'worker/desktop.dart';
import 'worker/setter.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:ollama_app/l10n/gen/app_localizations.dart';
import 'settings/behavior.dart';
import 'settings/interface.dart';

View File

@ -5,7 +5,7 @@ import 'package:speech_to_text/speech_to_text.dart' as stt;
import 'package:ollama_dart/ollama_dart.dart' as llama;
import 'package:datetime_loop/datetime_loop.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:ollama_app/l10n/gen/app_localizations.dart';
import 'main.dart';
import 'worker/sender.dart';
@ -185,11 +185,6 @@ class _ScreenVoiceState extends State<ScreenVoice> {
updateScrollState();
});
resetSystemNavigation(context,
statusBarColor: themeDark().colorScheme.surface,
systemNavigationBarColor: themeDark().colorScheme.surface,
delay: const Duration(milliseconds: 10));
void load() async {
var tmp = await speech.locales();
languageOptionIds = tmp.map((e) => e.localeId);
@ -222,7 +217,6 @@ class _ScreenVoiceState extends State<ScreenVoice> {
}
settingsOpen = false;
logoVisible = true;
resetSystemNavigation(context);
},
child: Scaffold(
appBar: AppBar(
@ -260,7 +254,6 @@ class _ScreenVoiceState extends State<ScreenVoice> {
MaterialPageRoute(
builder: (context) =>
const ScreenSettingsVoice()));
resetSystemNavigation(context);
},
icon: const Icon(
Icons.settings_rounded,
@ -268,144 +261,142 @@ class _ScreenVoiceState extends State<ScreenVoice> {
))
]),
body: SafeArea(
child: Column(
mainAxisSize: MainAxisSize.max,
children: [
Expanded(
child: Column(mainAxisSize: MainAxisSize.max, children: [
Expanded(
child: Padding(
padding: const EdgeInsets.only(left: 16, right: 16),
child: Center(
child: Text(text,
textAlign: TextAlign.center,
overflow: TextOverflow.fade,
style: const TextStyle(
color: Colors.grey,
fontFamily: "monospace"))),
))
]),
),
Expanded(
child: Column(mainAxisSize: MainAxisSize.max, children: [
Expanded(
child: Column(mainAxisSize: MainAxisSize.max, children: [
Expanded(
child: Padding(
padding: const EdgeInsets.only(left: 16, right: 16),
child: Center(
child: DateTimeLoopBuilder(
timeUnit: TimeUnit.seconds,
builder: (context, dateTime, child) {
return SizedBox(
height: 96,
width: 96,
child: AnimatedScale(
scale: speaking
? aiThinking
? (dateTime.second).isEven
? 2.4
: 2
: 2
: dateTime.second
.toString()
.endsWith("1")
? 1.6
: 1.4,
duration: aiThinking
? const Duration(seconds: 1)
: const Duration(milliseconds: 200),
curve: Curves.easeInOut,
child: InkWell(
borderRadius:
BorderRadius.circular(48),
onTap: () {
if (speaking && !aiThinking) {
intendedStop = true;
speaking = false;
voice.stop();
return;
}
process();
},
child: CircleAvatar(
backgroundColor: themeDark()
.colorScheme
.primary
child: Text(text,
textAlign: TextAlign.center,
overflow: TextOverflow.fade,
style: const TextStyle(
color: Colors.grey,
fontFamily: "monospace"))),
))
]),
),
Expanded(
child: Center(
child: DateTimeLoopBuilder(
timeUnit: TimeUnit.seconds,
builder: (context, dateTime, child) {
return SizedBox(
height: 96,
width: 96,
child: AnimatedScale(
scale: speaking
? aiThinking
? (dateTime.second).isEven
? 2.4
: 2
: 2
: dateTime.second
.toString()
.endsWith("1")
? 1.6
: 1.4,
duration: aiThinking
? const Duration(seconds: 1)
: const Duration(milliseconds: 200),
curve: Curves.easeInOut,
child: InkWell(
borderRadius:
BorderRadius.circular(48),
onTap: () {
if (speaking && !aiThinking) {
intendedStop = true;
speaking = false;
voice.stop();
return;
}
process();
},
child: CircleAvatar(
backgroundColor: themeDark()
.colorScheme
.primary
.withAlpha(
!speaking ? 200 : 255),
child: AnimatedSwitcher(
duration: const Duration(
milliseconds: 200),
child: speaking
? aiThinking
? Icon(Icons.auto_awesome_rounded,
color: themeDark()
.colorScheme
.secondary,
key: const ValueKey(
"aiThinking"))
: sttDone
? Icon(Icons.volume_up_rounded,
color: themeDark()
.colorScheme
.secondary,
key: const ValueKey(
"tts"))
: Icon(Icons.mic_rounded,
color: themeDark()
.colorScheme
.secondary,
key: const ValueKey("stt"))
: null)))),
);
}))),
Expanded(
child: Column(mainAxisSize: MainAxisSize.max, children: [
Expanded(
child: Stack(
children: [
ShaderMask(
shaderCallback: (Rect bounds) {
return LinearGradient(
begin: Alignment.bottomCenter,
end: Alignment.topCenter,
colors: const [
Colors.transparent,
Colors.black
],
stops: [0.0, atScrollEnd ? 0.0 : 0.1],
).createShader(bounds);
},
blendMode: BlendMode.dstIn,
child: SingleChildScrollView(
controller: scrollController,
child: Padding(
padding: const EdgeInsets.only(
left: 16, right: 16),
child: Center(
child: Text(aiText,
textAlign: TextAlign.center,
overflow: TextOverflow.fade,
style: const TextStyle(
fontFamily:
"monospace")))))),
if (!atScrollEnd)
Positioned(
right: 0,
bottom: 0,
child: IconButton(
icon: const Icon(
Icons.arrow_downward_rounded,
color: Colors.grey),
onPressed: () {
scrollController.animateTo(
scrollController
.position.maxScrollExtent,
duration: const Duration(
milliseconds: 500),
curve: Curves.easeInOut);
}),
)
],
))
]),
)
]),
child: AnimatedSwitcher(
duration: const Duration(
milliseconds: 200),
child: speaking
? aiThinking
? Icon(Icons.auto_awesome_rounded,
color: themeDark()
.colorScheme
.secondary,
key: const ValueKey(
"aiThinking"))
: sttDone
? Icon(Icons.volume_up_rounded,
color: themeDark()
.colorScheme
.secondary,
key: const ValueKey(
"tts"))
: Icon(Icons.mic_rounded,
color: themeDark()
.colorScheme
.secondary,
key: const ValueKey("stt"))
: null)))),
);
}))),
Expanded(
child: Column(mainAxisSize: MainAxisSize.max, children: [
Expanded(
child: Stack(
children: [
ShaderMask(
shaderCallback: (Rect bounds) {
return LinearGradient(
begin: Alignment.bottomCenter,
end: Alignment.topCenter,
colors: const [
Colors.transparent,
Colors.black
],
stops: [0.0, atScrollEnd ? 0.0 : 0.1],
).createShader(bounds);
},
blendMode: BlendMode.dstIn,
child: SingleChildScrollView(
controller: scrollController,
child: Padding(
padding: const EdgeInsets.only(
left: 16, right: 16),
child: Center(
child: Text(aiText,
textAlign: TextAlign.center,
overflow: TextOverflow.fade,
style: const TextStyle(
fontFamily:
"monospace")))))),
if (!atScrollEnd)
Positioned(
right: 0,
bottom: 0,
child: IconButton(
icon: const Icon(
Icons.arrow_downward_rounded,
color: Colors.grey),
onPressed: () {
scrollController.animateTo(
scrollController
.position.maxScrollExtent,
duration:
const Duration(milliseconds: 500),
curve: Curves.easeInOut);
}),
)
],
))
]),
)
]),
))));
}
}

View File

@ -26,19 +26,6 @@ class _ScreenWelcomeState extends State<ScreenWelcome> {
precacheImage(const AssetImage("assets/welcome/2dark.png"), context);
precacheImage(const AssetImage("assets/welcome/3dark.png"), context);
resetSystemNavigation(context,
systemNavigationBarColor:
(prefs!.getString("brightness") ?? "system") == "system"
// ignore: use_build_context_synchronously
? ((MediaQuery.of(context).platformBrightness ==
Brightness.light)
? Colors.grey[100]
: Colors.grey[900])
: (prefs!.getString("brightness") == "dark"
? Colors.grey[900]
: Colors.grey[100]),
delay: const Duration(milliseconds: 10));
return Scaffold(
bottomNavigationBar: BottomSheet(
enableDrag: false,

View File

@ -5,7 +5,8 @@ import '../screen_settings.dart';
import '../worker/haptic.dart';
import '../worker/update.dart';
import '../worker/desktop.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:ollama_app/l10n/gen/app_localizations.dart';
import 'package:bitsdojo_window/bitsdojo_window.dart';
import 'package:simple_icons/simple_icons.dart';

View File

@ -4,7 +4,8 @@ import '../main.dart';
import '../worker/haptic.dart';
import '../worker/desktop.dart';
import '../screen_settings.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:ollama_app/l10n/gen/app_localizations.dart';
import 'package:bitsdojo_window/bitsdojo_window.dart';
import 'package:dynamic_color/dynamic_color.dart';

View File

@ -8,9 +8,9 @@ import 'package:flutter/foundation.dart';
import '../main.dart';
import '../worker/haptic.dart';
import '../worker/desktop.dart';
import '../worker/theme.dart';
import '../screen_settings.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:ollama_app/l10n/gen/app_localizations.dart';
import 'package:bitsdojo_window/bitsdojo_window.dart';
import 'package:file_picker/file_picker.dart';
@ -104,10 +104,6 @@ class _ScreenSettingsExportState extends State<ScreenSettingsExport> {
AppLocalizations.of(context)!.settingsImportChats,
Icons.download_rounded, () async {
selectionHaptic();
resetSystemNavigation(context,
systemNavigationBarColor: Color.alphaBlend(
Colors.black54,
Theme.of(context).colorScheme.surface));
await showDialog(
context: context,
builder: (context) {
@ -219,8 +215,6 @@ class _ScreenSettingsExportState extends State<ScreenSettingsExport> {
.settingsImportChatsImport))
]);
});
// ignore: use_build_context_synchronously
resetSystemNavigation(context);
})
: const SizedBox.shrink()
]),

View File

@ -5,7 +5,8 @@ import '../worker/haptic.dart';
import '../worker/desktop.dart';
import '../worker/theme.dart';
import '../screen_settings.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:ollama_app/l10n/gen/app_localizations.dart';
import 'package:bitsdojo_window/bitsdojo_window.dart';
import 'package:dartx/dartx.dart';
@ -190,10 +191,6 @@ class _ScreenSettingsInterfaceState extends State<ScreenSettingsInterface> {
.settingsKeepModelLoadedFor,
Icons.snooze_rounded, () async {
selectionHaptic();
resetSystemNavigation(context,
systemNavigationBarColor: Color.alphaBlend(
Colors.black54,
Theme.of(context).colorScheme.surface));
bool loaded = false;
await showDialog(
context: context,
@ -283,8 +280,6 @@ class _ScreenSettingsInterfaceState extends State<ScreenSettingsInterface> {
);
}));
});
// ignore: use_build_context_synchronously
resetSystemNavigation(context);
}),
titleDivider(context: context),
button(

View File

@ -5,9 +5,9 @@ import 'package:ollama_app/worker/haptic.dart';
import 'package:ollama_app/worker/theme.dart';
import '../main.dart';
// import '../worker/haptic.dart';
import '../screen_settings.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:ollama_app/l10n/gen/app_localizations.dart';
import 'package:bitsdojo_window/bitsdojo_window.dart';
import 'package:permission_handler/permission_handler.dart';
@ -212,7 +212,8 @@ class _ScreenSettingsVoiceState extends State<ScreenSettingsVoice> {
}
return PopScope(
onPopInvokedWithResult: (didPop, result) {
onPopInvokedWithResult:
(didPop, result) {
if (usedIndex == -1) return;
prefs!.setString(
"voiceLanguage",

View File

@ -7,7 +7,8 @@ import 'package:ollama_app/worker/clients.dart';
import 'haptic.dart';
import 'setter.dart';
import '../main.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:ollama_app/l10n/gen/app_localizations.dart';
import 'package:ollama_dart/ollama_dart.dart' as llama;
import 'package:dartx/dartx.dart';

View File

@ -4,7 +4,6 @@ import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:ollama_app/worker/clients.dart';
import 'desktop.dart';
import 'haptic.dart';
@ -12,6 +11,8 @@ import '../main.dart';
import 'sender.dart';
import 'theme.dart';
import 'package:ollama_app/l10n/gen/app_localizations.dart';
import 'package:dartx/dartx.dart';
import 'package:ollama_dart/ollama_dart.dart' as llama;
// ignore: depend_on_referenced_packages
@ -397,9 +398,6 @@ void addModel(BuildContext context, Function setState) async {
}
if (response.statusCode == 200) {
bool returnValue = false;
resetSystemNavigation(mainContext!,
systemNavigationBarColor: Color.alphaBlend(
Colors.black54, Theme.of(mainContext!).colorScheme.surface));
await showDialog(
context: mainContext!,
barrierDismissible: false,
@ -429,7 +427,6 @@ void addModel(BuildContext context, Function setState) async {
.modelDialogAddAssuranceAdd))
]);
});
resetSystemNavigation(mainContext!);
return returnValue;
}
if (response.statusCode == 429) {
@ -707,12 +704,6 @@ Future<bool> deleteChatDialog(BuildContext context, Function setState,
}
if ((prefs!.getBool("askBeforeDeletion") ?? false) && additionalCondition) {
// ignore: use_build_context_synchronously
resetSystemNavigation(context,
systemNavigationBarColor: Color.alphaBlend(
Colors.black54,
// ignore: use_build_context_synchronously
Theme.of(context).colorScheme.surface));
await showDialog(
context: context,
builder: (context) {
@ -741,8 +732,6 @@ Future<bool> deleteChatDialog(BuildContext context, Function setState,
]);
});
});
// ignore: use_build_context_synchronously
resetSystemNavigation(context);
} else {
delete(context);
}

View File

@ -1,53 +1,19 @@
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import '../main.dart';
ColorScheme? colorSchemeLight;
ColorScheme? colorSchemeDark;
void resetSystemNavigation(BuildContext context,
{Color? color,
Color? statusBarColor,
Color? systemNavigationBarColor,
Duration? delay}) {
WidgetsBinding.instance.addPostFrameCallback((_) async {
if (delay != null) {
await Future.delayed(delay);
}
// ignore: use_build_context_synchronously
color ??= themeCurrent(context).colorScheme.surface;
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
statusBarIconBrightness:
(((statusBarColor != null) ? statusBarColor : color)!
.computeLuminance() >
0.179)
? Brightness.dark
: Brightness.light,
statusBarColor:
((((statusBarColor != null) ? statusBarColor : color)!.value !=
// ignore: use_build_context_synchronously
themeCurrent(context).colorScheme.surface.value) ||
kIsWeb)
? (statusBarColor != null)
? statusBarColor
: color
: Colors.transparent,
systemNavigationBarColor:
(systemNavigationBarColor != null) ? systemNavigationBarColor : color,
));
});
}
ThemeData themeModifier(ThemeData theme) {
return theme.copyWith(
// https://docs.flutter.dev/platform-integration/android/predictive-back#set-up-your-app
pageTransitionsTheme: const PageTransitionsTheme(
builders: <TargetPlatform, PageTransitionsBuilder>{
TargetPlatform.android: PredictiveBackPageTransitionsBuilder(),
},
));
builders: <TargetPlatform, PageTransitionsBuilder>{
TargetPlatform.android: PredictiveBackPageTransitionsBuilder(),
},
),
sliderTheme: theme.sliderTheme.copyWith(year2023: false));
}
ThemeData themeCurrent(BuildContext context) {

View File

@ -6,12 +6,12 @@ import 'package:ollama_app/worker/clients.dart';
import 'package:ollama_app/worker/desktop.dart';
import 'haptic.dart';
import 'theme.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:ollama_app/l10n/gen/app_localizations.dart';
import '../main.dart';
import 'package:install_referrer/install_referrer.dart';
import 'package:flutter_install_referrer/flutter_install_referrer.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:url_launcher/url_launcher.dart';
@ -128,9 +128,6 @@ Future<bool> checkUpdate(Function setState) async {
}
void updateDialog(BuildContext context, Function title) async {
resetSystemNavigation(context,
systemNavigationBarColor: Color.alphaBlend(
Colors.black54, Theme.of(context).colorScheme.surface));
await showDialog(
context: context,
builder: (context) {
@ -170,6 +167,4 @@ void updateDialog(BuildContext context, Function title) async {
AppLocalizations.of(context)!.settingsUpdateDialogUpdate))
]);
});
// ignore: use_build_context_synchronously
resetSystemNavigation(context);
}

View File

@ -5,26 +5,26 @@ packages:
dependency: "direct main"
description:
name: animated_text_kit
sha256: "37392a5376c9a1a503b02463c38bc0342ef814ddbb8f9977bc90f2a84b22fa92"
sha256: adba517adb7e6adeb1eb5e1c8a147dd7bc664dfdf2f5e92226b572a91393a93d
url: "https://pub.dev"
source: hosted
version: "4.2.2"
version: "4.2.3"
args:
dependency: transitive
description:
name: args
sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a"
sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6
url: "https://pub.dev"
source: hosted
version: "2.5.0"
version: "2.6.0"
async:
dependency: transitive
description:
name: async
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
url: "https://pub.dev"
source: hosted
version: "2.11.0"
version: "2.12.0"
bitsdojo_window:
dependency: "direct main"
description:
@ -69,42 +69,42 @@ packages:
dependency: transitive
description:
name: boolean_selector
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
url: "https://pub.dev"
source: hosted
version: "2.1.1"
version: "2.1.2"
characters:
dependency: transitive
description:
name: characters
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
url: "https://pub.dev"
source: hosted
version: "1.3.0"
version: "1.4.0"
charcode:
dependency: transitive
description:
name: charcode
sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306
sha256: fb0f1107cac15a5ea6ef0a6ef71a807b9e4267c713bb93e00e92d737cc8dbd8a
url: "https://pub.dev"
source: hosted
version: "1.3.1"
version: "1.4.0"
clock:
dependency: transitive
description:
name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
url: "https://pub.dev"
source: hosted
version: "1.1.1"
version: "1.1.2"
collection:
dependency: transitive
description:
name: collection
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
url: "https://pub.dev"
source: hosted
version: "1.18.0"
version: "1.19.1"
cross_file:
dependency: transitive
description:
@ -117,18 +117,18 @@ packages:
dependency: transitive
description:
name: crypto
sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27
sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855"
url: "https://pub.dev"
source: hosted
version: "3.0.5"
version: "3.0.6"
csslib:
dependency: transitive
description:
name: csslib
sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb"
sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
version: "1.0.2"
dartx:
dependency: "direct main"
description:
@ -141,10 +141,10 @@ packages:
dependency: "direct main"
description:
name: datetime_loop
sha256: "5b7b694879e505368e6d0e04ac8bb55a1e7d2e493dd0b851e08db08e1ba784e2"
sha256: "147afacf3102b41ceb5dee07c187731d978726476f51642a3f741ee69acea77c"
url: "https://pub.dev"
source: hosted
version: "1.2.0"
version: "1.2.1"
diffutil_dart:
dependency: transitive
description:
@ -173,18 +173,18 @@ packages:
dependency: transitive
description:
name: equatable
sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2
sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7"
url: "https://pub.dev"
source: hosted
version: "2.0.5"
version: "2.0.7"
fake_async:
dependency: transitive
description:
name: fake_async
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc"
url: "https://pub.dev"
source: hosted
version: "1.3.1"
version: "1.3.2"
fetch_api:
dependency: transitive
description:
@ -205,26 +205,26 @@ packages:
dependency: transitive
description:
name: ffi
sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6"
sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418"
url: "https://pub.dev"
source: hosted
version: "2.1.3"
version: "2.1.4"
file:
dependency: transitive
description:
name: file
sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
url: "https://pub.dev"
source: hosted
version: "7.0.0"
version: "7.0.1"
file_picker:
dependency: "direct main"
description:
name: file_picker
sha256: "167bb619cdddaa10ef2907609feb8a79c16dfa479d3afaf960f8e223f754bf12"
sha256: ab13ae8ef5580a411c458d6207b6774a6c237d77ac37011b13994879f68a8810
url: "https://pub.dev"
source: hosted
version: "8.1.2"
version: "8.3.7"
file_selector:
dependency: "direct main"
description:
@ -237,34 +237,34 @@ packages:
dependency: transitive
description:
name: file_selector_android
sha256: "77f23eb5916fd0875946720d1f286f809a28a867d4882db6ac2cf053e2d5f7c6"
sha256: "98ac58e878b05ea2fdb204e7f4fc4978d90406c9881874f901428e01d3b18fbc"
url: "https://pub.dev"
source: hosted
version: "0.5.1+6"
version: "0.5.1+12"
file_selector_ios:
dependency: transitive
description:
name: file_selector_ios
sha256: "38ebf91ecbcfa89a9639a0854ccaed8ab370c75678938eebca7d34184296f0bb"
sha256: "94b98ad950b8d40d96fee8fa88640c2e4bd8afcdd4817993bd04e20310f45420"
url: "https://pub.dev"
source: hosted
version: "0.5.3"
version: "0.5.3+1"
file_selector_linux:
dependency: transitive
description:
name: file_selector_linux
sha256: "045d372bf19b02aeb69cacf8b4009555fb5f6f0b7ad8016e5f46dd1387ddd492"
sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33"
url: "https://pub.dev"
source: hosted
version: "0.9.2+1"
version: "0.9.3+2"
file_selector_macos:
dependency: transitive
description:
name: file_selector_macos
sha256: f42eacb83b318e183b1ae24eead1373ab1334084404c8c16e0354f9a3e55d385
sha256: "271ab9986df0c135d45c3cdb6bd0faa5db6f4976d3e4b437cf7d0f258d941bfc"
url: "https://pub.dev"
source: hosted
version: "0.9.4"
version: "0.9.4+2"
file_selector_platform_interface:
dependency: transitive
description:
@ -285,18 +285,18 @@ packages:
dependency: transitive
description:
name: file_selector_windows
sha256: "2ad726953f6e8affbc4df8dc78b77c3b4a060967a291e528ef72ae846c60fb69"
sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b"
url: "https://pub.dev"
source: hosted
version: "0.9.3+2"
version: "0.9.3+4"
fixnum:
dependency: transitive
description:
name: fixnum
sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1"
sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be
url: "https://pub.dev"
source: hosted
version: "1.1.0"
version: "1.1.1"
flutter:
dependency: "direct main"
description: flutter
@ -326,6 +326,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.6.0"
flutter_install_referrer:
dependency: "direct main"
description:
name: flutter_install_referrer
sha256: "8f994ff0653be0483303af0a6f4ecbe2fc643a61456e5bd3bf5e28e38b035c77"
url: "https://pub.dev"
source: hosted
version: "2.0.2"
flutter_link_previewer:
dependency: transitive
description:
@ -359,10 +367,10 @@ packages:
dependency: "direct main"
description:
name: flutter_markdown
sha256: a23c41ee57573e62fc2190a1f36a0480c4d90bde3a8a8d7126e5d5992fb53fb7
sha256: e7bbc718adc9476aa14cfddc1ef048d2e21e4e8f18311aaac723266db9f9e7b5
url: "https://pub.dev"
source: hosted
version: "0.7.3+1"
version: "0.7.6+2"
flutter_parsed_text:
dependency: transitive
description:
@ -375,10 +383,10 @@ packages:
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
sha256: "9d98bd47ef9d34e803d438f17fd32b116d31009f534a6fa5ce3a1167f189a6de"
sha256: "5a1e6fb2c0561958d7e4c33574674bda7b77caaca7a33b758876956f2902eea3"
url: "https://pub.dev"
source: hosted
version: "2.0.21"
version: "2.0.27"
flutter_test:
dependency: "direct dev"
description: flutter
@ -388,10 +396,10 @@ packages:
dependency: "direct main"
description:
name: flutter_tts
sha256: aed2a00c48c43af043ed81145fd8503ddd793dafa7088ab137dbef81a703e53d
sha256: baa3cb6b4990318460fe28bfa8c7869399e97223971532c02bd97c5e876aa3c5
url: "https://pub.dev"
source: hosted
version: "4.0.2"
version: "4.2.2"
flutter_web_plugins:
dependency: transitive
description: flutter
@ -409,26 +417,26 @@ packages:
dependency: transitive
description:
name: html
sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a"
sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec"
url: "https://pub.dev"
source: hosted
version: "0.15.4"
version: "0.15.5"
http:
dependency: "direct main"
description:
name: http
sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010
sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f
url: "https://pub.dev"
source: hosted
version: "1.2.2"
version: "1.3.0"
http_parser:
dependency: transitive
description:
name: http_parser
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
url: "https://pub.dev"
source: hosted
version: "4.0.2"
version: "4.1.2"
image_picker:
dependency: "direct main"
description:
@ -441,26 +449,26 @@ packages:
dependency: transitive
description:
name: image_picker_android
sha256: "8c5abf0dcc24fe6e8e0b4a5c0b51a5cf30cefdf6407a3213dae61edc75a70f56"
sha256: "82652a75e3dd667a91187769a6a2cc81bd8c111bbead698d8e938d2b63e5e89a"
url: "https://pub.dev"
source: hosted
version: "0.8.12+12"
version: "0.8.12+21"
image_picker_for_web:
dependency: transitive
description:
name: image_picker_for_web
sha256: "65d94623e15372c5c51bebbcb820848d7bcb323836e12dfdba60b5d3a8b39e50"
sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83"
url: "https://pub.dev"
source: hosted
version: "3.0.5"
version: "3.0.6"
image_picker_ios:
dependency: transitive
description:
name: image_picker_ios
sha256: "6703696ad49f5c3c8356d576d7ace84d1faf459afb07accbb0fae780753ff447"
sha256: "05da758e67bc7839e886b3959848aa6b44ff123ab4b28f67891008afe8ef9100"
url: "https://pub.dev"
source: hosted
version: "0.8.12"
version: "0.8.12+2"
image_picker_linux:
dependency: transitive
description:
@ -473,18 +481,18 @@ packages:
dependency: transitive
description:
name: image_picker_macos
sha256: "3f5ad1e8112a9a6111c46d0b57a7be2286a9a07fc6e1976fdf5be2bd31d4ff62"
sha256: "1b90ebbd9dcf98fb6c1d01427e49a55bd96b5d67b8c67cf955d60a5de74207c1"
url: "https://pub.dev"
source: hosted
version: "0.2.1+1"
version: "0.2.1+2"
image_picker_platform_interface:
dependency: transitive
description:
name: image_picker_platform_interface
sha256: "9ec26d410ff46f483c5519c29c02ef0e02e13a543f882b152d4bfd2f06802f80"
sha256: "886d57f0be73c4b140004e78b9f28a8914a09e50c2d816bdd0520051a71236a0"
url: "https://pub.dev"
source: hosted
version: "2.10.0"
version: "2.10.1"
image_picker_windows:
dependency: transitive
description:
@ -493,14 +501,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.2.1+1"
install_referrer:
dependency: "direct main"
description:
name: install_referrer
sha256: "901c56d24ee3c3010dfd0bbebf305ed6b4b0f3fe969192081c167590a64cd78b"
url: "https://pub.dev"
source: hosted
version: "1.2.1"
intl:
dependency: "direct main"
description:
@ -513,10 +513,10 @@ packages:
dependency: transitive
description:
name: js
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc"
url: "https://pub.dev"
source: hosted
version: "0.6.7"
version: "0.7.2"
json_annotation:
dependency: transitive
description:
@ -529,18 +529,18 @@ packages:
dependency: transitive
description:
name: leak_tracker
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
url: "https://pub.dev"
source: hosted
version: "10.0.5"
version: "10.0.8"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
url: "https://pub.dev"
source: hosted
version: "3.0.5"
version: "3.0.9"
leak_tracker_testing:
dependency: transitive
description:
@ -569,18 +569,18 @@ packages:
dependency: transitive
description:
name: markdown
sha256: ef2a1298144e3f985cc736b22e0ccdaf188b5b3970648f2d9dc13efd1d9df051
sha256: "935e23e1ff3bc02d390bad4d4be001208ee92cc217cb5b5a6c19bc14aaa318c1"
url: "https://pub.dev"
source: hosted
version: "7.2.2"
version: "7.3.0"
matcher:
dependency: transitive
description:
name: matcher
sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
url: "https://pub.dev"
source: hosted
version: "0.12.16+1"
version: "0.12.17"
material_color_utilities:
dependency: transitive
description:
@ -593,50 +593,50 @@ packages:
dependency: transitive
description:
name: meta
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
url: "https://pub.dev"
source: hosted
version: "1.15.0"
version: "1.16.0"
mime:
dependency: transitive
description:
name: mime
sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2"
sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6"
url: "https://pub.dev"
source: hosted
version: "1.0.5"
version: "2.0.0"
ollama_dart:
dependency: "direct main"
description:
name: ollama_dart
sha256: f65e60c61c91f625df76b4435474bfacc315b4b4eaa8b53e2385679da121dee4
sha256: "4e40bc499b6fe46ba54a004d2da601c40bd73d66e3f18cf7b03225ccf3d481a6"
url: "https://pub.dev"
source: hosted
version: "0.2.1"
version: "0.2.2+1"
package_info_plus:
dependency: "direct main"
description:
name: package_info_plus
sha256: a75164ade98cb7d24cfd0a13c6408927c6b217fa60dee5a7ff5c116a58f28918
sha256: "7976bfe4c583170d6cdc7077e3237560b364149fcd268b5f53d95a991963b191"
url: "https://pub.dev"
source: hosted
version: "8.0.2"
version: "8.3.0"
package_info_plus_platform_interface:
dependency: transitive
description:
name: package_info_plus_platform_interface
sha256: ac1f4a4847f1ade8e6a87d1f39f5d7c67490738642e2542f559ec38c37489a66
sha256: "6c935fb612dff8e3cc9632c2b301720c77450a126114126ffaafe28d2e87956c"
url: "https://pub.dev"
source: hosted
version: "3.0.1"
version: "3.2.0"
path:
dependency: transitive
description:
name: path
sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
url: "https://pub.dev"
source: hosted
version: "1.9.0"
version: "1.9.1"
path_provider_linux:
dependency: transitive
description:
@ -673,42 +673,42 @@ packages:
dependency: "direct main"
description:
name: permission_handler
sha256: "18bf33f7fefbd812f37e72091a15575e72d5318854877e0e4035a24ac1113ecb"
sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849"
url: "https://pub.dev"
source: hosted
version: "11.3.1"
version: "11.4.0"
permission_handler_android:
dependency: transitive
description:
name: permission_handler_android
sha256: "76e4ab092c1b240d31177bb64d2b0bea43f43d0e23541ec866151b9f7b2490fa"
sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc
url: "https://pub.dev"
source: hosted
version: "12.0.12"
version: "12.1.0"
permission_handler_apple:
dependency: transitive
description:
name: permission_handler_apple
sha256: e6f6d73b12438ef13e648c4ae56bd106ec60d17e90a59c4545db6781229082a0
sha256: f84a188e79a35c687c132a0a0556c254747a08561e99ab933f12f6ca71ef3c98
url: "https://pub.dev"
source: hosted
version: "9.4.5"
version: "9.4.6"
permission_handler_html:
dependency: transitive
description:
name: permission_handler_html
sha256: af26edbbb1f2674af65a8f4b56e1a6f526156bc273d0e65dd8075fab51c78851
sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24"
url: "https://pub.dev"
source: hosted
version: "0.1.3+2"
version: "0.1.3+5"
permission_handler_platform_interface:
dependency: transitive
description:
name: permission_handler_platform_interface
sha256: fe0ffe274d665be8e34f9c59705441a7d248edebbe5d9e3ec2665f88b79358ea
sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878
url: "https://pub.dev"
source: hosted
version: "4.2.2"
version: "4.3.0"
permission_handler_windows:
dependency: transitive
description:
@ -729,10 +729,10 @@ packages:
dependency: transitive
description:
name: platform
sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65"
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
url: "https://pub.dev"
source: hosted
version: "3.1.5"
version: "3.1.6"
plugin_platform_interface:
dependency: transitive
description:
@ -745,10 +745,10 @@ packages:
dependency: "direct main"
description:
name: pwa_install
sha256: "79a6c38e67db12da98489258ead7e025ce4860c9010cde226d0b53ad6d403fd9"
sha256: "77fbb93d064d0cda0657f61386958562a13a7e57a2ce2a8b6da707d3bcef43c5"
url: "https://pub.dev"
source: hosted
version: "0.0.5"
version: "0.0.6"
scroll_to_index:
dependency: "direct main"
description:
@ -761,26 +761,26 @@ packages:
dependency: "direct main"
description:
name: shared_preferences
sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051"
sha256: "846849e3e9b68f3ef4b60c60cf4b3e02e9321bc7f4d8c4692cf87ffa82fc8a3a"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
version: "2.5.2"
shared_preferences_android:
dependency: transitive
description:
name: shared_preferences_android
sha256: a7e8467e9181cef109f601e3f65765685786c1a738a83d7fbbde377589c0d974
sha256: a768fc8ede5f0c8e6150476e14f38e2417c0864ca36bb4582be8e21925a03c22
url: "https://pub.dev"
source: hosted
version: "2.3.1"
version: "2.4.6"
shared_preferences_foundation:
dependency: transitive
description:
name: shared_preferences_foundation
sha256: c4b35f6cb8f63c147312c054ce7c2254c8066745125264f0c88739c417fc9d9f
sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03"
url: "https://pub.dev"
source: hosted
version: "2.5.2"
version: "2.5.4"
shared_preferences_linux:
dependency: transitive
description:
@ -801,10 +801,10 @@ packages:
dependency: transitive
description:
name: shared_preferences_web
sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e
sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019
url: "https://pub.dev"
source: hosted
version: "2.4.2"
version: "2.4.3"
shared_preferences_windows:
dependency: transitive
description:
@ -825,23 +825,23 @@ packages:
dependency: transitive
description: flutter
source: sdk
version: "0.0.99"
version: "0.0.0"
smooth_page_indicator:
dependency: "direct main"
description:
name: smooth_page_indicator
sha256: "3b28b0c545fa67ed9e5997d9f9720d486f54c0c607e056a1094544e36934dff3"
sha256: b21ebb8bc39cf72d11c7cfd809162a48c3800668ced1c9da3aade13a32cf6c1c
url: "https://pub.dev"
source: hosted
version: "1.2.0+3"
version: "1.2.1"
source_span:
dependency: transitive
description:
name: source_span
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
url: "https://pub.dev"
source: hosted
version: "1.10.0"
version: "1.10.1"
speech_to_text:
dependency: "direct main"
description:
@ -854,10 +854,10 @@ packages:
dependency: transitive
description:
name: speech_to_text_platform_interface
sha256: a0df1a907091ea09880077dc25aae02af9f79811264e6e97ddb08639b7f771c2
sha256: a1935847704e41ee468aad83181ddd2423d0833abe55d769c59afca07adb5114
url: "https://pub.dev"
source: hosted
version: "2.2.0"
version: "2.3.0"
sprintf:
dependency: transitive
description:
@ -870,50 +870,50 @@ packages:
dependency: transitive
description:
name: stack_trace
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
url: "https://pub.dev"
source: hosted
version: "1.11.1"
version: "1.12.1"
stream_channel:
dependency: transitive
description:
name: stream_channel
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
version: "2.1.4"
string_scanner:
dependency: transitive
description:
name: string_scanner
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
url: "https://pub.dev"
source: hosted
version: "1.2.0"
version: "1.4.1"
term_glyph:
dependency: transitive
description:
name: term_glyph
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
url: "https://pub.dev"
source: hosted
version: "1.2.1"
version: "1.2.2"
test_api:
dependency: transitive
description:
name: test_api
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
url: "https://pub.dev"
source: hosted
version: "0.7.2"
version: "0.7.4"
time:
dependency: transitive
description:
name: time
sha256: ad8e018a6c9db36cb917a031853a1aae49467a93e0d464683e029537d848c221
sha256: "370572cf5d1e58adcb3e354c47515da3f7469dac3a95b447117e728e7be6f461"
url: "https://pub.dev"
source: hosted
version: "2.1.4"
version: "2.1.5"
transparent_image:
dependency: "direct main"
description:
@ -926,10 +926,10 @@ packages:
dependency: transitive
description:
name: typed_data
sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
url: "https://pub.dev"
source: hosted
version: "1.3.2"
version: "1.4.0"
universal_html:
dependency: "direct main"
description:
@ -950,42 +950,42 @@ packages:
dependency: "direct main"
description:
name: url_launcher
sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3"
sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603"
url: "https://pub.dev"
source: hosted
version: "6.3.0"
version: "6.3.1"
url_launcher_android:
dependency: transitive
description:
name: url_launcher_android
sha256: f0c73347dfcfa5b3db8bc06e1502668265d39c08f310c29bff4e28eea9699f79
sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193"
url: "https://pub.dev"
source: hosted
version: "6.3.9"
version: "6.3.14"
url_launcher_ios:
dependency: transitive
description:
name: url_launcher_ios
sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e
sha256: "16a513b6c12bb419304e72ea0ae2ab4fed569920d1c7cb850263fe3acc824626"
url: "https://pub.dev"
source: hosted
version: "6.3.1"
version: "6.3.2"
url_launcher_linux:
dependency: transitive
description:
name: url_launcher_linux
sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af
sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935"
url: "https://pub.dev"
source: hosted
version: "3.2.0"
version: "3.2.1"
url_launcher_macos:
dependency: transitive
description:
name: url_launcher_macos
sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de"
sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2"
url: "https://pub.dev"
source: hosted
version: "3.2.0"
version: "3.2.2"
url_launcher_platform_interface:
dependency: transitive
description:
@ -998,26 +998,26 @@ packages:
dependency: transitive
description:
name: url_launcher_web
sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e"
sha256: "3ba963161bd0fe395917ba881d320b9c4f6dd3c4a233da62ab18a5025c85f1e9"
url: "https://pub.dev"
source: hosted
version: "2.3.3"
version: "2.4.0"
url_launcher_windows:
dependency: transitive
description:
name: url_launcher_windows
sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185"
sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77"
url: "https://pub.dev"
source: hosted
version: "3.1.2"
version: "3.1.4"
uuid:
dependency: "direct main"
description:
name: uuid
sha256: "83d37c7ad7aaf9aa8e275490669535c8080377cfa7a7004c24dfac53afffaa90"
sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff
url: "https://pub.dev"
source: hosted
version: "4.4.2"
version: "4.5.1"
vector_math:
dependency: transitive
description:
@ -1046,10 +1046,10 @@ packages:
dependency: transitive
description:
name: vm_service
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14"
url: "https://pub.dev"
source: hosted
version: "14.2.5"
version: "14.3.1"
volume_controller:
dependency: "direct main"
description:
@ -1062,26 +1062,26 @@ packages:
dependency: transitive
description:
name: web
sha256: d43c1d6b787bf0afad444700ae7f4db8827f701bc61c255ac8d328c6f4d52062
sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
version: "1.1.1"
win32:
dependency: transitive
description:
name: win32
sha256: "68d1e89a91ed61ad9c370f9f8b6effed9ae5e0ede22a270bdfa6daf79fc2290a"
sha256: b89e6e24d1454e149ab20fbb225af58660f0c0bf4475544650700d8e2da54aef
url: "https://pub.dev"
source: hosted
version: "5.5.4"
version: "5.11.0"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d
sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
url: "https://pub.dev"
source: hosted
version: "1.0.4"
version: "1.1.0"
sdks:
dart: ">=3.4.0 <4.0.0"
flutter: ">=3.22.0"
dart: ">=3.7.0 <4.0.0"
flutter: ">=3.29.0"

View File

@ -5,6 +5,7 @@ version: 1.2.0+9
environment:
sdk: '>=3.3.4 <4.0.0'
flutter: 3.29.0
dependencies:
flutter:
@ -30,7 +31,7 @@ dependencies:
file_picker: ^8.0.3
file_selector: ^1.0.3
bitsdojo_window: ^0.1.6
install_referrer: ^1.2.1
flutter_install_referrer: ^2.0.2
package_info_plus: ^8.0.0
version: ^3.0.2
flutter_displaymode: ^0.6.0

View File

@ -4,4 +4,4 @@ import 'dart:convert';
void main(List<String> args) {
print(base64Encode(utf8.encode(args.join(" "))));
}
}

View File

@ -7,4 +7,4 @@ String random(int length) {
});
return String.fromCharCodes(codeUnits);
}
}