diff --git a/.github/workflows/commit.yml b/.github/workflows/commit.yml
index a2ffbace..574e4c37 100644
--- a/.github/workflows/commit.yml
+++ b/.github/workflows/commit.yml
@@ -19,8 +19,8 @@ jobs:
# Call setup_env action to setup workspace
- uses: ./.github/actions/setup_env
with:
- java-version: ${{ vars.JAVA_VERSION }}
- flutter-channel: ${{ vars.FLUTTER_CHANNEL }}
+ java-version: 17.x
+ flutter-channel: stable
# Check for any formatting issues in the code.
- run: dart format --set-exit-if-changed .
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 81f12e15..a55998c8 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -27,8 +27,8 @@ jobs:
# Call setup_env action to setup workspace
- uses: ./.github/actions/setup_env
with:
- java-version: ${{ vars.JAVA_VERSION }}
- flutter-channel: ${{ vars.FLUTTER_CHANNEL }}
+ java-version: 17.x
+ flutter-channel: stable
# Generate keystore
- uses: timheuer/base64-to-file@v1.2
@@ -49,9 +49,10 @@ jobs:
sed -i 's/^\(version: [0-9\.]\{1,\}\(-[a-z]\{1,\}\)\{0,1\}\)$/\1+${{ github.run_number }}/m' pubspec.yaml
# Build apk.
- - run: flutter build apk --obfuscate --split-debug-info=build/app/outputs/symbols/apk --release --split-per-abi
+ - run: flutter build apk --obfuscate --split-debug-info=build/app/outputs/symbols/apk --release --split-per-abi --dart-define=cronetHttpNoPlay=true
# Build aab
+ # Since the aab is only distributed to the play store and never uploaded somewhere else, we can use the Google Play Services cronet here.
- run: flutter build appbundle --obfuscate --split-debug-info=build/app/outputs/symbols/aab --release
# Zip symbols
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 86651fd3..c8027bc2 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -159,6 +159,7 @@
+
@@ -195,6 +196,7 @@
+
@@ -207,10 +209,12 @@
+
+
@@ -237,6 +241,8 @@
+
+
diff --git a/fastlane/metadata/android/de-DE/changelogs/289.txt b/fastlane/metadata/android/de-DE/changelogs/289.txt
new file mode 100644
index 00000000..061ffd15
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/289.txt
@@ -0,0 +1,4 @@
+- Zeige Schlagwörter in der Transaktions-Liste
+- Update der Übersetzungen
+- Unterstützung für zusätzliche Banking-Apps
+- Fehlerbehebungen
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/289.txt b/fastlane/metadata/android/en-US/changelogs/289.txt
new file mode 100644
index 00000000..5cb0fa3c
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/289.txt
@@ -0,0 +1,4 @@
+- Show tags on transaction screen
+- Translation updates
+- Add support for additional banking apps
+- Bugfixes
\ No newline at end of file
diff --git a/fastlane/metadata/android/pt-PT/full_description.txt b/fastlane/metadata/android/pt-PT/full_description.txt
new file mode 100644
index 00000000..5a3e9866
--- /dev/null
+++ b/fastlane/metadata/android/pt-PT/full_description.txt
@@ -0,0 +1,17 @@
+Waterfly III é um aplicativo não oficial para sua própria instância do Firefly III, um gerenciador financeiro gratuito e de código aberto.
+
+Este aplicativo requer uma instância do Firefly III auto-hospedada em seu próprio servidor. É apenas um aplicativo complementar e não pode ser executado de forma independente!
+
+Características:
+
+- Painel com gráficos e visão geral do orçamento
+- Lista de transações com filtros
+- Adicione e edite transações com preenchimento automático, incluindo anexos, transações divididas e suporte a várias moedas
+- Suporte ao Piggy Bank (visualizar e adicionar dinheiro)
+- Serviço de ouvinte de notificação para criar facilmente novas transações com base em notificações recebidas (por exemplo, do Google Pay ou de seu aplicativo bancário)
+- Código totalmente aberto: https://github.com/dreutall/waterfly-iii
+- Sem anúncios ou rastreadores
+
+Contribuição:
+
+Se você encontrar uma falha ou sentir falta de um recurso, sinta-se à vontade para dar opinião na Play Store, enviar-me um e-mail ou abrir um chamado no GitHub.
\ No newline at end of file
diff --git a/fastlane/metadata/android/pt-PT/short_description.txt b/fastlane/metadata/android/pt-PT/short_description.txt
new file mode 100644
index 00000000..695e5617
--- /dev/null
+++ b/fastlane/metadata/android/pt-PT/short_description.txt
@@ -0,0 +1 @@
+Aplicativo não oficial para Firefly III, um gerenciador de finanças pessoais de código aberto.
\ No newline at end of file
diff --git a/fastlane/metadata/android/sv-SE/full_description.txt b/fastlane/metadata/android/sv-SE/full_description.txt
index 2f4ed04a..202c3acb 100644
--- a/fastlane/metadata/android/sv-SE/full_description.txt
+++ b/fastlane/metadata/android/sv-SE/full_description.txt
@@ -1,17 +1,17 @@
Waterfly III är en inofficiell app för din egna instans av Firefly III, en fri och öppen finanshanterare.
-Denna app kräver en egen Firefly III instans på din egna server, besök https://www.firefly-iii.org/ för mer information om programvaran. Detta är endast en medföljande app och kan inte köra utan en Firefly III instans!
+Denna app kräver en självhostad Firefly III-instans på din egen server, vänligen besök https://www.firefly-iii.org/ för mer information om programvaran. Detta appen kan inte köras fristående!
Funktioner:
-- Kontrollpanel med diagram & budgetöversikt
+- En dashboard med diagram & budgetöversikt
- Transaktionslista med filter
-- Lägg till och redigera transaktioner med autocomplete, inklusive bilagor, delade transaktioner och stöd för flera valutor
-- Stöd för spargrisar (visa och lägg till pengar)
-- Notifikationslyssnartjänsten kan enkelt skapa nya transaktioner baserat på inkommande meddelanden (t.ex. från Google Pay eller din bankapp)
-- Helt öppen källkod: https://github.com/dreautall/waterfly-iii
-- Inga annonser eller trackers
+- Lägg till & redigera transaktioner med autokomplettering, inklusive bilagor, delade transaktioner & stöd för flera valutor
+- Stöd för "Piggy Bank" (visa & lägg till pengar)
+- Tjänst för att lyssna av notifikationer för att enkelt skapa nya transaktioner baserade på inkommande notifikationer (t.ex. från Google Pay eller din bankapp)
+- Fullständigt öppen källkod: https://github.com/dreautall/waterfly-iii
+- Inga annonser eller spårare
-Bidra:
+Bidrag:
-Om du stöter på en bugg eller saknar en funktion, får du gärna ge feedback i play store, skicka mig ett mail eller öppna ett ärende på GitHub.
\ No newline at end of file
+Om du stöter på ett fel eller saknar en funktion, tveka inte att ge feedback i Play Store, skicka ett e-postmeddelande till mig eller öppna ett ärende på GitHub.
\ No newline at end of file
diff --git a/fastlane/metadata/android/version.txt b/fastlane/metadata/android/version.txt
index 5807f38f..300b4407 100644
--- a/fastlane/metadata/android/version.txt
+++ b/fastlane/metadata/android/version.txt
@@ -1,2 +1,2 @@
-versionName=1.0.1
-versionCode=271
\ No newline at end of file
+versionName=1.0.2
+versionCode=289
\ No newline at end of file
diff --git a/lib/auth.dart b/lib/auth.dart
index 9a06784c..a60d5d2e 100644
--- a/lib/auth.dart
+++ b/lib/auth.dart
@@ -1,12 +1,14 @@
import 'dart:convert';
import 'dart:io';
+import 'package:cronet_http/cronet_http.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:http/http.dart' as http;
import 'package:logging/logging.dart';
import 'package:chopper/chopper.dart'
- show Request, Response, StripStringExtension;
+ show HttpMethod, Request, Response, StripStringExtension;
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:version/version.dart';
@@ -103,6 +105,16 @@ class AuthErrorNoInstance extends AuthError {
final String host;
}
+http.Client get httpClient {
+ // Only for Android
+ return CronetClient.fromCronetEngine(
+ CronetEngine.build(
+ cacheMode: CacheMode.memory,
+ cacheMaxSize: 2 * 1024 * 1024,
+ ),
+ );
+}
+
class AuthUser {
late Uri _host;
late String _apiKey;
@@ -123,6 +135,7 @@ class AuthUser {
_api = FireflyIii.create(
baseUrl: _host,
+ httpClient: httpClient,
interceptors: [
(Request request) async {
log.finest(() => "API query to ${request.url}");
@@ -141,6 +154,7 @@ class AuthUser {
_apiV2 = FireflyIiiV2.create(
baseUrl: _host,
+ httpClient: httpClient,
interceptors: [
(Request request) async {
log.finest(() => "APIv2 query to ${request.url}");
@@ -170,7 +184,7 @@ class AuthUser {
log.config("AuthUser->create($host)");
// This call is on purpose not using the Swagger API
- final HttpClient client = HttpClient();
+ final http.Client client = httpClient;
late Uri uri;
try {
@@ -187,10 +201,10 @@ class AuthUser {
]);
try {
- HttpClientRequest request = await client.getUrl(aboutUri);
- request.headers.add(HttpHeaders.authorizationHeader, "Bearer $apiKey");
+ final http.Request request = http.Request(HttpMethod.Get, aboutUri);
+ request.headers[HttpHeaders.authorizationHeader] = "Bearer $apiKey";
request.followRedirects = false;
- HttpClientResponse response = await request.close();
+ final http.StreamedResponse response = await request.send();
if (response.isRedirect) {
throw const AuthErrorApiKey();
@@ -199,7 +213,7 @@ class AuthUser {
throw AuthErrorStatusCode(response.statusCode);
}
- final String stringData = await response.transform(utf8.decoder).join();
+ final String stringData = await response.stream.bytesToString();
try {
SystemInfo.fromJson(json.decode(stringData));
@@ -327,7 +341,7 @@ class FireflyService with ChangeNotifier {
}
// Manual API query as the Swagger type doesn't resolve in Flutter :(
- final HttpClient client = HttpClient();
+ final http.Client client = httpClient;
Uri tzUri = user!.host.replace(pathSegments: [
...user!.host.pathSegments,
"v1",
@@ -335,13 +349,11 @@ class FireflyService with ChangeNotifier {
ConfigValueFilter.appTimezone.value!
]);
try {
- HttpClientRequest request = await client.getUrl(tzUri);
- user!.headers().forEach(
- (String key, String value) => request.headers.add(key, value),
- );
- HttpClientResponse response = await request.close();
- final String stringData = await response.transform(utf8.decoder).join();
- final APITZReply reply = APITZReply.fromJson(json.decode(stringData));
+ final http.Response response = await client.get(
+ tzUri,
+ headers: user!.headers(),
+ );
+ final APITZReply reply = APITZReply.fromJson(json.decode(response.body));
tzHandler = TimeZoneHandler(reply.data.value);
} finally {
client.close();
diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb
index 40bea529..bff576fb 100644
--- a/lib/l10n/app_de.arb
+++ b/lib/l10n/app_de.arb
@@ -812,7 +812,7 @@
"@settingsDialogDebugMailCreate": {
"description": "Button to confirm mail creation after privacy disclaimer is shown."
},
- "settingsDialogDebugMailDisclaimer": "ACHTUNG: Ein E-Mail Entwurf wird mit angehängtem Fehlerprotokoll erstellt. Das Fehlerprotokoll kann sensible Informationen wie zum Beispiel die URL deiner Firefly-Instanz enthalten (auch wenn ich versuche, geheime Informationen wie den API-Schlüssel nicht zu protokollieren). Bitte lese vor dem Senden der Mail das Protokoll durch und zensiere alle Informationen, die du nicht teilen möchtest.\n\nBitte sende keine Fehlerprotokolle ohne vorherige Absprache mit mir via Mail/GitHub. Ich werde alle ohne Kontext eingesendete Protokolle aus Datenschutzgründen löschen. Lade die Protokolle nie auf GitHub oder anderswo hoch.",
+ "settingsDialogDebugMailDisclaimer": "ACHTUNG: Ein E-Mail Entwurf wird mit angehängtem Fehlerprotokoll (einer Textdatei) erstellt. Das Fehlerprotokoll kann sensible Informationen, wie zum Beispiel die URL deiner Firefly-Instanz, enthalten (auch wenn ich versuche, geheime Informationen wie den API-Schlüssel nicht zu protokollieren). Bitte lese vor dem Senden der Mail das Protokoll durch und zensiere alle Informationen, die du nicht teilen möchtest.\n\nBitte sende keine Fehlerprotokolle ohne vorherige Absprache mit mir via Mail/GitHub. Ich werde alle ohne Kontext eingesendete Protokolle aus Datenschutzgründen löschen. Lade die Protokolle nie auf GitHub oder anderswo hoch.",
"@settingsDialogDebugMailDisclaimer": {
"description": "Privacy disclaimer shown before sending logs"
},
diff --git a/lib/l10n/app_sv.arb b/lib/l10n/app_sv.arb
index ce501f85..9acbef82 100644
--- a/lib/l10n/app_sv.arb
+++ b/lib/l10n/app_sv.arb
@@ -1,854 +1,1122 @@
{
- "@@locale": "sv",
- "@@x-reference": true,
- "accountRoleAssetCashWallet": "Plånbok",
- "@accountRoleAssetCashWallet": {
- "description": "Firefly Translation String: account_role_cashWalletAsset"
- },
- "accountRoleAssetCC": "Kreditkort",
- "@accountRoleAssetCC": {
- "description": "Firefly Translation String: account_role_ccAsset"
- },
- "accountRoleAssetDefault": "Förvalt tillgångskonto",
- "@accountRoleAssetDefault": {
- "description": "Firefly Translation String: account_role_defaultAsset"
- },
- "accountRoleAssetSavings": "Sparkonto",
- "@accountRoleAssetSavings": {
- "description": "Firefly Translation String: account_role_savingAsset"
- },
- "accountRoleAssetShared": "Delat tillgångskonto",
- "@accountRoleAssetShared": {
- "description": "Firefly Translation String: account_role_sharedAsset"
- },
- "accountsLabelAsset": "Tillgångskonton",
- "@accountsLabelAsset": {
- "description": "Firefly Translation String: asset_accounts"
- },
- "accountsLabelExpense": "Kostnadskonton",
- "@accountsLabelExpense": {
- "description": "Firefly Translation String: expense_accounts"
- },
- "accountsLabelLiabilities": "Skulder",
- "@accountsLabelLiabilities": {
- "description": "Firefly Translation String: liabilities_accounts"
- },
- "accountsLabelRevenue": "Intäktskonton",
- "@accountsLabelRevenue": {
- "description": "Firefly Translation String: revenue_accounts"
- },
- "accountsLiabilitiesInterest": "{interest}% ränta per {period, select, weekly{vecka} monthly{månad} quarterly{kvartal} halfyear{halvår} yearly{år} other{okänd}}",
- "@accountsLiabilitiesInterest": {
- "description": "Interest in a certain period",
- "placeholders": {
- "interest": {
- "type": "double",
- "example": "1.2"
- },
- "period": {
- "type": "String",
- "example": "yearly"
- }
- }
- },
- "catOther": "Övrigt",
- "@catOther": {
- "description": "Category description for summary category 'Other'"
- },
- "errorAPIInvalidResponse": "Ogiltigt svar från API: {message}",
- "@errorAPIInvalidResponse": {
- "description": "Invalid API response error",
- "placeholders": {
- "message": {
- "type": "String",
- "example": "API could not be reached."
- }
- }
- },
- "errorAPIUnavailable": "API inte tillgängligt",
- "@errorAPIUnavailable": {
- "description": "Error thrown when API is unavailable."
- },
- "errorFieldRequired": "Detta fält är obligatoriskt.",
- "@errorFieldRequired": {
- "description": "Error: Required field was left empty."
- },
- "errorInvalidSSLCert": "Ogiltigt SSL-certifikat",
- "@errorInvalidSSLCert": {
- "description": "Error: SSL certificate is invalid"
- },
- "errorInvalidURL": "Ogiltig URL",
- "@errorInvalidURL": {
- "description": "Error: URL is invalid"
- },
- "errorMinAPIVersion": "Minsta Firefly API Version v{requiredVersion} krävs. Vänligen uppdatera Firefly.",
- "@errorMinAPIVersion": {
- "description": "Error: Required API version not met.",
- "placeholders": {
- "requiredVersion": {
- "type": "String",
- "example": "2.0.0"
- }
- }
- },
- "errorStatusCode": "Statuskod: {code}",
- "@errorStatusCode": {
- "description": "HTTP status code information on error",
- "placeholders": {
- "code": {
- "type": "int",
- "example": "500"
- }
- }
- },
- "errorUnknown": "Okänt fel.",
- "@errorUnknown": {
- "description": "Error without further information occurred."
- },
- "formButtonHelp": "Hjälp",
- "@formButtonHelp": {
- "description": "Button Label: Help"
- },
- "formButtonLogin": "Logga in",
- "@formButtonLogin": {
- "description": "Button Label: Login"
- },
- "formButtonLogout": "Logga ut",
- "@formButtonLogout": {
- "description": "Button Label: Logout"
- },
- "formButtonRemove": "Ta bort",
- "@formButtonRemove": {
- "description": "Button Label: Remove"
- },
- "formButtonResetLogin": "Återställ inloggning",
- "@formButtonResetLogin": {
- "description": "Button Label: Reset login form (when error is shown)"
- },
- "formButtonTransactionAdd": "Lägg till transaktion",
- "@formButtonTransactionAdd": {
- "description": "Button Label: Add Transaction"
- },
- "formButtonTryAgain": "Försök igen",
- "@formButtonTryAgain": {
- "description": "Button Label: Try that thing again (login etc)"
- },
- "generalAccount": "Konto",
- "@generalAccount": {
- "description": "Asset/Debt (Bank) Account"
- },
- "generalAssets": "Tillgångar",
- "@generalAssets": {
- "description": "(Monetary) Assets"
- },
- "generalBalance": "Balans",
- "@generalBalance": {
- "description": "(Account) Balance"
- },
- "generalBalanceOn": "Saldo för {date}",
- "@generalBalanceOn": {
- "placeholders": {
- "date": {
- "type": "DateTime",
- "format": "yMd",
- "example": "2023-05-13"
- }
- }
- },
- "generalBill": "Räkning",
- "@generalBill": {
- "description": "Bill"
- },
- "generalBudget": "Budget",
- "@generalBudget": {
- "description": "(Monetary) Budget"
- },
- "generalCategory": "Kategori",
- "@generalCategory": {
- "description": "Category (of transaction etc.)."
- },
- "generalCurrency": "Valuta",
- "@generalCurrency": {
- "description": "(Money) Currency"
- },
- "generalDefault": "förvald",
- "@generalDefault": {
- "description": "Indicates that something is the default choice"
- },
- "generalDismiss": "Stäng",
- "@generalDismiss": {
- "description": "Dismiss window/dialog without action"
- },
- "generalError": "Fel",
- "@generalError": {
- "description": "Error (title in dialogs etc.)"
- },
- "generalExpenses": "Utgifter",
- "@generalExpenses": {
- "description": "(Account) Expenses"
- },
- "generalIncome": "Inkomst",
- "@generalIncome": {
- "description": "(Account) Info"
- },
- "generalLiabilities": "Skulder",
- "@generalLiabilities": {
- "description": "Firefly Translation String: liabilities"
- },
- "generalMultiple": "multipla",
- "@generalMultiple": {
- "description": "Multiples of a single thing (e.g. source accounts) are existing"
- },
- "generalNever": "aldrig",
- "@generalNever": {
- "description": "Has never happened, no update etc."
- },
- "generalReconcile": "Avstämt",
- "@generalReconcile": {
- "description": "Booking has been confirmed/reconciled"
- },
- "generalReset": "Återställ",
- "@generalReset": {
- "description": "Reset something (i.e. set filters)"
- },
- "generalSum": "Summa",
- "@generalSum": {
- "description": "(Mathematical) Sum"
- },
- "generalTarget": "Mål",
- "@generalTarget": {
- "description": "Target value (i.e. a sum to save)"
- },
- "generalUnknown": "Okänt",
- "@generalUnknown": {
- "description": "Something is unknown."
- },
- "homeMainBillsInterval": " ({period, select, weekly{veckovis} monthly{månadsvis} quarterly{kvartalsvis} halfyear{årligen} yearly{} other{okänd}})",
- "@homeMainBillsInterval": {
- "description": "bill interval type",
- "placeholders": {
- "period": {
- "type": "String",
- "example": "weekly"
- }
- }
- },
- "homeMainBillsTitle": "Räkningar inför nästa vecka",
- "@homeMainBillsTitle": {
- "description": "Title: Bills for the next week"
- },
- "homeMainBudgetInterval": " ({from} till {to}, {period})",
- "@homeMainBudgetInterval": {
- "description": "Budget interval ranging from 'from' to 'to', over an interval of 'period'. 'period' is localized by Firefly.",
- "placeholders": {
- "from": {
- "type": "DateTime",
- "format": "MMMd",
- "example": "May 13"
- },
- "to": {
- "type": "DateTime",
- "format": "MMMd",
- "example": "May 17"
- },
- "period": {
- "type": "String",
- "example": "weekly"
- }
- }
- },
- "homeMainBudgetIntervalSingle": " ({from} till {to})",
- "@homeMainBudgetIntervalSingle": {
- "description": "Budget interval ranging from 'from' to 'to', without a specified period.",
- "placeholders": {
- "from": {
- "type": "DateTime",
- "format": "MMMd",
- "example": "May 13"
- },
- "to": {
- "type": "DateTime",
- "format": "MMMd",
- "example": "May 17"
- }
- }
- },
- "homeMainBudgetSum": "{current} {status, select, over{över} other{kvar från}} {available}",
- "@homeMainBudgetSum": {
- "description": "Budget has 'current' money over/left from ('status') of total budget 'available' money.",
- "placeholders": {
- "current": {
- "type": "String",
- "example": "12.34€"
- },
- "status": {
- "type": "String",
- "example": "left from"
- },
- "available": {
- "type": "String",
- "example": "12.34€"
- }
- }
- },
- "homeMainBudgetTitle": "Budgetar för den aktuella månaden",
- "@homeMainBudgetTitle": {
- "description": "Title: Budgets for current month"
- },
- "homeMainChartAccountsTitle": "Kontosammanfattning",
- "@homeMainChartAccountsTitle": {
- "description": "Chart Label: Account Summary"
- },
- "homeMainChartCategoriesTitle": "Kategorisammanfattning för aktuell månad",
- "@homeMainChartCategoriesTitle": {
- "description": "Chart Label: Category Summary"
- },
- "homeMainChartDailyAvg": "7 dagars genomsnitt",
- "@homeMainChartDailyAvg": {
- "description": "Text for last week average spent"
- },
- "homeMainChartDailyTitle": "Daglig sammanfattning",
- "@homeMainChartDailyTitle": {
- "description": "Chart Label: Daily Summary"
- },
- "homeMainChartNetEarningsTitle": "Nettoinkomst",
- "@homeMainChartNetEarningsTitle": {
- "description": "Chart Label: Net Earnings"
- },
- "homeMainChartNetWorthTitle": "Nettoförmögenhet",
- "@homeMainChartNetWorthTitle": {
- "description": "Chart Label: Net Worth"
- },
- "homePiggyAdjustDialogTitle": "Spara/spendera pengar",
- "@homePiggyAdjustDialogTitle": {
- "description": "Title of the dialog where money can be added/removed to a piggy bank."
- },
- "homePiggyDateStart": "Startdatum: {date}",
- "@homePiggyDateStart": {
- "description": "Start of the piggy bank",
- "placeholders": {
- "date": {
- "type": "DateTime",
- "format": "yMMMMd",
- "example": "March 12, 2023"
- }
- }
- },
- "homePiggyDateTarget": "Måldatum: {date}",
- "@homePiggyDateTarget": {
- "description": "Set target date of the piggy bank (when saving should be finished)",
- "placeholders": {
- "date": {
- "type": "DateTime",
- "format": "yMMMMd",
- "example": "March 12, 2023"
- }
- }
- },
- "homePiggyLinked": "Länkad till {account}",
- "@homePiggyLinked": {
- "description": "Piggy bank is linked to asset account {account}.",
- "placeholders": {
- "account": {
- "type": "String",
- "example": "Awesome Bank Account"
- }
- }
- },
- "homePiggyNoAccounts": "Inga spargrisar har inrättats.",
- "@homePiggyNoAccounts": {
- "description": "Information that no piggy banks are existing"
- },
- "homePiggyNoAccountsSubtitle": "Skapa några i webbgränssnittet!",
- "@homePiggyNoAccountsSubtitle": {
- "description": "Subtitle if no piggy banks are existing, hinting to use the webinterface to create some."
- },
- "homePiggyRemaining": "Kvar att spara: {amount}",
- "@homePiggyRemaining": {
- "description": "How much money is left to save",
- "placeholders": {
- "amount": {
- "type": "String",
- "example": "€12.34"
- }
- }
- },
- "homePiggySaved": "Sparat hittills: {amount}",
- "@homePiggySaved": {
- "description": "How much money already was saved",
- "placeholders": {
- "amount": {
- "type": "String",
- "example": "€12.34"
- }
- }
- },
- "homePiggyTarget": "Målbelopp: {amount}",
- "@homePiggyTarget": {
- "description": "How much money should be saved",
- "placeholders": {
- "amount": {
- "type": "String",
- "example": "€12.34"
- }
- }
- },
- "homeTabLabelBalance": "Balansräkning",
- "@homeTabLabelBalance": {
- "description": "Tab Label: Balance Sheet page"
- },
- "homeTabLabelMain": "Start",
- "@homeTabLabelMain": {
- "description": "Tab Label: Start page (\"main\")"
- },
- "homeTabLabelPiggybanks": "Spargris",
- "@homeTabLabelPiggybanks": {
- "description": "Tab Label: Piggy Banks page"
- },
- "homeTabLabelTransactions": "Transaktioner",
- "@homeTabLabelTransactions": {
- "description": "Tab Label: Transactions page"
- },
- "homeTransactionsActionFilter": "Filtrera listan",
- "@homeTransactionsActionFilter": {
- "description": "Action Button Label: Filter list."
- },
- "homeTransactionsDialogFilterAccountsAll": "",
- "@homeTransactionsDialogFilterAccountsAll": {
- "description": "Don't filter for a specific account (default entry)"
- },
- "homeTransactionsDialogFilterBillsAll": "",
- "@homeTransactionsDialogFilterBillsAll": {
- "description": "Don't filter for a specific bill (default entry)"
- },
- "homeTransactionsDialogFilterBillUnset": "",
- "@homeTransactionsDialogFilterBillUnset": {
- "description": "Filter for unset bills"
- },
- "homeTransactionsDialogFilterBudgetsAll": "",
- "@homeTransactionsDialogFilterBudgetsAll": {
- "description": "Don't filter for a specific budget (default entry)"
- },
- "homeTransactionsDialogFilterBudgetUnset": "",
- "@homeTransactionsDialogFilterBudgetUnset": {
- "description": "Filter for unset budgets"
- },
- "homeTransactionsDialogFilterCategoriesAll": "",
- "@homeTransactionsDialogFilterCategoriesAll": {
- "description": "Don't filter for a specific category (default entry)"
- },
- "homeTransactionsDialogFilterCategoryUnset": "",
- "@homeTransactionsDialogFilterCategoryUnset": {
- "description": "Filter for unset categories"
- },
- "homeTransactionsDialogFilterCurrenciesAll": "",
- "@homeTransactionsDialogFilterCurrenciesAll": {
- "description": "Don't filter for a specific currency (default entry)"
- },
- "homeTransactionsDialogFilterSearch": "Sökord",
- "@homeTransactionsDialogFilterSearch": {
- "description": "Search term for filter"
- },
- "homeTransactionsDialogFilterTitle": "Välj filter",
- "@homeTransactionsDialogFilterTitle": {
- "description": "Title of Filter Dialog"
- },
- "homeTransactionsEmpty": "Inga transaktioner hittade.",
- "@homeTransactionsEmpty": {
- "description": "Message when no transactions are found."
- },
- "homeTransactionsMultipleCategories": "{num} kategorier",
- "@homeTransactionsMultipleCategories": {
- "description": "$num categories for the transaction.",
- "placeholders": {
- "num": {
- "type": "int",
- "example": "2"
- }
- }
- },
- "liabilityDirectionCredit": "Jag är skyldig denna skuld",
- "@liabilityDirectionCredit": {
- "description": "Firefly Translation String: liability_direction_credit"
- },
- "liabilityDirectionDebit": "Jag har denna skuld",
- "@liabilityDirectionDebit": {
- "description": "Firefly Translation String: liability_direction_debit"
- },
- "liabilityTypeDebt": "Skuld",
- "@liabilityTypeDebt": {
- "description": "Firefly Translation String: account_type_debt"
- },
- "liabilityTypeLoan": "Lån",
- "@liabilityTypeLoan": {
- "description": "Firefly Translation String: account_type_loan"
- },
- "liabilityTypeMortgage": "Bolån",
- "@liabilityTypeMortgage": {
- "description": "Firefly Translation String: account_type_mortgage"
- },
- "loginAbout": "För att använda Waterfly III på ett produktivt sätt behöver du din egen server med en Firefly III instans eller Firefly III-tillägget för Home Assistant.\n\nAnge hela URL: en samt en personlig åtkomst-token (inställningar -> Profil -> OAuth -> Personlig åtkomst-token) nedan.",
- "@loginAbout": {
- "description": "Login screen welcome description"
- },
- "loginFormLabelAPIKey": "Giltig API-nyckel",
- "@loginFormLabelAPIKey": {
- "description": "Login Form: Label for API Key field"
- },
- "loginFormLabelHost": "Värd URL",
- "@loginFormLabelHost": {
- "description": "Login Form: Label for Host field"
- },
- "loginWelcome": "Välkommen till Waterfly III",
- "@loginWelcome": {
- "description": "Login screen welcome banner"
- },
- "logoutConfirmation": "Är du säker på att du vill logga ut?",
- "@logoutConfirmation": {
- "description": "Get user confirmation if he really wants to log out"
- },
- "navigationAccounts": "Konton",
- "@navigationAccounts": {
- "description": "Navigation Label: Accounts Page"
- },
- "navigationMain": "Kontrollpanel",
- "@navigationMain": {
- "description": "Navigation Label: Main Dashboard"
- },
- "navigationSettings": "Inställningar",
- "@navigationSettings": {
- "description": "Navigation Label: Settings"
- },
- "numPercent": "{num}",
- "@numPercent": {
- "description": "Number formatted as percentage",
- "placeholders": {
- "num": {
- "type": "double",
- "format": "decimalPercentPattern",
- "optionalParameters": {
- "decimalDigits": 0
- }
- }
- }
- },
- "numPercentOf": "{perc} av {of}",
- "@numPercentOf": {
- "description": "Number formatted as percentage, with total amount provided",
- "placeholders": {
- "perc": {
- "type": "double",
- "format": "decimalPercentPattern",
- "optionalParameters": {
- "decimalDigits": 0
- }
- },
- "of": {
- "type": "String"
- }
- }
- },
- "settingsDialogDebugInfo": "Du kan aktivera och skicka felsökningsloggar här. Dessa har en dålig inverkan på prestandan, så var snäll och aktivera dem inte om du inte rekommenderas att göra det. Inaktivering av loggning kommer att ta bort den lagrade loggen.",
- "@settingsDialogDebugInfo": {
- "description": "Information about debug logs and their impact."
- },
- "settingsDialogDebugMailCreate": "Skapa e-post",
- "@settingsDialogDebugMailCreate": {
- "description": "Button to confirm mail creation after privacy disclaimer is shown."
- },
- "settingsDialogDebugMailDisclaimer": "VARNING: Ett e-postutkast öppnas med loggfilen bifogad (i textformat). Loggarna kan innehålla känslig information, såsom värdnamnet för din Firefly instans (även om jag försöker undvika loggning av några hemligheter, såsom api nyckel). Läs igenom loggen noga och censurera all information som du inte vill dela och/eller inte är relevant för det problem du vill rapportera.\n\nSkicka inte in loggar utan föregående överenskommelse via mail/GitHub. Jag kommer att ta bort alla loggar som skickas utan kontext av sekretessskäl. Ladda aldrig upp loggen ocensurerad till GitHub eller någon annanstans.",
- "@settingsDialogDebugMailDisclaimer": {
- "description": "Privacy disclaimer shown before sending logs"
- },
- "settingsDialogDebugSendButton": "Skicka loggar via e-post",
- "@settingsDialogDebugSendButton": {
- "description": "Button to send logs via E-Mail"
- },
- "settingsDialogDebugTitle": "Felsökningsloggar",
- "@settingsDialogDebugTitle": {
- "description": "Dialog title: Debug Logs"
- },
- "settingsDialogLanguageTitle": "Välj språk",
- "@settingsDialogLanguageTitle": {
- "description": "Dialog title: Select Language"
- },
- "settingsDialogThemeTitle": "Välj tema",
- "@settingsDialogThemeTitle": {
- "description": "Dialog title: Select theme"
- },
- "settingsLanguage": "Språk",
- "@settingsLanguage": {
- "description": "Currently selected language"
- },
- "settingsLockscreen": "Låsskärm",
- "@settingsLockscreen": {
- "description": "Setting if a lockscreen is shown (authentication is required on startup)"
- },
- "settingsLockscreenHelp": "Kräv autentisering vid appstart",
- "@settingsLockscreenHelp": {
- "description": "Description for lockscreen setting"
- },
- "settingsLockscreenInitial": "Vänligen autentisera för att aktivera låsskärmen.",
- "@settingsLockscreenInitial": {
- "description": "Prompt to authenticate once to set up the lockscreen"
- },
- "settingsNLAppAccount": "Förvalt konto",
- "@settingsNLAppAccount": {
- "description": "Default account which will be used for the transaction."
- },
- "settingsNLAppAccountDynamic": "",
- "@settingsNLAppAccountDynamic": {
- "description": "Account will be selected dynamically by the content of the notification."
- },
- "settingsNLAppAdd": "Lägg till app",
- "@settingsNLAppAdd": {
- "description": "Button title to add a new app."
- },
- "settingsNLAppAddHelp": "Klicka för att lägga till en app att lyssna efter. Endast kvalificerade appar visas i listan.",
- "@settingsNLAppAddHelp": {
- "description": "Help text below adding the new app button."
- },
- "settingsNLAppAddInfo": "Gör några transaktioner där du får telefonaviseringar för att lägga till appar i den här listan. Om appen fortfarande inte dyker upp, vänligen rapportera det till app@vogt.pw.",
- "@settingsNLAppAddInfo": {
- "description": "Help text when no more app is available to add."
- },
- "settingsNLDescription": "Den här tjänsten låter dig hämta transaktionsdetaljer från inkommande pushnotifikationer. Du kan även välja ett förvalt konto som transaktionen ska göras på - om inget värde ges försöker den extrahera kontot från notifikationen.",
- "@settingsNLDescription": {
- "description": "Description text for the notification listener service."
- },
- "settingsNLPermissionGrant": "Tryck för att bevilja tillstånd.",
- "@settingsNLPermissionGrant": {
- "description": "Indicates user should tap the text to grant certain permissions (notification access)."
- },
- "settingsNLPermissionNotGranted": "Behörighet inte beviljad.",
- "@settingsNLPermissionNotGranted": {
- "description": "A requested permission was not granted."
- },
- "settingsNLPermissionRemove": "Ta bort behörigheten?",
- "@settingsNLPermissionRemove": {
- "description": "Dialog title asking if permission should be removed."
- },
- "settingsNLPermissionRemoveHelp": "För att avaktivera den här tjänsten, tryck på appen och ta bort behörigheterna på den nästa skärmen.",
- "@settingsNLPermissionRemoveHelp": {
- "description": "Dialog text giving hint how to remove the permission."
- },
- "settingsNLPrefillTXTitle": "Fyll i transaktionstiteln med nofikationstiteln i förväg",
- "@settingsNLPrefillTXTitle": {
- "description": "First line for setting to use pre-fill transaction title with notification title."
- },
- "settingsNLServiceChecking": "Kontrollerar status…",
- "@settingsNLServiceChecking": {
- "description": "Checking the status of the background service"
- },
- "settingsNLServiceCheckingError": "Fel vid kontroll av status: {error}",
- "@settingsNLServiceCheckingError": {
- "description": "An error occurred while checking the service status",
- "placeholders": {
- "error": {
- "type": "String",
- "description": "Error details",
- "example": "Timeout"
- }
- }
- },
- "settingsNLServiceRunning": "Tjänsten körs.",
- "@settingsNLServiceRunning": {
- "description": "A background service is running normally."
- },
- "settingsNLServiceStatus": "Tjänstestatus",
- "@settingsNLServiceStatus": {
- "description": "Status of a background service."
- },
- "settingsNLServiceStopped": "Tjänsten är stoppad.",
- "@settingsNLServiceStopped": {
- "description": "A background service is stopped."
- },
- "settingsNotificationListener": "Notifikationslyssningstjänst",
- "@settingsNotificationListener": {
- "description": "Setting for the notification listener service."
- },
- "settingsTheme": "Apptema",
- "@settingsTheme": {
- "description": "App theme (dark or light)"
- },
- "settingsThemeDynamicColors": "Dynamiska färger",
- "@settingsThemeDynamicColors": {
- "description": "Material You Dynamic Colors feature"
- },
- "settingsThemeValue": "{theme, select, dark{Mörkt läge} light{Ljust läge} other{Systemstandard}}",
- "@settingsThemeValue": {
- "description": "Currently selected theme (either dark, light or system)",
- "placeholders": {
- "theme": {
- "type": "String",
- "example": "ThemeMode.dark"
- }
- }
- },
- "settingsVersion": "Appversion",
- "@settingsVersion": {
- "description": "Current App Version"
- },
- "settingsVersionChecking": "kontrollerar…",
- "@settingsVersionChecking": {
- "description": "Shown while checking for app version"
- },
- "splashCustomSSLCert": "Anpassat SSL-certifikat",
- "@splashCustomSSLCert": {
- "description": "Button text & Dialog title for using a custom SSL certificate"
- },
- "splashFormLabelCustomSSLCertPEM": "Certifikatfil (PEM)",
- "@splashFormLabelCustomSSLCertPEM": {
- "description": "Label for certificate file text input in PEM format"
- },
- "transactionAttachments": "Bilagor",
- "@transactionAttachments": {
- "description": "Button Label: Attachments"
- },
- "transactionDeleteConfirm": "Är du säker att du vill radera denna transaktion?",
- "@transactionDeleteConfirm": {
- "description": "Confirmation text to delete transaction"
- },
- "transactionDialogAttachmentsDelete": "Ta bort bifogad fil",
- "@transactionDialogAttachmentsDelete": {
- "description": "Button Label: Delete Attachment"
- },
- "transactionDialogAttachmentsDeleteConfirm": "Är du säker på att du vill radera bilagan?",
- "@transactionDialogAttachmentsDeleteConfirm": {
- "description": "Confirmation text to delete attachment"
- },
- "transactionDialogAttachmentsErrorDownload": "Kunde inte ladda ner filen.",
- "@transactionDialogAttachmentsErrorDownload": {
- "description": "Snackbar Text: File download failed."
- },
- "transactionDialogAttachmentsErrorOpen": "Kunde inte öppna filen: {error}",
- "@transactionDialogAttachmentsErrorOpen": {
- "description": "Snackbar Text: File could not be opened, with reason.",
- "placeholders": {
- "error": {
- "type": "String"
- }
+ "@@locale": "sv",
+ "@@x-reference": true,
+ "accountRoleAssetCashWallet": "Plånbok",
+ "@accountRoleAssetCashWallet": {
+ "description": "Firefly Translation String: account_role_cashWalletAsset"
+ },
+ "accountRoleAssetCC": "Kreditkort",
+ "@accountRoleAssetCC": {
+ "description": "Firefly Translation String: account_role_ccAsset"
+ },
+ "accountRoleAssetDefault": "Förvalt tillgångskonto",
+ "@accountRoleAssetDefault": {
+ "description": "Firefly Translation String: account_role_defaultAsset"
+ },
+ "accountRoleAssetSavings": "Sparkonto",
+ "@accountRoleAssetSavings": {
+ "description": "Firefly Translation String: account_role_savingAsset"
+ },
+ "accountRoleAssetShared": "Delat tillgångskonto",
+ "@accountRoleAssetShared": {
+ "description": "Firefly Translation String: account_role_sharedAsset"
+ },
+ "accountsLabelAsset": "Tillgångskonton",
+ "@accountsLabelAsset": {
+ "description": "Firefly Translation String: asset_accounts"
+ },
+ "accountsLabelExpense": "Kostnadskonton",
+ "@accountsLabelExpense": {
+ "description": "Firefly Translation String: expense_accounts"
+ },
+ "accountsLabelLiabilities": "Skulder",
+ "@accountsLabelLiabilities": {
+ "description": "Firefly Translation String: liabilities_accounts"
+ },
+ "accountsLabelRevenue": "Intäktskonton",
+ "@accountsLabelRevenue": {
+ "description": "Firefly Translation String: revenue_accounts"
+ },
+ "accountsLiabilitiesInterest": "{interest}% ränta per {period, select, weekly{vecka} monthly{månad} quarterly{kvartal} halfyear{halvår} yearly{år} other{okänd}}",
+ "@accountsLiabilitiesInterest": {
+ "description": "Interest in a certain period",
+ "placeholders": {
+ "interest": {
+ "type": "double",
+ "example": "1.2"
+ },
+ "period": {
+ "type": "String",
+ "example": "yearly"
+ }
+ }
+ },
+ "billsAddNewBill": "Lägg till ny räkning",
+ "@billsAddNewBill": {
+ "description": "Text for add new bill flows"
+ },
+ "billsAmountAndFrequency": "Räkningen matchar transaktioner mellan {minValue} och {maxvalue}. Upprepas {frequency, select, weekly{veckovis} monthly{månadsvis} quarterly{kvartalsvis} halfyear{halvårsvis} yearly{årligen} other{okänt}}{skip, plural, =0{} other{, hoppar över {skip}}}.",
+ "@billsAmountAndFrequency": {
+ "description": "Bill match for min and max amounts, and frequency",
+ "placeholders": {
+ "minValue": {
+ "type": "String",
+ "example": "$50.12"
+ },
+ "maxvalue": {
+ "type": "String",
+ "example": "$60.50"
+ },
+ "frequency": {
+ "type": "String",
+ "example": "yearly"
+ },
+ "skip": {
+ "type": "num",
+ "example": "1"
+ }
+ }
+ },
+ "billsChangeLayoutTooltip": "Ändra layout",
+ "@billsChangeLayoutTooltip": {
+ "description": "Text for layout change button tooltip"
+ },
+ "billsChangeSortOrderTooltip": "Ändra sorteringsordning",
+ "@billsChangeSortOrderTooltip": {
+ "description": "Text for sort order change button tooltip"
+ },
+ "billsDialogLayoutTitle": "Layout för räkningsvy",
+ "@billsDialogLayoutTitle": {
+ "description": "Text for bills layout dialog title"
+ },
+ "billsDialogSortTitle": "Sortera listan efter",
+ "@billsDialogSortTitle": {
+ "description": "Text for bills sort dialog title"
+ },
+ "billsEditBill": "Ändra räkning",
+ "@billsEditBill": {
+ "description": "Text for edit bill flows"
+ },
+ "billsErrorLoading": "Fel vid laddning av räkningar.",
+ "@billsErrorLoading": {
+ "description": "Generic error message when bills can't be loaded (shouldn't occur)"
+ },
+ "billsExactAmountAndFrequency": "Räkningen matchar transaktioner på {value}. Upprepas {frequency, select, weekly{veckovis} monthly{månadsvis} quarterly{kvartalsvis} halfyear{halvårsvis} yearly{årligen} other{okänt}}{skip, plural, =0{} other{, hoppar över {skip}}}.",
+ "@billsExactAmountAndFrequency": {
+ "description": "Bill match for exact amount and frequency",
+ "placeholders": {
+ "value": {
+ "type": "String",
+ "example": "$50.12"
+ },
+ "frequency": {
+ "type": "String",
+ "example": "yearly"
+ },
+ "skip": {
+ "type": "num",
+ "example": "1"
+ }
+ }
+ },
+ "billsExpectedOn": "Förväntad {date}",
+ "@billsExpectedOn": {
+ "description": "Describes what date the bill is expected",
+ "placeholders": {
+ "date": {
+ "type": "DateTime",
+ "format": "yMMMMd",
+ "example": "January 5, 2024"
+ }
+ }
+ },
+ "billsFrequency": "{frequency, select, weekly{Veckovis} monthly{Månadsvis} quarterly{Kvartalsvis} halfyear{Halvårsvis} yearly{Årligen} other{Okänt}}",
+ "@billsFrequency": {
+ "description": "Bill frequency",
+ "placeholders": {
+ "frequency": {
+ "type": "String",
+ "example": "yearly"
+ }
+ }
+ },
+ "billsFrequencySkip": "{frequency, select, weekly{Veckovis} monthly{Månadsvis} quarterly{Kvartalsvis} halfyear{Halvårsvis} yearly{Årligen} other{Okänt}}{skip, plural, =0{} other{, hoppar över {skip}}}",
+ "@billsFrequencySkip": {
+ "description": "Bill frequency",
+ "placeholders": {
+ "frequency": {
+ "type": "String",
+ "example": "yearly"
+ },
+ "skip": {
+ "type": "num",
+ "example": "1"
+ }
+ }
+ },
+ "billsInactive": "Inaktiv",
+ "@billsInactive": {
+ "description": "Text: when the bill is inactive"
+ },
+ "billsIsActive": "Räkningen aktiv",
+ "@billsIsActive": {
+ "description": "Text: the bill is active"
+ },
+ "billsLayoutGroupSubtitle": "Räkningar visas i sina tilldelade grupper.",
+ "@billsLayoutGroupSubtitle": {
+ "description": "Subtitle text for group layout option"
+ },
+ "billsLayoutGroupTitle": "Grupp",
+ "@billsLayoutGroupTitle": {
+ "description": "Title text for group layout option"
+ },
+ "billsLayoutListSubtitle": "Räkningar visas i en lista sorterad efter vissa kriterier.",
+ "@billsLayoutListSubtitle": {
+ "description": "Subtitle text for list layout option"
+ },
+ "billsLayoutListTitle": "Lista",
+ "@billsLayoutListTitle": {
+ "description": "Title text for list layout option"
+ },
+ "billsListEmpty": "Den här listan är för närvarande tom.",
+ "@billsListEmpty": {
+ "description": "Describes that the list is empty"
+ },
+ "billsNextExpectedMatch": "Nästa förväntade träff",
+ "@billsNextExpectedMatch": {
+ "description": "Text: next expected match for bill"
+ },
+ "billsNotActive": "Räkningen är inaktiv",
+ "@billsNotActive": {
+ "description": "Text: the bill is inactive"
+ },
+ "billsNotExpected": "Ej förväntat denna period",
+ "@billsNotExpected": {
+ "description": "Describes that the bill is not expected this period"
+ },
+ "billsNoTransactions": "Inga transaktioner hittade.",
+ "@billsNoTransactions": {
+ "description": "Describes that there are no transactions connected to the bill"
+ },
+ "billsPaidOn": "Betald {date}",
+ "@billsPaidOn": {
+ "description": "Describes what date the bill was paid",
+ "placeholders": {
+ "date": {
+ "type": "DateTime",
+ "format": "yMMMMd",
+ "example": "January 5, 2024"
+ }
+ }
+ },
+ "billsSortAlphabetical": "Alfabetisk",
+ "@billsSortAlphabetical": {
+ "description": "Text for alphabetical sort types"
+ },
+ "billsSortByTimePeriod": "Efter tidsperiod",
+ "@billsSortByTimePeriod": {
+ "description": "Text for frequency sort type"
+ },
+ "billsSortDirection": "{sortDirection, select, ascending{Stigande} descending{Fallande} other{Okänt}}",
+ "@billsSortDirection": {
+ "description": "Bill sort direction",
+ "placeholders": {
+ "sortDirection": {
+ "type": "String",
+ "example": "Ascending"
+ }
+ }
+ },
+ "billsSortFrequency": "Frekvens",
+ "@billsSortFrequency": {
+ "description": "Text for sort by frequency"
+ },
+ "billsSortName": "Namn",
+ "@billsSortName": {
+ "description": "Text for sort by name"
+ },
+ "billsUngrouped": "Ogrupperad",
+ "@billsUngrouped": {
+ "description": "Title for ungrouped bills"
+ },
+ "categoryDeleteConfirm": "Är du säker på att du vill ta bort denna kategori? Transaktionerna kommer inte att tas bort, men kommer inte att ha en kategori längre.",
+ "@categoryDeleteConfirm": {
+ "description": "Confirmation text to delete category"
+ },
+ "categoryErrorLoading": "Fel vid laddning av kategorier.",
+ "@categoryErrorLoading": {
+ "description": "Generic error message when categories can't be loaded (shouldn't occur)"
+ },
+ "categoryFormLabelIncludeInSum": "Inkludera i månadssumman",
+ "@categoryFormLabelIncludeInSum": {
+ "description": "Category Add/Edit Form: Label for toggle field to include value in monthly sum"
+ },
+ "categoryFormLabelName": "Kategorinamn",
+ "@categoryFormLabelName": {
+ "description": "Category Add/Edit Form: Label for name field"
+ },
+ "categoryMonthNext": "Nästa Månad",
+ "@categoryMonthNext": {
+ "description": "Button title to view overview for next month"
+ },
+ "categoryMonthPrev": "Föregående månad",
+ "@categoryMonthPrev": {
+ "description": "Button title to view overview for previous month"
+ },
+ "categorySumExcluded": "exkluderad",
+ "@categorySumExcluded": {
+ "description": "Label that the category is excluded from the monthly sum. The label will be shown in the place where usually the monthly percentage share is shown. Should be a single word if possible."
+ },
+ "categoryTitleAdd": "Lägg till kategori",
+ "@categoryTitleAdd": {
+ "description": "Title for Dialog: Add Category"
+ },
+ "categoryTitleDelete": "Ta bort kategori",
+ "@categoryTitleDelete": {
+ "description": "Title for Dialog: Delete Category"
+ },
+ "categoryTitleEdit": "Redigera kategori",
+ "@categoryTitleEdit": {
+ "description": "Title for Dialog: Edit Category"
+ },
+ "catNone": "",
+ "@catNone": {
+ "description": "Placeholder when no category has been set."
+ },
+ "catOther": "Övrigt",
+ "@catOther": {
+ "description": "Category description for summary category 'Other'"
+ },
+ "errorAPIInvalidResponse": "Ogiltigt svar från API: {message}",
+ "@errorAPIInvalidResponse": {
+ "description": "Invalid API response error",
+ "placeholders": {
+ "message": {
+ "type": "String",
+ "example": "API could not be reached."
+ }
+ }
+ },
+ "errorAPIUnavailable": "API inte tillgängligt",
+ "@errorAPIUnavailable": {
+ "description": "Error thrown when API is unavailable."
+ },
+ "errorFieldRequired": "Detta fält är obligatoriskt.",
+ "@errorFieldRequired": {
+ "description": "Error: Required field was left empty."
+ },
+ "errorInvalidSSLCert": "Ogiltigt SSL-certifikat",
+ "@errorInvalidSSLCert": {
+ "description": "Error: SSL certificate is invalid"
+ },
+ "errorInvalidURL": "Ogiltig URL",
+ "@errorInvalidURL": {
+ "description": "Error: URL is invalid"
+ },
+ "errorMinAPIVersion": "Minsta Firefly API Version v{requiredVersion} krävs. Vänligen uppdatera Firefly.",
+ "@errorMinAPIVersion": {
+ "description": "Error: Required API version not met.",
+ "placeholders": {
+ "requiredVersion": {
+ "type": "String",
+ "example": "2.0.0"
+ }
+ }
+ },
+ "errorStatusCode": "Statuskod: {code}",
+ "@errorStatusCode": {
+ "description": "HTTP status code information on error",
+ "placeholders": {
+ "code": {
+ "type": "int",
+ "example": "500"
+ }
+ }
+ },
+ "errorUnknown": "Okänt fel.",
+ "@errorUnknown": {
+ "description": "Error without further information occurred."
+ },
+ "formButtonHelp": "Hjälp",
+ "@formButtonHelp": {
+ "description": "Button Label: Help"
+ },
+ "formButtonLogin": "Logga in",
+ "@formButtonLogin": {
+ "description": "Button Label: Login"
+ },
+ "formButtonLogout": "Logga ut",
+ "@formButtonLogout": {
+ "description": "Button Label: Logout"
+ },
+ "formButtonRemove": "Ta bort",
+ "@formButtonRemove": {
+ "description": "Button Label: Remove"
+ },
+ "formButtonResetLogin": "Återställ inloggning",
+ "@formButtonResetLogin": {
+ "description": "Button Label: Reset login form (when error is shown)"
+ },
+ "formButtonTransactionAdd": "Lägg till transaktion",
+ "@formButtonTransactionAdd": {
+ "description": "Button Label: Add Transaction"
+ },
+ "formButtonTryAgain": "Försök igen",
+ "@formButtonTryAgain": {
+ "description": "Button Label: Try that thing again (login etc)"
+ },
+ "generalAccount": "Konto",
+ "@generalAccount": {
+ "description": "Asset/Debt (Bank) Account"
+ },
+ "generalAssets": "Tillgångar",
+ "@generalAssets": {
+ "description": "(Monetary) Assets"
+ },
+ "generalBalance": "Balans",
+ "@generalBalance": {
+ "description": "(Account) Balance"
+ },
+ "generalBalanceOn": "Saldo för {date}",
+ "@generalBalanceOn": {
+ "placeholders": {
+ "date": {
+ "type": "DateTime",
+ "format": "yMd",
+ "example": "2023-05-13"
+ }
+ }
+ },
+ "generalBill": "Räkning",
+ "@generalBill": {
+ "description": "Bill"
+ },
+ "generalBudget": "Budget",
+ "@generalBudget": {
+ "description": "(Monetary) Budget"
+ },
+ "generalCategory": "Kategori",
+ "@generalCategory": {
+ "description": "Category (of transaction etc.)."
+ },
+ "generalCurrency": "Valuta",
+ "@generalCurrency": {
+ "description": "(Money) Currency"
+ },
+ "generalDefault": "förvald",
+ "@generalDefault": {
+ "description": "Indicates that something is the default choice"
+ },
+ "generalDismiss": "Stäng",
+ "@generalDismiss": {
+ "description": "Dismiss window/dialog without action"
+ },
+ "generalEarned": "Intjänat",
+ "@generalEarned": {
+ "description": "(Amount) Earned"
+ },
+ "generalError": "Fel",
+ "@generalError": {
+ "description": "Error (title in dialogs etc.)"
+ },
+ "generalExpenses": "Utgifter",
+ "@generalExpenses": {
+ "description": "(Account) Expenses"
+ },
+ "generalIncome": "Inkomst",
+ "@generalIncome": {
+ "description": "(Account) Info"
+ },
+ "generalLiabilities": "Skulder",
+ "@generalLiabilities": {
+ "description": "Firefly Translation String: liabilities"
+ },
+ "generalMultiple": "multipla",
+ "@generalMultiple": {
+ "description": "Multiples of a single thing (e.g. source accounts) are existing"
+ },
+ "generalNever": "aldrig",
+ "@generalNever": {
+ "description": "Has never happened, no update etc."
+ },
+ "generalReconcile": "Avstämt",
+ "@generalReconcile": {
+ "description": "Booking has been confirmed/reconciled"
+ },
+ "generalReset": "Återställ",
+ "@generalReset": {
+ "description": "Reset something (i.e. set filters)"
+ },
+ "generalSpent": "Spenderat",
+ "@generalSpent": {
+ "description": "(Amount) Spent"
+ },
+ "generalSum": "Summa",
+ "@generalSum": {
+ "description": "(Mathematical) Sum"
+ },
+ "generalTarget": "Mål",
+ "@generalTarget": {
+ "description": "Target value (i.e. a sum to save)"
+ },
+ "generalUnknown": "Okänt",
+ "@generalUnknown": {
+ "description": "Something is unknown."
+ },
+ "homeMainBillsInterval": " ({period, select, weekly{veckovis} monthly{månadsvis} quarterly{kvartalsvis} halfyear{årligen} yearly{} other{okänd}})",
+ "@homeMainBillsInterval": {
+ "description": "bill interval type",
+ "placeholders": {
+ "period": {
+ "type": "String",
+ "example": "weekly"
+ }
+ }
+ },
+ "homeMainBillsTitle": "Räkningar inför nästa vecka",
+ "@homeMainBillsTitle": {
+ "description": "Title: Bills for the next week"
+ },
+ "homeMainBudgetInterval": " ({from} till {to}, {period})",
+ "@homeMainBudgetInterval": {
+ "description": "Budget interval ranging from 'from' to 'to', over an interval of 'period'. 'period' is localized by Firefly.",
+ "placeholders": {
+ "from": {
+ "type": "DateTime",
+ "format": "MMMd",
+ "example": "May 13"
+ },
+ "to": {
+ "type": "DateTime",
+ "format": "MMMd",
+ "example": "May 17"
+ },
+ "period": {
+ "type": "String",
+ "example": "weekly"
+ }
+ }
+ },
+ "homeMainBudgetIntervalSingle": " ({from} till {to})",
+ "@homeMainBudgetIntervalSingle": {
+ "description": "Budget interval ranging from 'from' to 'to', without a specified period.",
+ "placeholders": {
+ "from": {
+ "type": "DateTime",
+ "format": "MMMd",
+ "example": "May 13"
+ },
+ "to": {
+ "type": "DateTime",
+ "format": "MMMd",
+ "example": "May 17"
+ }
+ }
+ },
+ "homeMainBudgetSum": "{current} {status, select, over{över} other{kvar från}} {available}",
+ "@homeMainBudgetSum": {
+ "description": "Budget has 'current' money over/left from ('status') of total budget 'available' money.",
+ "placeholders": {
+ "current": {
+ "type": "String",
+ "example": "12.34€"
+ },
+ "status": {
+ "type": "String",
+ "example": "left from"
+ },
+ "available": {
+ "type": "String",
+ "example": "12.34€"
+ }
+ }
+ },
+ "homeMainBudgetTitle": "Budgetar för den aktuella månaden",
+ "@homeMainBudgetTitle": {
+ "description": "Title: Budgets for current month"
+ },
+ "homeMainChartAccountsTitle": "Kontosammanfattning",
+ "@homeMainChartAccountsTitle": {
+ "description": "Chart Label: Account Summary"
+ },
+ "homeMainChartCategoriesTitle": "Kategorisammanfattning för aktuell månad",
+ "@homeMainChartCategoriesTitle": {
+ "description": "Chart Label: Category Summary"
+ },
+ "homeMainChartDailyAvg": "7 dagars genomsnitt",
+ "@homeMainChartDailyAvg": {
+ "description": "Text for last week average spent"
+ },
+ "homeMainChartDailyTitle": "Daglig sammanfattning",
+ "@homeMainChartDailyTitle": {
+ "description": "Chart Label: Daily Summary"
+ },
+ "homeMainChartNetEarningsTitle": "Nettoinkomst",
+ "@homeMainChartNetEarningsTitle": {
+ "description": "Chart Label: Net Earnings"
+ },
+ "homeMainChartNetWorthTitle": "Nettoförmögenhet",
+ "@homeMainChartNetWorthTitle": {
+ "description": "Chart Label: Net Worth"
+ },
+ "homePiggyAdjustDialogTitle": "Spara/spendera pengar",
+ "@homePiggyAdjustDialogTitle": {
+ "description": "Title of the dialog where money can be added/removed to a piggy bank."
+ },
+ "homePiggyDateStart": "Startdatum: {date}",
+ "@homePiggyDateStart": {
+ "description": "Start of the piggy bank",
+ "placeholders": {
+ "date": {
+ "type": "DateTime",
+ "format": "yMMMMd",
+ "example": "March 12, 2023"
+ }
+ }
+ },
+ "homePiggyDateTarget": "Måldatum: {date}",
+ "@homePiggyDateTarget": {
+ "description": "Set target date of the piggy bank (when saving should be finished)",
+ "placeholders": {
+ "date": {
+ "type": "DateTime",
+ "format": "yMMMMd",
+ "example": "March 12, 2023"
+ }
+ }
+ },
+ "homePiggyLinked": "Länkad till {account}",
+ "@homePiggyLinked": {
+ "description": "Piggy bank is linked to asset account {account}.",
+ "placeholders": {
+ "account": {
+ "type": "String",
+ "example": "Awesome Bank Account"
+ }
+ }
+ },
+ "homePiggyNoAccounts": "Inga spargrisar har inrättats.",
+ "@homePiggyNoAccounts": {
+ "description": "Information that no piggy banks are existing"
+ },
+ "homePiggyNoAccountsSubtitle": "Skapa några i webbgränssnittet!",
+ "@homePiggyNoAccountsSubtitle": {
+ "description": "Subtitle if no piggy banks are existing, hinting to use the webinterface to create some."
+ },
+ "homePiggyRemaining": "Kvar att spara: {amount}",
+ "@homePiggyRemaining": {
+ "description": "How much money is left to save",
+ "placeholders": {
+ "amount": {
+ "type": "String",
+ "example": "€12.34"
+ }
+ }
+ },
+ "homePiggySaved": "Sparat hittills: {amount}",
+ "@homePiggySaved": {
+ "description": "How much money already was saved",
+ "placeholders": {
+ "amount": {
+ "type": "String",
+ "example": "€12.34"
+ }
+ }
+ },
+ "homePiggyTarget": "Målbelopp: {amount}",
+ "@homePiggyTarget": {
+ "description": "How much money should be saved",
+ "placeholders": {
+ "amount": {
+ "type": "String",
+ "example": "€12.34"
+ }
+ }
+ },
+ "homeTabLabelBalance": "Balansräkning",
+ "@homeTabLabelBalance": {
+ "description": "Tab Label: Balance Sheet page"
+ },
+ "homeTabLabelMain": "Start",
+ "@homeTabLabelMain": {
+ "description": "Tab Label: Start page (\"main\")"
+ },
+ "homeTabLabelPiggybanks": "Spargris",
+ "@homeTabLabelPiggybanks": {
+ "description": "Tab Label: Piggy Banks page"
+ },
+ "homeTabLabelTransactions": "Transaktioner",
+ "@homeTabLabelTransactions": {
+ "description": "Tab Label: Transactions page"
+ },
+ "homeTransactionsActionFilter": "Filtrera listan",
+ "@homeTransactionsActionFilter": {
+ "description": "Action Button Label: Filter list."
+ },
+ "homeTransactionsDialogFilterAccountsAll": "",
+ "@homeTransactionsDialogFilterAccountsAll": {
+ "description": "Don't filter for a specific account (default entry)"
+ },
+ "homeTransactionsDialogFilterBillsAll": "",
+ "@homeTransactionsDialogFilterBillsAll": {
+ "description": "Don't filter for a specific bill (default entry)"
+ },
+ "homeTransactionsDialogFilterBillUnset": "",
+ "@homeTransactionsDialogFilterBillUnset": {
+ "description": "Filter for unset bills"
+ },
+ "homeTransactionsDialogFilterBudgetsAll": "",
+ "@homeTransactionsDialogFilterBudgetsAll": {
+ "description": "Don't filter for a specific budget (default entry)"
+ },
+ "homeTransactionsDialogFilterBudgetUnset": "",
+ "@homeTransactionsDialogFilterBudgetUnset": {
+ "description": "Filter for unset budgets"
+ },
+ "homeTransactionsDialogFilterCategoriesAll": "",
+ "@homeTransactionsDialogFilterCategoriesAll": {
+ "description": "Don't filter for a specific category (default entry)"
+ },
+ "homeTransactionsDialogFilterCategoryUnset": "",
+ "@homeTransactionsDialogFilterCategoryUnset": {
+ "description": "Filter for unset categories"
+ },
+ "homeTransactionsDialogFilterCurrenciesAll": "",
+ "@homeTransactionsDialogFilterCurrenciesAll": {
+ "description": "Don't filter for a specific currency (default entry)"
+ },
+ "homeTransactionsDialogFilterFutureTransactions": "Visa framtida transaktioner",
+ "@homeTransactionsDialogFilterFutureTransactions": {
+ "description": "Setting to show future transactions"
+ },
+ "homeTransactionsDialogFilterSearch": "Sökord",
+ "@homeTransactionsDialogFilterSearch": {
+ "description": "Search term for filter"
+ },
+ "homeTransactionsDialogFilterTitle": "Välj filter",
+ "@homeTransactionsDialogFilterTitle": {
+ "description": "Title of Filter Dialog"
+ },
+ "homeTransactionsEmpty": "Inga transaktioner hittade.",
+ "@homeTransactionsEmpty": {
+ "description": "Message when no transactions are found."
+ },
+ "homeTransactionsMultipleCategories": "{num} kategorier",
+ "@homeTransactionsMultipleCategories": {
+ "description": "$num categories for the transaction.",
+ "placeholders": {
+ "num": {
+ "type": "int",
+ "example": "2"
+ }
+ }
+ },
+ "liabilityDirectionCredit": "Jag är skyldig denna skuld",
+ "@liabilityDirectionCredit": {
+ "description": "Firefly Translation String: liability_direction_credit"
+ },
+ "liabilityDirectionDebit": "Jag har denna skuld",
+ "@liabilityDirectionDebit": {
+ "description": "Firefly Translation String: liability_direction_debit"
+ },
+ "liabilityTypeDebt": "Skuld",
+ "@liabilityTypeDebt": {
+ "description": "Firefly Translation String: account_type_debt"
+ },
+ "liabilityTypeLoan": "Lån",
+ "@liabilityTypeLoan": {
+ "description": "Firefly Translation String: account_type_loan"
+ },
+ "liabilityTypeMortgage": "Bolån",
+ "@liabilityTypeMortgage": {
+ "description": "Firefly Translation String: account_type_mortgage"
+ },
+ "loginAbout": "För att använda Waterfly III på ett produktivt sätt behöver du din egen server med en Firefly III instans eller Firefly III-tillägget för Home Assistant.\n\nAnge hela URL: en samt en personlig åtkomst-token (inställningar -> Profil -> OAuth -> Personlig åtkomst-token) nedan.",
+ "@loginAbout": {
+ "description": "Login screen welcome description"
+ },
+ "loginFormLabelAPIKey": "Giltig API-nyckel",
+ "@loginFormLabelAPIKey": {
+ "description": "Login Form: Label for API Key field"
+ },
+ "loginFormLabelHost": "Värd URL",
+ "@loginFormLabelHost": {
+ "description": "Login Form: Label for Host field"
+ },
+ "loginWelcome": "Välkommen till Waterfly III",
+ "@loginWelcome": {
+ "description": "Login screen welcome banner"
+ },
+ "logoutConfirmation": "Är du säker på att du vill logga ut?",
+ "@logoutConfirmation": {
+ "description": "Get user confirmation if he really wants to log out"
+ },
+ "navigationAccounts": "Konton",
+ "@navigationAccounts": {
+ "description": "Navigation Label: Accounts Page"
+ },
+ "navigationBills": "Räkningar",
+ "@navigationBills": {
+ "description": "Navigation Label: Bills"
+ },
+ "navigationCategories": "Kategorier",
+ "@navigationCategories": {
+ "description": "Navigation Label: Categories"
+ },
+ "navigationMain": "Kontrollpanel",
+ "@navigationMain": {
+ "description": "Navigation Label: Main Dashboard"
+ },
+ "navigationSettings": "Inställningar",
+ "@navigationSettings": {
+ "description": "Navigation Label: Settings"
+ },
+ "no": "Nej",
+ "@no": {
+ "description": "The word no"
+ },
+ "numPercent": "{num}",
+ "@numPercent": {
+ "description": "Number formatted as percentage",
+ "placeholders": {
+ "num": {
+ "type": "double",
+ "format": "decimalPercentPattern",
+ "optionalParameters": {
+ "decimalDigits": 0
}
- },
- "transactionDialogAttachmentsErrorUpload": "Kunde inte ladda upp filen: {error}",
- "@transactionDialogAttachmentsErrorUpload": {
- "description": "Snackbar Text: File could not be uploaded, with reason.",
- "placeholders": {
- "error": {
- "type": "String"
- }
+ }
+ }
+ },
+ "numPercentOf": "{perc} av {of}",
+ "@numPercentOf": {
+ "description": "Number formatted as percentage, with total amount provided",
+ "placeholders": {
+ "perc": {
+ "type": "double",
+ "format": "decimalPercentPattern",
+ "optionalParameters": {
+ "decimalDigits": 0
}
- },
- "transactionDialogAttachmentsTitle": "Bilagor",
- "@transactionDialogAttachmentsTitle": {
- "description": "Dialog Title: Attachments Dialog"
- },
- "transactionDialogBillNoBill": "Ingen faktura",
- "@transactionDialogBillNoBill": {
- "description": "Button Label: no bill to be used"
- },
- "transactionDialogBillTitle": "Länk till faktura",
- "@transactionDialogBillTitle": {
- "description": "Dialog Title: Link Bill to transaction"
- },
- "transactionDialogCurrencyTitle": "Välj valuta",
- "@transactionDialogCurrencyTitle": {
- "description": "Dialog Title: Currency Selection"
- },
- "transactionDialogTagsAdd": "Lägg till Tagg",
- "@transactionDialogTagsAdd": {
- "description": "Button Label: Add Tag"
- },
- "transactionDialogTagsHint": "Sök/Lägg till tagg",
- "@transactionDialogTagsHint": {
- "description": "Hint Text for search tag field"
- },
- "transactionDialogTagsTitle": "Välj taggar",
- "@transactionDialogTagsTitle": {
- "description": "Dialog Title: Select Tags"
- },
- "transactionDuplicate": "Dubblett",
- "@transactionDuplicate": {
- "description": "Menu Label: Duplicate item"
- },
- "transactionErrorInvalidAccount": "Ogiltigt konto",
- "@transactionErrorInvalidAccount": {
- "description": "Transaction Save Error: Invalid account"
- },
- "transactionErrorInvalidBudget": "Ogiltig budget",
- "@transactionErrorInvalidBudget": {
- "description": "Transaction Save Error: Invalid budget"
- },
- "transactionErrorTitle": "Vänligen ange en titel.",
- "@transactionErrorTitle": {
- "description": "Transaction Save Error: No title provided"
- },
- "transactionFormLabelAccountDestination": "Till konto",
- "@transactionFormLabelAccountDestination": {
- "description": "Transaction Form: Label for destination account for transfer transaction"
- },
- "transactionFormLabelAccountForeign": "Mottagarkonto",
- "@transactionFormLabelAccountForeign": {
- "description": "Transaction Form: Label for foreign (other) account"
- },
- "transactionFormLabelAccountOwn": "Källkonto",
- "@transactionFormLabelAccountOwn": {
- "description": "Transaction Form: Label for own account"
- },
- "transactionFormLabelAccountSource": "Källkonto",
- "@transactionFormLabelAccountSource": {
- "description": "Transaction Form: Label for source account for transfer transaction"
- },
- "transactionFormLabelNotes": "Anteckningar",
- "@transactionFormLabelNotes": {
- "description": "Transaction Form: Label for notes field"
- },
- "transactionFormLabelTags": "Taggar",
- "@transactionFormLabelTags": {
- "description": "Transaction Form: Label for tags field"
- },
- "transactionFormLabelTitle": "Transaktionstitel",
- "@transactionFormLabelTitle": {
- "description": "Transaction Form: Label for title field"
- },
- "transactionSplitAdd": "Lägg till delad transaktion",
- "@transactionSplitAdd": {
- "description": "Button Label: Add a split"
- },
- "transactionSplitChangeCurrency": "Ändra delad valuta",
- "@transactionSplitChangeCurrency": {
- "description": "Hint Text: Change currency for a single split"
- },
- "transactionSplitChangeTarget": "Ändra delat målkonto",
- "@transactionSplitChangeTarget": {
- "description": "Hint Text: Change target account for single split"
- },
- "transactionSplitDelete": "Ta bort delning",
- "@transactionSplitDelete": {
- "description": "Hint Text: Delete single split"
- },
- "transactionTitleAdd": "Lägg till transaktion",
- "@transactionTitleAdd": {
- "description": "Title: Add a new transaction"
- },
- "transactionTitleDelete": "Ta bort transaktion",
- "@transactionTitleDelete": {
- "description": "Title: Delete existing transaction"
- },
- "transactionTitleEdit": "Ändra transaktion",
- "@transactionTitleEdit": {
- "description": "Title: Edit existing transaction"
- },
- "transactionTypeDeposit": "Insättning",
- "@transactionTypeDeposit": {
- "description": "Deposit transaction type"
- },
- "transactionTypeTransfer": "Överföring",
- "@transactionTypeTransfer": {
- "description": "Transfer transaction type"
- },
- "transactionTypeWithdrawal": "Uttag",
- "@transactionTypeWithdrawal": {
- "description": "Withdrawal transaction type"
+ },
+ "of": {
+ "type": "String"
+ }
+ }
+ },
+ "settingsDialogDebugInfo": "Du kan aktivera och skicka felsökningsloggar här. Dessa har en dålig inverkan på prestandan, så var snäll och aktivera dem inte om du inte rekommenderas att göra det. Inaktivering av loggning kommer att ta bort den lagrade loggen.",
+ "@settingsDialogDebugInfo": {
+ "description": "Information about debug logs and their impact."
+ },
+ "settingsDialogDebugMailCreate": "Skapa e-post",
+ "@settingsDialogDebugMailCreate": {
+ "description": "Button to confirm mail creation after privacy disclaimer is shown."
+ },
+ "settingsDialogDebugMailDisclaimer": "VARNING: Ett e-postutkast öppnas med loggfilen bifogad (i textformat). Loggarna kan innehålla känslig information, såsom värdnamnet för din Firefly instans (även om jag försöker undvika loggning av några hemligheter, såsom api nyckel). Läs igenom loggen noga och censurera all information som du inte vill dela och/eller inte är relevant för det problem du vill rapportera.\n\nSkicka inte in loggar utan föregående överenskommelse via mail/GitHub. Jag kommer att ta bort alla loggar som skickas utan kontext av sekretessskäl. Ladda aldrig upp loggen ocensurerad till GitHub eller någon annanstans.",
+ "@settingsDialogDebugMailDisclaimer": {
+ "description": "Privacy disclaimer shown before sending logs"
+ },
+ "settingsDialogDebugSendButton": "Skicka loggar via e-post",
+ "@settingsDialogDebugSendButton": {
+ "description": "Button to send logs via E-Mail"
+ },
+ "settingsDialogDebugTitle": "Felsökningsloggar",
+ "@settingsDialogDebugTitle": {
+ "description": "Dialog title: Debug Logs"
+ },
+ "settingsDialogLanguageTitle": "Välj språk",
+ "@settingsDialogLanguageTitle": {
+ "description": "Dialog title: Select Language"
+ },
+ "settingsDialogThemeTitle": "Välj tema",
+ "@settingsDialogThemeTitle": {
+ "description": "Dialog title: Select theme"
+ },
+ "settingsLanguage": "Språk",
+ "@settingsLanguage": {
+ "description": "Currently selected language"
+ },
+ "settingsLockscreen": "Låsskärm",
+ "@settingsLockscreen": {
+ "description": "Setting if a lockscreen is shown (authentication is required on startup)"
+ },
+ "settingsLockscreenHelp": "Kräv autentisering vid appstart",
+ "@settingsLockscreenHelp": {
+ "description": "Description for lockscreen setting"
+ },
+ "settingsLockscreenInitial": "Vänligen autentisera för att aktivera låsskärmen.",
+ "@settingsLockscreenInitial": {
+ "description": "Prompt to authenticate once to set up the lockscreen"
+ },
+ "settingsNLAppAccount": "Förvalt konto",
+ "@settingsNLAppAccount": {
+ "description": "Default account which will be used for the transaction."
+ },
+ "settingsNLAppAccountDynamic": "",
+ "@settingsNLAppAccountDynamic": {
+ "description": "Account will be selected dynamically by the content of the notification."
+ },
+ "settingsNLAppAdd": "Lägg till app",
+ "@settingsNLAppAdd": {
+ "description": "Button title to add a new app."
+ },
+ "settingsNLAppAddHelp": "Klicka för att lägga till en app att lyssna efter. Endast kvalificerade appar visas i listan.",
+ "@settingsNLAppAddHelp": {
+ "description": "Help text below adding the new app button."
+ },
+ "settingsNLAppAddInfo": "Gör några transaktioner där du får telefonaviseringar för att lägga till appar i den här listan. Om appen fortfarande inte dyker upp, vänligen rapportera det till app@vogt.pw.",
+ "@settingsNLAppAddInfo": {
+ "description": "Help text when no more app is available to add."
+ },
+ "settingsNLDescription": "Den här tjänsten låter dig hämta transaktionsdetaljer från inkommande pushnotifikationer. Du kan även välja ett förvalt konto som transaktionen ska göras på - om inget värde ges försöker den extrahera kontot från notifikationen.",
+ "@settingsNLDescription": {
+ "description": "Description text for the notification listener service."
+ },
+ "settingsNLPermissionGrant": "Tryck för att bevilja tillstånd.",
+ "@settingsNLPermissionGrant": {
+ "description": "Indicates user should tap the text to grant certain permissions (notification access)."
+ },
+ "settingsNLPermissionNotGranted": "Behörighet inte beviljad.",
+ "@settingsNLPermissionNotGranted": {
+ "description": "A requested permission was not granted."
+ },
+ "settingsNLPermissionRemove": "Ta bort behörigheten?",
+ "@settingsNLPermissionRemove": {
+ "description": "Dialog title asking if permission should be removed."
+ },
+ "settingsNLPermissionRemoveHelp": "För att avaktivera den här tjänsten, tryck på appen och ta bort behörigheterna på den nästa skärmen.",
+ "@settingsNLPermissionRemoveHelp": {
+ "description": "Dialog text giving hint how to remove the permission."
+ },
+ "settingsNLPrefillTXTitle": "Fyll i transaktionstiteln med nofikationstiteln i förväg",
+ "@settingsNLPrefillTXTitle": {
+ "description": "First line for setting to use pre-fill transaction title with notification title."
+ },
+ "settingsNLServiceChecking": "Kontrollerar status…",
+ "@settingsNLServiceChecking": {
+ "description": "Checking the status of the background service"
+ },
+ "settingsNLServiceCheckingError": "Fel vid kontroll av status: {error}",
+ "@settingsNLServiceCheckingError": {
+ "description": "An error occurred while checking the service status",
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "Error details",
+ "example": "Timeout"
+ }
+ }
+ },
+ "settingsNLServiceRunning": "Tjänsten körs.",
+ "@settingsNLServiceRunning": {
+ "description": "A background service is running normally."
+ },
+ "settingsNLServiceStatus": "Tjänstestatus",
+ "@settingsNLServiceStatus": {
+ "description": "Status of a background service."
+ },
+ "settingsNLServiceStopped": "Tjänsten är stoppad.",
+ "@settingsNLServiceStopped": {
+ "description": "A background service is stopped."
+ },
+ "settingsNotificationListener": "Notifikationslyssningstjänst",
+ "@settingsNotificationListener": {
+ "description": "Setting for the notification listener service."
+ },
+ "settingsTheme": "Apptema",
+ "@settingsTheme": {
+ "description": "App theme (dark or light)"
+ },
+ "settingsThemeDynamicColors": "Dynamiska färger",
+ "@settingsThemeDynamicColors": {
+ "description": "Material You Dynamic Colors feature"
+ },
+ "settingsThemeValue": "{theme, select, dark{Mörkt läge} light{Ljust läge} other{Systemstandard}}",
+ "@settingsThemeValue": {
+ "description": "Currently selected theme (either dark, light or system)",
+ "placeholders": {
+ "theme": {
+ "type": "String",
+ "example": "ThemeMode.dark"
+ }
+ }
+ },
+ "settingsUseServerTimezone": "Använd serverns tidszon",
+ "@settingsUseServerTimezone": {
+ "description": "Setting label to use server timezone."
+ },
+ "settingsUseServerTimezoneHelp": "Visa alla tider i serverns tidszon. Detta härmar beteendet hos webbgränssnittet.",
+ "@settingsUseServerTimezoneHelp": {
+ "description": "Help text for the server timezone setting. Basically, if enabled, all times shown in the app match the time shown in the webinterface (which is always in the 'home' timezone). Please try to keep the translation short (max 3 lines)."
+ },
+ "settingsVersion": "Appversion",
+ "@settingsVersion": {
+ "description": "Current App Version"
+ },
+ "settingsVersionChecking": "kontrollerar…",
+ "@settingsVersionChecking": {
+ "description": "Shown while checking for app version"
+ },
+ "splashCustomSSLCert": "Anpassat SSL-certifikat",
+ "@splashCustomSSLCert": {
+ "description": "Button text & Dialog title for using a custom SSL certificate"
+ },
+ "splashFormLabelCustomSSLCertPEM": "Certifikatfil (PEM)",
+ "@splashFormLabelCustomSSLCertPEM": {
+ "description": "Label for certificate file text input in PEM format"
+ },
+ "transactionAttachments": "Bilagor",
+ "@transactionAttachments": {
+ "description": "Button Label: Attachments"
+ },
+ "transactionDeleteConfirm": "Är du säker att du vill radera denna transaktion?",
+ "@transactionDeleteConfirm": {
+ "description": "Confirmation text to delete transaction"
+ },
+ "transactionDialogAttachmentsDelete": "Ta bort bifogad fil",
+ "@transactionDialogAttachmentsDelete": {
+ "description": "Button Label: Delete Attachment"
+ },
+ "transactionDialogAttachmentsDeleteConfirm": "Är du säker på att du vill radera bilagan?",
+ "@transactionDialogAttachmentsDeleteConfirm": {
+ "description": "Confirmation text to delete attachment"
+ },
+ "transactionDialogAttachmentsErrorDownload": "Kunde inte ladda ner filen.",
+ "@transactionDialogAttachmentsErrorDownload": {
+ "description": "Snackbar Text: File download failed."
+ },
+ "transactionDialogAttachmentsErrorOpen": "Kunde inte öppna filen: {error}",
+ "@transactionDialogAttachmentsErrorOpen": {
+ "description": "Snackbar Text: File could not be opened, with reason.",
+ "placeholders": {
+ "error": {
+ "type": "String"
+ }
+ }
+ },
+ "transactionDialogAttachmentsErrorUpload": "Kunde inte ladda upp filen: {error}",
+ "@transactionDialogAttachmentsErrorUpload": {
+ "description": "Snackbar Text: File could not be uploaded, with reason.",
+ "placeholders": {
+ "error": {
+ "type": "String"
+ }
}
-}
\ No newline at end of file
+ },
+ "transactionDialogAttachmentsTitle": "Bilagor",
+ "@transactionDialogAttachmentsTitle": {
+ "description": "Dialog Title: Attachments Dialog"
+ },
+ "transactionDialogBillNoBill": "Ingen faktura",
+ "@transactionDialogBillNoBill": {
+ "description": "Button Label: no bill to be used"
+ },
+ "transactionDialogBillTitle": "Länk till faktura",
+ "@transactionDialogBillTitle": {
+ "description": "Dialog Title: Link Bill to transaction"
+ },
+ "transactionDialogCurrencyTitle": "Välj valuta",
+ "@transactionDialogCurrencyTitle": {
+ "description": "Dialog Title: Currency Selection"
+ },
+ "transactionDialogTagsAdd": "Lägg till Tagg",
+ "@transactionDialogTagsAdd": {
+ "description": "Button Label: Add Tag"
+ },
+ "transactionDialogTagsHint": "Sök/Lägg till tagg",
+ "@transactionDialogTagsHint": {
+ "description": "Hint Text for search tag field"
+ },
+ "transactionDialogTagsTitle": "Välj taggar",
+ "@transactionDialogTagsTitle": {
+ "description": "Dialog Title: Select Tags"
+ },
+ "transactionDuplicate": "Dubblett",
+ "@transactionDuplicate": {
+ "description": "Menu Label: Duplicate item"
+ },
+ "transactionErrorInvalidAccount": "Ogiltigt konto",
+ "@transactionErrorInvalidAccount": {
+ "description": "Transaction Save Error: Invalid account"
+ },
+ "transactionErrorInvalidBudget": "Ogiltig budget",
+ "@transactionErrorInvalidBudget": {
+ "description": "Transaction Save Error: Invalid budget"
+ },
+ "transactionErrorTitle": "Vänligen ange en titel.",
+ "@transactionErrorTitle": {
+ "description": "Transaction Save Error: No title provided"
+ },
+ "transactionFormLabelAccountDestination": "Till konto",
+ "@transactionFormLabelAccountDestination": {
+ "description": "Transaction Form: Label for destination account for transfer transaction"
+ },
+ "transactionFormLabelAccountForeign": "Mottagarkonto",
+ "@transactionFormLabelAccountForeign": {
+ "description": "Transaction Form: Label for foreign (other) account"
+ },
+ "transactionFormLabelAccountOwn": "Källkonto",
+ "@transactionFormLabelAccountOwn": {
+ "description": "Transaction Form: Label for own account"
+ },
+ "transactionFormLabelAccountSource": "Källkonto",
+ "@transactionFormLabelAccountSource": {
+ "description": "Transaction Form: Label for source account for transfer transaction"
+ },
+ "transactionFormLabelNotes": "Anteckningar",
+ "@transactionFormLabelNotes": {
+ "description": "Transaction Form: Label for notes field"
+ },
+ "transactionFormLabelTags": "Taggar",
+ "@transactionFormLabelTags": {
+ "description": "Transaction Form: Label for tags field"
+ },
+ "transactionFormLabelTitle": "Transaktionstitel",
+ "@transactionFormLabelTitle": {
+ "description": "Transaction Form: Label for title field"
+ },
+ "transactionSplitAdd": "Lägg till delad transaktion",
+ "@transactionSplitAdd": {
+ "description": "Button Label: Add a split"
+ },
+ "transactionSplitChangeCurrency": "Ändra delad valuta",
+ "@transactionSplitChangeCurrency": {
+ "description": "Hint Text: Change currency for a single split"
+ },
+ "transactionSplitChangeTarget": "Ändra delat målkonto",
+ "@transactionSplitChangeTarget": {
+ "description": "Hint Text: Change target account for single split"
+ },
+ "transactionSplitDelete": "Ta bort delning",
+ "@transactionSplitDelete": {
+ "description": "Hint Text: Delete single split"
+ },
+ "transactionTitleAdd": "Lägg till transaktion",
+ "@transactionTitleAdd": {
+ "description": "Title: Add a new transaction"
+ },
+ "transactionTitleDelete": "Ta bort transaktion",
+ "@transactionTitleDelete": {
+ "description": "Title: Delete existing transaction"
+ },
+ "transactionTitleEdit": "Ändra transaktion",
+ "@transactionTitleEdit": {
+ "description": "Title: Edit existing transaction"
+ },
+ "transactionTypeDeposit": "Insättning",
+ "@transactionTypeDeposit": {
+ "description": "Deposit transaction type"
+ },
+ "transactionTypeTransfer": "Överföring",
+ "@transactionTypeTransfer": {
+ "description": "Transfer transaction type"
+ },
+ "transactionTypeWithdrawal": "Uttag",
+ "@transactionTypeWithdrawal": {
+ "description": "Withdrawal transaction type"
+ },
+ "yes": "Ja",
+ "@yes": {
+ "description": "The word yes"
+ }
+}
diff --git a/lib/pages/categories.dart b/lib/pages/categories.dart
index b767002d..b02ac782 100644
--- a/lib/pages/categories.dart
+++ b/lib/pages/categories.dart
@@ -598,9 +598,6 @@ class CategoryLine extends StatelessWidget {
),
),
),
- onClosed: (bool? refresh) {
- debugPrint("closed with $refresh");
- },
);
}
}
diff --git a/lib/pages/home/main.dart b/lib/pages/home/main.dart
index aad936bf..532996b4 100644
--- a/lib/pages/home/main.dart
+++ b/lib/pages/home/main.dart
@@ -366,6 +366,7 @@ class _HomeMainState extends State
return true;
}*/
+ final FireflyIii api = context.read().api;
final FireflyIiiV2 apiV2 = context.read().apiV2;
final TimeZoneHandler tzHandler = context.read().tzHandler;
@@ -390,15 +391,34 @@ class _HomeMainState extends State
lastMonthsAssets.clear();
lastMonthsLiabilities.clear();
+ final Response respAssetAccounts =
+ await api.v1AccountsGet(type: AccountTypeFilter.asset);
+ apiThrowErrorIfEmpty(respAssetAccounts, mounted ? context : null);
+ final Map includeInNetWorth = {
+ for (AccountRead e in respAssetAccounts.body!.data)
+ e.attributes.name: e.attributes.includeNetWorth ?? true
+ };
+ final Response respLiabilityAccounts =
+ await api.v1AccountsGet(type: AccountTypeFilter.liabilities);
+ apiThrowErrorIfEmpty(respLiabilityAccounts, mounted ? context : null);
+ includeInNetWorth.addAll({
+ for (AccountRead e in respLiabilityAccounts.body!.data)
+ e.attributes.name: e.attributes.includeNetWorth ?? true
+ });
+
final Response> respBalanceData =
await apiV2.v2ChartAccountDashboardGet(
start: DateFormat('yyyy-MM-dd', 'en_US').format(start),
end: DateFormat('yyyy-MM-dd', 'en_US').format(end),
- preselected: api_v2_enums.PreselectedAccountProperty.all,
+ preselected: api_v2_enums.PreselectedAccountProperty.assets,
);
apiThrowErrorIfEmpty(respBalanceData, mounted ? context : null);
for (api_v2.ChartDataSetV2 e in respBalanceData.body!) {
+ if (includeInNetWorth.containsKey(e.label) &&
+ includeInNetWorth[e.label] != true) {
+ continue;
+ }
final Map entries = e.entries as Map;
entries.forEach(
(String dateStr, dynamic valueStr) {
diff --git a/lib/pages/home/transactions.dart b/lib/pages/home/transactions.dart
index c411ef1d..06a1fedd 100644
--- a/lib/pages/home/transactions.dart
+++ b/lib/pages/home/transactions.dart
@@ -149,7 +149,6 @@ class _HomeTransactionsState extends State
// logic later already detects categoryId == -1 (= no category)
// there is no /api/v1/categories call for "no category" anyways
if (widget.category != null) {
- debugPrint("setting filter for cat ${widget.category!.id}");
_filters.category = widget.category;
_filters.updateFilters();
}
@@ -294,6 +293,7 @@ class _HomeTransactionsState extends State
String foreignText = "";
String sourceName = "";
String destinationName = "";
+ List tags = [];
late bool reconciled;
for (TransactionSplit trans in transactions) {
if (trans.categoryName?.isNotEmpty ?? false) {
@@ -311,6 +311,9 @@ class _HomeTransactionsState extends State
if (trans.hasAttachments ?? false) {
hasAttachments = true;
}
+ if (trans.tags?.isNotEmpty ?? false) {
+ tags = trans.tags!;
+ }
amount += double.parse(trans.amount);
if (trans.foreignAmount?.isNotEmpty ?? false) {
final double amount = double.parse(trans.foreignAmount!);
@@ -524,13 +527,52 @@ class _HomeTransactionsState extends State
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
- subtitle: RichText(
- overflow: TextOverflow.ellipsis,
- maxLines: 2,
- text: TextSpan(
- style: Theme.of(context).textTheme.bodyMedium,
- children: subtitle,
- ),
+ subtitle: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ RichText(
+ overflow: TextOverflow.ellipsis,
+ maxLines: 2,
+ text: TextSpan(
+ style: Theme.of(context).textTheme.bodyMedium,
+ children: subtitle,
+ ),
+ ),
+ if (tags.isNotEmpty) ...[
+ Wrap(
+ children: tags
+ .map(
+ (String tag) => Card(
+ child: Padding(
+ padding: const EdgeInsets.all(6.0),
+ child: Row(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ const Icon(
+ Icons.label_outline,
+ size: 16,
+ ),
+ const SizedBox(width: 5),
+ Flexible(
+ child: RichText(
+ overflow: TextOverflow.fade,
+ text: TextSpan(
+ style: Theme.of(context)
+ .textTheme
+ .bodyMedium,
+ text: tag,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ )
+ .toList(),
+ )
+ ]
+ ],
),
isThreeLine: true,
shape: const RoundedRectangleBorder(
diff --git a/lib/pages/splash.dart b/lib/pages/splash.dart
index eb182be5..83e1ce90 100644
--- a/lib/pages/splash.dart
+++ b/lib/pages/splash.dart
@@ -38,7 +38,7 @@ class _SplashPageState extends State {
success = await context.read().signInFromStorage();
} else {
log.finer(() =>
- "SplashPage->_login() with credentials: $host, apiKey apiKey ${apiKey.isEmpty ? "unset" : "set"}");
+ "SplashPage->_login() with credentials: $host, apiKey ${apiKey.isEmpty ? "unset" : "set"}");
success =
await context.read().signIn(host, apiKey, cert);
}
diff --git a/lib/pages/transaction.dart b/lib/pages/transaction.dart
index bd1a388e..78f946aa 100644
--- a/lib/pages/transaction.dart
+++ b/lib/pages/transaction.dart
@@ -1,4 +1,3 @@
-import 'dart:async';
import 'dart:convert';
import 'dart:io';
@@ -7,13 +6,14 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_sharing_intent/model/sharing_file.dart';
+import 'package:http/http.dart' as http;
import 'package:image_picker/image_picker.dart';
import 'package:intl/intl.dart';
import 'package:logging/logging.dart';
import 'package:provider/provider.dart';
import 'package:badges/badges.dart' as badges;
-import 'package:chopper/chopper.dart' show Response;
+import 'package:chopper/chopper.dart' show HttpMethod, Response;
import 'package:timezone/timezone.dart' as tz;
import 'package:version/version.dart';
@@ -1142,33 +1142,31 @@ class _TransactionPageState extends State
respAttachment.body!.data;
log.finest(
() => "attachment id is ${newAttachment.id}");
- final HttpClientRequest request =
- await HttpClient().postUrl(
+
+ final File file =
+ File(attachment.attributes.uploadUrl!);
+
+ final http.StreamedRequest request =
+ http.StreamedRequest(
+ HttpMethod.Post,
Uri.parse(newAttachment.attributes.uploadUrl!),
);
- user!.headers().forEach(
- (String key, String value) =>
- request.headers.add(key, value),
- );
- request.headers.set(HttpHeaders.contentTypeHeader,
- "application/octet-stream");
- final Stream> listenStream =
- File(attachment.attributes.uploadUrl!)
- .openRead()
- .transform(
- StreamTransformer,
- List>.fromHandlers(
- handleData: (List data,
- EventSink> sink) {
- sink.add(data);
- },
- handleDone: (EventSink> sink) {
- sink.close();
- },
- ),
- );
- await request.addStream(listenStream);
- await request.close();
+ request.headers.addAll(user!.headers());
+ request.headers[HttpHeaders.contentTypeHeader] =
+ ContentType.binary.mimeType;
+ request.contentLength = await file.length();
+ log.fine(() =>
+ "AttachmentUpload: Starting Upload ${newAttachment.id}");
+
+ file.openRead().listen((List data) {
+ log.finest(() => "sent ${data.length} bytes");
+ request.sink.add(data);
+ }, onDone: () {
+ request.sink.close();
+ });
+
+ await httpClient.send(request);
+
log.fine(() => "done uploading attachment");
}
}
diff --git a/lib/pages/transaction/attachments.dart b/lib/pages/transaction/attachments.dart
index 6a7a7e33..ce7234b1 100644
--- a/lib/pages/transaction/attachments.dart
+++ b/lib/pages/transaction/attachments.dart
@@ -1,19 +1,19 @@
-import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:http/http.dart' as http;
import 'package:image_picker/image_picker.dart';
import 'package:intl/intl.dart';
import 'package:logging/logging.dart';
import 'package:path_provider/path_provider.dart' show getTemporaryDirectory;
import 'package:provider/provider.dart';
-import 'package:chopper/chopper.dart' show Response;
+import 'package:chopper/chopper.dart' show HttpMethod, Response;
import 'package:file_picker/file_picker.dart';
import 'package:filesize/filesize.dart';
-import 'package:open_filex/open_filex.dart';
+import 'package:open_file_plus/open_file_plus.dart';
import 'package:waterflyiii/auth.dart';
import 'package:waterflyiii/generated/swagger_fireflyiii_api/firefly_iii.swagger.dart';
@@ -58,13 +58,12 @@ class _AttachmentDialogState extends State
final Directory tmpPath = await getTemporaryDirectory();
final String filePath = "${tmpPath.path}/${attachment.attributes.filename}";
- final HttpClientRequest request = await HttpClient().getUrl(
+ final http.Request request = http.Request(
+ HttpMethod.Get,
Uri.parse(attachment.attributes.downloadUrl!),
);
- user.headers().forEach(
- (String key, String value) => request.headers.add(key, value),
- );
- final HttpClientResponse resp = await request.close();
+ request.headers.addAll(user.headers());
+ final http.StreamedResponse resp = await httpClient.send(request);
if (resp.statusCode != 200) {
log.warning("got invalid status code ${resp.statusCode}");
msg.showSnackBar(SnackBar(
@@ -73,11 +72,11 @@ class _AttachmentDialogState extends State
));
return;
}
- total = resp.headers.contentLength;
+ total = resp.contentLength ?? 0;
if (total == 0) {
total = attachment.attributes.size ?? 0;
}
- resp.listen(
+ resp.stream.listen(
(List value) {
setState(() {
fileData.addAll(value);
@@ -96,7 +95,7 @@ class _AttachmentDialogState extends State
});
log.finest(() => "writing ${fileData.length} bytes to $filePath");
await File(filePath).writeAsBytes(fileData, flush: true);
- final OpenResult file = await OpenFilex.open(filePath);
+ final OpenResult file = await OpenFile.open(filePath);
if (file.type != ResultType.done) {
log.severe("error opening file", file.message);
msg.showSnackBar(SnackBar(
@@ -106,8 +105,8 @@ class _AttachmentDialogState extends State
));
}
},
- onError: (Error e) {
- log.severe("download error", e);
+ onError: (Object e, StackTrace s) {
+ log.severe("download error", e, s);
setState(() {
_dlProgress.remove(i);
});
@@ -173,10 +172,13 @@ class _AttachmentDialogState extends State
));
return;
}
- final AttachmentRead newAttachment = respAttachment.body!.data;
+ AttachmentRead newAttachment = respAttachment.body!.data;
int newAttachmentIndex =
widget.attachments.length; // Will be added later, no -1 needed.
final int total = file.size;
+ newAttachment = newAttachment.copyWith(
+ attributes: newAttachment.attributes.copyWith(size: total),
+ );
int sent = 0;
setState(() {
@@ -184,38 +186,31 @@ class _AttachmentDialogState extends State
_dlProgress[newAttachmentIndex] = -0.0001;
});
- final HttpClientRequest request = await HttpClient().postUrl(
+ final http.StreamedRequest request = http.StreamedRequest(
+ HttpMethod.Post,
Uri.parse(newAttachment.attributes.uploadUrl!),
);
- user.headers().forEach(
- (String key, String value) => request.headers.add(key, value),
- );
- request.headers
- .set(HttpHeaders.contentTypeHeader, "application/octet-stream");
+ request.headers.addAll(user.headers());
+ request.headers[HttpHeaders.contentTypeHeader] =
+ ContentType.binary.mimeType;
log.fine(() => "AttachmentUpload: Starting Upload $newAttachmentIndex");
+ request.contentLength = total;
- final Stream> listenStream =
- File(file.path!).openRead().transform(
- StreamTransformer, List>.fromHandlers(
- handleData: (List data, EventSink> sink) {
- setState(() {
- sent += data.length;
- _dlProgress[newAttachmentIndex] = sent / total * -1;
- log.finest(
- () =>
- "sent ${data.length} bytes (total $sent of $total), ${sent / total * 100}%",
- );
- });
- sink.add(data);
- },
- handleDone: (EventSink> sink) {
- sink.close();
- },
- ),
- );
+ File(file.path!).openRead().listen((List data) {
+ setState(() {
+ sent += data.length;
+ _dlProgress[newAttachmentIndex] = sent / total * -1;
+ log.finest(
+ () =>
+ "sent ${data.length} bytes (total $sent of $total), ${sent / total * 100}%",
+ );
+ });
+ request.sink.add(data);
+ }, onDone: () {
+ request.sink.close();
+ });
- await request.addStream(listenStream);
- final HttpClientResponse resp = await request.close();
+ final http.StreamedResponse resp = await httpClient.send(request);
log.fine(() => "AttachmentUpload: Done with Upload $newAttachmentIndex");
setState(() {
_dlProgress.remove(newAttachmentIndex);
@@ -227,7 +222,7 @@ class _AttachmentDialogState extends State
}
late String error;
try {
- final String respString = await resp.transform(utf8.decoder).join();
+ final String respString = await resp.stream.bytesToString();
ValidationErrorResponse valError =
ValidationErrorResponse.fromJson(json.decode(respString));
error = valError.message ?? l10n.errorUnknown;
@@ -252,7 +247,7 @@ class _AttachmentDialogState extends State
final S l10n = S.of(context);
final OpenResult file =
- await OpenFilex.open(attachment.attributes.uploadUrl);
+ await OpenFile.open(attachment.attributes.uploadUrl);
if (file.type != ResultType.done) {
log.severe("error opening file", file.message);
msg.showSnackBar(SnackBar(
diff --git a/lib/stock.dart b/lib/stock.dart
index f42666dc..b1dc7c6f 100644
--- a/lib/stock.dart
+++ b/lib/stock.dart
@@ -290,13 +290,10 @@ class CatStock {
final Map categories = {};
for (InsightGroupEntry cat in respIncomeCat.body!) {
if ((cat.id?.isEmpty ?? true) || (cat.name?.isEmpty ?? true)) {
- debugPrint("skipping empty category");
continue;
}
if (cat.currencyId != defaultCurrency.id) {
- debugPrint(
- "skipping non-default currency category (${cat.currencyCode})");
continue;
}
if (!categories.containsKey(cat.id)) {
@@ -323,13 +320,10 @@ class CatStock {
}
for (InsightGroupEntry cat in respExpenseCat.body!) {
if ((cat.id?.isEmpty ?? true) || (cat.name?.isEmpty ?? true)) {
- debugPrint("skipping empty category");
continue;
}
if (cat.currencyId != defaultCurrency.id) {
- debugPrint(
- "skipping non-default currency category (${cat.currencyCode})");
continue;
}
if (!categories.containsKey(cat.id)) {
@@ -356,8 +350,6 @@ class CatStock {
}
for (InsightTotalEntry cat in respIncomeNoCat.body!) {
if (cat.currencyId != defaultCurrency.id) {
- debugPrint(
- "skipping non-default currency category (${cat.currencyCode})");
continue;
}
if (!categories.containsKey("-1")) {
@@ -384,8 +376,6 @@ class CatStock {
}
for (InsightTotalEntry cat in respExpenseNoCat.body!) {
if (cat.currencyId != defaultCurrency.id) {
- debugPrint(
- "skipping non-default currency category (${cat.currencyCode})");
continue;
}
if (!categories.containsKey("-1")) {
diff --git a/pubspec.lock b/pubspec.lock
index 3a0aae5f..a1b9bd63 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -45,10 +45,10 @@ packages:
dependency: transitive
description:
name: args
- sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596
+ sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a"
url: "https://pub.dev"
source: hosted
- version: "2.4.2"
+ version: "2.5.0"
async:
dependency: "direct main"
description:
@@ -109,10 +109,10 @@ packages:
dependency: "direct dev"
description:
name: build_runner
- sha256: "581bacf68f89ec8792f5e5a0b2c4decd1c948e97ce659dc783688c8a88fbec21"
+ sha256: "3ac61a79bfb6f6cc11f693591063a7f19a7af628dc52f141743edac5c16e8c22"
url: "https://pub.dev"
source: hosted
- version: "2.4.8"
+ version: "2.4.9"
build_runner_core:
dependency: transitive
description:
@@ -133,10 +133,10 @@ packages:
dependency: transitive
description:
name: built_value
- sha256: fedde275e0a6b798c3296963c5cd224e3e1b55d0e478d5b7e65e6b540f363a0e
+ sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb
url: "https://pub.dev"
source: hosted
- version: "8.9.1"
+ version: "8.9.2"
characters:
dependency: transitive
description:
@@ -157,18 +157,18 @@ packages:
dependency: "direct main"
description:
name: chopper
- sha256: eac1e6ddfdf50df266943a5f6838f5490e4f6818b48476a68427b89ecc97e07d
+ sha256: "1b6280ec22841b844448bec8ef2644d9cbe9ea8dfce13ec9cab9e8d3aac3830d"
url: "https://pub.dev"
source: hosted
- version: "7.2.0"
+ version: "7.4.0"
chopper_generator:
dependency: "direct dev"
description:
name: chopper_generator
- sha256: fa03549c15e2c1d7bf122b2afa05c5367fa2d34fd1cbd013298beaff83f94b67
+ sha256: "2984ed8589132aa8fd8225482038cad2bd576405e3751aa237d466870f5dad42"
url: "https://pub.dev"
source: hosted
- version: "7.2.0"
+ version: "7.4.0"
clock:
dependency: transitive
description:
@@ -217,6 +217,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.1.1"
+ cronet_http:
+ dependency: "direct main"
+ description:
+ name: cronet_http
+ sha256: "9b9f00ae48971bc8a8cbdd4528bd35511adce00fb79d1ebf9f9907667056640f"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.2.0"
cross_file:
dependency: transitive
description:
@@ -309,10 +317,10 @@ packages:
dependency: "direct main"
description:
name: file_picker
- sha256: d1d0ac3966b36dc3e66eeefb40280c17feb87fa2099c6e22e6a1fc959327bd03
+ sha256: b6283d7387310ad83bc4f3bc245b75d223a032ae6eba275afcd585de2b9a1476
url: "https://pub.dev"
source: hosted
- version: "8.0.0+1"
+ version: "8.0.1"
file_selector_linux:
dependency: transitive
description:
@@ -370,10 +378,10 @@ packages:
dependency: "direct main"
description:
name: flutter_email_sender
- sha256: "5001e9158f91a8799140fb30a11ad89cd587244f30b4f848d87085985c49b60f"
+ sha256: fb515d4e073d238d0daf1d765e5318487b6396d46b96e0ae9745dbc9a133f97a
url: "https://pub.dev"
source: hosted
- version: "6.0.2"
+ version: "6.0.3"
flutter_lints:
dependency: "direct dev"
description:
@@ -386,10 +394,10 @@ packages:
dependency: "direct main"
description:
name: flutter_local_notifications
- sha256: f9a05409385b77b06c18f200a41c7c2711ebf7415669350bb0f8474c07bd40d1
+ sha256: a701df4866f9a38bb8e4450a54c143bbeeb0ce2381e7df5a36e1006f3b43bb28
url: "https://pub.dev"
source: hosted
- version: "17.0.0"
+ version: "17.0.1"
flutter_local_notifications_linux:
dependency: transitive
description:
@@ -423,10 +431,10 @@ packages:
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
- sha256: b068ffc46f82a55844acfa4fdbb61fad72fa2aef0905548419d97f0f95c456da
+ sha256: "8cf40eebf5dec866a6d1956ad7b4f7016e6c0cc69847ab946833b7d43743809f"
url: "https://pub.dev"
source: hosted
- version: "2.0.17"
+ version: "2.0.19"
flutter_secure_storage:
dependency: "direct main"
description:
@@ -521,10 +529,10 @@ packages:
dependency: transitive
description:
name: frontend_server_client
- sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612"
+ sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694
url: "https://pub.dev"
source: hosted
- version: "3.2.0"
+ version: "4.0.0"
glob:
dependency: transitive
description:
@@ -550,7 +558,7 @@ packages:
source: hosted
version: "0.15.4"
http:
- dependency: transitive
+ dependency: "direct main"
description:
name: http
sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938"
@@ -585,34 +593,34 @@ packages:
dependency: "direct main"
description:
name: image_picker
- sha256: "26222b01a0c9a2c8fe02fc90b8208bd3325da5ed1f4a2acabf75939031ac0bdd"
+ sha256: fe9ee64ccb8d599a5dfb0e21cc6652232c610bcf667af4e79b9eb175cc30a7a5
url: "https://pub.dev"
source: hosted
- version: "1.0.7"
+ version: "1.1.0"
image_picker_android:
dependency: transitive
description:
name: image_picker_android
- sha256: "39f2bfe497e495450c81abcd44b62f56c2a36a37a175da7d137b4454977b51b1"
+ sha256: "8e75431a62b7feb4fd55cb4a5c6f0ac4564460ec5dc09f9c4a0d50a5ce7c4cb9"
url: "https://pub.dev"
source: hosted
- version: "0.8.9+3"
+ version: "0.8.10"
image_picker_for_web:
dependency: transitive
description:
name: image_picker_for_web
- sha256: "6a1704fdd75022272e7e7a897a9068e9c2ff3cd6a66820bf3ded810633eac954"
+ sha256: "5d6eb13048cd47b60dbf1a5495424dea226c5faf3950e20bf8120a58efb5b5f3"
url: "https://pub.dev"
source: hosted
- version: "3.0.3"
+ version: "3.0.4"
image_picker_ios:
dependency: transitive
description:
name: image_picker_ios
- sha256: "917a5cadd67d052554cfb258595e54217de53fac5b52939426e26319a02e6297"
+ sha256: f4a6f62be96d6fd268f32a6bf8ef444cd8e3fff64d16923c6e6fe55e0c84a761
url: "https://pub.dev"
source: hosted
- version: "0.8.9+2"
+ version: "0.8.10"
image_picker_linux:
dependency: transitive
description:
@@ -633,10 +641,10 @@ packages:
dependency: transitive
description:
name: image_picker_platform_interface
- sha256: "3d2c323daea9d60608f1caf30be32a938916f4975434b8352e6f73dae496da38"
+ sha256: "9ec26d410ff46f483c5519c29c02ef0e02e13a543f882b152d4bfd2f06802f80"
url: "https://pub.dev"
source: hosted
- version: "2.9.4"
+ version: "2.10.0"
image_picker_windows:
dependency: transitive
description:
@@ -669,6 +677,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.4"
+ jni:
+ dependency: transitive
+ description:
+ name: jni
+ sha256: "499558e919997adfc45809a66caf0b95b91393e23289dd2826b152f8f04e6611"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.7.3"
js:
dependency: transitive
description:
@@ -737,10 +753,10 @@ packages:
dependency: transitive
description:
name: local_auth_android
- sha256: "3bcd732dda7c75fcb7ddaef12e131230f53dcc8c00790d0d6efb3aa0fbbeda57"
+ sha256: e0e5b1ea247c5a0951c13a7ee13dc1beae69750e6a2e1910d1ed6a3cd4d56943
url: "https://pub.dev"
source: hosted
- version: "1.0.37"
+ version: "1.0.38"
local_auth_darwin:
dependency: transitive
description:
@@ -838,14 +854,14 @@ packages:
url: "https://github.com/dreautall/notification_listener_service.git"
source: git
version: "0.0.2"
- open_filex:
+ open_file_plus:
dependency: "direct main"
description:
- name: open_filex
- sha256: "74e2280754cf8161e860746c3181db2c996d6c1909c7057b738ede4a469816b8"
+ name: open_file_plus
+ sha256: "01ad7011d46d253aa22e5f0bc7345ca49cfe652c50ae9b0af945491c1728a8c3"
url: "https://pub.dev"
source: hosted
- version: "4.4.0"
+ version: "3.4.1+1"
package_config:
dependency: transitive
description:
@@ -858,18 +874,18 @@ packages:
dependency: "direct main"
description:
name: package_info_plus
- sha256: cb44f49b6e690fa766f023d5b22cac6b9affe741dd792b6ac7ad4fabe0d7b097
+ sha256: "2c582551839386fa7ddbc7770658be7c0f87f388a4bff72066478f597c34d17f"
url: "https://pub.dev"
source: hosted
- version: "6.0.0"
+ version: "7.0.0"
package_info_plus_platform_interface:
dependency: transitive
description:
name: package_info_plus_platform_interface
- sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6"
+ sha256: f49918f3433a3146047372f9d4f1f847511f2acd5cd030e1f44fe5a50036b70e
url: "https://pub.dev"
source: hosted
- version: "2.0.1"
+ version: "3.0.0"
path:
dependency: transitive
description:
@@ -890,18 +906,18 @@ packages:
dependency: "direct main"
description:
name: path_provider
- sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b
+ sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161
url: "https://pub.dev"
source: hosted
- version: "2.1.2"
+ version: "2.1.3"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
- sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668"
+ sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d
url: "https://pub.dev"
source: hosted
- version: "2.2.2"
+ version: "2.2.4"
path_provider_foundation:
dependency: transitive
description:
@@ -962,10 +978,10 @@ packages:
dependency: transitive
description:
name: pointycastle
- sha256: "43ac87de6e10afabc85c445745a7b799e04de84cebaa4fd7bf55a5e1e9604d29"
+ sha256: "70fe966348fe08c34bf929582f1d8247d9d9408130723206472b4687227e4333"
url: "https://pub.dev"
source: hosted
- version: "3.7.4"
+ version: "3.8.0"
pool:
dependency: transitive
description:
@@ -998,6 +1014,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.2.3"
+ qs_dart:
+ dependency: transitive
+ description:
+ name: qs_dart
+ sha256: "53eb3e489be555a60e83b2e2104638cb57d305d9cf4698e7245b7e75fb5fd1be"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.8"
quick_actions:
dependency: "direct main"
description:
@@ -1010,10 +1034,10 @@ packages:
dependency: transitive
description:
name: quick_actions_android
- sha256: adb42f20a46b22fee4caef421c00ff9eb209f9d441010bc5d6e9afa824288cf6
+ sha256: "58b9b36cad2fc5c5a6752e5eafdb20ab00697f11278ca7f206ecd7b85ec6c101"
url: "https://pub.dev"
source: hosted
- version: "1.0.10"
+ version: "1.0.11"
quick_actions_ios:
dependency: transitive
description:
@@ -1050,18 +1074,18 @@ packages:
dependency: "direct main"
description:
name: shared_preferences
- sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02"
+ sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180
url: "https://pub.dev"
source: hosted
- version: "2.2.2"
+ version: "2.2.3"
shared_preferences_android:
dependency: transitive
description:
name: shared_preferences_android
- sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06"
+ sha256: "1ee8bf911094a1b592de7ab29add6f826a7331fb854273d55918693d5364a1f2"
url: "https://pub.dev"
source: hosted
- version: "2.2.1"
+ version: "2.2.2"
shared_preferences_foundation:
dependency: transitive
description:
@@ -1207,18 +1231,18 @@ packages:
dependency: "direct main"
description:
name: syncfusion_flutter_charts
- sha256: c702a611ebb21f13b7107a470d3751ed852a1ec5de0cae7ef9339ccb761b574f
+ sha256: f3327077c4816573895b15545ea85b12c6a6cab7f8c2cde1a7eec05c36bfb432
url: "https://pub.dev"
source: hosted
- version: "25.1.37"
+ version: "25.1.40"
syncfusion_flutter_core:
dependency: transitive
description:
name: syncfusion_flutter_core
- sha256: d098e3cf5ee0c5a37b083f2efdb7c6bdfaabf871f68758bb491b10b61b3dd0d7
+ sha256: "8e19260d292ed77e1cbd4ee1baafb3c9486079cad856e7891478131d25076039"
url: "https://pub.dev"
source: hosted
- version: "25.1.37"
+ version: "25.1.40"
term_glyph:
dependency: transitive
description:
@@ -1279,18 +1303,18 @@ packages:
dependency: "direct main"
description:
name: url_launcher
- sha256: "0ecc004c62fd3ed36a2ffcbe0dd9700aee63bd7532d0b642a488b1ec310f492e"
+ sha256: "6ce1e04375be4eed30548f10a315826fd933c1e493206eab82eed01f438c8d2e"
url: "https://pub.dev"
source: hosted
- version: "6.2.5"
+ version: "6.2.6"
url_launcher_android:
dependency: transitive
description:
name: url_launcher_android
- sha256: d4ed0711849dd8e33eb2dd69c25db0d0d3fdc37e0a62e629fe32f57a22db2745
+ sha256: "360a6ed2027f18b73c8d98e159dda67a61b7f2e0f6ec26e86c3ada33b0621775"
url: "https://pub.dev"
source: hosted
- version: "6.3.0"
+ version: "6.3.1"
url_launcher_ios:
dependency: transitive
description:
@@ -1327,10 +1351,10 @@ packages:
dependency: transitive
description:
name: url_launcher_web
- sha256: "3692a459204a33e04bc94f5fb91158faf4f2c8903281ddd82915adecdb1a901d"
+ sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a"
url: "https://pub.dev"
source: hosted
- version: "2.3.0"
+ version: "2.3.1"
url_launcher_windows:
dependency: transitive
description:
@@ -1395,6 +1419,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.1.0"
+ weak_map:
+ dependency: transitive
+ description:
+ name: weak_map
+ sha256: "95ca338f0cdf5f0022cc283dfa4d97f6f6b03752f67eca85ebe6d7a679ffe3ed"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.1"
web:
dependency: transitive
description:
@@ -1407,18 +1439,18 @@ packages:
dependency: transitive
description:
name: web_socket_channel
- sha256: "1d8e795e2a8b3730c41b8a98a2dff2e0fb57ae6f0764a1c46ec5915387d257b2"
+ sha256: "58c6666b342a38816b2e7e50ed0f1e261959630becd4c879c4f26bfa14aa5a42"
url: "https://pub.dev"
source: hosted
- version: "2.4.4"
+ version: "2.4.5"
win32:
dependency: transitive
description:
name: win32
- sha256: "8cb58b45c47dcb42ab3651533626161d6b67a2921917d8d429791f76972b3480"
+ sha256: "0a989dc7ca2bb51eac91e8fd00851297cfffd641aa7538b165c62637ca0eaa4a"
url: "https://pub.dev"
source: hosted
- version: "5.3.0"
+ version: "5.4.0"
xdg_directories:
dependency: transitive
description:
diff --git a/pubspec.yaml b/pubspec.yaml
index 3687108a..d9c3c2bd 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -2,7 +2,7 @@ name: waterflyiii
description: WaterFly III, a mobile client for Firefly III
publish_to: 'none'
-version: 1.0.1
+version: 1.0.2
environment:
sdk: '>=3.0.0 <4.0.0'
@@ -19,7 +19,7 @@ dependencies:
flutter_secure_storage: ^9.0.0
provider: ^6.1.2
shared_preferences: ^2.2.2
- chopper: ^7.1.1
+ chopper: ^7.4.0
json_annotation: ^4.8.0
flutter_svg: ^2.0.7
url_launcher: ^6.2.4
@@ -27,16 +27,15 @@ dependencies:
badges: ^3.1.2
filesize: ^2.0.1
community_charts_flutter: ^1.0.2
- open_filex: ^4.4.0
file_picker: ^8.0.0+1
animations: ^2.0.11
- flutter_local_notifications: ^17.0.0
+ flutter_local_notifications: ^17.0.1
notifications_listener_service:
git:
url: https://github.com/dreautall/notification_listener_service.git
ref: 280a7b869fe57c81dd1842cd08fa16045d828f0a
device_apps: ^2.2.0
- package_info_plus: ^6.0.0
+ package_info_plus: ^7.0.0
logging: ^1.1.1
flutter_email_sender: ^6.0.2
local_auth: ^2.1.8
@@ -50,12 +49,15 @@ dependencies:
timezone: ^0.9.2
flutter_timezone: ^1.0.8
flutter_sharing_intent: ^1.1.1
+ cronet_http: ^1.2.0
+ http: ^1.2.1
+ open_file_plus: ^3.4.1+1
dev_dependencies:
flutter_lints: ^3.0.0
# needed for swagger_dart_code_generator
build_runner: ^2.4.7
- chopper_generator: ^7.1.1
+ chopper_generator: ^7.4.0
json_serializable: ^6.7.1
swagger_dart_code_generator: ^2.15.1
flutter_native_splash: ^2.3.10