diff --git a/budget/android/app/src/main/kotlin/com/example/budget/NetWorthPlusWidgetProvider.kt b/budget/android/app/src/main/kotlin/com/example/budget/NetWorthPlusWidgetProvider.kt index 1013b61f..20246062 100644 --- a/budget/android/app/src/main/kotlin/com/example/budget/NetWorthPlusWidgetProvider.kt +++ b/budget/android/app/src/main/kotlin/com/example/budget/NetWorthPlusWidgetProvider.kt @@ -46,13 +46,13 @@ class NetWorthPlusWidgetProvider : HomeWidgetProvider() { val plusButtonIntent = HomeWidgetLaunchIntent.getActivity( context, MainActivity::class.java, - Uri.parse("addTransaction")) + Uri.parse("addTransactionWidget")) setOnClickPendingIntent(R.id.plus_button, plusButtonIntent) val pendingIntentWithData = HomeWidgetLaunchIntent.getActivity( context, MainActivity::class.java, - Uri.parse("netWorthLaunch")) + Uri.parse("netWorthLaunchWidget")) setOnClickPendingIntent(R.id.widget_container, pendingIntentWithData) }catch (e: Exception){} diff --git a/budget/android/app/src/main/kotlin/com/example/budget/NetWorthWidgetProvider.kt b/budget/android/app/src/main/kotlin/com/example/budget/NetWorthWidgetProvider.kt index 35df8949..5ee12c7e 100644 --- a/budget/android/app/src/main/kotlin/com/example/budget/NetWorthWidgetProvider.kt +++ b/budget/android/app/src/main/kotlin/com/example/budget/NetWorthWidgetProvider.kt @@ -51,7 +51,7 @@ class NetWorthWidgetProvider : HomeWidgetProvider() { val pendingIntentWithData = HomeWidgetLaunchIntent.getActivity( context, MainActivity::class.java, - Uri.parse("addTransaction")) + Uri.parse("addTransactionWidget")) setOnClickPendingIntent(R.id.widget_container, pendingIntentWithData) }catch (e: Exception){} diff --git a/budget/android/app/src/main/kotlin/com/example/budget/PlusWidgetProvider.kt b/budget/android/app/src/main/kotlin/com/example/budget/PlusWidgetProvider.kt index 7b3411ee..6c9b4665 100644 --- a/budget/android/app/src/main/kotlin/com/example/budget/PlusWidgetProvider.kt +++ b/budget/android/app/src/main/kotlin/com/example/budget/PlusWidgetProvider.kt @@ -37,7 +37,7 @@ class PlusWidgetProvider : HomeWidgetProvider() { val pendingIntentWithData = HomeWidgetLaunchIntent.getActivity( context, MainActivity::class.java, - Uri.parse("addTransaction")) + Uri.parse("addTransactionWidget")) setOnClickPendingIntent(R.id.widget_container, pendingIntentWithData) }catch (e: Exception){} diff --git a/budget/android/app/src/main/kotlin/com/example/budget/TransferWidgetProvider.kt b/budget/android/app/src/main/kotlin/com/example/budget/TransferWidgetProvider.kt index a99034b2..f360dd03 100644 --- a/budget/android/app/src/main/kotlin/com/example/budget/TransferWidgetProvider.kt +++ b/budget/android/app/src/main/kotlin/com/example/budget/TransferWidgetProvider.kt @@ -37,7 +37,7 @@ class TransferWidgetProvider : HomeWidgetProvider() { val pendingIntentWithData = HomeWidgetLaunchIntent.getActivity( context, MainActivity::class.java, - Uri.parse("transferTransaction")) + Uri.parse("transferTransactionWidget")) setOnClickPendingIntent(R.id.widget_container, pendingIntentWithData) }catch (e: Exception){} diff --git a/budget/assets/translations/generated/ar.json b/budget/assets/translations/generated/ar.json index 38948630..14b8e9c4 100644 --- a/budget/assets/translations/generated/ar.json +++ b/budget/assets/translations/generated/ar.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "فشل في معاينة الصورة", "open-link": "افتح الرابط", "category-not-selected": "الفئة غير محددة", - "all-transactions-require-a-category": "تتطلب جميع المعاملات فئة" + "all-transactions-require-a-category": "تتطلب جميع المعاملات فئة", + "total-offset": "إزاحة الكلية", + "total-offset-description": "تعويض إجمالي القرض عن طريق إدخال مبلغ. مفيد إذا كان القرض قد جمع الفوائد أو غيرها من العواصلة للتكاليف التي تزيد من المجموع.", + "advanced-automation": "الأتمتة المتقدمة", + "deep-linking": "روابط التطبيق", + "deep-linking-description": "أتمتة إدراج المعاملات باستخدام عناوين URL APP. اضغط لمعرفة المزيد وعرض الوثائق.", + "added-transaction": "معاملة أضيفت" } \ No newline at end of file diff --git a/budget/assets/translations/generated/bg.json b/budget/assets/translations/generated/bg.json index 38ff67ce..21f05d6c 100644 --- a/budget/assets/translations/generated/bg.json +++ b/budget/assets/translations/generated/bg.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Неуспешно визуализация на изображението", "open-link": "Отвори линк", "category-not-selected": "Категория не е избрана", - "all-transactions-require-a-category": "Всички транзакции изискват категория" + "all-transactions-require-a-category": "Всички транзакции изискват категория", + "total-offset": "Общо компенсиране", + "total-offset-description": "Компенсиране на общия брой на заема, като влезете в сума. Полезен, ако заемът е натрупал лихва или други неизпълнени за увеличаване на разходите.", + "advanced-automation": "Разширена автоматизация", + "deep-linking": "Връзки на приложението", + "deep-linking-description": "Автоматизирайте вмъкването на транзакции с помощта на URL адреси на APP. Докоснете, за да научите повече и да видите документацията.", + "added-transaction": "Добавена транзакция" } \ No newline at end of file diff --git a/budget/assets/translations/generated/bn.json b/budget/assets/translations/generated/bn.json index 2d543d8b..169f6f14 100644 --- a/budget/assets/translations/generated/bn.json +++ b/budget/assets/translations/generated/bn.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "চিত্রের পূর্বরূপ দেখতে ব্যর্থ", "open-link": "খোলা সংযুক্তি", "category-not-selected": "বিভাগ নির্বাচিত নয়", - "all-transactions-require-a-category": "সমস্ত লেনদেনের জন্য একটি বিভাগ প্রয়োজন" + "all-transactions-require-a-category": "সমস্ত লেনদেনের জন্য একটি বিভাগ প্রয়োজন", + "total-offset": "মোট অফসেট", + "total-offset-description": "একটি পরিমাণ প্রবেশ করে মোট loan ণের অফসেট করুন। যদি loan ণটি মোট বাড়ানোর জন্য ব্যয় বা অন্য কোনও অ্যাকাউন্টে জমা থাকে তবে তা কার্যকর।", + "advanced-automation": "উন্নত অটোমেশন", + "deep-linking": "অ্যাপ্লিকেশন লিঙ্ক", + "deep-linking-description": "অ্যাপ্লিকেশন ইউআরএল ব্যবহার করে লেনদেনের সন্নিবেশ স্বয়ংক্রিয় করুন। আরও জানতে এবং ডকুমেন্টেশন দেখতে আলতো চাপুন।", + "added-transaction": "যুক্ত লেনদেন" } \ No newline at end of file diff --git a/budget/assets/translations/generated/cs.json b/budget/assets/translations/generated/cs.json index b64cb334..75fcf4a1 100644 --- a/budget/assets/translations/generated/cs.json +++ b/budget/assets/translations/generated/cs.json @@ -1047,7 +1047,7 @@ "difference-loan": "Rozdílná půjčka", "open-settings": "Otevřené nastavení", "decimal-precision": "Desetinná přesnost", - "decimal-precision-description": "Desetinná místa pro zaokrouhlování částky transakce", + "decimal-precision-description": "Desetinná místa pro zaokrouhlení částky transakce", "same-accounts": "Stejné účty", "select-2-different-accounts": "Vyberte 2 různé účty", "include-amount": "Zahrnout částku", @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Nepodařilo se k náhledu obrázku", "open-link": "Otevřít odkaz", "category-not-selected": "Kategorie není vybrána", - "all-transactions-require-a-category": "Všechny transakce vyžadují kategorii" + "all-transactions-require-a-category": "Všechny transakce vyžadují kategorii", + "total-offset": "Celkový posun", + "total-offset-description": "Kompenzovat celkový počet půjček zadáním částky. Užitečné, pokud půjčka nahromadila úrok nebo jiné nezúčtované za náklady na zvýšení celkového počtu.", + "advanced-automation": "Pokročilá automatizace", + "deep-linking": "Odkazy na aplikace", + "deep-linking-description": "Automatizujte vložení transakcí pomocí URL APP. Klepnutím se dozvíte více a zobrazíte dokumentaci.", + "added-transaction": "Přidaná transakce" } \ No newline at end of file diff --git a/budget/assets/translations/generated/da.json b/budget/assets/translations/generated/da.json index f0e1dc8b..f3720d4c 100644 --- a/budget/assets/translations/generated/da.json +++ b/budget/assets/translations/generated/da.json @@ -1047,7 +1047,7 @@ "difference-loan": "Forskellån", "open-settings": "Åbne indstillinger", "decimal-precision": "Decimal præcision", - "decimal-precision-description": "Decimalsteder for transaktionsbeløb afrunding", + "decimal-precision-description": "Decimalsteder til transaktionsbeløb afrunding", "same-accounts": "Samme konti", "select-2-different-accounts": "Vælg 2 forskellige konti", "include-amount": "Inkluderer beløb", @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Kunne ikke forhåndsvise billedet", "open-link": "Åben link", "category-not-selected": "Kategori ikke valgt", - "all-transactions-require-a-category": "Alle transaktioner kræver en kategori" + "all-transactions-require-a-category": "Alle transaktioner kræver en kategori", + "total-offset": "Total offset", + "total-offset-description": "Offset det samlede beløb ved at indtaste et beløb. Nyttigt, hvis lånet har akkumuleret renter eller andre ikke -anførte for omkostninger, der øger det samlede antal.", + "advanced-automation": "Avanceret automatisering", + "deep-linking": "App -links", + "deep-linking-description": "Automatiser indsættelsen af ​​transaktioner ved hjælp af app -URL'er. Tryk på for at lære mere og se dokumentationen.", + "added-transaction": "Tilføjet transaktion" } \ No newline at end of file diff --git a/budget/assets/translations/generated/de.json b/budget/assets/translations/generated/de.json index 04791bf7..1b82493a 100644 --- a/budget/assets/translations/generated/de.json +++ b/budget/assets/translations/generated/de.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Die Vorschau von Bild versäumt es", "open-link": "Verbindung öffnen", "category-not-selected": "Kategorie nicht ausgewählt", - "all-transactions-require-a-category": "Alle Transaktionen erfordern eine Kategorie" + "all-transactions-require-a-category": "Alle Transaktionen erfordern eine Kategorie", + "total-offset": "Gesamtversatz", + "total-offset-description": "Setzen Sie die Summe des Darlehens aus, indem Sie einen Betrag eingeben. Nützlich, wenn das Darlehen Zinsen oder andere nicht berücksichtige Kosten angesammelt hat, um die Gesamtsumme zu erhöhen.", + "advanced-automation": "Erweiterte Automatisierung", + "deep-linking": "App -Links", + "deep-linking-description": "Automatisieren Sie das Insertion von Transaktionen mithilfe von App -URLs. Tippen Sie auf, um mehr zu erfahren und die Dokumentation anzusehen.", + "added-transaction": "Transaktion hinzugefügt" } \ No newline at end of file diff --git a/budget/assets/translations/generated/el.json b/budget/assets/translations/generated/el.json index 873a0896..21b55f5d 100644 --- a/budget/assets/translations/generated/el.json +++ b/budget/assets/translations/generated/el.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Αποτυχία προεπισκόπησης της εικόνας", "open-link": "Ανοίξτε σύνδεσμο", "category-not-selected": "Η κατηγορία δεν έχει επιλεγεί", - "all-transactions-require-a-category": "Όλες οι συναλλαγές απαιτούν κατηγορία" + "all-transactions-require-a-category": "Όλες οι συναλλαγές απαιτούν κατηγορία", + "total-offset": "Συνολική μετατόπιση", + "total-offset-description": "Αντιστάθμιση του συνόλου του δανείου εισάγοντας ένα ποσό. Χρήσιμο εάν το δάνειο έχει συσσωρεύσει τόκους ή άλλο μη καταγεγραμμένο για το κόστος αυξάνοντας το σύνολο.", + "advanced-automation": "Προηγμένη αυτοματοποίηση", + "deep-linking": "Σύνδεσμοι εφαρμογών", + "deep-linking-description": "Αυτοματοποιήστε την εισαγωγή συναλλαγών χρησιμοποιώντας διευθύνσεις URL εφαρμογών. Πατήστε για να μάθετε περισσότερα και να δείτε την τεκμηρίωση.", + "added-transaction": "Προστιθέμενη συναλλαγή" } \ No newline at end of file diff --git a/budget/assets/translations/generated/en.json b/budget/assets/translations/generated/en.json index 9a334a58..ac578b6f 100644 --- a/budget/assets/translations/generated/en.json +++ b/budget/assets/translations/generated/en.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Failed to Preview Image", "open-link": "Open Link", "category-not-selected": "Category Not Selected", - "all-transactions-require-a-category": "All transactions require a category" + "all-transactions-require-a-category": "All transactions require a category", + "total-offset": "Total Offset", + "total-offset-description": "Offset the total of the loan by entering an amount. Useful if the loan has accumulated interest or other unaccounted for costs increasing the total.", + "advanced-automation": "Advanced Automation", + "deep-linking": "App Links", + "deep-linking-description": "Automate the insertion of transactions using app URLs. Tap to learn more and view the documentation.", + "added-transaction": "Added Transaction" } \ No newline at end of file diff --git a/budget/assets/translations/generated/es.json b/budget/assets/translations/generated/es.json index 9ec12db7..53d817ca 100644 --- a/budget/assets/translations/generated/es.json +++ b/budget/assets/translations/generated/es.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "No se pudo obtener una vista previa de imagen", "open-link": "Enlace abierto", "category-not-selected": "Categoría no seleccionada", - "all-transactions-require-a-category": "Todas las transacciones requieren una categoría" + "all-transactions-require-a-category": "Todas las transacciones requieren una categoría", + "total-offset": "Compensación total", + "total-offset-description": "Compensar el total del préstamo ingresando un monto. Útil si el préstamo ha acumulado intereses u otros no contabilizados para los costos que aumentan el total.", + "advanced-automation": "Automatización avanzada", + "deep-linking": "Enlaces de aplicaciones", + "deep-linking-description": "Automatice la inserción de transacciones utilizando URL de aplicaciones. Toque para obtener más información y ver la documentación.", + "added-transaction": "Transacción agregada" } \ No newline at end of file diff --git a/budget/assets/translations/generated/fa.json b/budget/assets/translations/generated/fa.json index acb79cc9..f7f8de63 100644 --- a/budget/assets/translations/generated/fa.json +++ b/budget/assets/translations/generated/fa.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "پیش نمایش تصویر انجام نشد", "open-link": "لینک باز", "category-not-selected": "دسته بندی انتخاب نشده است", - "all-transactions-require-a-category": "همه معاملات به یک دسته نیاز دارند" + "all-transactions-require-a-category": "همه معاملات به یک دسته نیاز دارند", + "total-offset": "کل", + "total-offset-description": "با وارد کردن یک مبلغ ، کل وام را جبران کنید. مفید است اگر وام برای افزایش هزینه ها ، سود یا سایر موارد غیرقابل حساب را جمع کند.", + "advanced-automation": "اتوماسیون پیشرفته", + "deep-linking": "پیوندهای برنامه", + "deep-linking-description": "درج معاملات با استفاده از URL های برنامه. برای یادگیری بیشتر و مشاهده مستندات ضربه بزنید.", + "added-transaction": "معامله اضافه شده" } \ No newline at end of file diff --git a/budget/assets/translations/generated/fi.json b/budget/assets/translations/generated/fi.json index 71f2f07e..2375e45e 100644 --- a/budget/assets/translations/generated/fi.json +++ b/budget/assets/translations/generated/fi.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Kuvan esikatselu epäonnistui", "open-link": "Avaa linkki", "category-not-selected": "Luokkaa ei ole valittu", - "all-transactions-require-a-category": "Kaikki tapahtumat vaativat luokkaa" + "all-transactions-require-a-category": "Kaikki tapahtumat vaativat luokkaa", + "total-offset": "Kokonaispuolinen", + "total-offset-description": "Korvaa lainan kokonaismäärä syöttämällä summa. Hyödyllinen, jos laina on kertynyt korkoon tai muuhun kirjaamattomaan kokonaiskustannusten kustannuksiin.", + "advanced-automation": "Edistynyt automaatio", + "deep-linking": "Sovelluslinkit", + "deep-linking-description": "Automatisoi tapahtumien asettaminen sovellus -URL -osoitteiden avulla. Napauta saadaksesi lisätietoja ja tarkastella asiakirjaa.", + "added-transaction": "Lisätty tapahtuma" } \ No newline at end of file diff --git a/budget/assets/translations/generated/fil.json b/budget/assets/translations/generated/fil.json index 2311e215..adfc3ffc 100644 --- a/budget/assets/translations/generated/fil.json +++ b/budget/assets/translations/generated/fil.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Nabigong i -preview ang imahe", "open-link": "Bukas na link", "category-not-selected": "Hindi napili ang kategorya", - "all-transactions-require-a-category": "Ang lahat ng mga transaksyon ay nangangailangan ng isang kategorya" + "all-transactions-require-a-category": "Ang lahat ng mga transaksyon ay nangangailangan ng isang kategorya", + "total-offset": "Kabuuang offset", + "total-offset-description": "I -offset ang kabuuan ng pautang sa pamamagitan ng pagpasok ng isang halaga. Kapaki -pakinabang kung ang pautang ay naipon ang interes o iba pang hindi nabilang para sa mga gastos sa pagtaas ng kabuuan.", + "advanced-automation": "Advanced na automation", + "deep-linking": "Mga Link ng App", + "deep-linking-description": "I -automate ang pagpasok ng mga transaksyon gamit ang mga URL ng APP. Tapikin upang malaman ang higit pa at tingnan ang dokumentasyon.", + "added-transaction": "Nagdagdag ng transaksyon" } \ No newline at end of file diff --git a/budget/assets/translations/generated/fr.json b/budget/assets/translations/generated/fr.json index 5ce0e7c8..89b28736 100644 --- a/budget/assets/translations/generated/fr.json +++ b/budget/assets/translations/generated/fr.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Échec de l'image de prévisualisation", "open-link": "Ouvrir le lien", "category-not-selected": "Catégorie non sélectionnée", - "all-transactions-require-a-category": "Toutes les transactions nécessitent une catégorie" + "all-transactions-require-a-category": "Toutes les transactions nécessitent une catégorie", + "total-offset": "Décalage total", + "total-offset-description": "Compenser le total du prêt en entrant un montant. Utile si le prêt a accumulé des intérêts ou d'autres personnes non comptabilisées pour augmenter le total.", + "advanced-automation": "Automatisation avancée", + "deep-linking": "Liens d'application", + "deep-linking-description": "Automatisez l'insertion des transactions à l'aide des URL de l'application. Appuyez pour en savoir plus et affichez la documentation.", + "added-transaction": "Transaction supplémentaire" } \ No newline at end of file diff --git a/budget/assets/translations/generated/gu.json b/budget/assets/translations/generated/gu.json index c7d134cf..bf45039f 100644 --- a/budget/assets/translations/generated/gu.json +++ b/budget/assets/translations/generated/gu.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "છબીનું પૂર્વાવલોકન કરવામાં નિષ્ફળ", "open-link": "ખુલ્લી કડી", "category-not-selected": "કેટેગરી પસંદ નથી", - "all-transactions-require-a-category": "બધા વ્યવહારોને કેટેગરીની જરૂર હોય છે" + "all-transactions-require-a-category": "બધા વ્યવહારોને કેટેગરીની જરૂર હોય છે", + "total-offset": "કુલ -ફસેટ", + "total-offset-description": "રકમ દાખલ કરીને લોનની કુલને સરભર કરો. ઉપયોગી જો લોન કુલ વધતા ખર્ચ માટે વ્યાજ અથવા અન્ય બિનહિસાબી સંચિત કરે છે.", + "advanced-automation": "અદ્યતન સ્વચાલિત", + "deep-linking": "એપ્લિકેશન લિંક્સ", + "deep-linking-description": "એપ્લિકેશન URL નો ઉપયોગ કરીને ટ્રાન્ઝેક્શનના નિવેશને સ્વચાલિત કરો. વધુ જાણવા અને દસ્તાવેજીકરણ જોવા માટે ટેપ કરો.", + "added-transaction": "ઉમેરાયેલ લેવડદેવડ" } \ No newline at end of file diff --git a/budget/assets/translations/generated/he.json b/budget/assets/translations/generated/he.json index 7fee85c9..b1375823 100644 --- a/budget/assets/translations/generated/he.json +++ b/budget/assets/translations/generated/he.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "תצוגה מקדימה של תמונה נכשלה", "open-link": "קישור פתוח", "category-not-selected": "קטגוריה לא נבחרה", - "all-transactions-require-a-category": "כל העסקאות דורשות קטגוריה" + "all-transactions-require-a-category": "כל העסקאות דורשות קטגוריה", + "total-offset": "קיזוז מוחלט", + "total-offset-description": "קיזוז סך ההלוואה על ידי כניסה לסכום. שימושי אם ההלוואה צברה ריבית או אחרים שלא הוסברו על עלויות הגדלת הסכום.", + "advanced-automation": "אוטומציה מתקדמת", + "deep-linking": "קישורי אפליקציה", + "deep-linking-description": "אוטומציה של החדרת עסקאות באמצעות כתובות כתובות אפליקציות. הקש כדי ללמוד עוד וצפה בתיעוד.", + "added-transaction": "הוסיפה עסקה" } \ No newline at end of file diff --git a/budget/assets/translations/generated/hi.json b/budget/assets/translations/generated/hi.json index 6602a37a..f5bbffb4 100644 --- a/budget/assets/translations/generated/hi.json +++ b/budget/assets/translations/generated/hi.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "छवि का पूर्वावलोकन करने में विफल", "open-link": "खुला लिंक", "category-not-selected": "श्रेणी का चयन नहीं किया गया", - "all-transactions-require-a-category": "सभी लेनदेन को एक श्रेणी की आवश्यकता होती है" + "all-transactions-require-a-category": "सभी लेनदेन को एक श्रेणी की आवश्यकता होती है", + "total-offset": "कुल ऑफसेट", + "total-offset-description": "एक राशि में प्रवेश करके ऋण की कुल ऑफसेट करें। उपयोगी यदि ऋण कुल बढ़ाने की लागत के लिए ब्याज या अन्य बेहिसाब है।", + "advanced-automation": "उन्नत स्वचालन", + "deep-linking": "ऐप लिंक", + "deep-linking-description": "APP URL का उपयोग करके लेनदेन के सम्मिलन को स्वचालित करें। अधिक जानने के लिए टैप करें और प्रलेखन देखें।", + "added-transaction": "जोड़ा गया लेनदेन" } \ No newline at end of file diff --git a/budget/assets/translations/generated/hu.json b/budget/assets/translations/generated/hu.json index 15216c68..629279e0 100644 --- a/budget/assets/translations/generated/hu.json +++ b/budget/assets/translations/generated/hu.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Nem sikerült megtekinteni a képet", "open-link": "Link megnyitása", "category-not-selected": "A kategória nem választva", - "all-transactions-require-a-category": "Minden tranzakcióhoz kategóriát igényel" + "all-transactions-require-a-category": "Minden tranzakcióhoz kategóriát igényel", + "total-offset": "Teljes eltolás", + "total-offset-description": "A hitel összegének összegének megadásával történő eltolódása. Hasznos, ha a hitel felhalmozódott kamatba vagy egyéb, a költségek növelésére nem számoltak be.", + "advanced-automation": "Fejlett automatizálás", + "deep-linking": "App linkek", + "deep-linking-description": "Az APP URL -ek segítségével automatizálja a tranzakciók beillesztését. Érintse meg a további információkat, és tekintse meg a dokumentációt.", + "added-transaction": "Hozzáadott tranzakció" } \ No newline at end of file diff --git a/budget/assets/translations/generated/id.json b/budget/assets/translations/generated/id.json index 44e81243..b2066193 100644 --- a/budget/assets/translations/generated/id.json +++ b/budget/assets/translations/generated/id.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Gagal Pratinjau Gambar", "open-link": "Buka tautan", "category-not-selected": "Kategori tidak dipilih", - "all-transactions-require-a-category": "Semua transaksi membutuhkan kategori" + "all-transactions-require-a-category": "Semua transaksi membutuhkan kategori", + "total-offset": "Total offset", + "total-offset-description": "Mengimbangi total pinjaman dengan memasukkan jumlah. Berguna jika pinjaman telah mengumpulkan bunga atau biaya lain yang tidak terhitung untuk meningkatkan total.", + "advanced-automation": "Otomatisasi Lanjutan", + "deep-linking": "Tautan aplikasi", + "deep-linking-description": "Otomatiskan penyisipan transaksi menggunakan URL aplikasi. Ketuk untuk mempelajari lebih lanjut dan melihat dokumentasi.", + "added-transaction": "Ditambahkan transaksi" } \ No newline at end of file diff --git a/budget/assets/translations/generated/it.json b/budget/assets/translations/generated/it.json index 751ff077..374adda3 100644 --- a/budget/assets/translations/generated/it.json +++ b/budget/assets/translations/generated/it.json @@ -1047,7 +1047,7 @@ "difference-loan": "Prestito di differenza", "open-settings": "Impostazioni aperte", "decimal-precision": "Precisione decimali", - "decimal-precision-description": "Posti decimali per l'arrotondamento dell'importo delle transazioni", + "decimal-precision-description": "Posizioni decimali per l'arrotondamento dell'importo delle transazioni", "same-accounts": "Stessi account", "select-2-different-accounts": "Seleziona 2 account diversi", "include-amount": "Includere l'importo", @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Impossibile in anteprima immagine", "open-link": "Link aperto", "category-not-selected": "Categoria non selezionata", - "all-transactions-require-a-category": "Tutte le transazioni richiedono una categoria" + "all-transactions-require-a-category": "Tutte le transazioni richiedono una categoria", + "total-offset": "Offset totale", + "total-offset-description": "Offsettare il totale del prestito inserendo un importo. Utile se il prestito ha accumulato interessi o altri non contabilizzati per i costi in aumento del totale.", + "advanced-automation": "Automazione avanzata", + "deep-linking": "Collegamenti app", + "deep-linking-description": "Automatizzare l'inserimento delle transazioni utilizzando gli URL dell'app. Tocca per saperne di più e visualizza la documentazione.", + "added-transaction": "Transazione aggiunta" } \ No newline at end of file diff --git a/budget/assets/translations/generated/ja.json b/budget/assets/translations/generated/ja.json index 7611a05e..ceb397d6 100644 --- a/budget/assets/translations/generated/ja.json +++ b/budget/assets/translations/generated/ja.json @@ -1044,7 +1044,7 @@ "set-date-time": "セット", "add-record-using-plus-button": "[+]ボタンを使用してレコードを追加します。", "all-settled": "すべてが落ち着きました", - "difference-loan": "差額ローン", + "difference-loan": "差異ローン", "open-settings": "設定を開く", "decimal-precision": "10進精度", "decimal-precision-description": "トランザクション額の丸めの小数点", @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "画像のプレビューに失敗しました", "open-link": "オープンリンク", "category-not-selected": "選択されていないカテゴリ", - "all-transactions-require-a-category": "すべてのトランザクションにはカテゴリが必要です" + "all-transactions-require-a-category": "すべてのトランザクションにはカテゴリが必要です", + "total-offset": "トータルオフセット", + "total-offset-description": "金額を入力することにより、ローンの合計を相殺します。ローンが利息またはその他の計算を累積した場合、合計を増加させた場合に役立ちます。", + "advanced-automation": "高度な自動化", + "deep-linking": "アプリリンク", + "deep-linking-description": "アプリURLを使用してトランザクションの挿入を自動化します。タップして詳細を確認し、ドキュメントを表示します。", + "added-transaction": "トランザクションを追加しました" } \ No newline at end of file diff --git a/budget/assets/translations/generated/ko.json b/budget/assets/translations/generated/ko.json index bcd1c319..a5ab0d0c 100644 --- a/budget/assets/translations/generated/ko.json +++ b/budget/assets/translations/generated/ko.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "이미지를 미리 보지 못했습니다", "open-link": "열기 링크", "category-not-selected": "범주가 선택되지 않았습니다", - "all-transactions-require-a-category": "모든 거래에는 범주가 필요합니다" + "all-transactions-require-a-category": "모든 거래에는 범주가 필요합니다", + "total-offset": "총 오프셋", + "total-offset-description": "금액을 입력하여 대출의 총계를 상쇄하십시오. 대출이이자를 축적했거나 총계가 증가하는 비용에 대한 기타 계산되지 않은 경우 유용합니다.", + "advanced-automation": "고급 자동화", + "deep-linking": "앱 링크", + "deep-linking-description": "앱 URL을 사용하여 트랜잭션 삽입을 자동화하십시오. 자세한 내용을 배우고 문서를 봅니다.", + "added-transaction": "트랜잭션이 추가되었습니다" } \ No newline at end of file diff --git a/budget/assets/translations/generated/ml.json b/budget/assets/translations/generated/ml.json index 8fe02370..a35618c0 100644 --- a/budget/assets/translations/generated/ml.json +++ b/budget/assets/translations/generated/ml.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "ചിത്രം തിരയുന്നതിൽ പരാജയപ്പെട്ടു", "open-link": "ലിങ്ക് തുറക്കുക", "category-not-selected": "വിഭാഗം തിരഞ്ഞെടുത്തിട്ടില്ല", - "all-transactions-require-a-category": "എല്ലാ ഇടപാടുകളും ഒരു വിഭാഗം ആവശ്യമാണ്" + "all-transactions-require-a-category": "എല്ലാ ഇടപാടുകളും ഒരു വിഭാഗം ആവശ്യമാണ്", + "total-offset": "ആകെ ഓഫ്സെറ്റ്", + "total-offset-description": "ഒരു തുക നൽകി വായ്പയുടെ ആകെത്തുക. മൊത്തം വർദ്ധിച്ചതിന് വായ്പയ്ക്ക് പലിശ അല്ലെങ്കിൽ മറ്റ് കണക്റ്റുചെയ്തിട്ടുണ്ടെങ്കിൽ ഉപയോഗപ്രദമാണ്.", + "advanced-automation": "വിപുലമായ ഓട്ടോമേഷൻ", + "deep-linking": "അപ്ലിക്കേഷൻ ലിങ്കുകൾ", + "deep-linking-description": "അപ്ലിക്കേഷൻ URL- കൾ ഉപയോഗിച്ച് ഇടപാടുകളുടെ ഉൾപ്പെടുത്തൽ യാന്ത്രികമാക്കുക. കൂടുതലറിയാൻ ടാപ്പുചെയ്ത് ഡോക്യുമെന്റേഷൻ കാണുക.", + "added-transaction": "ഇടപാട് ചേർത്തു" } \ No newline at end of file diff --git a/budget/assets/translations/generated/mr.json b/budget/assets/translations/generated/mr.json index 23ee816a..026ca304 100644 --- a/budget/assets/translations/generated/mr.json +++ b/budget/assets/translations/generated/mr.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "प्रतिमेचे पूर्वावलोकन करण्यात अयशस्वी", "open-link": "ओपन लिंक", "category-not-selected": "श्रेणी निवडलेली नाही", - "all-transactions-require-a-category": "सर्व व्यवहारांना श्रेणी आवश्यक आहे" + "all-transactions-require-a-category": "सर्व व्यवहारांना श्रेणी आवश्यक आहे", + "total-offset": "एकूण ऑफसेट", + "total-offset-description": "रक्कम प्रविष्ट करून एकूण कर्जाची ऑफसेट करा. जर कर्जात एकूण वाढ होणार्‍या खर्चासाठी व्याज जमा झाले असेल किंवा इतर अनुरुप असेल तर उपयुक्त.", + "advanced-automation": "प्रगत ऑटोमेशन", + "deep-linking": "अ‍ॅप दुवे", + "deep-linking-description": "अ‍ॅप URL वापरून व्यवहार समाविष्ट करणे स्वयंचलित करा. अधिक जाणून घेण्यासाठी टॅप करा आणि दस्तऐवजीकरण पाहा.", + "added-transaction": "जोडलेला व्यवहार" } \ No newline at end of file diff --git a/budget/assets/translations/generated/ms.json b/budget/assets/translations/generated/ms.json index b5f0ebad..1d85b762 100644 --- a/budget/assets/translations/generated/ms.json +++ b/budget/assets/translations/generated/ms.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Gagal Pratonton Imej", "open-link": "Pautan Terbuka", "category-not-selected": "Kategori tidak dipilih", - "all-transactions-require-a-category": "Semua urus niaga memerlukan kategori" + "all-transactions-require-a-category": "Semua urus niaga memerlukan kategori", + "total-offset": "Jumlah Offset", + "total-offset-description": "Mengimbangi jumlah pinjaman dengan memasukkan jumlah. Berguna jika pinjaman telah mengumpulkan faedah atau yang lain yang tidak dapat dipertanggungjawabkan untuk kos yang semakin meningkat.", + "advanced-automation": "Automasi Lanjutan", + "deep-linking": "Pautan aplikasi", + "deep-linking-description": "Automatikkan penyisipan urus niaga menggunakan URL aplikasi. Ketik untuk mengetahui lebih lanjut dan lihat dokumentasi.", + "added-transaction": "Menambah transaksi" } \ No newline at end of file diff --git a/budget/assets/translations/generated/nl.json b/budget/assets/translations/generated/nl.json index 3ce336ea..0bcb28db 100644 --- a/budget/assets/translations/generated/nl.json +++ b/budget/assets/translations/generated/nl.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Kan de afbeelding niet bekijken", "open-link": "Open link", "category-not-selected": "Categorie niet geselecteerd", - "all-transactions-require-a-category": "Alle transacties vereisen een categorie" + "all-transactions-require-a-category": "Alle transacties vereisen een categorie", + "total-offset": "Totale offset", + "total-offset-description": "Compenseer het totaal van de lening door een bedrag in te voeren. Handig als de lening rente of andere niet -verantwoord heeft verzameld voor kosten die het totaal verhogen.", + "advanced-automation": "Geavanceerde automatisering", + "deep-linking": "App -links", + "deep-linking-description": "Automatiseer het invoegen van transacties met behulp van APP -URL's. Tik op voor meer informatie en bekijk de documentatie.", + "added-transaction": "Toegevoegde transactie" } \ No newline at end of file diff --git a/budget/assets/translations/generated/no.json b/budget/assets/translations/generated/no.json index 54c91eb8..15c17b3d 100644 --- a/budget/assets/translations/generated/no.json +++ b/budget/assets/translations/generated/no.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Kunne ikke forhåndsvise image", "open-link": "Åpen lenke", "category-not-selected": "Kategori ikke valgt", - "all-transactions-require-a-category": "Alle transaksjoner krever en kategori" + "all-transactions-require-a-category": "Alle transaksjoner krever en kategori", + "total-offset": "Total forskyvning", + "total-offset-description": "Utlignet totalen av lånet ved å legge inn et beløp. Nyttig hvis lånet har akkumulert renter eller annen ikke -regnskap for kostnadene som øker totalen.", + "advanced-automation": "Avansert automatisering", + "deep-linking": "App lenker", + "deep-linking-description": "Automatiser innsetting av transaksjoner ved hjelp av APP -URL -er. Trykk for å lære mer og se dokumentasjonen.", + "added-transaction": "Lagt til transaksjon" } \ No newline at end of file diff --git a/budget/assets/translations/generated/pl.json b/budget/assets/translations/generated/pl.json index 0c720906..9eba3de7 100644 --- a/budget/assets/translations/generated/pl.json +++ b/budget/assets/translations/generated/pl.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Nie udało się podglądu obrazu", "open-link": "Otwórz link", "category-not-selected": "Kategoria nie została wybrana", - "all-transactions-require-a-category": "Wszystkie transakcje wymagają kategorii" + "all-transactions-require-a-category": "Wszystkie transakcje wymagają kategorii", + "total-offset": "Całkowite przesunięcie", + "total-offset-description": "Zrównuj sumę pożyczki, wprowadzając kwotę. Przydatne, jeśli pożyczka zgromadziła odsetki lub inne nieznane za zwiększenie kosztów.", + "advanced-automation": "Zaawansowana automatyzacja", + "deep-linking": "Linki aplikacji", + "deep-linking-description": "Zautomatyzuj wprowadzenie transakcji za pomocą adresów URL aplikacji. Stuknij, aby dowiedzieć się więcej i wyświetlić dokumentację.", + "added-transaction": "Dodano transakcję" } \ No newline at end of file diff --git a/budget/assets/translations/generated/pt.json b/budget/assets/translations/generated/pt.json index 3c6d8770..d1eef89a 100644 --- a/budget/assets/translations/generated/pt.json +++ b/budget/assets/translations/generated/pt.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Falha ao visualizar a imagem", "open-link": "Link aberto", "category-not-selected": "Categoria não selecionada", - "all-transactions-require-a-category": "Todas as transações requerem uma categoria" + "all-transactions-require-a-category": "Todas as transações requerem uma categoria", + "total-offset": "Offset total", + "total-offset-description": "Compensando o total do empréstimo, inserindo um valor. Útil se o empréstimo acumular juros ou outro não contabilizado para custos, aumentando o total.", + "advanced-automation": "Automação avançada", + "deep-linking": "Links de aplicativos", + "deep-linking-description": "Automatize a inserção de transações usando URLs de aplicativos. Toque para saber mais e ver a documentação.", + "added-transaction": "Transação adicionada" } \ No newline at end of file diff --git a/budget/assets/translations/generated/ro.json b/budget/assets/translations/generated/ro.json index ed10da80..fb22d1a1 100644 --- a/budget/assets/translations/generated/ro.json +++ b/budget/assets/translations/generated/ro.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Nu a reușit să previzualizeze imaginea", "open-link": "Deschide link-ul", "category-not-selected": "Categoria nu a fost selectată", - "all-transactions-require-a-category": "Toate tranzacțiile necesită o categorie" + "all-transactions-require-a-category": "Toate tranzacțiile necesită o categorie", + "total-offset": "Offset total", + "total-offset-description": "Compensați totalul împrumutului prin introducerea unei sume. Util dacă împrumutul a acumulat dobândă sau alte necontractate pentru costurile crescând totalul.", + "advanced-automation": "Automatizare avansată", + "deep-linking": "Link -uri pentru aplicații", + "deep-linking-description": "Automatizați inserarea tranzacțiilor folosind adresele URL ale aplicației. Atingeți pentru a afla mai multe și vizualizați documentația.", + "added-transaction": "Tranzacție adăugată" } \ No newline at end of file diff --git a/budget/assets/translations/generated/ru.json b/budget/assets/translations/generated/ru.json index 7ef7e17b..6b0cbdfe 100644 --- a/budget/assets/translations/generated/ru.json +++ b/budget/assets/translations/generated/ru.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Не удалось просмотреть изображение", "open-link": "Открыть ссылку", "category-not-selected": "Категория не выбрана", - "all-transactions-require-a-category": "Все транзакции требуют категории" + "all-transactions-require-a-category": "Все транзакции требуют категории", + "total-offset": "Общее смещение", + "total-offset-description": "Сметить общую сумму кредита, введя сумму. Полезно, если кредит накапливал проценты или другие недоступные за расходы, увеличивающие общую сумму.", + "advanced-automation": "Усовершенствованная автоматизация", + "deep-linking": "Приложения ссылки", + "deep-linking-description": "Автоматизируйте вставку транзакций с помощью URL -адресов APP. Нажмите, чтобы узнать больше и просмотреть документацию.", + "added-transaction": "Добавлена ​​транзакция" } \ No newline at end of file diff --git a/budget/assets/translations/generated/sr.json b/budget/assets/translations/generated/sr.json index a4371064..34c4a8f4 100644 --- a/budget/assets/translations/generated/sr.json +++ b/budget/assets/translations/generated/sr.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Није успело да прегледате слику", "open-link": "Отвори линк", "category-not-selected": "Категорија Није изабрана", - "all-transactions-require-a-category": "Све трансакције захтевају категорију" + "all-transactions-require-a-category": "Све трансакције захтевају категорију", + "total-offset": "Укупно оффсет", + "total-offset-description": "Надокнадити укупно зајма уношењем износа. Корисно ако је зајам акумулирао камате или друге необрађене за трошкове који повећавају укупно.", + "advanced-automation": "Напредна аутоматизација", + "deep-linking": "Апп Линкови", + "deep-linking-description": "Аутоматизирајте уметање трансакција помоћу УРЛ-ова апликација. Тапните да бисте сазнали више и погледали документацију.", + "added-transaction": "Додана трансакција" } \ No newline at end of file diff --git a/budget/assets/translations/generated/sv.json b/budget/assets/translations/generated/sv.json index 03825a77..5eb9d5fa 100644 --- a/budget/assets/translations/generated/sv.json +++ b/budget/assets/translations/generated/sv.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Det gick inte att förhandsgranska bilden", "open-link": "Öppen länk", "category-not-selected": "Kategori är inte vald", - "all-transactions-require-a-category": "Alla transaktioner kräver en kategori" + "all-transactions-require-a-category": "Alla transaktioner kräver en kategori", + "total-offset": "Total offset", + "total-offset-description": "Kompensera summan av lånet genom att ange ett belopp. Användbart om lånet har samlat ränta eller andra som inte redovisas för kostnader som ökar summan.", + "advanced-automation": "Avancerad automatisering", + "deep-linking": "Applänkar", + "deep-linking-description": "Automatisera införandet av transaktioner med app -URL: er. Tryck för att lära dig mer och se dokumentationen.", + "added-transaction": "Tillagd transaktion" } \ No newline at end of file diff --git a/budget/assets/translations/generated/sw.json b/budget/assets/translations/generated/sw.json index af4f5deb..d4270618 100644 --- a/budget/assets/translations/generated/sw.json +++ b/budget/assets/translations/generated/sw.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Imeshindwa hakiki picha", "open-link": "Kiunga cha wazi", "category-not-selected": "Jamii haijachaguliwa", - "all-transactions-require-a-category": "Shughuli zote zinahitaji kitengo" + "all-transactions-require-a-category": "Shughuli zote zinahitaji kitengo", + "total-offset": "Jumla ya kukabiliana", + "total-offset-description": "Ondoa jumla ya mkopo kwa kuingia kiasi. Inatumika ikiwa mkopo umekusanya riba au nyingine isiyo na hesabu kwa gharama inayoongeza jumla.", + "advanced-automation": "Otomatiki ya hali ya juu", + "deep-linking": "Viungo vya programu", + "deep-linking-description": "Ondoa uingizaji wa shughuli kwa kutumia URL za programu. Gonga ili ujifunze zaidi na uangalie nyaraka.", + "added-transaction": "Shughuli iliyoongezwa" } \ No newline at end of file diff --git a/budget/assets/translations/generated/ta.json b/budget/assets/translations/generated/ta.json index 14b02284..1c3cf02a 100644 --- a/budget/assets/translations/generated/ta.json +++ b/budget/assets/translations/generated/ta.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "படத்தை முன்னோட்டமிடுவதில் தோல்வி", "open-link": "திறந்த இணைப்பு", "category-not-selected": "வகை தேர்ந்தெடுக்கப்படவில்லை", - "all-transactions-require-a-category": "அனைத்து பரிவர்த்தனைகளுக்கும் ஒரு வகை தேவை" + "all-transactions-require-a-category": "அனைத்து பரிவர்த்தனைகளுக்கும் ஒரு வகை தேவை", + "total-offset": "மொத்த ஆஃப்செட்", + "total-offset-description": "ஒரு தொகையை உள்ளிடுவதன் மூலம் கடனின் மொத்தத்தை ஈடுசெய்யவும். மொத்தம் அதிகரிக்கும் செலவுகளுக்கு கடன் வட்டி அல்லது கணக்கிடப்படாத பிற இருந்தால் பயனுள்ளதாக இருந்தால் பயனுள்ளதாக இருக்கும்.", + "advanced-automation": "மேம்பட்ட ஆட்டோமேஷன்", + "deep-linking": "பயன்பாட்டு இணைப்புகள்", + "deep-linking-description": "பயன்பாட்டு URL களைப் பயன்படுத்தி பரிவர்த்தனைகளைச் செருகுவதை தானியக்கமாக்குங்கள். மேலும் அறியவும் ஆவணங்களைக் காணவும் தட்டவும்.", + "added-transaction": "பரிவர்த்தனை சேர்க்கப்பட்டது" } \ No newline at end of file diff --git a/budget/assets/translations/generated/te.json b/budget/assets/translations/generated/te.json index 6cccbbcf..8350c309 100644 --- a/budget/assets/translations/generated/te.json +++ b/budget/assets/translations/generated/te.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "చిత్రాన్ని పరిదృశ్యం చేయడంలో విఫలమైంది", "open-link": "లింక్ తెరవండి", "category-not-selected": "వర్గం ఎంచుకోబడలేదు", - "all-transactions-require-a-category": "అన్ని లావాదేవీలకు ఒక వర్గం అవసరం" + "all-transactions-require-a-category": "అన్ని లావాదేవీలకు ఒక వర్గం అవసరం", + "total-offset": "మొత్తం ఆఫ్‌సెట్", + "total-offset-description": "మొత్తాన్ని నమోదు చేయడం ద్వారా రుణం మొత్తాన్ని ఆఫ్‌సెట్ చేయండి. రుణం వడ్డీని సేకరించినట్లయితే లేదా మొత్తాన్ని పెంచే ఖర్చుల కోసం లెక్కించబడకపోతే ఉపయోగపడుతుంది.", + "advanced-automation": "అధునాతన ఆటోమేషన్", + "deep-linking": "అనువర్తన లింకులు", + "deep-linking-description": "అనువర్తన URL లను ఉపయోగించి లావాదేవీలను చొప్పించడాన్ని ఆటోమేట్ చేయండి. మరింత తెలుసుకోవడానికి నొక్కండి మరియు డాక్యుమెంటేషన్ చూడటానికి.", + "added-transaction": "లావాదేవీ జోడించబడింది" } \ No newline at end of file diff --git a/budget/assets/translations/generated/th.json b/budget/assets/translations/generated/th.json index eb3f9ff2..80bbcf95 100644 --- a/budget/assets/translations/generated/th.json +++ b/budget/assets/translations/generated/th.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "ไม่สามารถดูตัวอย่างภาพได้", "open-link": "เปิดลิ้งค์", "category-not-selected": "หมวดหมู่ไม่ได้เลือก", - "all-transactions-require-a-category": "ธุรกรรมทั้งหมดต้องการหมวดหมู่" + "all-transactions-require-a-category": "ธุรกรรมทั้งหมดต้องการหมวดหมู่", + "total-offset": "ชดเชยทั้งหมด", + "total-offset-description": "ชดเชยยอดรวมของเงินกู้โดยป้อนจำนวนเงิน มีประโยชน์หากเงินกู้มีดอกเบี้ยสะสมหรือไม่ได้รับเงินอื่น ๆ สำหรับค่าใช้จ่ายที่เพิ่มขึ้นทั้งหมด", + "advanced-automation": "ระบบอัตโนมัติขั้นสูง", + "deep-linking": "ลิงค์แอพ", + "deep-linking-description": "ทำการแทรกธุรกรรมโดยอัตโนมัติโดยใช้ URL แอพ แตะเพื่อเรียนรู้เพิ่มเติมและดูเอกสาร", + "added-transaction": "เพิ่มธุรกรรม" } \ No newline at end of file diff --git a/budget/assets/translations/generated/tr.json b/budget/assets/translations/generated/tr.json index 1093dccd..a9d4b655 100644 --- a/budget/assets/translations/generated/tr.json +++ b/budget/assets/translations/generated/tr.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Resmi önizlemedi", "open-link": "Linki aç", "category-not-selected": "Kategori seçilmedi", - "all-transactions-require-a-category": "Tüm işlemler bir kategori gerektirir" + "all-transactions-require-a-category": "Tüm işlemler bir kategori gerektirir", + "total-offset": "Toplam ofset", + "total-offset-description": "Bir tutar girerek kredinin toplamını dengeleyin. Kredi, toplamı artıran maliyetler için faiz birikmiş veya başka bir hesaplanmamışsa kullanışlıdır.", + "advanced-automation": "Gelişmiş Otomasyon", + "deep-linking": "Uygulama bağlantıları", + "deep-linking-description": "Uygulama URL'lerini kullanarak işlemlerin eklenmesini otomatikleştirin. Daha fazla bilgi edinmek ve belgeleri görüntülemek için dokunun.", + "added-transaction": "Eklenen İşlem" } \ No newline at end of file diff --git a/budget/assets/translations/generated/uk.json b/budget/assets/translations/generated/uk.json index c24c71c3..7af879a8 100644 --- a/budget/assets/translations/generated/uk.json +++ b/budget/assets/translations/generated/uk.json @@ -1044,7 +1044,7 @@ "set-date-time": "Встановити", "add-record-using-plus-button": "Додайте запис за допомогою кнопки [+].", "all-settled": "Все врегульовано", - "difference-loan": "Різниця позики", + "difference-loan": "Різниця", "open-settings": "Відкриті налаштування", "decimal-precision": "Десяткова точність", "decimal-precision-description": "Десяткові місця для округлення суми транзакцій", @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Не вдалося переглянути зображення", "open-link": "Відкрити посилання", "category-not-selected": "Категорія не вибрана", - "all-transactions-require-a-category": "Усі транзакції потребують категорії" + "all-transactions-require-a-category": "Усі транзакції потребують категорії", + "total-offset": "Загальний зміщення", + "total-offset-description": "Компенсуйте загальну суму позики, ввівши суму. Корисно, якщо позика накопичила відсотки або інші не враховані на витрати, збільшуючи загальну суму.", + "advanced-automation": "Вдосконалена автоматизація", + "deep-linking": "Посилання додатків", + "deep-linking-description": "Автоматизація вставки транзакцій за допомогою URL -адрес додатків. Торкніться, щоб дізнатися більше та переглянути документацію.", + "added-transaction": "Додана транзакція" } \ No newline at end of file diff --git a/budget/assets/translations/generated/ur.json b/budget/assets/translations/generated/ur.json index 5540befc..9536c052 100644 --- a/budget/assets/translations/generated/ur.json +++ b/budget/assets/translations/generated/ur.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "تصویر کا پیش نظارہ کرنے میں ناکام", "open-link": "لنک کھولیں", "category-not-selected": "زمرہ منتخب نہیں کیا گیا ہے", - "all-transactions-require-a-category": "تمام لین دین میں ایک زمرے کی ضرورت ہوتی ہے" + "all-transactions-require-a-category": "تمام لین دین میں ایک زمرے کی ضرورت ہوتی ہے", + "total-offset": "کل آفسیٹ", + "total-offset-description": "کسی رقم میں داخل ہوکر قرض کی کل کو آفسیٹ کریں۔ مفید ہے اگر قرض میں سود یا دیگر غیر حساب کتاب جمع ہوچکے ہیں۔", + "advanced-automation": "اعلی درجے کی آٹومیشن", + "deep-linking": "ایپ لنکس", + "deep-linking-description": "ایپ یو آر ایل کا استعمال کرتے ہوئے لین دین کے اندراج کو خود کار بنائیں۔ مزید جاننے کے لئے ٹیپ کریں اور دستاویزات کو دیکھیں۔", + "added-transaction": "شامل ٹرانزیکشن" } \ No newline at end of file diff --git a/budget/assets/translations/generated/vi.json b/budget/assets/translations/generated/vi.json index c8bcd4e7..f5a67f58 100644 --- a/budget/assets/translations/generated/vi.json +++ b/budget/assets/translations/generated/vi.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "Không thể Xem trước Hình ảnh", "open-link": "Mở Liên kết", "category-not-selected": "Thể loại không được chọn", - "all-transactions-require-a-category": "Tất cả các giao dịch yêu cầu một danh mục" + "all-transactions-require-a-category": "Tất cả các giao dịch yêu cầu một danh mục", + "total-offset": "Tổng số bù", + "total-offset-description": "Bù đắp tổng số khoản vay bằng cách nhập một số tiền. Hữu ích nếu khoản vay đã tích lũy lãi hoặc không được tính cho chi phí tăng tổng số.", + "advanced-automation": "Tự động hóa nâng cao", + "deep-linking": "Liên kết ứng dụng", + "deep-linking-description": "Tự động hóa việc chèn các giao dịch bằng URL APP. Nhấn để tìm hiểu thêm và xem tài liệu.", + "added-transaction": "Đã thêm giao dịch" } \ No newline at end of file diff --git a/budget/assets/translations/generated/zh-Hant.json b/budget/assets/translations/generated/zh-Hant.json index 77806351..ef96aac1 100644 --- a/budget/assets/translations/generated/zh-Hant.json +++ b/budget/assets/translations/generated/zh-Hant.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "無法預覽圖像", "open-link": "打開鏈接", "category-not-selected": "類別未選擇", - "all-transactions-require-a-category": "所有交易都需要類別" + "all-transactions-require-a-category": "所有交易都需要類別", + "total-offset": "總偏移", + "total-offset-description": "通過輸入金額來抵消貸款的總計。如果貸款累積了利息或其他未徵收的費用,則有用。", + "advanced-automation": "高級自動化", + "deep-linking": "應用鏈接", + "deep-linking-description": "使用應用程序URL自動插入交易。點擊以了解更多信息並查看文檔。", + "added-transaction": "增加了交易" } \ No newline at end of file diff --git a/budget/assets/translations/generated/zh.json b/budget/assets/translations/generated/zh.json index 709896fb..5f0a1129 100644 --- a/budget/assets/translations/generated/zh.json +++ b/budget/assets/translations/generated/zh.json @@ -1059,5 +1059,11 @@ "failed-to-preview-image": "无法预览图像", "open-link": "打开链接", "category-not-selected": "类别未选择", - "all-transactions-require-a-category": "所有交易都需要类别" + "all-transactions-require-a-category": "所有交易都需要类别", + "total-offset": "总偏移", + "total-offset-description": "通过输入金额来抵消贷款的总计。如果贷款累积了利息或其他未征收的费用,则有用。", + "advanced-automation": "高级自动化", + "deep-linking": "应用链接", + "deep-linking-description": "使用应用程序URL自动插入交易。点击以了解更多信息并查看文档。", + "added-transaction": "增加了交易" } \ No newline at end of file diff --git a/budget/assets/translations/translations.csv b/budget/assets/translations/translations.csv index c9e3280d..65f5e72e 100644 --- a/budget/assets/translations/translations.csv +++ b/budget/assets/translations/translations.csv @@ -1045,10 +1045,10 @@ "set-date-time","Set","Ensemble","Definir","放","तय करना","تعيين","Definir","","Набор","セット","Satz","세트","Ayarlamak","Impostato","Đặt","Ustawić","Set","ชุด","Soubor","সেট","Mengatur","سیٹ","సెట్","सेट","அமைக்கவும்","સમૂહ","Встановити","Itakda","Tetapkan","A stabilit","Készlet","Σειρά","Uppsättning","Sæt","Sett","Aseta","מַעֲרֶכֶת","تنظیم","സജ്ജീകൃതരംഗം","Комплет","Seti","Комплект","放" "add-record-using-plus-button","Add a record using the + button.","Ajoutez un enregistrement à l'aide du bouton [+].","Agregue un registro usando el botón [+].","使用[+]按钮添加记录。","[+] बटन का उपयोग करके एक रिकॉर्ड जोड़ें।","إضافة سجل باستخدام زر [+].","Adicione um registro usando o botão [+].","","Добавьте запись, используя кнопку [+].","[+]ボタンを使用してレコードを追加します。","Fügen Sie einen Datensatz mit der Schaltfläche [+] hinzu.","[+] 버튼을 사용하여 레코드를 추가하십시오.","[+] Düğmesini kullanarak bir kayıt ekleyin.","Aggiungi un record utilizzando il pulsante [+].","Thêm một bản ghi bằng nút +.","Dodaj rekord za pomocą przycisku [+].","Voeg een record toe met de knop [+].","เพิ่มบันทึกโดยใช้ปุ่ม [+]","Přidejte záznam pomocí tlačítka [+].","[+] বোতামটি ব্যবহার করে একটি রেকর্ড যুক্ত করুন।","Tambahkan catatan menggunakan tombol [+].","[+] بٹن کا استعمال کرتے ہوئے ایک ریکارڈ شامل کریں۔","[+] బటన్‌ను ఉపయోగించి రికార్డును జోడించండి.","[+] बटण वापरून रेकॉर्ड जोडा.","[+] பொத்தானைப் பயன்படுத்தி பதிவைச் சேர்க்கவும்.","[+] બટનનો ઉપયોગ કરીને રેકોર્ડ ઉમેરો.","Додайте запис за допомогою кнопки [+].","Magdagdag ng isang tala gamit ang pindutan ng [+].","Tambah rekod menggunakan butang [+].","Adăugați o înregistrare folosind butonul [+].","Adjon hozzá egy rekordot a [+] gomb használatával.","Προσθέστε μια εγγραφή χρησιμοποιώντας το κουμπί [+].","Lägg till en post med knappen [+].","Tilføj en post ved hjælp af [+] -knappen.","Legg til en post ved hjelp av [+] -knappen.","Lisää tietue käyttämällä [+] -painiketta.","הוסף רשומה באמצעות כפתור [+].","با استفاده از دکمه [+] یک رکورد اضافه کنید.","[+] ബട്ടൺ ഉപയോഗിച്ച് ഒരു റെക്കോർഡ് ചേർക്കുക.","Додајте запис помоћу [+] тастера.","Ongeza rekodi kwa kutumia kitufe cha [+].","Добавете запис с помощта на бутона [+].","使用[+]按鈕添加記錄。" "all-settled","All Settled","Tous installés","Todo configurado","所有人都解决了","सभी व्यवस्थित हो गए","كل ما استقر","Tudo resolvido","","Все урегулированы","すべてが落ち着きました","Alles erledigt","모두 정착했습니다","Herşey ayarlandı","Tutto sistemato","Đã thanh toán Hết","Wszystkie się rozstrzygnęły","Allemaal geregeld","ทั้งหมดตัดสิน","Všichni se usadili","সব স্থির","Semua diselesaikan","سب طے شدہ","అన్నీ స్థిరపడ్డాయి","सर्व सेटल","அனைத்தும் குடியேறின","બધા સ્થાયી થયા","Все врегульовано","Lahat ay naayos","Semua diselesaikan","Toate stabilite","Minden rendeződött","Όλοι εγκατεστημένοι","Alla avgjorda","Alle afgjort","Alt avgjort","Kaikki asettuneet","כולם התיישבו","همه حل و فصل شدند","എല്ലാം സ്ഥിരതാമസമാക്കി","Сви су се населили","Zote zimetulia","Всички се уредиха","所有人都解決了" -"difference-loan","Difference loan","Prêt de différence","Préstamo de diferencia","差异贷款","अंतर ऋण","قرض الفرق","Empréstimo de diferença","","Разница в кредит","差額ローン","Differenzdarlehen","차이 대출","Fark kredisi","Prestito di differenza","Khoản vay khác nhau","Pożyczka na różnicę","Verschillening","เงินกู้ที่แตกต่างกัน","Rozdílná půjčka","পার্থক্য loan ণ","Pinjaman perbedaan","فرق قرض","వ్యత్యాస రుణం","फरक कर्ज","வேறுபாடு கடன்","ફરક લોન","Різниця позики","Pagkakaiba ng pautang","Pinjaman perbezaan","Împrumut de diferență","Különbséghitel","Διαφορά δάνειο","Skillnadslån","Forskellån","Forskjell lån","Erolaina","הלוואת הבדל","وام تفاوت","വ്യത്യാസ വായ്പ","Зајам за разлику","Mkopo tofauti","Разлика заем","差異貸款" +"difference-loan","Difference loan","Prêt de différence","Préstamo de diferencia","差异贷款","अंतर ऋण","قرض الفرق","Empréstimo de diferença","","Разница в кредит","差異ローン","Differenzdarlehen","차이 대출","Fark kredisi","Prestito di differenza","Khoản vay khác nhau","Pożyczka na różnicę","Verschillening","เงินกู้ที่แตกต่างกัน","Rozdílná půjčka","পার্থক্য loan ণ","Pinjaman perbedaan","فرق قرض","వ్యత్యాస రుణం","फरक कर्ज","வேறுபாடு கடன்","ફરક લોન","Різниця","Pagkakaiba ng pautang","Pinjaman perbezaan","Împrumut de diferență","Különbséghitel","Διαφορά δάνειο","Skillnadslån","Forskellån","Forskjell lån","Erolaina","הלוואת הבדל","وام تفاوت","വ്യത്യാസ വായ്പ","Зајам за разлику","Mkopo tofauti","Разлика заем","差異貸款" "open-settings","Open Settings","Paramètres ouvrir","Configuración abierta","打开设置","खुली सेटिंग","أفتح الإعدادات","Abrir configurações","","Открыть настройки","設定を開く","Einstellungen öffnen","열기 설정","Ayarları aç","Impostazioni aperte","Mở Các thiết đặt","Otwórz ustawienia","Open instellingen","เปิดการตั้งค่า","Otevřené nastavení","ওপেন সেটিংস","Buka Pengaturan","کھلی ترتیبات","సెట్టింగులు తెరవండి","सेटिंग्ज उघडा","திறந்த அமைப்புகள்","ખુલ્લી સેટિંગ્સ","Відкриті налаштування","Buksan ang settings","Buka Tetapan","Deschide setările","Nyisd meg a beállításokat","Ανοίξτε τις ρυθμίσεις","Öppna Inställningar","Åbne indstillinger","Åpne innstillinger","Avaa asetukset","פתח הגדרות","تنظیمات باز","ക്രമീകരണങ്ങൾ തുറക്കുക","Отвори подешавања","Mipangilio ya Fungua","Отворени настройки","打開設置" "decimal-precision","Decimal Precision","Précision décimale","Precisión decimal","小数点","दशमलव परिशुद्धता","الدقة العشرية","Precisão decimal","Precisão decimal","Десятичная точность","10進精度","Dezimalpräzision","소수점 정밀도","Ondalık hassasiyet","Precisione decimali","Độ chính xác Thập phân","Liczba po przecinku","Decimale precisie","ความแม่นยำของทศนิยม","Desetinná přesnost","দশমিক নির্ভুলতা","Ketepatan desimal","اعشاریہ صحت سے متعلق","దశాంశ ఖచ్చితత్వం","दशांश सुस्पष्टता","தசம துல்லியம்","દશાંશ ચોકસાઈ","Десяткова точність","Desimal na katumpakan","Ketepatan perpuluhan","Precizie zecimală","Tizedes pontosság","Δεκαδική ακρίβεια","Decimal precision","Decimal præcision","Desimal presisjon","Tarkkuus","דיוק עשרוני","دقت اعشاری","ദശാംശ കൃത്യത","Децимална прецизност","Usahihi wa decimal","Десетична точност","精確到小數點" -"decimal-precision-description","Decimal places for transaction amount rounding","Décimaux pour le montant de la transaction Arrondi","Posición decimal para el redondeo de la transacción","交易金额四舍五入的小数位","लेन -देन राशि के लिए दशमलव स्थान","أماكن عشرية لالتقاط مبلغ المعاملات","Locais decimais para arredondamento da quantidade de transação","","Десятичные места для округления транзакции","トランザクション額の丸めの小数点","Dezimalstellen für die Transaktionsbetragsrundung","거래 금액 반올림을위한 소수점 이하","İşlem miktarı yuvarlama için ondalık yerler","Posti decimali per l'arrotondamento dell'importo delle transazioni","Vị trí thập phân để làm tròn số tiền giao dịch","Miejsca dziesiętne do zaokrąglania","Decimale plaatsen voor afronding van transactiebedrag","ทศนิยมสถานที่สำหรับการทำธุรกรรมการปัดเศษ","Desetinná místa pro zaokrouhlování částky transakce","গোলাকার লেনদেনের পরিমাণের জন্য দশমিক স্থান","Tempat desimal untuk pembulatan jumlah transaksi","ٹرانزیکشن کی رقم کے لئے اعشاریہ مقامات","లావాదేవీ మొత్తం రౌండింగ్ కోసం దశాంశ స్థానాలు","व्यवहाराच्या रकमेसाठी दशांश ठिकाणे","பரிவர்த்தனை அளவு வட்டமிடுவதற்கான தசம இடங்கள்","વ્યવહારની રકમ ગોળાકાર માટે દશાંશ સ્થાનો","Десяткові місця для округлення суми транзакцій","Mga lugar na desimal para sa pag -ikot ng halaga ng transaksyon","Tempat perpuluhan untuk jumlah urus niaga","Locuri zecimale pentru rotunjirea tranzacției","Tizedesjegyek a tranzakciós összeg kerekítéséhez","Δεκαδικά μέρη για στρογγυλοποίηση ποσού συναλλαγών","Decimalplatser för avrundning av transaktionsbelopp","Decimalsteder for transaktionsbeløb afrunding","Desimaler for transaksjonsbeløp avrunding","Desimaalit tapahtumien määrän pyöristämiselle","מקומות עשרוניים לעיגול סכום העסקה","مکان های اعشاری برای گردآوری مبلغ معامله","ഇടപാട് തുകയ്ക്കുള്ള ദശാംശ സ്ഥാനങ്ങൾ","Децимална места за заокруживање износа трансакције","Maeneo ya decimal kwa kiwango cha ununuzi","Десетични знаци за закръгляне на сумата на транзакцията","交易金額四捨五入的小數位" +"decimal-precision-description","Decimal places for transaction amount rounding","Décimaux pour le montant de la transaction Arrondi","Posición decimal para el redondeo de la transacción","交易金额四舍五入的小数位","लेन -देन राशि के लिए दशमलव स्थान","أماكن عشرية لالتقاط مبلغ المعاملات","Locais decimais para arredondamento da quantidade de transação","","Десятичные места для округления транзакции","トランザクション額の丸めの小数点","Dezimalstellen für die Transaktionsbetragsrundung","거래 금액 반올림을위한 소수점 이하","İşlem miktarı yuvarlama için ondalık yerler","Posizioni decimali per l'arrotondamento dell'importo delle transazioni","Vị trí thập phân để làm tròn số tiền giao dịch","Miejsca dziesiętne do zaokrąglania","Decimale plaatsen voor afronding van transactiebedrag","ทศนิยมสถานที่สำหรับการทำธุรกรรมการปัดเศษ","Desetinná místa pro zaokrouhlení částky transakce","গোলাকার লেনদেনের পরিমাণের জন্য দশমিক স্থান","Tempat desimal untuk pembulatan jumlah transaksi","ٹرانزیکشن کی رقم کے لئے اعشاریہ مقامات","లావాదేవీ మొత్తం రౌండింగ్ కోసం దశాంశ స్థానాలు","व्यवहाराच्या रकमेसाठी दशांश ठिकाणे","பரிவர்த்தனை அளவு வட்டமிடுவதற்கான தசம இடங்கள்","વ્યવહારની રકમ ગોળાકાર માટે દશાંશ સ્થાનો","Десяткові місця для округлення суми транзакцій","Mga lugar na desimal para sa pag -ikot ng halaga ng transaksyon","Tempat perpuluhan untuk jumlah urus niaga","Locuri zecimale pentru rotunjirea tranzacției","Tizedesjegyek a tranzakciós összeg kerekítéséhez","Δεκαδικά μέρη για στρογγυλοποίηση ποσού συναλλαγών","Decimalplatser för avrundning av transaktionsbelopp","Decimalsteder til transaktionsbeløb afrunding","Desimaler for transaksjonsbeløp avrunding","Desimaalit tapahtumien määrän pyöristämiselle","מקומות עשרוניים לעיגול סכום העסקה","مکان های اعشاری برای گردآوری مبلغ معامله","ഇടപാട് തുകയ്ക്കുള്ള ദശാംശ സ്ഥാനങ്ങൾ","Децимална места за заокруживање износа трансакције","Maeneo ya decimal kwa kiwango cha ununuzi","Десетични знаци за закръгляне на сумата на транзакцията","交易金額四捨五入的小數位" "same-accounts","Same Accounts","Mêmes comptes","Mismas cuentas","相同的帐户","एक ही खाते","نفس الحسابات","Mesmos contas","","Те же счета","同じアカウント","Gleiche Konten","같은 계정","Aynı hesaplar","Stessi account","Cùng tài khoản","Te same konta","Dezelfde accounts","บัญชีเดียวกัน","Stejné účty","একই অ্যাকাউন্ট","Akun yang sama","ایک ہی اکاؤنٹس","అదే ఖాతాలు","समान खाती","அதே கணக்குகள்","સરખી હિસાબ","Такі ж рахунки","Parehong mga account","Akaun yang sama","Aceleași conturi","Ugyanazok a számlák","Ίδιοι λογαριασμοί","Samma konton","Samme konti","Samme kontoer","Samat tilit","אותם חשבונות","حسابهای مشابه","സമാന അക്കൗണ്ടുകൾ","Исти рачуни","Akaunti sawa","Същите акаунти","相同的帳戶" "select-2-different-accounts","Select 2 different accounts","Sélectionnez 2 comptes différents","Seleccione 2 cuentas diferentes","选择2个不同的帐户","2 अलग -अलग खातों का चयन करें","حدد 2 حساب مختلف","Selecione 2 contas diferentes","","Выберите 2 разных учетных записей","2つの異なるアカウントを選択します","Wählen Sie 2 verschiedene Konten aus","2 개의 다른 계정을 선택하십시오","2 farklı hesap seçin","Seleziona 2 account diversi","Chọn 2 tài khoản khác nhau","Wybierz 2 różne konta","Selecteer 2 verschillende accounts","เลือก 2 บัญชีที่แตกต่างกัน","Vyberte 2 různé účty","2 টি পৃথক অ্যাকাউন্ট নির্বাচন করুন","Pilih 2 akun yang berbeda","2 مختلف اکاؤنٹس منتخب کریں","2 వేర్వేరు ఖాతాలను ఎంచుకోండి","2 भिन्न खाती निवडा","2 வெவ்வேறு கணக்குகளைத் தேர்ந்தெடுக்கவும்","2 વિવિધ એકાઉન્ટ્સ પસંદ કરો","Виберіть 2 різних облікових записів","Piliin ang 2 iba't ibang mga account","Pilih 2 akaun yang berbeza","Selectați 2 conturi diferite","Válasszon 2 különböző fiókot","Επιλέξτε 2 διαφορετικούς λογαριασμούς","Välj 2 olika konton","Vælg 2 forskellige konti","Velg 2 forskjellige kontoer","Valitse 2 erilaista tiliä","בחר 2 חשבונות שונים","2 حساب مختلف را انتخاب کنید","2 വ്യത്യസ്ത അക്കൗണ്ടുകൾ തിരഞ്ഞെടുക്കുക","Изаберите 2 различита рачуна","Chagua akaunti 2 tofauti","Изберете 2 различни акаунта","選擇2個不同的帳戶" "include-amount","Include Amount","Inclure le montant","Incluir la cantidad","包括金额","राशि शामिल करें","تشمل المبلغ","Inclua o valor","","Включить сумму","金額を含めます","Betrag einschließen","금액을 포함하십시오","Miktar dahil","Includere l'importo","Bao gồm số tiền","Uwzględnij kwotę","BETREKKING VAN BEDRIJF","รวมจำนวนเงิน","Zahrnout částku","পরিমাণ অন্তর্ভুক্ত করুন","Termasuk jumlah","رقم شامل کریں","మొత్తాన్ని చేర్చండి","रक्कम समाविष्ट करा","அளவு அடங்கும்","સમાવિષ્ટ રકમ","Включити суму","Isama ang halaga","Termasuk jumlah","Include suma","Tartalmazza az összeget","Περιλαμβάνει το ποσό","Inkludera belopp","Inkluderer beløb","Inkluder beløp","Sisällytä määrä","כלול סכום","شامل مقدار","തുക ഉൾപ്പെടുത്തുക","Укључите износ","Ni pamoja na kiasi","Включете сума","包括金額" @@ -1060,4 +1060,10 @@ "failed-to-preview-image","Failed to Preview Image","Échec de l'image de prévisualisation","No se pudo obtener una vista previa de imagen","无法预览图像","छवि का पूर्वावलोकन करने में विफल","فشل في معاينة الصورة","Falha ao visualizar a imagem","","Не удалось просмотреть изображение","画像のプレビューに失敗しました","Die Vorschau von Bild versäumt es","이미지를 미리 보지 못했습니다","Resmi önizlemedi","Impossibile in anteprima immagine","Không thể Xem trước Hình ảnh","Nie udało się podglądu obrazu","Kan de afbeelding niet bekijken","ไม่สามารถดูตัวอย่างภาพได้","Nepodařilo se k náhledu obrázku","চিত্রের পূর্বরূপ দেখতে ব্যর্থ","Gagal Pratinjau Gambar","تصویر کا پیش نظارہ کرنے میں ناکام","చిత్రాన్ని పరిదృశ్యం చేయడంలో విఫలమైంది","प्रतिमेचे पूर्वावलोकन करण्यात अयशस्वी","படத்தை முன்னோட்டமிடுவதில் தோல்வி","છબીનું પૂર્વાવલોકન કરવામાં નિષ્ફળ","Не вдалося переглянути зображення","Nabigong i -preview ang imahe","Gagal Pratonton Imej","Nu a reușit să previzualizeze imaginea","Nem sikerült megtekinteni a képet","Αποτυχία προεπισκόπησης της εικόνας","Det gick inte att förhandsgranska bilden","Kunne ikke forhåndsvise billedet","Kunne ikke forhåndsvise image","Kuvan esikatselu epäonnistui","תצוגה מקדימה של תמונה נכשלה","پیش نمایش تصویر انجام نشد","ചിത്രം തിരയുന്നതിൽ പരാജയപ്പെട്ടു","Није успело да прегледате слику","Imeshindwa hakiki picha","Неуспешно визуализация на изображението","無法預覽圖像" "open-link","Open Link","Ouvrir le lien","Enlace abierto","打开链接","खुला लिंक","افتح الرابط","Link aberto","","Открыть ссылку","オープンリンク","Verbindung öffnen","열기 링크","Linki aç","Link aperto","Mở Liên kết","Otwórz link","Open link","เปิดลิ้งค์","Otevřít odkaz","খোলা সংযুক্তি","Buka tautan","لنک کھولیں","లింక్ తెరవండి","ओपन लिंक","திறந்த இணைப்பு","ખુલ્લી કડી","Відкрити посилання","Bukas na link","Pautan Terbuka","Deschide link-ul","Link megnyitása","Ανοίξτε σύνδεσμο","Öppen länk","Åben link","Åpen lenke","Avaa linkki","קישור פתוח","لینک باز","ലിങ്ക് തുറക്കുക","Отвори линк","Kiunga cha wazi","Отвори линк","打開鏈接" "category-not-selected","Category Not Selected","Catégorie non sélectionnée","Categoría no seleccionada","类别未选择","श्रेणी का चयन नहीं किया गया","الفئة غير محددة","Categoria não selecionada","","Категория не выбрана","選択されていないカテゴリ","Kategorie nicht ausgewählt","범주가 선택되지 않았습니다","Kategori seçilmedi","Categoria non selezionata","Thể loại không được chọn","Kategoria nie została wybrana","Categorie niet geselecteerd","หมวดหมู่ไม่ได้เลือก","Kategorie není vybrána","বিভাগ নির্বাচিত নয়","Kategori tidak dipilih","زمرہ منتخب نہیں کیا گیا ہے","వర్గం ఎంచుకోబడలేదు","श्रेणी निवडलेली नाही","வகை தேர்ந்தெடுக்கப்படவில்லை","કેટેગરી પસંદ નથી","Категорія не вибрана","Hindi napili ang kategorya","Kategori tidak dipilih","Categoria nu a fost selectată","A kategória nem választva","Η κατηγορία δεν έχει επιλεγεί","Kategori är inte vald","Kategori ikke valgt","Kategori ikke valgt","Luokkaa ei ole valittu","קטגוריה לא נבחרה","دسته بندی انتخاب نشده است","വിഭാഗം തിരഞ്ഞെടുത്തിട്ടില്ല","Категорија Није изабрана","Jamii haijachaguliwa","Категория не е избрана","類別未選擇" -"all-transactions-require-a-category","All transactions require a category","Toutes les transactions nécessitent une catégorie","Todas las transacciones requieren una categoría","所有交易都需要类别","सभी लेनदेन को एक श्रेणी की आवश्यकता होती है","تتطلب جميع المعاملات فئة","Todas as transações requerem uma categoria","","Все транзакции требуют категории","すべてのトランザクションにはカテゴリが必要です","Alle Transaktionen erfordern eine Kategorie","모든 거래에는 범주가 필요합니다","Tüm işlemler bir kategori gerektirir","Tutte le transazioni richiedono una categoria","Tất cả các giao dịch yêu cầu một danh mục","Wszystkie transakcje wymagają kategorii","Alle transacties vereisen een categorie","ธุรกรรมทั้งหมดต้องการหมวดหมู่","Všechny transakce vyžadují kategorii","সমস্ত লেনদেনের জন্য একটি বিভাগ প্রয়োজন","Semua transaksi membutuhkan kategori","تمام لین دین میں ایک زمرے کی ضرورت ہوتی ہے","అన్ని లావాదేవీలకు ఒక వర్గం అవసరం","सर्व व्यवहारांना श्रेणी आवश्यक आहे","அனைத்து பரிவர்த்தனைகளுக்கும் ஒரு வகை தேவை","બધા વ્યવહારોને કેટેગરીની જરૂર હોય છે","Усі транзакції потребують категорії","Ang lahat ng mga transaksyon ay nangangailangan ng isang kategorya","Semua urus niaga memerlukan kategori","Toate tranzacțiile necesită o categorie","Minden tranzakcióhoz kategóriát igényel","Όλες οι συναλλαγές απαιτούν κατηγορία","Alla transaktioner kräver en kategori","Alle transaktioner kræver en kategori","Alle transaksjoner krever en kategori","Kaikki tapahtumat vaativat luokkaa","כל העסקאות דורשות קטגוריה","همه معاملات به یک دسته نیاز دارند","എല്ലാ ഇടപാടുകളും ഒരു വിഭാഗം ആവശ്യമാണ്","Све трансакције захтевају категорију","Shughuli zote zinahitaji kitengo","Всички транзакции изискват категория","所有交易都需要類別" \ No newline at end of file +"all-transactions-require-a-category","All transactions require a category","Toutes les transactions nécessitent une catégorie","Todas las transacciones requieren una categoría","所有交易都需要类别","सभी लेनदेन को एक श्रेणी की आवश्यकता होती है","تتطلب جميع المعاملات فئة","Todas as transações requerem uma categoria","","Все транзакции требуют категории","すべてのトランザクションにはカテゴリが必要です","Alle Transaktionen erfordern eine Kategorie","모든 거래에는 범주가 필요합니다","Tüm işlemler bir kategori gerektirir","Tutte le transazioni richiedono una categoria","Tất cả các giao dịch yêu cầu một danh mục","Wszystkie transakcje wymagają kategorii","Alle transacties vereisen een categorie","ธุรกรรมทั้งหมดต้องการหมวดหมู่","Všechny transakce vyžadují kategorii","সমস্ত লেনদেনের জন্য একটি বিভাগ প্রয়োজন","Semua transaksi membutuhkan kategori","تمام لین دین میں ایک زمرے کی ضرورت ہوتی ہے","అన్ని లావాదేవీలకు ఒక వర్గం అవసరం","सर्व व्यवहारांना श्रेणी आवश्यक आहे","அனைத்து பரிவர்த்தனைகளுக்கும் ஒரு வகை தேவை","બધા વ્યવહારોને કેટેગરીની જરૂર હોય છે","Усі транзакції потребують категорії","Ang lahat ng mga transaksyon ay nangangailangan ng isang kategorya","Semua urus niaga memerlukan kategori","Toate tranzacțiile necesită o categorie","Minden tranzakcióhoz kategóriát igényel","Όλες οι συναλλαγές απαιτούν κατηγορία","Alla transaktioner kräver en kategori","Alle transaktioner kræver en kategori","Alle transaksjoner krever en kategori","Kaikki tapahtumat vaativat luokkaa","כל העסקאות דורשות קטגוריה","همه معاملات به یک دسته نیاز دارند","എല്ലാ ഇടപാടുകളും ഒരു വിഭാഗം ആവശ്യമാണ്","Све трансакције захтевају категорију","Shughuli zote zinahitaji kitengo","Всички транзакции изискват категория","所有交易都需要類別" +"total-offset","Total Offset","Décalage total","Compensación total","总偏移","कुल ऑफसेट","إزاحة الكلية","Offset total","","Общее смещение","トータルオフセット","Gesamtversatz","총 오프셋","Toplam ofset","Offset totale","Tổng số bù","Całkowite przesunięcie","Totale offset","ชดเชยทั้งหมด","Celkový posun","মোট অফসেট","Total offset","کل آفسیٹ","మొత్తం ఆఫ్‌సెట్","एकूण ऑफसेट","மொத்த ஆஃப்செட்","કુલ -ફસેટ","Загальний зміщення","Kabuuang offset","Jumlah Offset","Offset total","Teljes eltolás","Συνολική μετατόπιση","Total offset","Total offset","Total forskyvning","Kokonaispuolinen","קיזוז מוחלט","کل","ആകെ ഓഫ്സെറ്റ്","Укупно оффсет","Jumla ya kukabiliana","Общо компенсиране","總偏移" +"total-offset-description","Offset the total of the loan by entering an amount. Useful if the loan has accumulated interest or other unaccounted for costs increasing the total.","Compenser le total du prêt en entrant un montant. Utile si le prêt a accumulé des intérêts ou d'autres personnes non comptabilisées pour augmenter le total.","Compensar el total del préstamo ingresando un monto. Útil si el préstamo ha acumulado intereses u otros no contabilizados para los costos que aumentan el total.","通过输入金额来抵消贷款的总计。如果贷款累积了利息或其他未征收的费用,则有用。","एक राशि में प्रवेश करके ऋण की कुल ऑफसेट करें। उपयोगी यदि ऋण कुल बढ़ाने की लागत के लिए ब्याज या अन्य बेहिसाब है।","تعويض إجمالي القرض عن طريق إدخال مبلغ. مفيد إذا كان القرض قد جمع الفوائد أو غيرها من العواصلة للتكاليف التي تزيد من المجموع.","Compensando o total do empréstimo, inserindo um valor. Útil se o empréstimo acumular juros ou outro não contabilizado para custos, aumentando o total.","","Сметить общую сумму кредита, введя сумму. Полезно, если кредит накапливал проценты или другие недоступные за расходы, увеличивающие общую сумму.","金額を入力することにより、ローンの合計を相殺します。ローンが利息またはその他の計算を累積した場合、合計を増加させた場合に役立ちます。","Setzen Sie die Summe des Darlehens aus, indem Sie einen Betrag eingeben. Nützlich, wenn das Darlehen Zinsen oder andere nicht berücksichtige Kosten angesammelt hat, um die Gesamtsumme zu erhöhen.","금액을 입력하여 대출의 총계를 상쇄하십시오. 대출이이자를 축적했거나 총계가 증가하는 비용에 대한 기타 계산되지 않은 경우 유용합니다.","Bir tutar girerek kredinin toplamını dengeleyin. Kredi, toplamı artıran maliyetler için faiz birikmiş veya başka bir hesaplanmamışsa kullanışlıdır.","Offsettare il totale del prestito inserendo un importo. Utile se il prestito ha accumulato interessi o altri non contabilizzati per i costi in aumento del totale.","Bù đắp tổng số khoản vay bằng cách nhập một số tiền. Hữu ích nếu khoản vay đã tích lũy lãi hoặc không được tính cho chi phí tăng tổng số.","Zrównuj sumę pożyczki, wprowadzając kwotę. Przydatne, jeśli pożyczka zgromadziła odsetki lub inne nieznane za zwiększenie kosztów.","Compenseer het totaal van de lening door een bedrag in te voeren. Handig als de lening rente of andere niet -verantwoord heeft verzameld voor kosten die het totaal verhogen.","ชดเชยยอดรวมของเงินกู้โดยป้อนจำนวนเงิน มีประโยชน์หากเงินกู้มีดอกเบี้ยสะสมหรือไม่ได้รับเงินอื่น ๆ สำหรับค่าใช้จ่ายที่เพิ่มขึ้นทั้งหมด","Kompenzovat celkový počet půjček zadáním částky. Užitečné, pokud půjčka nahromadila úrok nebo jiné nezúčtované za náklady na zvýšení celkového počtu.","একটি পরিমাণ প্রবেশ করে মোট loan ণের অফসেট করুন। যদি loan ণটি মোট বাড়ানোর জন্য ব্যয় বা অন্য কোনও অ্যাকাউন্টে জমা থাকে তবে তা কার্যকর।","Mengimbangi total pinjaman dengan memasukkan jumlah. Berguna jika pinjaman telah mengumpulkan bunga atau biaya lain yang tidak terhitung untuk meningkatkan total.","کسی رقم میں داخل ہوکر قرض کی کل کو آفسیٹ کریں۔ مفید ہے اگر قرض میں سود یا دیگر غیر حساب کتاب جمع ہوچکے ہیں۔","మొత్తాన్ని నమోదు చేయడం ద్వారా రుణం మొత్తాన్ని ఆఫ్‌సెట్ చేయండి. రుణం వడ్డీని సేకరించినట్లయితే లేదా మొత్తాన్ని పెంచే ఖర్చుల కోసం లెక్కించబడకపోతే ఉపయోగపడుతుంది.","रक्कम प्रविष्ट करून एकूण कर्जाची ऑफसेट करा. जर कर्जात एकूण वाढ होणार्‍या खर्चासाठी व्याज जमा झाले असेल किंवा इतर अनुरुप असेल तर उपयुक्त.","ஒரு தொகையை உள்ளிடுவதன் மூலம் கடனின் மொத்தத்தை ஈடுசெய்யவும். மொத்தம் அதிகரிக்கும் செலவுகளுக்கு கடன் வட்டி அல்லது கணக்கிடப்படாத பிற இருந்தால் பயனுள்ளதாக இருந்தால் பயனுள்ளதாக இருக்கும்.","રકમ દાખલ કરીને લોનની કુલને સરભર કરો. ઉપયોગી જો લોન કુલ વધતા ખર્ચ માટે વ્યાજ અથવા અન્ય બિનહિસાબી સંચિત કરે છે.","Компенсуйте загальну суму позики, ввівши суму. Корисно, якщо позика накопичила відсотки або інші не враховані на витрати, збільшуючи загальну суму.","I -offset ang kabuuan ng pautang sa pamamagitan ng pagpasok ng isang halaga. Kapaki -pakinabang kung ang pautang ay naipon ang interes o iba pang hindi nabilang para sa mga gastos sa pagtaas ng kabuuan.","Mengimbangi jumlah pinjaman dengan memasukkan jumlah. Berguna jika pinjaman telah mengumpulkan faedah atau yang lain yang tidak dapat dipertanggungjawabkan untuk kos yang semakin meningkat.","Compensați totalul împrumutului prin introducerea unei sume. Util dacă împrumutul a acumulat dobândă sau alte necontractate pentru costurile crescând totalul.","A hitel összegének összegének megadásával történő eltolódása. Hasznos, ha a hitel felhalmozódott kamatba vagy egyéb, a költségek növelésére nem számoltak be.","Αντιστάθμιση του συνόλου του δανείου εισάγοντας ένα ποσό. Χρήσιμο εάν το δάνειο έχει συσσωρεύσει τόκους ή άλλο μη καταγεγραμμένο για το κόστος αυξάνοντας το σύνολο.","Kompensera summan av lånet genom att ange ett belopp. Användbart om lånet har samlat ränta eller andra som inte redovisas för kostnader som ökar summan.","Offset det samlede beløb ved at indtaste et beløb. Nyttigt, hvis lånet har akkumuleret renter eller andre ikke -anførte for omkostninger, der øger det samlede antal.","Utlignet totalen av lånet ved å legge inn et beløp. Nyttig hvis lånet har akkumulert renter eller annen ikke -regnskap for kostnadene som øker totalen.","Korvaa lainan kokonaismäärä syöttämällä summa. Hyödyllinen, jos laina on kertynyt korkoon tai muuhun kirjaamattomaan kokonaiskustannusten kustannuksiin.","קיזוז סך ההלוואה על ידי כניסה לסכום. שימושי אם ההלוואה צברה ריבית או אחרים שלא הוסברו על עלויות הגדלת הסכום.","با وارد کردن یک مبلغ ، کل وام را جبران کنید. مفید است اگر وام برای افزایش هزینه ها ، سود یا سایر موارد غیرقابل حساب را جمع کند.","ഒരു തുക നൽകി വായ്പയുടെ ആകെത്തുക. മൊത്തം വർദ്ധിച്ചതിന് വായ്പയ്ക്ക് പലിശ അല്ലെങ്കിൽ മറ്റ് കണക്റ്റുചെയ്തിട്ടുണ്ടെങ്കിൽ ഉപയോഗപ്രദമാണ്.","Надокнадити укупно зајма уношењем износа. Корисно ако је зајам акумулирао камате или друге необрађене за трошкове који повећавају укупно.","Ondoa jumla ya mkopo kwa kuingia kiasi. Inatumika ikiwa mkopo umekusanya riba au nyingine isiyo na hesabu kwa gharama inayoongeza jumla.","Компенсиране на общия брой на заема, като влезете в сума. Полезен, ако заемът е натрупал лихва или други неизпълнени за увеличаване на разходите.","通過輸入金額來抵消貸款的總計。如果貸款累積了利息或其他未徵收的費用,則有用。" +"advanced-automation","Advanced Automation","Automatisation avancée","Automatización avanzada","高级自动化","उन्नत स्वचालन","الأتمتة المتقدمة","Automação avançada","","Усовершенствованная автоматизация","高度な自動化","Erweiterte Automatisierung","고급 자동화","Gelişmiş Otomasyon","Automazione avanzata","Tự động hóa nâng cao","Zaawansowana automatyzacja","Geavanceerde automatisering","ระบบอัตโนมัติขั้นสูง","Pokročilá automatizace","উন্নত অটোমেশন","Otomatisasi Lanjutan","اعلی درجے کی آٹومیشن","అధునాతన ఆటోమేషన్","प्रगत ऑटोमेशन","மேம்பட்ட ஆட்டோமேஷன்","અદ્યતન સ્વચાલિત","Вдосконалена автоматизація","Advanced na automation","Automasi Lanjutan","Automatizare avansată","Fejlett automatizálás","Προηγμένη αυτοματοποίηση","Avancerad automatisering","Avanceret automatisering","Avansert automatisering","Edistynyt automaatio","אוטומציה מתקדמת","اتوماسیون پیشرفته","വിപുലമായ ഓട്ടോമേഷൻ","Напредна аутоматизација","Otomatiki ya hali ya juu","Разширена автоматизация","高級自動化" +"deep-linking","App Links","Liens d'application","Enlaces de aplicaciones","应用链接","ऐप लिंक","روابط التطبيق","Links de aplicativos","","Приложения ссылки","アプリリンク","App -Links","앱 링크","Uygulama bağlantıları","Collegamenti app","Liên kết ứng dụng","Linki aplikacji","App -links","ลิงค์แอพ","Odkazy na aplikace","অ্যাপ্লিকেশন লিঙ্ক","Tautan aplikasi","ایپ لنکس","అనువర్తన లింకులు","अ‍ॅप दुवे","பயன்பாட்டு இணைப்புகள்","એપ્લિકેશન લિંક્સ","Посилання додатків","Mga Link ng App","Pautan aplikasi","Link -uri pentru aplicații","App linkek","Σύνδεσμοι εφαρμογών","Applänkar","App -links","App lenker","Sovelluslinkit","קישורי אפליקציה","پیوندهای برنامه","അപ്ലിക്കേഷൻ ലിങ്കുകൾ","Апп Линкови","Viungo vya programu","Връзки на приложението","應用鏈接" +"deep-linking-description","Automate the insertion of transactions using app URLs. Tap to learn more and view the documentation.","Automatisez l'insertion des transactions à l'aide des URL de l'application. Appuyez pour en savoir plus et affichez la documentation.","Automatice la inserción de transacciones utilizando URL de aplicaciones. Toque para obtener más información y ver la documentación.","使用应用程序URL自动插入交易。点击以了解更多信息并查看文档。","APP URL का उपयोग करके लेनदेन के सम्मिलन को स्वचालित करें। अधिक जानने के लिए टैप करें और प्रलेखन देखें।","أتمتة إدراج المعاملات باستخدام عناوين URL APP. اضغط لمعرفة المزيد وعرض الوثائق.","Automatize a inserção de transações usando URLs de aplicativos. Toque para saber mais e ver a documentação.","","Автоматизируйте вставку транзакций с помощью URL -адресов APP. Нажмите, чтобы узнать больше и просмотреть документацию.","アプリURLを使用してトランザクションの挿入を自動化します。タップして詳細を確認し、ドキュメントを表示します。","Automatisieren Sie das Insertion von Transaktionen mithilfe von App -URLs. Tippen Sie auf, um mehr zu erfahren und die Dokumentation anzusehen.","앱 URL을 사용하여 트랜잭션 삽입을 자동화하십시오. 자세한 내용을 배우고 문서를 봅니다.","Uygulama URL'lerini kullanarak işlemlerin eklenmesini otomatikleştirin. Daha fazla bilgi edinmek ve belgeleri görüntülemek için dokunun.","Automatizzare l'inserimento delle transazioni utilizzando gli URL dell'app. Tocca per saperne di più e visualizza la documentazione.","Tự động hóa việc chèn các giao dịch bằng URL APP. Nhấn để tìm hiểu thêm và xem tài liệu.","Zautomatyzuj wprowadzenie transakcji za pomocą adresów URL aplikacji. Stuknij, aby dowiedzieć się więcej i wyświetlić dokumentację.","Automatiseer het invoegen van transacties met behulp van APP -URL's. Tik op voor meer informatie en bekijk de documentatie.","ทำการแทรกธุรกรรมโดยอัตโนมัติโดยใช้ URL แอพ แตะเพื่อเรียนรู้เพิ่มเติมและดูเอกสาร","Automatizujte vložení transakcí pomocí URL APP. Klepnutím se dozvíte více a zobrazíte dokumentaci.","অ্যাপ্লিকেশন ইউআরএল ব্যবহার করে লেনদেনের সন্নিবেশ স্বয়ংক্রিয় করুন। আরও জানতে এবং ডকুমেন্টেশন দেখতে আলতো চাপুন।","Otomatiskan penyisipan transaksi menggunakan URL aplikasi. Ketuk untuk mempelajari lebih lanjut dan melihat dokumentasi.","ایپ یو آر ایل کا استعمال کرتے ہوئے لین دین کے اندراج کو خود کار بنائیں۔ مزید جاننے کے لئے ٹیپ کریں اور دستاویزات کو دیکھیں۔","అనువర్తన URL లను ఉపయోగించి లావాదేవీలను చొప్పించడాన్ని ఆటోమేట్ చేయండి. మరింత తెలుసుకోవడానికి నొక్కండి మరియు డాక్యుమెంటేషన్ చూడటానికి.","अ‍ॅप URL वापरून व्यवहार समाविष्ट करणे स्वयंचलित करा. अधिक जाणून घेण्यासाठी टॅप करा आणि दस्तऐवजीकरण पाहा.","பயன்பாட்டு URL களைப் பயன்படுத்தி பரிவர்த்தனைகளைச் செருகுவதை தானியக்கமாக்குங்கள். மேலும் அறியவும் ஆவணங்களைக் காணவும் தட்டவும்.","એપ્લિકેશન URL નો ઉપયોગ કરીને ટ્રાન્ઝેક્શનના નિવેશને સ્વચાલિત કરો. વધુ જાણવા અને દસ્તાવેજીકરણ જોવા માટે ટેપ કરો.","Автоматизація вставки транзакцій за допомогою URL -адрес додатків. Торкніться, щоб дізнатися більше та переглянути документацію.","I -automate ang pagpasok ng mga transaksyon gamit ang mga URL ng APP. Tapikin upang malaman ang higit pa at tingnan ang dokumentasyon.","Automatikkan penyisipan urus niaga menggunakan URL aplikasi. Ketik untuk mengetahui lebih lanjut dan lihat dokumentasi.","Automatizați inserarea tranzacțiilor folosind adresele URL ale aplicației. Atingeți pentru a afla mai multe și vizualizați documentația.","Az APP URL -ek segítségével automatizálja a tranzakciók beillesztését. Érintse meg a további információkat, és tekintse meg a dokumentációt.","Αυτοματοποιήστε την εισαγωγή συναλλαγών χρησιμοποιώντας διευθύνσεις URL εφαρμογών. Πατήστε για να μάθετε περισσότερα και να δείτε την τεκμηρίωση.","Automatisera införandet av transaktioner med app -URL: er. Tryck för att lära dig mer och se dokumentationen.","Automatiser indsættelsen af ​​transaktioner ved hjælp af app -URL'er. Tryk på for at lære mere og se dokumentationen.","Automatiser innsetting av transaksjoner ved hjelp av APP -URL -er. Trykk for å lære mer og se dokumentasjonen.","Automatisoi tapahtumien asettaminen sovellus -URL -osoitteiden avulla. Napauta saadaksesi lisätietoja ja tarkastella asiakirjaa.","אוטומציה של החדרת עסקאות באמצעות כתובות כתובות אפליקציות. הקש כדי ללמוד עוד וצפה בתיעוד.","درج معاملات با استفاده از URL های برنامه. برای یادگیری بیشتر و مشاهده مستندات ضربه بزنید.","അപ്ലിക്കേഷൻ URL- കൾ ഉപയോഗിച്ച് ഇടപാടുകളുടെ ഉൾപ്പെടുത്തൽ യാന്ത്രികമാക്കുക. കൂടുതലറിയാൻ ടാപ്പുചെയ്ത് ഡോക്യുമെന്റേഷൻ കാണുക.","Аутоматизирајте уметање трансакција помоћу УРЛ-ова апликација. Тапните да бисте сазнали више и погледали документацију.","Ondoa uingizaji wa shughuli kwa kutumia URL za programu. Gonga ili ujifunze zaidi na uangalie nyaraka.","Автоматизирайте вмъкването на транзакции с помощта на URL адреси на APP. Докоснете, за да научите повече и да видите документацията.","使用應用程序URL自動插入交易。點擊以了解更多信息並查看文檔。" +"added-transaction","Added Transaction","Transaction supplémentaire","Transacción agregada","增加了交易","जोड़ा गया लेनदेन","معاملة أضيفت","Transação adicionada","","Добавлена ​​транзакция","トランザクションを追加しました","Transaktion hinzugefügt","트랜잭션이 추가되었습니다","Eklenen İşlem","Transazione aggiunta","Đã thêm giao dịch","Dodano transakcję","Toegevoegde transactie","เพิ่มธุรกรรม","Přidaná transakce","যুক্ত লেনদেন","Ditambahkan transaksi","شامل ٹرانزیکشن","లావాదేవీ జోడించబడింది","जोडलेला व्यवहार","பரிவர்த்தனை சேர்க்கப்பட்டது","ઉમેરાયેલ લેવડદેવડ","Додана транзакція","Nagdagdag ng transaksyon","Menambah transaksi","Tranzacție adăugată","Hozzáadott tranzakció","Προστιθέμενη συναλλαγή","Tillagd transaktion","Tilføjet transaktion","Lagt til transaksjon","Lisätty tapahtuma","הוסיפה עסקה","معامله اضافه شده","ഇടപാട് ചേർത്തു","Додана трансакција","Shughuli iliyoongezwa","Добавена транзакция","增加了交易" \ No newline at end of file diff --git a/budget/lib/database/tables.dart b/budget/lib/database/tables.dart index d2bdbe76..80672a7c 100644 --- a/budget/lib/database/tables.dart +++ b/budget/lib/database/tables.dart @@ -2654,6 +2654,12 @@ class FinanceDatabase extends _$FinanceDatabase { companionToInsert = companionToInsert.copyWith(objectivePk: Value.absent()); + // Objective loans should always have offset of 0 when inserted for the first time + if (objective.type == ObjectiveType.loan && + getIsDifferenceOnlyLoan(objective) == false) { + companionToInsert = companionToInsert.copyWith(amount: Value(0)); + } + // If homepage section disabled and user added an objective, enable homepage section // if (appStateSettings[objective.type == ObjectiveType.goal // ? "showObjectives" @@ -4050,10 +4056,11 @@ class FinanceDatabase extends _$FinanceDatabase { } // getIsDifferenceOnlyLoan(objective) + // This defines what a difference only loan can be Expression getIsDifferenceOnlyLoanFromTable($ObjectivesTable o) { if (appStateSettings["longTermLoansDifferenceFeature"] == false) return Constant(false); - return o.amount.equals(0) & o.type.equals(ObjectiveType.loan.index); + return o.amount.equals(-1) & o.type.equals(ObjectiveType.loan.index); } Future getPersonsLongTermDifferenceLoanInstance( @@ -6354,6 +6361,7 @@ class FinanceDatabase extends _$FinanceDatabase { count: (acc?.count ?? 0) + (val?.count ?? 0)))); } + // Related query: watchTotalWithCountOfCreditDebtLongTermLoansOffset Stream watchTotalWithCountOfCreditDebt({ required AllWallets allWallets, required bool? isCredit, @@ -6397,18 +6405,25 @@ class FinanceDatabase extends _$FinanceDatabase { forcedDateTimeRange: forcedDateTimeRange, )) & transactions.paid.equals(true) & + (transactions.objectiveLoanFk.isNull() | + objectives.archived.equals(false)) & + (selectedTab == 0 && searchString != null + ? transactions.objectiveLoanFk.isNull() + : selectedTab == 1 && searchString != null + ? transactions.objectiveLoanFk.isNotNull() + : Constant(true)) & (selectedTab == 0 || selectedTab == null || searchString == null || searchString == "" - ? onlyShowTransactionBasedOnSearchQuery( + ? (onlyShowTransactionBasedOnSearchQuery( transactions, searchString, withCategories: true, - joinedWithSubcategoriesTable: subCategories) + joinedWithSubcategoriesTable: subCategories)) // Only apply this tab specific total when searching - : (objectives.name + : ((objectives.name .collate(Collate.noCase) - .like("%" + (searchString ?? "") + "%"))) & + .like("%" + (searchString ?? "") + "%")))) & transactions.walletFk.equals(wallet.walletPk) & (isCredit == null ? transactions.type @@ -6426,12 +6441,67 @@ class FinanceDatabase extends _$FinanceDatabase { (transactions.objectiveLoanFk.isNotNull() & objectives.income.equals(false))), ); - mergedStreams.add(query - .map((row) => TotalWithCount( - total: (row.read(totalAmt) ?? 0) * - (amountRatioToPrimaryCurrency(allWallets, wallet.currency)), - count: row.read(totalCount) ?? 0)) - .watchSingle()); + mergedStreams.add(query.map((row) { + // print(row.rawData.data); + return TotalWithCount( + total: (row.read(totalAmt) ?? 0) * + (amountRatioToPrimaryCurrency(allWallets, wallet.currency)), + count: row.read(totalCount) ?? 0); + }).watchSingle()); + } + return totalTotalWithCountStream(mergedStreams); + } + + // Related query: watchTotalWithCountOfCreditDebt + Stream watchTotalWithCountOfCreditDebtLongTermLoansOffset({ + required AllWallets allWallets, + required bool? isCredit, + String? searchString, + bool followCustomPeriodCycle = false, + String? cycleSettingsExtension = "", + SearchFilters? searchFilters, + DateTimeRange? forcedDateTimeRange, + // selectedTab == 0 : one-time + // selectedTab == 1 : long-term + // Only apply selectedTab when searching + required int? selectedTab, + }) { + List> mergedStreams = []; + for (TransactionWallet wallet in allWallets.list) { + // Add the total offsets of objective amounts + Expression totalAmtObjective = objectives.amount.sum(); + Expression objectiveIncome = objectives.income; + final queryTotalObjectiveAmountOffset = selectOnly(objectives) + ..addColumns([totalAmtObjective, objectiveIncome]) + ..where(objectives.archived.equals(false) & + objectives.type.equals(ObjectiveType.loan.index) & + objectives.walletFk.equals(wallet.walletPk) & + getIsDifferenceOnlyLoanFromTable(objectives).equals(false) & + (selectedTab == 0 && searchString != null + ? Constant(false) + : Constant(true)) & + (selectedTab == 0 || + selectedTab == null || + searchString == null || + searchString == "" + ? Constant(true) + // Only apply this tab specific total when searching + : (objectives.name + .collate(Collate.noCase) + .like("%" + (searchString ?? "") + "%"))) & + (isCredit == null + ? Constant(true) + : isCredit + ? objectives.income.equals(true) + : objectives.income.equals(false))); + mergedStreams.add(queryTotalObjectiveAmountOffset.map((row) { + // print(row.rawData.data); + return TotalWithCount( + total: (row.read(totalAmtObjective) ?? 0).abs() * + ((row.read(objectiveIncome) ?? true) ? -1 : 1) * + (amountRatioToPrimaryCurrency(allWallets, wallet.currency)), + count: 0); + }).watchSingle()); } return totalTotalWithCountStream(mergedStreams); } diff --git a/budget/lib/pages/aboutPage.dart b/budget/lib/pages/aboutPage.dart index 80455ffd..36ca99e3 100644 --- a/budget/lib/pages/aboutPage.dart +++ b/budget/lib/pages/aboutPage.dart @@ -20,6 +20,7 @@ import 'package:budget/widgets/showChangelog.dart'; import 'package:budget/widgets/tappable.dart'; import 'package:budget/widgets/textWidgets.dart'; import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:budget/colors.dart'; @@ -430,7 +431,41 @@ class AboutPage extends StatelessWidget { ), ), ), - SizedBox(height: 20), + SizedBox(height: 10), + if (getPlatform(ignoreEmulation: true) == PlatformOS.isAndroid || + kIsWeb) + Padding( + padding: const EdgeInsets.only(top: 10, bottom: 10), + child: HorizontalBreakAbove( + child: Column( + children: [ + SizedBox(height: 10), + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 15, vertical: 7), + child: Center( + child: TextFont( + text: "advanced-automation".tr(), + fontSize: 20, + fontWeight: FontWeight.bold, + textAlign: TextAlign.center, + maxLines: 5, + ), + ), + ), + AboutInfoBox( + title: "deep-linking".tr(), + showLink: false, + link: + "https://github.com/jameskokoska/Cashew?tab=readme-ov-file#app-links", + list: [ + "deep-linking-description".tr(), + ], + ), + ], + )), + ), + SizedBox(height: 10), HorizontalBreak(), SizedBox(height: 10), Padding( @@ -621,6 +656,7 @@ class AboutInfoBox extends StatelessWidget { this.list, this.color, this.padding, + this.showLink = true, }) : super(key: key); final String title; @@ -628,6 +664,7 @@ class AboutInfoBox extends StatelessWidget { final List? list; final Color? color; final EdgeInsets? padding; + final bool showLink; @override Widget build(BuildContext context) { @@ -660,12 +697,13 @@ class AboutInfoBox extends StatelessWidget { maxLines: 5, ), SizedBox(height: 6), - if (link != null) + if (link != null && showLink) TextFont( text: link ?? "", fontSize: 14, textAlign: TextAlign.center, textColor: getColor(context, "textLight"), + maxLines: 1, ), for (String item in list ?? []) TextFont( @@ -673,6 +711,7 @@ class AboutInfoBox extends StatelessWidget { fontSize: 14, textAlign: TextAlign.center, textColor: getColor(context, "textLight"), + maxLines: 10, ), ], ), diff --git a/budget/lib/pages/addObjectivePage.dart b/budget/lib/pages/addObjectivePage.dart index d8b6a5d3..24d61c20 100644 --- a/budget/lib/pages/addObjectivePage.dart +++ b/budget/lib/pages/addObjectivePage.dart @@ -7,6 +7,7 @@ import 'package:budget/pages/addTransactionPage.dart'; import 'package:budget/pages/addWalletPage.dart'; import 'package:budget/pages/editObjectivesPage.dart'; import 'package:budget/pages/editWalletsPage.dart'; +import 'package:budget/pages/objectivesListPage.dart'; import 'package:budget/pages/premiumPage.dart'; import 'package:budget/struct/currencyFunctions.dart'; import 'package:budget/struct/databaseGlobal.dart'; @@ -146,13 +147,17 @@ class _AddObjectivePageState extends State void setSelectedIncome(bool income) { setState(() { selectedIncome = income; + if (isDifferenceOnlyLoan) { + selectedAmount = 0; + } isDifferenceOnlyLoan = false; }); determineBottomButton(); return; } - Future selectAmount(BuildContext context) async { + Future selectAmount(BuildContext context, + {bool allowZero = false}) async { openBottomSheet( context, fullSnap: true, @@ -161,6 +166,7 @@ class _AddObjectivePageState extends State underTitleSpace: false, hasPadding: false, child: SelectAmount( + allowZero: allowZero, hideWalletPickerIfOneCurrency: true, onlyShowCurrencyIcon: true, amountPassed: selectedAmount.toString(), @@ -274,8 +280,7 @@ class _AddObjectivePageState extends State Future createObjective() async { int numberOfObjectives = (await database.getTotalCountOfObjectives( - objectiveType: - widget.objective?.type ?? widget.objectiveType))[0] ?? + objectiveType: objectiveType))[0] ?? 0; if (selectedEndDate != null && selectedStartDate.isAfter(selectedEndDate!)) { @@ -296,15 +301,17 @@ class _AddObjectivePageState extends State iconName: selectedImage, amount: isDifferenceOnlyLoan == true && appStateSettings["longTermLoansDifferenceFeature"] == true - ? 0 - : selectedAmount == 0 - ? 1 + // This defines what a difference only loan can be + ? -1 + // Set to zero if adding a new long term loan, otherwise keep its amount because of the total offset + : objectiveType == ObjectiveType.loan && widget.objective == null + ? 0 : selectedAmount, income: selectedIncome, pinned: selectedPin, walletFk: selectedWalletPk, archived: widget.objective?.archived ?? false, - type: widget.objective?.type ?? widget.objectiveType, + type: objectiveType, ); } @@ -340,8 +347,7 @@ class _AddObjectivePageState extends State selectedAmount = widget.objective!.amount; selectedPin = widget.objective!.pinned; selectedWalletPk = widget.objective!.walletFk; - isDifferenceOnlyLoan = widget.objective!.type == ObjectiveType.loan && - widget.objective!.amount == 0; + isDifferenceOnlyLoan = getIsDifferenceOnlyLoan(widget.objective!); selectedIncome = widget.objective!.income; if (widget.objective?.income == false) { @@ -567,6 +573,9 @@ class _AddObjectivePageState extends State child: ButtonIcon( onTap: () { setState(() { + if (isDifferenceOnlyLoan) { + selectedAmount = 0; + } isDifferenceOnlyLoan = !isDifferenceOnlyLoan; }); determineBottomButton(); @@ -678,115 +687,272 @@ class _AddObjectivePageState extends State ), SliverToBoxAdapter( child: SizedBox( - height: 10, + height: 25, ), ), - widget.objective != null && objectiveType == ObjectiveType.loan - ? SliverToBoxAdapter( - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 22, vertical: 10), - child: TipBox( - onTap: () { - pushRoute( - context, - AddTransactionPage( - routesToPopAfterDelete: - RoutesToPopAfterDelete.None, - selectedObjective: widget.objective, - selectedIncome: !selectedIncome, - ), - ); - }, - text: selectedIncome - ? "change-loan-amount-tip-lent".tr() - : "change-loan-amount-tip-borrowed".tr(), - settingsString: null, - ), - ), - ) - : isDifferenceOnlyLoan - ? SliverToBoxAdapter(child: SizedBox.shrink()) - : SliverToBoxAdapter( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 14), - child: AnimatedSizeSwitcher( - child: TextFont( - key: ValueKey(selectedIncome.toString()), - text: objectiveType == ObjectiveType.loan - ? selectedIncome - ? "lent".tr() - : "borrowed".tr() - : "goal".tr() + " ", - fontSize: 17, - fontWeight: FontWeight.bold, + SliverToBoxAdapter( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: OutlinedContainer( + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Column( + children: [ + widget.objective != null && + objectiveType == ObjectiveType.loan + ? TipBox( + borderRadius: 0, + onTap: () { + pushRoute( + context, + AddTransactionPage( + routesToPopAfterDelete: + RoutesToPopAfterDelete.None, + selectedObjective: widget.objective, + selectedIncome: !selectedIncome, + ), + ); + }, + text: selectedIncome + ? "change-loan-amount-tip-lent".tr() + : "change-loan-amount-tip-borrowed".tr(), + settingsString: null, + ) + : isDifferenceOnlyLoan + ? SizedBox.shrink() + : Wrap( + alignment: WrapAlignment.center, + crossAxisAlignment: WrapCrossAlignment.end, + children: [ + Padding( + padding: + const EdgeInsets.only(bottom: 14), + child: AnimatedSizeSwitcher( + child: TextFont( + key: ValueKey( + selectedIncome.toString()), + text: objectiveType == + ObjectiveType.loan + ? selectedIncome + ? "lent".tr() + : "borrowed".tr() + : "goal".tr() + " ", + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + ), + TappableTextEntry( + title: convertToMoney( + Provider.of(context), + selectedAmount, + currencyKey: Provider.of( + context, + listen: true) + .indexedByPk[selectedWalletPk] + ?.currency, + ), + placeholder: convertToMoney( + Provider.of(context), + 0, + currencyKey: Provider.of( + context, + listen: true) + .indexedByPk[selectedWalletPk] + ?.currency, + ), + showPlaceHolderWhenTextEquals: + convertToMoney( + Provider.of(context), + 0, + currencyKey: Provider.of( + context, + listen: true) + .indexedByPk[selectedWalletPk] + ?.currency, + ), + onTap: () { + selectAmount(context); + }, + fontSize: 32, + fontWeight: FontWeight.bold, + internalPadding: EdgeInsets.symmetric( + vertical: 2, horizontal: 4), + padding: EdgeInsets.symmetric( + vertical: 10, horizontal: 5), + ), + ], ), - ), + if (isDifferenceOnlyLoan != true) + HorizontalBreakAbove( + child: Center( + child: SelectDateRange( + padding: EdgeInsets.only(bottom: 8), + initialStartDate: selectedStartDate, + initialEndDate: selectedEndDate, + onSelectedStartDate: setSelectedStartDate, + onSelectedEndDate: setSelectedEndDate, ), - Flexible( - child: TappableTextEntry( - title: convertToMoney( - Provider.of(context), - selectedAmount, - currencyKey: Provider.of( - context, - listen: true) - .indexedByPk[selectedWalletPk] - ?.currency, + ), + ), + if (widget.objective != null && + objectiveType == ObjectiveType.loan && + isDifferenceOnlyLoan == false) + HorizontalBreakAbove( + child: Padding( + padding: const EdgeInsets.all(5.0), + child: Column( + children: [ + HeaderWithIconAndInfo( + padding: const EdgeInsets.symmetric( + horizontal: 20 - 5.0), + iconData: appStateSettings["outlinedIcons"] + ? Icons.exposure_outlined + : Icons.exposure_rounded, + iconScale: 1, + text: "total-offset".tr(), + infoButton: IconButtonScaled( + iconData: + appStateSettings["outlinedIcons"] + ? Icons.info_outlined + : Icons.info_outline_rounded, + iconSize: 16, + scale: 1.6, + onTap: () { + openPopup( + context, + title: "total-offset".tr(), + description: + "total-offset-description".tr(), + icon: + appStateSettings["outlinedIcons"] + ? Icons.exposure_outlined + : Icons.exposure_rounded, + onSubmit: () { + Navigator.pop(context); + }, + onSubmitLabel: "ok".tr(), + ); + }, + ), ), - placeholder: convertToMoney( - Provider.of(context), - 0, - currencyKey: Provider.of( - context, - listen: true) - .indexedByPk[selectedWalletPk] - ?.currency, + TappableTextEntry( + title: convertToMoney( + Provider.of(context), + selectedAmount, + currencyKey: Provider.of( + context, + listen: true) + .indexedByPk[selectedWalletPk] + ?.currency, + ), + placeholder: convertToMoney( + Provider.of(context), + 0, + currencyKey: Provider.of( + context, + listen: true) + .indexedByPk[selectedWalletPk] + ?.currency, + ), + showPlaceHolderWhenTextEquals: + convertToMoney( + Provider.of(context), + 0, + currencyKey: Provider.of( + context, + listen: true) + .indexedByPk[selectedWalletPk] + ?.currency, + ), + onTap: () { + selectAmount(context, allowZero: true); + }, + fontSize: 32, + fontWeight: FontWeight.bold, + internalPadding: EdgeInsets.symmetric( + vertical: 2, horizontal: 4), + padding: EdgeInsets.symmetric( + vertical: 10, horizontal: 5), ), - showPlaceHolderWhenTextEquals: convertToMoney( - Provider.of(context), - 0, - currencyKey: Provider.of( - context, - listen: true) - .indexedByPk[selectedWalletPk] - ?.currency, + Padding( + padding: const EdgeInsets.only( + left: 8, right: 8, bottom: 8, top: 2), + child: StreamBuilder( + stream: database.getObjective( + widget.objective?.objectivePk ?? "0"), + builder: (context, snapshot) { + if (snapshot.data == null) + return SizedBox.shrink(); + Objective objective = + snapshot.data!.copyWith( + income: selectedIncome, + amount: 0, + walletFk: selectedWalletPk, + ); + return WatchTotalAndAmountOfObjective( + objective: objective, + builder: (double objectiveAmount, + double totalAmount, + double percentageTowardsGoal) { + double selectedAmountConverted = + selectedAmount * + amountRatioToPrimaryCurrency( + Provider.of( + context), + Provider.of( + context) + .indexedByPk[objective + .walletFk] + ?.currency, + ); + return TextFont( + text: (selectedIncome + ? "lent".tr() + : "borrowed".tr()) + + " " + + "total".tr() + + ": " + + convertToMoney( + Provider.of( + context), + selectedAmountConverted, + ) + + " + " + + convertToMoney( + Provider.of( + context), + objectiveAmount, + ) + + " = " + + convertToMoney( + Provider.of( + context), + objectiveAmount + + selectedAmountConverted, + ), + fontSize: 14.5, + textAlign: TextAlign.center, + textColor: getColor( + context, "textLight"), + maxLines: 4, + ); + }, + ); + }, + ), ), - onTap: () { - selectAmount(context); - }, - fontSize: 32, - fontWeight: FontWeight.bold, - internalPadding: EdgeInsets.symmetric( - vertical: 2, horizontal: 4), - padding: EdgeInsets.symmetric( - vertical: 10, horizontal: 5), - ), + ], ), - ], + ), ), - ), - ), - SliverToBoxAdapter( - child: SizedBox(height: 10), - ), - if (isDifferenceOnlyLoan != true) - SliverToBoxAdapter( - child: Center( - child: SelectDateRange( - initialStartDate: selectedStartDate, - initialEndDate: selectedEndDate, - onSelectedStartDate: setSelectedStartDate, - onSelectedEndDate: setSelectedEndDate, + ], + ), ), ), ), + ), + SliverToBoxAdapter(child: SizedBox(height: 65)), // SliverToBoxAdapter( // child: KeyboardHeightAreaAnimated(), diff --git a/budget/lib/pages/addTransactionPage.dart b/budget/lib/pages/addTransactionPage.dart index ab5187eb..58ebbb6a 100644 --- a/budget/lib/pages/addTransactionPage.dart +++ b/budget/lib/pages/addTransactionPage.dart @@ -739,7 +739,7 @@ class _AddTransactionPageState extends State }); } else { if (widget.selectedType != null) { - selectedType = widget.selectedType; + setSelectedType(transactionTypeDisplayToEnum[widget.selectedType]); } _titleInputController = new TextEditingController(); diff --git a/budget/lib/pages/creditDebtTransactionsPage.dart b/budget/lib/pages/creditDebtTransactionsPage.dart index 3cacaa60..4d00a91a 100644 --- a/budget/lib/pages/creditDebtTransactionsPage.dart +++ b/budget/lib/pages/creditDebtTransactionsPage.dart @@ -187,6 +187,13 @@ class CreditDebtTransactionsState extends State searchString: searchValue, selectedTab: _tabController.index, ), + totalWithCountStream2: + database.watchTotalWithCountOfCreditDebtLongTermLoansOffset( + allWallets: Provider.of(context), + isCredit: isCredit, + searchString: searchValue, + selectedTab: _tabController.index, + ), showIncomeArrow: false, getInitialText: (totalAmount) { if (totalAmount < 0) { diff --git a/budget/lib/pages/editObjectivesPage.dart b/budget/lib/pages/editObjectivesPage.dart index 292bb9f4..913e1fca 100644 --- a/budget/lib/pages/editObjectivesPage.dart +++ b/budget/lib/pages/editObjectivesPage.dart @@ -454,7 +454,9 @@ Future selectObjectivePopup( (objectiveType == ObjectiveType.loan ? "no-loan".tr() : "no-goal".tr())) + - (includeAmount && objective != null + (includeAmount && + objective != null && + objectiveType != ObjectiveType.loan ? (" (" + convertToMoney( Provider.of(context), diff --git a/budget/lib/pages/homePage/homePageCreditDebts.dart b/budget/lib/pages/homePage/homePageCreditDebts.dart index 8f01a319..7aefe42c 100644 --- a/budget/lib/pages/homePage/homePageCreditDebts.dart +++ b/budget/lib/pages/homePage/homePageCreditDebts.dart @@ -37,6 +37,14 @@ class HomePageCreditDebts extends StatelessWidget { cycleSettingsExtension: "CreditDebts", selectedTab: null, ), + totalWithCountStream2: + database.watchTotalWithCountOfCreditDebtLongTermLoansOffset( + allWallets: Provider.of(context), + isCredit: true, + followCustomPeriodCycle: true, + cycleSettingsExtension: "CreditDebts", + selectedTab: null, + ), textColor: getColor(context, "unPaidUpcoming"), openPage: CreditDebtTransactions(isCredit: true), onLongPress: () async { @@ -56,6 +64,14 @@ class HomePageCreditDebts extends StatelessWidget { followCustomPeriodCycle: true, selectedTab: null, ), + totalWithCountStream2: + database.watchTotalWithCountOfCreditDebtLongTermLoansOffset( + allWallets: Provider.of(context), + isCredit: false, + cycleSettingsExtension: "CreditDebts", + followCustomPeriodCycle: true, + selectedTab: null, + ), textColor: getColor(context, "unPaidOverdue"), openPage: CreditDebtTransactions(isCredit: false), onLongPress: () async { diff --git a/budget/lib/pages/homePage/homePagePieChart.dart b/budget/lib/pages/homePage/homePagePieChart.dart index f8d94d77..78c9e645 100644 --- a/budget/lib/pages/homePage/homePagePieChart.dart +++ b/budget/lib/pages/homePage/homePagePieChart.dart @@ -35,15 +35,17 @@ class HomePagePieChart extends StatelessWidget { : appStateSettings["pieChartTotal"] == "outgoing" ? false : true; + const double borderRadius = 15; return KeepAliveClientMixin( child: Padding( padding: const EdgeInsets.only(bottom: 13, left: 13, right: 13), child: Container( decoration: BoxDecoration( boxShadow: boxShadowCheck(boxShadowGeneral(context)), + borderRadius: BorderRadius.circular(borderRadius), ), child: Tappable( - borderRadius: 15, + borderRadius: borderRadius, onLongPress: () async { await openPieChartHomePageBottomSheetSettings(context); homePageStateKey.currentState?.refreshState(); diff --git a/budget/lib/pages/objectivePage.dart b/budget/lib/pages/objectivePage.dart index c013e5e8..7d53ab68 100644 --- a/budget/lib/pages/objectivePage.dart +++ b/budget/lib/pages/objectivePage.dart @@ -122,6 +122,42 @@ class _ObjectivePageContentState extends State<_ObjectivePageContent> { } } + openSelectIconPopup() { + openBottomSheet( + context, + PopupFramework( + title: "select-icon".tr(), + child: SelectCategoryImage( + setSelectedImage: (String? selection) async { + String? selectedIcon = + (selection ?? "").replaceFirst("assets/categories/", ""); + Objective newObjective = widget.objective.copyWith( + iconName: Value(selectedIcon), + emojiIconName: Value(null), + ); + await database.createOrUpdateObjective( + newObjective, + ); + }, + setSelectedEmoji: (String? selection) async { + Objective newObjective = widget.objective.copyWith( + iconName: Value(null), + emojiIconName: Value(selection), + ); + await database.createOrUpdateObjective( + newObjective, + ); + print(newObjective); + }, + selectedImage: + "assets/categories/" + widget.objective.iconName.toString(), + setSelectedTitle: (String? titleRecommendation) {}, + ), + ), + showScrollbar: true, + ); + } + @override Widget build(BuildContext context) { Widget numberTransactionsWidget = StreamBuilder( @@ -313,52 +349,11 @@ class _ObjectivePageContentState extends State<_ObjectivePageContent> { borderRadius: 100, canEditByLongPress: false, margin: EdgeInsets.zero, - onTap: () async { - await openBottomSheet( - context, - PopupFramework( - title: "select-icon".tr(), - child: SelectCategoryImage( - setSelectedImage: - (String? selection) async { - String? selectedIcon = - (selection ?? "") - .replaceFirst( - "assets/categories/", - ""); - Objective newObjective = - widget.objective.copyWith( - iconName: Value(selectedIcon), - emojiIconName: Value(null), - ); - await database - .createOrUpdateObjective( - newObjective, - ); - }, - setSelectedEmoji: - (String? selection) async { - Objective newObjective = - widget.objective.copyWith( - iconName: Value(null), - emojiIconName: Value(selection), - ); - await database - .createOrUpdateObjective( - newObjective, - ); - print(newObjective); - }, - selectedImage: - "assets/categories/" + - widget.objective.iconName - .toString(), - setSelectedTitle: (String? - titleRecommendation) {}, - ), - ), - showScrollbar: true, - ); + onLongPress: () { + openSelectIconPopup(); + }, + onTap: () { + openSelectIconPopup(); }, ), SizedBox(height: 10), @@ -563,6 +558,7 @@ class _ObjectivePageContentState extends State<_ObjectivePageContent> { widget.objective, totalAmount, percentageTowardsGoal, + objectiveAmount, addSpendingSavingIndication: true, ), maxLines: 3, diff --git a/budget/lib/pages/objectivesListPage.dart b/budget/lib/pages/objectivesListPage.dart index 6db6414a..c313325a 100644 --- a/budget/lib/pages/objectivesListPage.dart +++ b/budget/lib/pages/objectivesListPage.dart @@ -1,12 +1,7 @@ -import 'dart:collection'; - import 'package:budget/colors.dart'; import 'package:budget/database/tables.dart'; import 'package:budget/functions.dart'; -import 'package:budget/pages/addBudgetPage.dart'; -import 'package:budget/pages/addCategoryPage.dart'; import 'package:budget/pages/addObjectivePage.dart'; -import 'package:budget/pages/editBudgetPage.dart'; import 'package:budget/pages/editObjectivesPage.dart'; import 'package:budget/pages/objectivePage.dart'; import 'package:budget/struct/currencyFunctions.dart'; @@ -15,27 +10,24 @@ import 'package:budget/struct/randomConstants.dart'; import 'package:budget/struct/settings.dart'; import 'package:budget/widgets/budgetContainer.dart'; import 'package:budget/widgets/categoryIcon.dart'; -import 'package:budget/widgets/editRowEntry.dart'; import 'package:budget/widgets/navigationSidebar.dart'; -import 'package:budget/widgets/noResults.dart'; import 'package:budget/widgets/openBottomSheet.dart'; import 'package:budget/widgets/framework/pageFramework.dart'; import 'package:budget/widgets/openContainerNavigation.dart'; import 'package:budget/widgets/openPopup.dart'; import 'package:budget/widgets/tappable.dart'; import 'package:budget/widgets/textWidgets.dart'; -import 'package:budget/widgets/util/widgetSize.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart' hide SliverReorderableList, ReorderableDelayedDragStartListener; import 'package:provider/provider.dart'; - import 'addButton.dart'; +// This defines what a difference only loan can be bool getIsDifferenceOnlyLoan(Objective objective) { - return objective.amount == 0 && + return objective.amount == -1 && objective.type == ObjectiveType.loan && - appStateSettings["longTermLoansDifferenceFeature"]; + appStateSettings["longTermLoansDifferenceFeature"] == true; } // negative to collect / you are owed @@ -491,6 +483,7 @@ class ObjectiveContainer extends StatelessWidget { objective, totalAmount, percentageTowardsGoal, + objectiveAmount, ); } return TextFont( @@ -980,11 +973,8 @@ class ObjectiveContainerDifferenceLoan extends StatelessWidget { } String getObjectiveStatus(BuildContext context, Objective objective, - double totalAmount, double percentageTowardsGoal, + double totalAmount, double percentageTowardsGoal, double objectiveAmount, {bool addSpendingSavingIndication = false}) { - double objectiveAmount = objectiveAmountToPrimaryCurrency( - Provider.of(context, listen: true), objective); - String content; if (objective.endDate == null) return ""; int remainingDays = objective.endDate! @@ -1078,7 +1068,18 @@ class WatchTotalAndAmountOfObjective extends StatelessWidget { stream: database.watchTotalAmountObjectiveLoan( Provider.of(context, listen: true), objective), builder: (context, snapshotAmount) { - double objectiveAmount = snapshotAmount.data ?? 0; + double objectiveAmount = (snapshotAmount.data ?? 0); + if (getIsDifferenceOnlyLoan(objective) == false) { + double objectiveAmountConverted = objective.amount * + amountRatioToPrimaryCurrency( + Provider.of(context), + Provider.of(context) + .indexedByPk[objective.walletFk] + ?.currency, + ); + objectiveAmount = objectiveAmount + + (objectiveAmountConverted * (objective.income ? -1 : 1)); + } double totalAmount = ((snapshot.data ?? 0) - (snapshotAmount.data ?? 0)) * -1; double percentageTowardsGoal = diff --git a/budget/lib/pages/upcomingOverdueTransactionsPage.dart b/budget/lib/pages/upcomingOverdueTransactionsPage.dart index e80831ce..bc49f66e 100644 --- a/budget/lib/pages/upcomingOverdueTransactionsPage.dart +++ b/budget/lib/pages/upcomingOverdueTransactionsPage.dart @@ -285,9 +285,55 @@ class UpcomingOverdueTransactionsState } } +class DoubleTotalWithCountStreamBuilder extends StatelessWidget { + const DoubleTotalWithCountStreamBuilder({ + required this.totalWithCountStream, + this.totalWithCountStream2, + required this.builder, + super.key, + }); + + final Stream totalWithCountStream; + final Stream? totalWithCountStream2; + final Widget Function(BuildContext, AsyncSnapshot) builder; + + @override + Widget build(BuildContext context) { + if (totalWithCountStream2 != null) { + return StreamBuilder( + stream: totalWithCountStream, + builder: (context, snapshot1) { + return StreamBuilder( + stream: totalWithCountStream2, + builder: (context, snapshot2) { + final total1 = snapshot1.data; + final total2 = snapshot2.data; + return builder( + context, + AsyncSnapshot.withData( + ConnectionState.done, + TotalWithCount( + total: (total1?.total ?? 0) + (total2?.total ?? 0), + count: (total1?.count ?? 0) + (total2?.count ?? 0), + ), + ), + ); + }, + ); + }, + ); + } + return StreamBuilder( + stream: totalWithCountStream, + builder: builder, + ); + } +} + class CenteredAmountAndNumTransactions extends StatelessWidget { const CenteredAmountAndNumTransactions({ required this.totalWithCountStream, + this.totalWithCountStream2, required this.textColor, this.getTextColor, this.getInitialText, @@ -296,6 +342,7 @@ class CenteredAmountAndNumTransactions extends StatelessWidget { }); final Stream totalWithCountStream; + final Stream? totalWithCountStream2; final Color textColor; final String? Function(double totalAmount)? getInitialText; final Color? Function(double totalAmount)? getTextColor; @@ -308,8 +355,9 @@ class CenteredAmountAndNumTransactions extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ SizedBox(height: 10), - StreamBuilder( - stream: totalWithCountStream, + DoubleTotalWithCountStreamBuilder( + totalWithCountStream: totalWithCountStream, + totalWithCountStream2: totalWithCountStream2, builder: (context, snapshot) { double totalSpent = snapshot.data?.total ?? 0; int totalCount = snapshot.data?.count ?? 0; diff --git a/budget/lib/pages/walletDetailsPage.dart b/budget/lib/pages/walletDetailsPage.dart index f4d2e43f..29f2911e 100644 --- a/budget/lib/pages/walletDetailsPage.dart +++ b/budget/lib/pages/walletDetailsPage.dart @@ -880,6 +880,19 @@ class WalletDetailsPageState extends State forcedDateTimeRange: selectedDateTimeRange, selectedTab: null, ), + totalWithCountStream2: database + .watchTotalWithCountOfCreditDebtLongTermLoansOffset( + isCredit: true, + allWallets: Provider.of(context), + followCustomPeriodCycle: widget.wallet == null, + cycleSettingsExtension: null, //all time + searchFilters: searchFilters?.copyWith( + dateTimeRange: null, + forceSetDateTimeRange: true, + ), + forcedDateTimeRange: selectedDateTimeRange, + selectedTab: null, + ), onLongPress: () { // Since always all time, disable long press custom period for these rows //selectAllSpendingPeriod(); @@ -909,6 +922,19 @@ class WalletDetailsPageState extends State forcedDateTimeRange: selectedDateTimeRange, selectedTab: null, ), + totalWithCountStream2: database + .watchTotalWithCountOfCreditDebtLongTermLoansOffset( + isCredit: false, + allWallets: Provider.of(context), + followCustomPeriodCycle: widget.wallet == null, + cycleSettingsExtension: null, //all time + searchFilters: searchFilters?.copyWith( + dateTimeRange: null, + forceSetDateTimeRange: true, + ), + forcedDateTimeRange: selectedDateTimeRange, + selectedTab: null, + ), onLongPress: () { // Since always all time, disable long press custom period for these rows //selectAllSpendingPeriod(); @@ -2778,6 +2804,7 @@ class AmountSpentEntryRow extends StatelessWidget { required this.textColor, required this.label, required this.totalWithCountStream, + this.totalWithCountStream2, required this.onLongPress, this.hide = false, this.forceShow = false, @@ -2787,6 +2814,7 @@ class AmountSpentEntryRow extends StatelessWidget { final String label; final Widget openPage; final Stream totalWithCountStream; + final Stream? totalWithCountStream2; final VoidCallback onLongPress; final bool hide; final bool forceShow; @@ -2794,8 +2822,9 @@ class AmountSpentEntryRow extends StatelessWidget { @override Widget build(BuildContext context) { - return StreamBuilder( - stream: totalWithCountStream, + return DoubleTotalWithCountStreamBuilder( + totalWithCountStream: totalWithCountStream, + totalWithCountStream2: totalWithCountStream2, builder: (context, snapshot) { double totalSpent = (snapshot.data?.total ?? 0).abs(); int totalCount = snapshot.data?.count ?? 0; diff --git a/budget/lib/struct/defaultPreferences.dart b/budget/lib/struct/defaultPreferences.dart index 2376ccaf..05087784 100644 --- a/budget/lib/struct/defaultPreferences.dart +++ b/budget/lib/struct/defaultPreferences.dart @@ -4,8 +4,11 @@ import 'package:budget/functions.dart'; import 'package:budget/main.dart'; import 'package:budget/pages/homePage/homePageLineGraph.dart'; import 'package:budget/pages/walletDetailsPage.dart'; +import 'package:budget/struct/databaseGlobal.dart'; +import 'package:budget/struct/settings.dart'; import 'package:budget/widgets/notificationsSettings.dart'; import 'package:budget/widgets/periodCyclePicker.dart'; +import 'package:drift/drift.dart' show Value; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:device_info_plus/device_info_plus.dart'; @@ -294,11 +297,35 @@ Future> getDefaultPreferences() async { // The last synced button is there though! // "webForceLoginPopupOnLaunch": true, // + + // This key is used as a migration + // "migratedSetLongTermLoansAmountTo0": false, }; } -dynamic attemptToMigrateCyclePreferences( - dynamic currentUserSettings, String key) { +Future attemptToMigrateSetLongTermLoansAmountTo0() async { + try { + if (appStateSettings["hasOnboarded"] == true && + appStateSettings["migratedSetLongTermLoansAmountTo0"] != true) { + print("Migrating setting long term loans amounts to 0"); + appStateSettings["migratedSetLongTermLoansAmountTo0"] = true; + List objectivesInserting = []; + List allObjectives = + await database.getAllObjectives(objectiveType: ObjectiveType.loan); + for (Objective objective in allObjectives) { + objectivesInserting.add(objective.copyWith( + amount: 0, dateTimeModified: Value(DateTime.now()))); + } + await database.updateBatchObjectivesOnly(objectivesInserting); + } + } catch (e) { + print( + "Error migrating setting long term loans amounts to 0 " + e.toString()); + } +} + +Map attemptToMigrateCyclePreferences( + Map currentUserSettings, String key) { try { if ( // This is a setting we need to find a value for diff --git a/budget/lib/struct/settings.dart b/budget/lib/struct/settings.dart index f94dd4e9..5ef94183 100644 --- a/budget/lib/struct/settings.dart +++ b/budget/lib/struct/settings.dart @@ -79,6 +79,8 @@ Future initializeSettings() async { appStateSettings["accentColor"] = await getAccentColorSystemString(); } + await attemptToMigrateSetLongTermLoansAmountTo0(); + // Disable sync every change is not on web // It will still sync when user pulls down to refresh // if (!kIsWeb) { @@ -209,7 +211,8 @@ Future> getUserSettings() async { } print("Found user settings on file"); - var userSettingsJSON = json.decode(userSettings); + Map userSettingsJSON = json.decode(userSettings); + //Set to defaults if a new setting is added, but no entry saved userPreferencesDefault.forEach((key, value) { userSettingsJSON = @@ -220,7 +223,7 @@ Future> getUserSettings() async { }); return userSettingsJSON; } catch (e) { - print("There was an error, settings corrupted"); + print("There was an error, settings corrupted: " + e.toString()); await sharedPreferences.setString( 'userSettings', json.encode(userPreferencesDefault)); return userPreferencesDefault; diff --git a/budget/lib/struct/upcomingTransactionsFunctions.dart b/budget/lib/struct/upcomingTransactionsFunctions.dart index 34c6f741..5431b2a4 100644 --- a/budget/lib/struct/upcomingTransactionsFunctions.dart +++ b/budget/lib/struct/upcomingTransactionsFunctions.dart @@ -370,7 +370,7 @@ Future openPayDebtCreditPopup( // Lent is considered negative int? rowId = await database.createOrUpdateObjective( Objective( - amount: transaction.amount.abs(), //always positive + amount: 0, income: !transaction.income, objectivePk: "-1", name: transactionLabel, diff --git a/budget/lib/widgets/extraInfoBoxes.dart b/budget/lib/widgets/extraInfoBoxes.dart index e61e7dbc..6819cd1b 100644 --- a/budget/lib/widgets/extraInfoBoxes.dart +++ b/budget/lib/widgets/extraInfoBoxes.dart @@ -16,6 +16,7 @@ class TipBox extends StatefulWidget { required this.settingsString, this.richTextSpan, this.padding = EdgeInsets.zero, + this.borderRadius, super.key, }); final VoidCallback onTap; @@ -23,6 +24,7 @@ class TipBox extends StatefulWidget { final List? richTextSpan; final String? settingsString; final EdgeInsets padding; + final double? borderRadius; @override State createState() => _TipBoxState(); @@ -43,7 +45,8 @@ class _TipBoxState extends State { onTap: widget.onTap, color: Theme.of(context).colorScheme.secondaryContainer.withOpacity(0.7), - borderRadius: getIsFullScreen(context) ? 15 : 10, + borderRadius: + widget.borderRadius ?? (getIsFullScreen(context) ? 15 : 10), child: Padding( padding: EdgeInsets.only( left: 15, diff --git a/budget/lib/widgets/importCSV.dart b/budget/lib/widgets/importCSV.dart index 46e1ffc6..ce073e60 100644 --- a/budget/lib/widgets/importCSV.dart +++ b/budget/lib/widgets/importCSV.dart @@ -79,6 +79,7 @@ class _ImportCSVState extends State { throw "no-file-selected".tr(); } }, onError: (e) { + print("Error opening CSV: " + e.toString()); openPopup( context, title: "csv-error".tr(), diff --git a/budget/lib/widgets/outlinedButtonStacked.dart b/budget/lib/widgets/outlinedButtonStacked.dart index d99a9515..028c5b91 100644 --- a/budget/lib/widgets/outlinedButtonStacked.dart +++ b/budget/lib/widgets/outlinedButtonStacked.dart @@ -88,29 +88,12 @@ class OutlinedButtonStacked extends StatelessWidget { infoButton ?? SizedBox.shrink() ], ) - : Row( - children: [ - Transform.scale( - scale: iconScale, - child: Icon( - iconData, - size: 28, - color: Theme.of(context) - .colorScheme - .secondary, - ), - ), - SizedBox(width: 10), - Expanded( - child: TextFont( - text: text, - fontSize: fontSize ?? 22, - fontWeight: FontWeight.bold, - maxLines: 2, - ), - ), - infoButton ?? SizedBox.shrink(), - ], + : HeaderWithIconAndInfo( + iconData: iconData, + iconScale: iconScale, + text: text, + infoButton: infoButton, + fontSize: fontSize, ), afterWidget == null ? SizedBox.shrink() @@ -172,3 +155,50 @@ class OutlinedContainer extends StatelessWidget { ); } } + +class HeaderWithIconAndInfo extends StatelessWidget { + final IconData iconData; + final double iconScale; + final String text; + final double? fontSize; + final Widget? infoButton; + final EdgeInsets padding; + + HeaderWithIconAndInfo({ + required this.iconData, + this.iconScale = 1, + required this.text, + this.fontSize, + this.infoButton, + this.padding = EdgeInsets.zero, + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: padding, + child: Row( + children: [ + Transform.scale( + scale: iconScale, + child: Icon( + iconData, + size: 28, + color: Theme.of(context).colorScheme.secondary, + ), + ), + SizedBox(width: 10), + Expanded( + child: TextFont( + text: text, + fontSize: fontSize ?? 22, + fontWeight: FontWeight.bold, + maxLines: 2, + ), + ), + infoButton ?? SizedBox.shrink(), + ], + ), + ); + } +} diff --git a/budget/lib/widgets/selectDateRange.dart b/budget/lib/widgets/selectDateRange.dart index 101330e9..e92b4a89 100644 --- a/budget/lib/widgets/selectDateRange.dart +++ b/budget/lib/widgets/selectDateRange.dart @@ -14,11 +14,13 @@ class SelectDateRange extends StatefulWidget { required this.initialEndDate, required this.onSelectedStartDate, required this.onSelectedEndDate, + this.padding = const EdgeInsets.symmetric(vertical: 10), }); final DateTime? initialStartDate; final DateTime? initialEndDate; final Function(DateTime?) onSelectedStartDate; final Function(DateTime?) onSelectedEndDate; + final EdgeInsets padding; @override State createState() => _SelectDateRangeState(); @@ -31,7 +33,7 @@ class _SelectDateRangeState extends State { @override Widget build(BuildContext context) { return Padding( - padding: const EdgeInsets.symmetric(vertical: 10), + padding: widget.padding, child: Column( children: [ Row( diff --git a/budget/lib/widgets/showChangelog.dart b/budget/lib/widgets/showChangelog.dart index db8c856e..dd895632 100644 --- a/budget/lib/widgets/showChangelog.dart +++ b/budget/lib/widgets/showChangelog.dart @@ -26,6 +26,18 @@ import 'listItem.dart'; String getChangelogString() { return """ + < 5.2.4 + Improved UI layout when creating a goal/long term loan + Long term loan offset (useful for adding interest to long term loan totals) + Deep linking API (A): Automate the adding of transactions using app URL links (view [About] page for information) + Fix color picker initial color value + Fix importing of backup and CSV files (A) + Fix widget launching add transaction route twice + Fix account list name alignment + Fix widget action launch timeout on first launch + Fix adding transaction from subscription/upcoming page defaults to unpaid + Fix archived long term loan amounts no longer count towards total summary + Fix long term loan total amounts and collect/settle amounts per day < 5.2.3 Fix currency rates API File attachment in-app image preview @@ -37,8 +49,6 @@ String getChangelogString() { Consistent padding alignment for date picker UI alignment fixes Border radius tweaks (i) - Deep linking API (A) - Fix color picker initial color value < 5.2.2 Exclude transaction from counting towards reports and totals (in more options) Percentage decimal precision setting (in Settings > More Options > Formatting) diff --git a/budget/lib/widgets/transactionsAmountBox.dart b/budget/lib/widgets/transactionsAmountBox.dart index e602be15..1c3bbebc 100644 --- a/budget/lib/widgets/transactionsAmountBox.dart +++ b/budget/lib/widgets/transactionsAmountBox.dart @@ -1,6 +1,7 @@ import 'package:budget/colors.dart'; import 'package:budget/database/tables.dart'; import 'package:budget/functions.dart'; +import 'package:budget/pages/upcomingOverdueTransactionsPage.dart'; import 'package:budget/widgets/openContainerNavigation.dart'; import 'package:budget/widgets/tappable.dart'; import 'package:budget/widgets/textWidgets.dart'; @@ -19,6 +20,7 @@ class TransactionsAmountBox extends StatelessWidget { this.onLongPress, required this.label, required this.totalWithCountStream, + this.totalWithCountStream2, required this.textColor, this.absolute = true, this.getTextColor, @@ -29,6 +31,7 @@ class TransactionsAmountBox extends StatelessWidget { final Function? onLongPress; final String label; final Stream totalWithCountStream; + final Stream? totalWithCountStream2; final Color textColor; final bool absolute; final String? currencyKey; @@ -66,8 +69,9 @@ class TransactionsAmountBox extends StatelessWidget { fontWeight: FontWeight.bold, ), SizedBox(height: 6), - StreamBuilder( - stream: totalWithCountStream, + DoubleTotalWithCountStreamBuilder( + totalWithCountStream: totalWithCountStream, + totalWithCountStream2: totalWithCountStream2, builder: (context, snapshot) { double totalSpent = snapshot.data?.total ?? 0; int totalCount = snapshot.data?.count ?? 0; diff --git a/budget/lib/widgets/util/checkWidgetLaunch.dart b/budget/lib/widgets/util/checkWidgetLaunch.dart index 5a687597..ba1f7685 100644 --- a/budget/lib/widgets/util/checkWidgetLaunch.dart +++ b/budget/lib/widgets/util/checkWidgetLaunch.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:budget/colors.dart'; import 'package:budget/database/generatePreviewData.dart'; import 'package:budget/database/tables.dart'; @@ -70,12 +72,20 @@ class CheckWidgetLaunch extends StatefulWidget { bool hasDoneWidgetAction = false; class _CheckWidgetLaunchState extends State { + Timer? cancelTimer; + @override void initState() { super.initState(); HomeWidget.setAppGroupId('WIDGET_GROUP_ID'); } + @override + void dispose() { + cancelTimer?.cancel(); + super.dispose(); + } + @override void didChangeDependencies() { super.didChangeDependencies(); @@ -88,20 +98,21 @@ class _CheckWidgetLaunchState extends State { } // For some reason, older Android versions open an entirely new app instance... weird! + // has this been fixed with: android:launchMode="singleInstance" ? void _launchedFromWidget(Uri? uri) async { // Only perform one widget action per launch/continue of the app if (hasDoneWidgetAction == true) return; hasDoneWidgetAction = true; String widgetPayload = (uri ?? "").toString(); - if (widgetPayload == "addTransaction") { + if (widgetPayload == "addTransactionWidget") { pushRoute( context, AddTransactionPage( routesToPopAfterDelete: RoutesToPopAfterDelete.None, ), ); - } else if (widgetPayload == "transferTransaction") { + } else if (widgetPayload == "transferTransactionWidget") { // This fixes an issue on older versions of Android where the route would popup twice // We can detect when this is going to happen if the Provider is not yet loaded, so just pop // the route when this is called so the first time routing does not persist (i.e. we end with one route) @@ -119,7 +130,7 @@ class _CheckWidgetLaunchState extends State { showAllEditDetails: true, ), ); - } else if (widgetPayload == "netWorthLaunch") { + } else if (widgetPayload == "netWorthLaunchWidget") { pushRoute( context, WalletDetailsPage( @@ -127,6 +138,13 @@ class _CheckWidgetLaunchState extends State { ), ); } + _scheduleHasDoneWidgetAction(); + } + + void _scheduleHasDoneWidgetAction() { + cancelTimer = Timer(Duration(milliseconds: 3000), () { + hasDoneWidgetAction = false; + }); } @override @@ -134,6 +152,7 @@ class _CheckWidgetLaunchState extends State { return OnAppResume( onAppResume: () { hasDoneWidgetAction = false; + cancelTimer?.cancel(); }, child: SizedBox.shrink(), ); diff --git a/budget/lib/widgets/util/deepLinks.dart b/budget/lib/widgets/util/deepLinks.dart index b1e6de15..a549a9c0 100644 --- a/budget/lib/widgets/util/deepLinks.dart +++ b/budget/lib/widgets/util/deepLinks.dart @@ -12,6 +12,7 @@ import 'package:budget/widgets/openBottomSheet.dart'; import 'package:budget/widgets/openPopup.dart'; import 'package:budget/widgets/openSnackbar.dart'; import 'package:budget/widgets/transactionEntry/transactionEntry.dart'; +import 'package:budget/widgets/transactionEntry/transactionLabel.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:app_links/app_links.dart'; @@ -45,7 +46,8 @@ class _DeepLinksWebState extends State { @override void initState() { super.initState(); - Future.delayed(Duration(milliseconds: 500), () { + // This delay is required by the web app + Future.delayed(Duration(milliseconds: 0), () { executeAppLink(navigatorKey.currentContext, Uri.base); }); } @@ -83,7 +85,9 @@ class _DeepLinksState extends State { Future initDeepLinks() async { final appLink = await _appLinks.getInitialAppLink(); if (appLink != null) { - Future.delayed(Duration(milliseconds: 500), () { + // This delay may or may not be needed... + // we need to make sure Material navigator is accessible by the context though! + Future.delayed(Duration(milliseconds: 0), () { executeAppLink(navigatorKey.currentContext, appLink); }); } @@ -104,6 +108,9 @@ executeAppLink(BuildContext? context, Uri uri) async { String endPoint = getApiEndpoint(uri); Map params = parseAppLink(uri); + + // Note these URIs must be unique from the launch from widget URIs! + switch (endPoint) { case "addTransaction": if (context != null) { @@ -163,6 +170,13 @@ executeAppLink(BuildContext? context, Uri uri) async { final Transaction transactionJustAdded = await database.getTransactionFromRowId(rowId); flashTransaction(transactionJustAdded.transactionPk); + openSnackbar(SnackbarMessage( + title: "added-transaction".tr(), + description: await getTransactionLabel(transactionJustAdded), + icon: appStateSettings["outlinedIcons"] + ? Icons.post_add_outlined + : Icons.post_add_rounded, + )); } } break; diff --git a/budget/lib/widgets/walletEntry.dart b/budget/lib/widgets/walletEntry.dart index 1acec93b..fcb0de82 100644 --- a/budget/lib/widgets/walletEntry.dart +++ b/budget/lib/widgets/walletEntry.dart @@ -245,7 +245,7 @@ class WalletEntryRow extends StatelessWidget { left: 10, ), child: TextFont( - textAlign: TextAlign.right, + textAlign: TextAlign.left, text: "", maxLines: 1, richTextSpan: [ diff --git a/budget/pubspec.lock b/budget/pubspec.lock index ac349a63..5033d49c 100644 --- a/budget/pubspec.lock +++ b/budget/pubspec.lock @@ -428,11 +428,12 @@ packages: file_picker: dependency: "direct main" description: - name: file_picker - sha256: "4e42aacde3b993c5947467ab640882c56947d9d27342a5b6f2895b23956954a6" - url: "https://pub.dev" - source: hosted - version: "6.1.1" + path: "." + ref: HEAD + resolved-ref: ccbb9a384491cc0759f94618bb3859411e228091 + url: "https://github.com/melWiss/flutter_file_picker.git" + source: git + version: "6.0.1" file_selector_linux: dependency: transitive description: diff --git a/budget/pubspec.yaml b/budget/pubspec.yaml index d4158479..1a3e5532 100644 --- a/budget/pubspec.yaml +++ b/budget/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 5.2.3+328 +version: 5.2.4+335 environment: sdk: ">= 3.0.0" @@ -41,7 +41,10 @@ dependencies: googleapis: ^11.2.0 universal_html: ^2.0.8 flutter_charset_detector: ^1.0.2 - file_picker: ^6.1.1 + file_picker: + git: + # This fork implements https://github.com/miguelpruivo/flutter_file_picker/issues/1404 + url: https://github.com/melWiss/flutter_file_picker.git auto_size_text: ^3.0.0 shared_preferences: ^2.0.13 csv: ^5.0.1