diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 85a976d..7d57524 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -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 diff --git a/.metadata b/.metadata index 92a4651..6ac59d7 100644 --- a/.metadata +++ b/.metadata @@ -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 diff --git a/android/.gitignore b/android/.gitignore index 6f56801..be3943c 100644 --- a/android/.gitignore +++ b/android/.gitignore @@ -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 diff --git a/android/app/build.gradle b/android/app/build.gradle deleted file mode 100644 index 391a793..0000000 --- a/android/app/build.gradle +++ /dev/null @@ -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 = "../.." -} diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts new file mode 100644 index 0000000..88fe025 --- /dev/null +++ b/android/app/build.gradle.kts @@ -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 = "../.." +} diff --git a/android/app/src/main/kotlin/com/freakurl/apps/ollama/MainActivity.kt b/android/app/src/main/kotlin/com/freakurl/apps/ollama/MainActivity.kt index b363af4..b19421c 100644 --- a/android/app/src/main/kotlin/com/freakurl/apps/ollama/MainActivity.kt +++ b/android/app/src/main/kotlin/com/freakurl/apps/ollama/MainActivity.kt @@ -2,4 +2,4 @@ package com.freakurl.apps.ollama import io.flutter.embedding.android.FlutterActivity -class MainActivity: FlutterActivity() +class MainActivity : FlutterActivity() diff --git a/android/build.gradle b/android/build.gradle deleted file mode 100644 index d2ffbff..0000000 --- a/android/build.gradle +++ /dev/null @@ -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 -} diff --git a/android/build.gradle.kts b/android/build.gradle.kts new file mode 100644 index 0000000..89176ef --- /dev/null +++ b/android/build.gradle.kts @@ -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("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/android/gradle.properties b/android/gradle.properties index 3b5b324..f018a61 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -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 diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index e1ca574..afa1e8e 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -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 diff --git a/android/settings.gradle b/android/settings.gradle deleted file mode 100644 index c5fb685..0000000 --- a/android/settings.gradle +++ /dev/null @@ -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" diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts new file mode 100644 index 0000000..a439442 --- /dev/null +++ b/android/settings.gradle.kts @@ -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") diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 0000000..fa0b357 --- /dev/null +++ b/devtools_options.yaml @@ -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: diff --git a/l10n.yaml b/l10n.yaml index 3dee198..cb2e380 100644 --- a/l10n.yaml +++ b/l10n.yaml @@ -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 diff --git a/lib/l10n/gen/app_localizations.dart b/lib/l10n/gen/app_localizations.dart new file mode 100644 index 0000000..b9e784d --- /dev/null +++ b/lib/l10n/gen/app_localizations.dart @@ -0,0 +1,1023 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:intl/intl.dart' as intl; + +import 'app_localizations_de.dart'; +import 'app_localizations_en.dart'; +import 'app_localizations_fa.dart'; +import 'app_localizations_it.dart'; +import 'app_localizations_tr.dart'; +import 'app_localizations_zh.dart'; + +// ignore_for_file: type=lint + +/// Callers can lookup localized strings with an instance of AppLocalizations +/// returned by `AppLocalizations.of(context)`. +/// +/// Applications need to include `AppLocalizations.delegate()` in their app's +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: +/// +/// ```dart +/// import 'gen/app_localizations.dart'; +/// +/// return MaterialApp( +/// localizationsDelegates: AppLocalizations.localizationsDelegates, +/// supportedLocales: AppLocalizations.supportedLocales, +/// home: MyApplicationHome(), +/// ); +/// ``` +/// +/// ## Update pubspec.yaml +/// +/// Please make sure to update your pubspec.yaml to include the following +/// packages: +/// +/// ```yaml +/// dependencies: +/// # Internationalization support. +/// flutter_localizations: +/// sdk: flutter +/// intl: any # Use the pinned version from flutter_localizations +/// +/// # Rest of dependencies +/// ``` +/// +/// ## iOS Applications +/// +/// iOS applications define key application metadata, including supported +/// locales, in an Info.plist file that is built into the application bundle. +/// To configure the locales supported by your app, you’ll need to edit this +/// file. +/// +/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. +/// Then, in the Project Navigator, open the Info.plist file under the Runner +/// project’s Runner folder. +/// +/// Next, select the Information Property List item, select Add Item from the +/// Editor menu, then select Localizations from the pop-up menu. +/// +/// Select and expand the newly-created Localizations item then, for each +/// locale your application supports, add a new item and select the locale +/// you wish to add from the pop-up menu in the Value field. This list should +/// be consistent with the languages listed in the AppLocalizations.supportedLocales +/// property. +abstract class AppLocalizations { + AppLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + + final String localeName; + + static AppLocalizations? of(BuildContext context) { + return Localizations.of(context, AppLocalizations); + } + + static const LocalizationsDelegate delegate = _AppLocalizationsDelegate(); + + /// A list of this localizations delegate along with the default localizations + /// delegates. + /// + /// Returns a list of localizations delegates containing this delegate along with + /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, + /// and GlobalWidgetsLocalizations.delegate. + /// + /// Additional delegates can be added by appending to this list in + /// MaterialApp. This list does not have to be used at all if a custom list + /// of delegates is preferred or required. + static const List> localizationsDelegates = >[ + delegate, + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ]; + + /// A list of this localizations delegate's supported locales. + static const List supportedLocales = [ + Locale('en'), + Locale('de'), + Locale('fa'), + Locale('it'), + Locale('tr'), + Locale('zh') + ]; + + /// Title of the application + /// + /// In en, this message translates to: + /// **'Ollama'** + String get appTitle; + + /// Text displayed for new chat option + /// + /// In en, this message translates to: + /// **'New Chat'** + String get optionNewChat; + + /// Text displayed for settings option + /// + /// In en, this message translates to: + /// **'Settings'** + String get optionSettings; + + /// Text displayed for install PWA option + /// + /// In en, this message translates to: + /// **'Install Webapp'** + String get optionInstallPwa; + + /// Text displayed when no chats are found + /// + /// In en, this message translates to: + /// **'No chats found'** + String get optionNoChatFound; + + /// Prefix for tips + /// + /// In en, this message translates to: + /// **'Tip: '** + String get tipPrefix; + + /// First tip displayed in the sidebar + /// + /// In en, this message translates to: + /// **'Edit messages by long taping on them'** + String get tip0; + + /// Second tip displayed in the sidebar + /// + /// In en, this message translates to: + /// **'Delete messages by double tapping on them'** + String get tip1; + + /// Third tip displayed in the sidebar + /// + /// In en, this message translates to: + /// **'You can change the theme in settings'** + String get tip2; + + /// Fourth tip displayed in the sidebar + /// + /// In en, this message translates to: + /// **'Select a multimodal model to input images'** + String get tip3; + + /// Fifth tip displayed in the sidebar + /// + /// In en, this message translates to: + /// **'Chats are automatically saved'** + String get tip4; + + /// Text displayed for delete chat option + /// + /// In en, this message translates to: + /// **'Delete'** + String get deleteChat; + + /// Text displayed for rename chat option + /// + /// In en, this message translates to: + /// **'Rename'** + String get renameChat; + + /// Text displayed for take image button + /// + /// In en, this message translates to: + /// **'Take Image'** + String get takeImage; + + /// Text displayed for image upload button + /// + /// In en, this message translates to: + /// **'Upload Image'** + String get uploadImage; + + /// Text displayed when an image is not valid + /// + /// In en, this message translates to: + /// **'Not a valid image'** + String get notAValidImage; + + /// Title, if 'Generate Title' is executed on a conversation with no text messages + /// + /// In en, this message translates to: + /// **'Image Only Conversation'** + String get imageOnlyConversation; + + /// Placeholder text for message input + /// + /// In en, this message translates to: + /// **'Message'** + String get messageInputPlaceholder; + + /// Tooltip for attachment button + /// + /// In en, this message translates to: + /// **'Add attachment'** + String get tooltipAttachment; + + /// Tooltip for send button + /// + /// In en, this message translates to: + /// **'Send'** + String get tooltipSend; + + /// Tooltip for save button + /// + /// In en, this message translates to: + /// **'Save'** + String get tooltipSave; + + /// Tooltip for let AI think button + /// + /// In en, this message translates to: + /// **'Let AI think'** + String get tooltipLetAIThink; + + /// Tooltip for add host headers button + /// + /// In en, this message translates to: + /// **'Add host headers'** + String get tooltipAddHostHeaders; + + /// Tooltip for reset button + /// + /// In en, this message translates to: + /// **'Reset current chat'** + String get tooltipReset; + + /// Tooltip for options button + /// + /// In en, this message translates to: + /// **'Show options'** + String get tooltipOptions; + + /// Text displayed when no model is selected + /// + /// In en, this message translates to: + /// **'No model selected'** + String get noModelSelected; + + /// Text displayed when no host is selected + /// + /// In en, this message translates to: + /// **'No host selected, open setting to set one'** + String get noHostSelected; + + /// Text displayed when no model is selected + /// + /// In en, this message translates to: + /// **''** + String get noSelectedModel; + + /// Title of a new chat + /// + /// In en, this message translates to: + /// **'Unnamed Chat'** + String get newChatTitle; + + /// Text displayed for add model button + /// + /// In en, this message translates to: + /// **'Add'** + String get modelDialogAddModel; + + /// Title of the add model dialog + /// + /// In en, this message translates to: + /// **'Add new model'** + String get modelDialogAddPromptTitle; + + /// Description of the add model dialog + /// + /// In en, this message translates to: + /// **'This can have either be a normal name (e.g. \'llama3\') or name and tag (e.g. \'llama3:70b\').'** + String get modelDialogAddPromptDescription; + + /// Text displayed when the model already exists + /// + /// In en, this message translates to: + /// **'Model already exists'** + String get modelDialogAddPromptAlreadyExists; + + /// Text displayed when the model name is invalid + /// + /// In en, this message translates to: + /// **'Invalid model name'** + String get modelDialogAddPromptInvalid; + + /// Title of the allow proxy dialog + /// + /// In en, this message translates to: + /// **'Allow Proxy'** + String get modelDialogAddAllowanceTitle; + + /// Description of the allow proxy dialog + /// + /// In en, this message translates to: + /// **'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.'** + String get modelDialogAddAllowanceDescription; + + /// Text displayed for allow button, should be capitalized + /// + /// In en, this message translates to: + /// **'Allow'** + String get modelDialogAddAllowanceAllow; + + /// Text displayed for deny button, should be capitalized + /// + /// In en, this message translates to: + /// **'Deny'** + String get modelDialogAddAllowanceDeny; + + /// Title of the add model assurance dialog + /// + /// In en, this message translates to: + /// **'Add {model}?'** + String modelDialogAddAssuranceTitle(String model); + + /// Description of the add model assurance dialog + /// + /// In en, this message translates to: + /// **'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.'** + String modelDialogAddAssuranceDescription(String model); + + /// Text displayed for add button, should be capitalized + /// + /// In en, this message translates to: + /// **'Add'** + String get modelDialogAddAssuranceAdd; + + /// Text displayed for cancel button, should be capitalized + /// + /// In en, this message translates to: + /// **'Cancel'** + String get modelDialogAddAssuranceCancel; + + /// Text displayed while loading the download progress + /// + /// In en, this message translates to: + /// **'loading progress'** + String get modelDialogAddDownloadPercentLoading; + + /// Text displayed while downloading a model + /// + /// In en, this message translates to: + /// **'download at {percent}%'** + String modelDialogAddDownloadPercent(String percent); + + /// Text displayed when the download of a model fails + /// + /// In en, this message translates to: + /// **'Disconnected, try again'** + String get modelDialogAddDownloadFailed; + + /// Text displayed when the download of a model is successful + /// + /// In en, this message translates to: + /// **'Download successful'** + String get modelDialogAddDownloadSuccess; + + /// Title of the delete dialog + /// + /// In en, this message translates to: + /// **'Delete Chat'** + String get deleteDialogTitle; + + /// Description of the delete dialog + /// + /// In en, this message translates to: + /// **'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.'** + String get deleteDialogDescription; + + /// Text displayed for delete button, should be capitalized + /// + /// In en, this message translates to: + /// **'Delete'** + String get deleteDialogDelete; + + /// Text displayed for cancel button, should be capitalized + /// + /// In en, this message translates to: + /// **'Cancel'** + String get deleteDialogCancel; + + /// Text displayed as description for new title input + /// + /// In en, this message translates to: + /// **'Enter new title'** + String get dialogEnterNewTitle; + + /// Title of the edit message dialog + /// + /// In en, this message translates to: + /// **'Edit message'** + String get dialogEditMessageTitle; + + /// Title of the behavior settings section + /// + /// In en, this message translates to: + /// **'Behavior'** + String get settingsTitleBehavior; + + /// Description of the behavior settings section + /// + /// In en, this message translates to: + /// **'Change the behavior of the AI to your liking.'** + String get settingsDescriptionBehavior; + + /// Title of the interface settings section + /// + /// In en, this message translates to: + /// **'Interface'** + String get settingsTitleInterface; + + /// Description of the interface settings section + /// + /// In en, this message translates to: + /// **'Edit how Ollama App looks and behaves.'** + String get settingsDescriptionInterface; + + /// Title of the voice settings section. Do not translate if not required! + /// + /// In en, this message translates to: + /// **'Voice'** + String get settingsTitleVoice; + + /// Description of the voice settings section + /// + /// In en, this message translates to: + /// **'Enable voice mode and configure voice settings.'** + String get settingsDescriptionVoice; + + /// Title of the export settings section + /// + /// In en, this message translates to: + /// **'Export'** + String get settingsTitleExport; + + /// Description of the export settings section + /// + /// In en, this message translates to: + /// **'Export and import your chat history.'** + String get settingsDescriptionExport; + + /// Title of the about settings section + /// + /// In en, this message translates to: + /// **'About'** + String get settingsTitleAbout; + + /// Description of the about settings section + /// + /// In en, this message translates to: + /// **'Check for updates and learn more about Ollama App.'** + String get settingsDescriptionAbout; + + /// Text displayed when settings are saved automatically + /// + /// In en, this message translates to: + /// **'Settings are saved automatically'** + String get settingsSavedAutomatically; + + /// Text displayed when a feature is in alpha + /// + /// In en, this message translates to: + /// **'alpha'** + String get settingsExperimentalAlpha; + + /// Description of the alpha feature + /// + /// In en, this message translates to: + /// **'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.'** + String get settingsExperimentalAlphaDescription; + + /// Text displayed when a feature is in alpha + /// + /// In en, this message translates to: + /// **'Alpha feature, hold to learn more'** + String get settingsExperimentalAlphaFeature; + + /// Text displayed when a feature is in beta + /// + /// In en, this message translates to: + /// **'beta'** + String get settingsExperimentalBeta; + + /// Description of the beta feature + /// + /// In en, this message translates to: + /// **'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.'** + String get settingsExperimentalBetaDescription; + + /// Text displayed when a feature is in beta + /// + /// In en, this message translates to: + /// **'Beta feature, hold to learn more'** + String get settingsExperimentalBetaFeature; + + /// Text displayed when a feature is deprecated + /// + /// In en, this message translates to: + /// **'deprecated'** + String get settingsExperimentalDeprecated; + + /// Description of the deprecated feature + /// + /// In en, this message translates to: + /// **'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.'** + String get settingsExperimentalDeprecatedDescription; + + /// Text displayed when a feature is deprecated + /// + /// In en, this message translates to: + /// **'Deprecated feature, hold to learn more'** + String get settingsExperimentalDeprecatedFeature; + + /// Text displayed as description for host input + /// + /// In en, this message translates to: + /// **'Host'** + String get settingsHost; + + /// Text displayed when the host is valid + /// + /// In en, this message translates to: + /// **'Valid Host'** + String get settingsHostValid; + + /// Text displayed when the host is being checked + /// + /// In en, this message translates to: + /// **'Checking Host'** + String get settingsHostChecking; + + /// Text displayed when the host is invalid + /// + /// In en, this message translates to: + /// **'Issue: {type, select, url{Invalid URL} host{Invalid Host} timeout{Request Failed. Server issues} ratelimit{Too many requests} other{Request Failed}}'** + String settingsHostInvalid(String type); + + /// Text displayed as description for host header input + /// + /// In en, this message translates to: + /// **'Set host header'** + String get settingsHostHeaderTitle; + + /// Text displayed when the host header is invalid + /// + /// In en, this message translates to: + /// **'The entered text isn\'t a valid header JSON object'** + String get settingsHostHeaderInvalid; + + /// Text displayed when the host is invalid + /// + /// In en, this message translates to: + /// **'{type, select, 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.}}'** + String settingsHostInvalidDetailed(String type); + + /// Text displayed as description for system message input + /// + /// In en, this message translates to: + /// **'System message'** + String get settingsSystemMessage; + + /// Text displayed as description for use system message toggle + /// + /// In en, this message translates to: + /// **'Use system message'** + String get settingsUseSystem; + + /// Description of the use system message toggle + /// + /// In en, this message translates to: + /// **'Disables setting the system message above and use the one of the model instead. Can be useful for models with model files'** + String get settingsUseSystemDescription; + + /// Text displayed as description for disable markdown toggle + /// + /// In en, this message translates to: + /// **'Disable markdown'** + String get settingsDisableMarkdown; + + /// Text displayed when behavior settings are not updated for older chats + /// + /// In en, this message translates to: + /// **'Behavior settings are not updated for older chats'** + String get settingsBehaviorNotUpdatedForOlderChats; + + /// Text displayed as description for show model tags toggle + /// + /// In en, this message translates to: + /// **'Show model tags'** + String get settingsShowModelTags; + + /// Text displayed as description for preload models toggle + /// + /// In en, this message translates to: + /// **'Preload models'** + String get settingsPreloadModels; + + /// Text displayed as description for reset on model change toggle + /// + /// In en, this message translates to: + /// **'Reset on model change'** + String get settingsResetOnModelChange; + + /// Text displayed as description for stream request type. Do not translate if not required! + /// + /// In en, this message translates to: + /// **'Stream'** + String get settingsRequestTypeStream; + + /// Text displayed as description for request request type. Do not translate if not required! + /// + /// In en, this message translates to: + /// **'Request'** + String get settingsRequestTypeRequest; + + /// Text displayed as description for generate titles toggle + /// + /// In en, this message translates to: + /// **'Generate titles'** + String get settingsGenerateTitles; + + /// Text displayed as description for enable editing toggle + /// + /// In en, this message translates to: + /// **'Message editing'** + String get settingsEnableEditing; + + /// Text displayed as description for ask before deletion toggle + /// + /// In en, this message translates to: + /// **'Ask before chat deletion'** + String get settingsAskBeforeDelete; + + /// Text displayed as description for show tips toggle + /// + /// In en, this message translates to: + /// **'Show tips in sidebar'** + String get settingsShowTips; + + /// Text displayed as description for keep model loaded always toggle + /// + /// In en, this message translates to: + /// **'Keep model always loaded'** + String get settingsKeepModelLoadedAlways; + + /// Text displayed as description for don't keep model loaded toggle + /// + /// In en, this message translates to: + /// **'Don\'t keep model loaded'** + String get settingsKeepModelLoadedNever; + + /// Text displayed as description for keep model loaded for toggle + /// + /// In en, this message translates to: + /// **'Set specific time to keep model loaded'** + String get settingsKeepModelLoadedFor; + + /// Text displayed as description for keep model loaded for set time toggle + /// + /// In en, this message translates to: + /// **'Keep model loaded for {minutes} minutes'** + String settingsKeepModelLoadedSet(String minutes); + + /// Text displayed as title for the timeout multiplier section + /// + /// In en, this message translates to: + /// **'Timeout multiplier'** + String get settingsTimeoutMultiplier; + + /// Description of the timeout multiplier section + /// + /// In en, this message translates to: + /// **'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.'** + String get settingsTimeoutMultiplierDescription; + + /// Example for the timeout multiplier + /// + /// In en, this message translates to: + /// **'E.g. message timeout:'** + String get settingsTimeoutMultiplierExample; + + /// Text displayed as description for enable haptic feedback toggle + /// + /// In en, this message translates to: + /// **'Enable haptic feedback'** + String get settingsEnableHapticFeedback; + + /// Text displayed as description for maximize on start toggle + /// + /// In en, this message translates to: + /// **'Start maximized'** + String get settingsMaximizeOnStart; + + /// Text displayed as description for system brightness option + /// + /// In en, this message translates to: + /// **'System'** + String get settingsBrightnessSystem; + + /// Text displayed as description for light brightness option + /// + /// In en, this message translates to: + /// **'Light'** + String get settingsBrightnessLight; + + /// Text displayed as description for dark brightness option + /// + /// In en, this message translates to: + /// **'Dark'** + String get settingsBrightnessDark; + + /// Text displayed as description for device theme option + /// + /// In en, this message translates to: + /// **'Device'** + String get settingsThemeDevice; + + /// Text displayed as description for Ollama theme option + /// + /// In en, this message translates to: + /// **'Ollama'** + String get settingsThemeOllama; + + /// Text displayed as description for temporary fixes section + /// + /// In en, this message translates to: + /// **'Temporary interface fixes'** + String get settingsTemporaryFixes; + + /// Description of the temporary fixes section + /// + /// In en, this message translates to: + /// **'Enable temporary fixes for interface issues.\nLong press on the individual options to learn more.'** + String get settingsTemporaryFixesDescription; + + /// Instructions and warnings for the temporary fixes + /// + /// In en, this message translates to: + /// **'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.'** + String get settingsTemporaryFixesInstructions; + + /// Text displayed when no fixes are available + /// + /// In en, this message translates to: + /// **'No fixes available'** + String get settingsTemporaryFixesNoFixes; + + /// Text displayed while loading voice permissions + /// + /// In en, this message translates to: + /// **'Loading voice permissions ...'** + String get settingsVoicePermissionLoading; + + /// Text displayed when text-to-speech is not supported + /// + /// In en, this message translates to: + /// **'Text-to-speech not supported'** + String get settingsVoiceTtsNotSupported; + + /// Description of the text-to-speech not supported message + /// + /// In en, this message translates to: + /// **'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.'** + String get settingsVoiceTtsNotSupportedDescription; + + /// Text displayed when voice permissions are not granted + /// + /// In en, this message translates to: + /// **'Permissions not granted'** + String get settingsVoicePermissionNot; + + /// Text displayed when voice mode is not enabled + /// + /// In en, this message translates to: + /// **'Voice mode not enabled'** + String get settingsVoiceNotEnabled; + + /// Text displayed when voice mode is not supported + /// + /// In en, this message translates to: + /// **'Voice mode not supported'** + String get settingsVoiceNotSupported; + + /// Text displayed as description for enable voice mode toggle + /// + /// In en, this message translates to: + /// **'Enable voice mode'** + String get settingsVoiceEnable; + + /// Text displayed when no language is selected + /// + /// In en, this message translates to: + /// **'No language selected'** + String get settingsVoiceNoLanguage; + + /// Text displayed as description for limit language toggle + /// + /// In en, this message translates to: + /// **'Limit to selected language'** + String get settingsVoiceLimitLanguage; + + /// Text displayed as description for enable AI punctuation toggle + /// + /// In en, this message translates to: + /// **'Enable AI punctuation'** + String get settingsVoicePunctuation; + + /// Text displayed as description for export chats button + /// + /// In en, this message translates to: + /// **'Export chats'** + String get settingsExportChats; + + /// Text displayed when chats are exported successfully + /// + /// In en, this message translates to: + /// **'Chats exported successfully'** + String get settingsExportChatsSuccess; + + /// Text displayed as description for import chats button + /// + /// In en, this message translates to: + /// **'Import chats'** + String get settingsImportChats; + + /// Title of the import dialog + /// + /// In en, this message translates to: + /// **'Import'** + String get settingsImportChatsTitle; + + /// Description of the import dialog + /// + /// In en, this message translates to: + /// **'The following step will import the chats from the selected file. This will overwrite all currently available chats.\nDo you want to continue?'** + String get settingsImportChatsDescription; + + /// Text displayed for import button, should be capitalized + /// + /// In en, this message translates to: + /// **'Import and Erase'** + String get settingsImportChatsImport; + + /// Text displayed for cancel button, should be capitalized + /// + /// In en, this message translates to: + /// **'Cancel'** + String get settingsImportChatsCancel; + + /// Text displayed when chats are imported successfully + /// + /// In en, this message translates to: + /// **'Chats imported successfully'** + String get settingsImportChatsSuccess; + + /// Information displayed for export and import options + /// + /// In en, this message translates to: + /// **'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'** + String get settingsExportInfo; + + /// Warning displayed for export and import options + /// + /// In en, this message translates to: + /// **'Multiple chat histories won\'t be merged! You\'ll loose your current chat history if you import a new one'** + String get settingsExportWarning; + + /// Text displayed as description for check for updates button + /// + /// In en, this message translates to: + /// **'Check for updates'** + String get settingsUpdateCheck; + + /// Text displayed while looking for updates + /// + /// In en, this message translates to: + /// **'Checking for updates ...'** + String get settingsUpdateChecking; + + /// Text displayed when the app is up to date + /// + /// In en, this message translates to: + /// **'You are on the latest version'** + String get settingsUpdateLatest; + + /// Text displayed when an update is available + /// + /// In en, this message translates to: + /// **'Update available (v{version})'** + String settingsUpdateAvailable(String version); + + /// Text displayed when the API rate limit is exceeded + /// + /// In en, this message translates to: + /// **'Can\'t check, API rate limit exceeded'** + String get settingsUpdateRateLimit; + + /// Text displayed when an issue occurs while checking for updates + /// + /// In en, this message translates to: + /// **'An issue occurred'** + String get settingsUpdateIssue; + + /// Title of the update dialog + /// + /// In en, this message translates to: + /// **'New version available'** + String get settingsUpdateDialogTitle; + + /// Description of the update dialog + /// + /// In en, this message translates to: + /// **'A new version of Ollama is available. Do you want to download and install it now?'** + String get settingsUpdateDialogDescription; + + /// Text displayed as description for change log button + /// + /// In en, this message translates to: + /// **'Change Log'** + String get settingsUpdateChangeLog; + + /// Text displayed for update button, should be capitalized + /// + /// In en, this message translates to: + /// **'Update'** + String get settingsUpdateDialogUpdate; + + /// Text displayed for cancel button, should be capitalized + /// + /// In en, this message translates to: + /// **'Cancel'** + String get settingsUpdateDialogCancel; + + /// Text displayed as description for check for updates toggle + /// + /// In en, this message translates to: + /// **'Check for updates on open'** + String get settingsCheckForUpdates; + + /// Text displayed as description for GitHub button + /// + /// In en, this message translates to: + /// **'GitHub'** + String get settingsGithub; + + /// Text displayed as description for report issue button + /// + /// In en, this message translates to: + /// **'Report Issue'** + String get settingsReportIssue; + + /// Text displayed as description for licenses button + /// + /// In en, this message translates to: + /// **'Licenses'** + String get settingsLicenses; + + /// Text displayed as description for version + /// + /// In en, this message translates to: + /// **'Ollama App v{version}'** + String settingsVersion(String version); +} + +class _AppLocalizationsDelegate extends LocalizationsDelegate { + const _AppLocalizationsDelegate(); + + @override + Future load(Locale locale) { + return SynchronousFuture(lookupAppLocalizations(locale)); + } + + @override + bool isSupported(Locale locale) => ['de', 'en', 'fa', 'it', 'tr', 'zh'].contains(locale.languageCode); + + @override + bool shouldReload(_AppLocalizationsDelegate old) => false; +} + +AppLocalizations lookupAppLocalizations(Locale locale) { + + + // Lookup logic when only language code is specified. + switch (locale.languageCode) { + case 'de': return AppLocalizationsDe(); + case 'en': return AppLocalizationsEn(); + case 'fa': return AppLocalizationsFa(); + case 'it': return AppLocalizationsIt(); + case 'tr': return AppLocalizationsTr(); + case 'zh': return AppLocalizationsZh(); + } + + throw FlutterError( + 'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); +} diff --git a/lib/l10n/gen/app_localizations_de.dart b/lib/l10n/gen/app_localizations_de.dart new file mode 100644 index 0000000..673f9c7 --- /dev/null +++ b/lib/l10n/gen/app_localizations_de.dart @@ -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 => ''; + + @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'; + } +} diff --git a/lib/l10n/gen/app_localizations_en.dart b/lib/l10n/gen/app_localizations_en.dart new file mode 100644 index 0000000..ce6d73e --- /dev/null +++ b/lib/l10n/gen/app_localizations_en.dart @@ -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 => ''; + + @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'; + } +} diff --git a/lib/l10n/gen/app_localizations_fa.dart b/lib/l10n/gen/app_localizations_fa.dart new file mode 100644 index 0000000..dc88b15 --- /dev/null +++ b/lib/l10n/gen/app_localizations_fa.dart @@ -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 => ''; + + @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'; + } +} diff --git a/lib/l10n/gen/app_localizations_it.dart b/lib/l10n/gen/app_localizations_it.dart new file mode 100644 index 0000000..740d56b --- /dev/null +++ b/lib/l10n/gen/app_localizations_it.dart @@ -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 => ''; + + @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'; + } +} diff --git a/lib/l10n/gen/app_localizations_tr.dart b/lib/l10n/gen/app_localizations_tr.dart new file mode 100644 index 0000000..92eed23 --- /dev/null +++ b/lib/l10n/gen/app_localizations_tr.dart @@ -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ı açıp bir tane belirleyin'; + + @override + String get noSelectedModel => ''; + + @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 => 'Açı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ı aşı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 => 'Açı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'; + } +} diff --git a/lib/l10n/gen/app_localizations_zh.dart b/lib/l10n/gen/app_localizations_zh.dart new file mode 100644 index 0000000..f051020 --- /dev/null +++ b/lib/l10n/gen/app_localizations_zh.dart @@ -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'; + } +} diff --git a/lib/main.dart b/lib/main.dart index f96e0a8..d440178 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -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 { : () 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 { } 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 { @override Widget build(BuildContext context) { - resetSystemNavigation(context); - Widget selector = InkWell( onTap: !useModel ? () { diff --git a/lib/screen_settings.dart b/lib/screen_settings.dart index 194460e..bd6a0eb 100644 --- a/lib/screen_settings.dart +++ b/lib/screen_settings.dart @@ -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'; diff --git a/lib/screen_voice.dart b/lib/screen_voice.dart index 3e1deff..de23e22 100644 --- a/lib/screen_voice.dart +++ b/lib/screen_voice.dart @@ -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 { 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 { } settingsOpen = false; logoVisible = true; - resetSystemNavigation(context); }, child: Scaffold( appBar: AppBar( @@ -260,7 +254,6 @@ class _ScreenVoiceState extends State { MaterialPageRoute( builder: (context) => const ScreenSettingsVoice())); - resetSystemNavigation(context); }, icon: const Icon( Icons.settings_rounded, @@ -268,144 +261,142 @@ class _ScreenVoiceState extends State { )) ]), 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); + }), + ) + ], + )) + ]), + ) + ]), )))); } } diff --git a/lib/screen_welcome.dart b/lib/screen_welcome.dart index 3d781f0..d5e2d08 100644 --- a/lib/screen_welcome.dart +++ b/lib/screen_welcome.dart @@ -26,19 +26,6 @@ class _ScreenWelcomeState extends State { 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, diff --git a/lib/settings/about.dart b/lib/settings/about.dart index cbe6471..37538f4 100644 --- a/lib/settings/about.dart +++ b/lib/settings/about.dart @@ -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'; diff --git a/lib/settings/behavior.dart b/lib/settings/behavior.dart index 0874ea0..09108e1 100644 --- a/lib/settings/behavior.dart +++ b/lib/settings/behavior.dart @@ -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'; diff --git a/lib/settings/export.dart b/lib/settings/export.dart index 6d2a082..f6f47df 100644 --- a/lib/settings/export.dart +++ b/lib/settings/export.dart @@ -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 { 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 { .settingsImportChatsImport)) ]); }); - // ignore: use_build_context_synchronously - resetSystemNavigation(context); }) : const SizedBox.shrink() ]), diff --git a/lib/settings/interface.dart b/lib/settings/interface.dart index b92a7b7..4bea25a 100644 --- a/lib/settings/interface.dart +++ b/lib/settings/interface.dart @@ -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 { .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 { ); })); }); - // ignore: use_build_context_synchronously - resetSystemNavigation(context); }), titleDivider(context: context), button( diff --git a/lib/settings/voice.dart b/lib/settings/voice.dart index a62f22a..8326fb5 100644 --- a/lib/settings/voice.dart +++ b/lib/settings/voice.dart @@ -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 { } return PopScope( - onPopInvokedWithResult: (didPop, result) { + onPopInvokedWithResult: + (didPop, result) { if (usedIndex == -1) return; prefs!.setString( "voiceLanguage", diff --git a/lib/worker/sender.dart b/lib/worker/sender.dart index eb7a87c..c5fd27f 100644 --- a/lib/worker/sender.dart +++ b/lib/worker/sender.dart @@ -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'; diff --git a/lib/worker/setter.dart b/lib/worker/setter.dart index 33b93b8..3e63294 100644 --- a/lib/worker/setter.dart +++ b/lib/worker/setter.dart @@ -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 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 deleteChatDialog(BuildContext context, Function setState, ]); }); }); - // ignore: use_build_context_synchronously - resetSystemNavigation(context); } else { delete(context); } diff --git a/lib/worker/theme.dart b/lib/worker/theme.dart index ceb0ce4..3dd5333 100644 --- a/lib/worker/theme.dart +++ b/lib/worker/theme.dart @@ -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.android: PredictiveBackPageTransitionsBuilder(), - }, - )); + builders: { + TargetPlatform.android: PredictiveBackPageTransitionsBuilder(), + }, + ), + sliderTheme: theme.sliderTheme.copyWith(year2023: false)); } ThemeData themeCurrent(BuildContext context) { diff --git a/lib/worker/update.dart b/lib/worker/update.dart index 9ceebba..86bdb71 100644 --- a/lib/worker/update.dart +++ b/lib/worker/update.dart @@ -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 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); } diff --git a/pubspec.lock b/pubspec.lock index d2cd799..550c409 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -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" diff --git a/pubspec.yaml b/pubspec.yaml index 223acc0..484c1d9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -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 diff --git a/scripts/base64.dart b/scripts/base64.dart index ca32b53..f6d0f5a 100644 --- a/scripts/base64.dart +++ b/scripts/base64.dart @@ -4,4 +4,4 @@ import 'dart:convert'; void main(List args) { print(base64Encode(utf8.encode(args.join(" ")))); -} \ No newline at end of file +} diff --git a/test/functions.dart b/test/functions.dart index ba3fb19..90dc745 100644 --- a/test/functions.dart +++ b/test/functions.dart @@ -7,4 +7,4 @@ String random(int length) { }); return String.fromCharCodes(codeUnits); -} \ No newline at end of file +}