Add i18n via slang
This commit is contained in:
@@ -10,6 +10,7 @@ import 'package:okane/ui/pages/account/total_balance_card.dart';
|
||||
import 'package:okane/ui/pages/account/upcoming_transactions_card.dart';
|
||||
import 'package:okane/ui/state/core.dart';
|
||||
import 'package:okane/ui/utils.dart';
|
||||
import 'package:okane/i18n/strings.g.dart';
|
||||
|
||||
class AccountListPage extends StatefulWidget {
|
||||
final bool isPage;
|
||||
@@ -33,7 +34,7 @@ class AccountListPageState extends State<AccountListPage> {
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
|
||||
child: Text(
|
||||
"Accounts",
|
||||
t.pages.accounts.title,
|
||||
style: Theme.of(context).textTheme.titleLarge,
|
||||
),
|
||||
),
|
||||
@@ -104,7 +105,10 @@ class AccountListPageState extends State<AccountListPage> {
|
||||
),
|
||||
);
|
||||
},
|
||||
child: Text(bloc.activeAccount?.name ?? "None"),
|
||||
child: Text(
|
||||
bloc.activeAccount?.name ??
|
||||
t.pages.accounts.accountSelector.none,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
@@ -207,7 +211,8 @@ class AccountListPageState extends State<AccountListPage> {
|
||||
child: TextField(
|
||||
controller: _accountNameController,
|
||||
decoration: InputDecoration(
|
||||
hintText: "Account name",
|
||||
hintText:
|
||||
t.pages.accounts.addAccount.accountName,
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -229,7 +234,7 @@ class AccountListPageState extends State<AccountListPage> {
|
||||
_accountNameController.text = "";
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
child: Text("Add"),
|
||||
child: Text(t.modals.add),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -3,6 +3,7 @@ import 'package:fl_chart/fl_chart.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get_it/get_it.dart';
|
||||
import 'package:okane/database/database.dart';
|
||||
import 'package:okane/i18n/strings.g.dart';
|
||||
import 'package:okane/ui/state/core.dart';
|
||||
import 'package:okane/ui/utils.dart';
|
||||
|
||||
@@ -67,7 +68,7 @@ class AccountBalanceGraphCard extends StatelessWidget {
|
||||
padding: const EdgeInsets.all(16),
|
||||
child: Column(
|
||||
children: [
|
||||
Text("Account balance"),
|
||||
Text(t.pages.transactions.balance),
|
||||
SizedBox(
|
||||
height: 150,
|
||||
child: FutureBuilder(
|
||||
|
||||
@@ -6,6 +6,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:get_it/get_it.dart';
|
||||
import 'package:okane/database/collections/transaction.dart';
|
||||
import 'package:okane/database/database.dart';
|
||||
import 'package:okane/i18n/strings.g.dart';
|
||||
import 'package:okane/ui/state/core.dart';
|
||||
import 'package:okane/ui/utils.dart';
|
||||
import 'package:okane/ui/widgets/piechart.dart';
|
||||
@@ -75,7 +76,7 @@ class BreakdownCard extends StatelessWidget {
|
||||
|
||||
Widget _buildCard(Widget child, String? subtitle) {
|
||||
return ResponsiveCard(
|
||||
titleText: "Expense Breakdown",
|
||||
titleText: t.pages.accounts.expenseBreakdown.title,
|
||||
subtitleText: subtitle,
|
||||
child: child,
|
||||
);
|
||||
@@ -91,7 +92,9 @@ class BreakdownCard extends StatelessWidget {
|
||||
return BlocBuilder<CoreCubit, CoreState>(
|
||||
builder: (context, state) {
|
||||
if (bloc.activeAccount == null) {
|
||||
return _buildCenterText("No account active");
|
||||
return _buildCenterText(
|
||||
t.pages.accounts.expenseBreakdown.noActiveAccount,
|
||||
);
|
||||
}
|
||||
|
||||
return FutureBuilder(
|
||||
@@ -125,7 +128,9 @@ class BreakdownCard extends StatelessWidget {
|
||||
)
|
||||
.toList();
|
||||
if (sectionData.isEmpty) {
|
||||
return _buildCenterText("No expenses available");
|
||||
return _buildCenterText(
|
||||
t.pages.accounts.expenseBreakdown.noExpensesAvailable,
|
||||
);
|
||||
}
|
||||
return _buildCard(
|
||||
OkanePieChart(
|
||||
@@ -141,7 +146,9 @@ class BreakdownCard extends StatelessWidget {
|
||||
)
|
||||
.toList(),
|
||||
),
|
||||
"Available money: ${formatCurrency(data.usable)}",
|
||||
t.pages.accounts.expenseBreakdown.availableFunds(
|
||||
amount: formatCurrency(data.usable),
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:get_it/get_it.dart';
|
||||
import 'package:okane/database/collections/account.dart';
|
||||
import 'package:okane/i18n/strings.g.dart';
|
||||
import 'package:okane/ui/state/core.dart';
|
||||
|
||||
class DeleteAccountPopup extends StatelessWidget {
|
||||
@@ -22,7 +23,7 @@ class DeleteAccountPopup extends StatelessWidget {
|
||||
return BlocBuilder<CoreCubit, CoreState>(
|
||||
builder:
|
||||
(context, state) => AlertDialog(
|
||||
title: Text("Delete Account"),
|
||||
title: Text(t.pages.accounts.deleteAccount.title),
|
||||
content:
|
||||
state.isDeletingAccount
|
||||
? Row(
|
||||
@@ -37,7 +38,9 @@ class DeleteAccountPopup extends StatelessWidget {
|
||||
],
|
||||
)
|
||||
: Text(
|
||||
"Are you sure you want to delete the account '${account.name!}'? This will delete all transactions as well.",
|
||||
t.pages.accounts.deleteAccount.content(
|
||||
name: account.name!,
|
||||
),
|
||||
),
|
||||
actions: [
|
||||
TextButton(
|
||||
@@ -48,7 +51,10 @@ class DeleteAccountPopup extends StatelessWidget {
|
||||
await GetIt.I.get<CoreCubit>().deleteAccount(account);
|
||||
afterDelete();
|
||||
},
|
||||
child: Text("Delete", style: TextStyle(color: Colors.red)),
|
||||
child: Text(
|
||||
t.modals.delete,
|
||||
style: TextStyle(color: Colors.red),
|
||||
),
|
||||
),
|
||||
TextButton(
|
||||
onPressed:
|
||||
@@ -57,7 +63,7 @@ class DeleteAccountPopup extends StatelessWidget {
|
||||
: () {
|
||||
onCancel();
|
||||
},
|
||||
child: Text("Cancel"),
|
||||
child: Text(t.modals.cancel),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:okane/database/collections/account.dart';
|
||||
import 'package:okane/database/database.dart';
|
||||
import 'package:okane/i18n/strings.g.dart';
|
||||
import 'package:okane/ui/state/core.dart';
|
||||
import 'package:okane/ui/utils.dart';
|
||||
import 'package:okane/ui/widgets/piechart_card.dart';
|
||||
@@ -24,14 +25,16 @@ class TotalBalanceCard extends StatelessWidget {
|
||||
return BlocBuilder<CoreCubit, CoreState>(
|
||||
builder: (context, state) {
|
||||
return ResponsiveCard(
|
||||
titleText: "Total Balance",
|
||||
titleText: t.pages.accounts.totalBalance.title,
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(16),
|
||||
child: FutureBuilder(
|
||||
future: _getTotalBalance(state.accounts),
|
||||
builder: (context, snapshot) {
|
||||
return Text(
|
||||
snapshot.hasData ? formatCurrency(snapshot.data!) : "...",
|
||||
snapshot.hasData
|
||||
? formatCurrency(snapshot.data!)
|
||||
: t.pages.accounts.totalBalance.loading,
|
||||
style: Theme.of(context).textTheme.bodyLarge,
|
||||
);
|
||||
},
|
||||
|
||||
@@ -4,6 +4,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:get_it/get_it.dart';
|
||||
import 'package:okane/database/collections/recurrent.dart';
|
||||
import 'package:okane/database/database.dart';
|
||||
import 'package:okane/i18n/strings.g.dart';
|
||||
import 'package:okane/ui/state/core.dart';
|
||||
import 'package:okane/ui/utils.dart';
|
||||
import 'package:okane/ui/widgets/add_transaction.dart';
|
||||
@@ -28,25 +29,40 @@ class UpcomingTransactionsCard extends StatelessWidget {
|
||||
upcoming.isEmpty
|
||||
? [
|
||||
Text(
|
||||
"No upcoming transactions",
|
||||
t
|
||||
.pages
|
||||
.accounts
|
||||
.upcomingTransactions
|
||||
.noUpcomingTransactions,
|
||||
style: Theme.of(context).textTheme.bodyLarge,
|
||||
),
|
||||
]
|
||||
: upcoming
|
||||
.map(
|
||||
(t) => ListTile(
|
||||
(transaction) => ListTile(
|
||||
title: Text(
|
||||
"${t.template.value!.name} (${t.template.value!.amount}€)",
|
||||
t.pages.accounts.upcomingTransactions.items.title(
|
||||
name: transaction.template.value!.name,
|
||||
amount:
|
||||
"${formatCurrency(transaction.template.value!.amount)}€",
|
||||
),
|
||||
),
|
||||
subtitle: Text(
|
||||
"Due in ${today.difference(t.lastExecution ?? today).inDays} days",
|
||||
t.pages.accounts.upcomingTransactions.items.dueIn(
|
||||
number:
|
||||
today
|
||||
.difference(
|
||||
transaction.lastExecution ?? today,
|
||||
)
|
||||
.inDays,
|
||||
),
|
||||
),
|
||||
leading: Icon(
|
||||
t.template.value!.amount < 0
|
||||
transaction.template.value!.amount < 0
|
||||
? Icons.remove
|
||||
: Icons.add,
|
||||
color:
|
||||
t.template.value!.amount < 0
|
||||
transaction.template.value!.amount < 0
|
||||
? Colors.red
|
||||
: Colors.green,
|
||||
),
|
||||
@@ -58,12 +74,14 @@ class UpcomingTransactionsCard extends StatelessWidget {
|
||||
builder:
|
||||
(context) => AddTransactionWidget(
|
||||
activeAccountItem: bloc.activeAccount!,
|
||||
template: t.template.value!,
|
||||
onAdd: (transaction) async {
|
||||
template: transaction.template.value!,
|
||||
onAdd: (newTransaction) async {
|
||||
// Update the recurring template
|
||||
print(transaction.date);
|
||||
t.lastExecution = transaction.date;
|
||||
await upsertRecurringTransaction(t);
|
||||
transaction.lastExecution =
|
||||
newTransaction.date;
|
||||
await upsertRecurringTransaction(
|
||||
transaction,
|
||||
);
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
@@ -74,7 +92,7 @@ class UpcomingTransactionsCard extends StatelessWidget {
|
||||
)
|
||||
.toList();
|
||||
return ResponsiveCard(
|
||||
titleText: "Upcoming Transactions",
|
||||
titleText: t.pages.accounts.upcomingTransactions.title,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(16),
|
||||
child: Column(children: transactions),
|
||||
|
||||
Reference in New Issue
Block a user