Add i18n via slang
This commit is contained in:
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:get_it/get_it.dart';
|
||||
import 'package:okane/database/collections/budget.dart';
|
||||
import 'package:okane/database/database.dart';
|
||||
import 'package:okane/i18n/strings.g.dart';
|
||||
import 'package:okane/ui/state/core.dart';
|
||||
|
||||
class AddBudgetPopup extends StatefulWidget {
|
||||
@@ -23,12 +24,16 @@ class AddBudgetState extends State<AddBudgetPopup> {
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
TextField(
|
||||
decoration: InputDecoration(hintText: "Budget name"),
|
||||
decoration: InputDecoration(
|
||||
hintText: t.pages.budgets.addBudget.budgetNameHint,
|
||||
),
|
||||
controller: _budgetNameEditController,
|
||||
),
|
||||
|
||||
TextField(
|
||||
decoration: InputDecoration(hintText: "Income"),
|
||||
decoration: InputDecoration(
|
||||
hintText: t.pages.budgets.addBudget.income,
|
||||
),
|
||||
controller: _budgetIncomeEditController,
|
||||
keyboardType: TextInputType.numberWithOptions(
|
||||
signed: false,
|
||||
@@ -57,7 +62,7 @@ class AddBudgetState extends State<AddBudgetPopup> {
|
||||
await upsertBudget(budget);
|
||||
widget.onDone();
|
||||
},
|
||||
child: Text("Add"),
|
||||
child: Text(t.modals.add),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -3,6 +3,7 @@ import 'package:get_it/get_it.dart';
|
||||
import 'package:okane/database/collections/budget.dart';
|
||||
import 'package:okane/database/collections/expense_category.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_expense_category.dart';
|
||||
@@ -32,7 +33,7 @@ class AddBudgetItemState extends State<AddBudgetItemPopup> {
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Text("Expense category"),
|
||||
Text(t.common.expenseCategory.name),
|
||||
|
||||
OutlinedButton(
|
||||
onPressed: () async {
|
||||
@@ -46,13 +47,17 @@ class AddBudgetItemState extends State<AddBudgetItemPopup> {
|
||||
|
||||
setState(() => _expenseCategory = category);
|
||||
},
|
||||
child: Text(_expenseCategory?.name ?? "None"),
|
||||
child: Text(
|
||||
_expenseCategory?.name ?? t.common.expenseCategory.none,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
TextField(
|
||||
decoration: InputDecoration(hintText: "Amount"),
|
||||
decoration: InputDecoration(
|
||||
hintText: t.pages.budgets.addBudgetItem.amountHint,
|
||||
),
|
||||
controller: _budgetItemAmountEditController,
|
||||
keyboardType: TextInputType.numberWithOptions(
|
||||
signed: false,
|
||||
@@ -91,7 +96,7 @@ class AddBudgetItemState extends State<AddBudgetItemPopup> {
|
||||
await upsertBudget(widget.budget);
|
||||
widget.onDone();
|
||||
},
|
||||
child: Text("Add"),
|
||||
child: Text(t.modals.add),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
import 'package:fl_chart/fl_chart.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:get_it/get_it.dart';
|
||||
import 'package:okane/database/collections/budget.dart';
|
||||
import 'package:okane/database/database.dart';
|
||||
import 'package:okane/ui/pages/account/breakdown_card.dart';
|
||||
import 'package:okane/i18n/strings.g.dart';
|
||||
import 'package:okane/ui/pages/budgets/add_budget_item.dart';
|
||||
import 'package:okane/ui/state/core.dart';
|
||||
import 'package:okane/ui/utils.dart';
|
||||
import 'package:okane/ui/widgets/piechart.dart';
|
||||
import 'package:okane/ui/widgets/piechart_card.dart';
|
||||
|
||||
class BudgetDetailsPage extends StatelessWidget {
|
||||
@@ -55,13 +53,13 @@ class BudgetDetailsPage extends StatelessWidget {
|
||||
BlocBuilder<CoreCubit, CoreState>(
|
||||
builder: (context, state) {
|
||||
if (state.activeBudget == null) {
|
||||
return Text("No budget selected");
|
||||
return Text(t.pages.budgets.details.noBudgetSelected);
|
||||
}
|
||||
|
||||
if (state.activeBudget!.items.isEmpty) {
|
||||
return Row(
|
||||
children: [
|
||||
Text("No budget items added"),
|
||||
Text(t.pages.budgets.details.noBudgetItems),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(left: 16),
|
||||
child: IconButton(
|
||||
@@ -92,7 +90,7 @@ class BudgetDetailsPage extends StatelessWidget {
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Text(
|
||||
"Budget items",
|
||||
t.pages.budgets.details.budgetItems,
|
||||
style: Theme.of(context).textTheme.titleMedium,
|
||||
),
|
||||
ListView.builder(
|
||||
@@ -105,9 +103,14 @@ class BudgetDetailsPage extends StatelessWidget {
|
||||
final amount = formatCurrency(item.amount);
|
||||
return ListTile(
|
||||
title: Text(
|
||||
"${item.expenseCategory.value!.name} ($amount)",
|
||||
t.pages.budgets.details.items.title(
|
||||
name: item.expenseCategory.value!.name,
|
||||
amount: amount,
|
||||
),
|
||||
),
|
||||
subtitle: Text(
|
||||
t.pages.budgets.details.items.loading,
|
||||
),
|
||||
subtitle: Text("..."),
|
||||
);
|
||||
},
|
||||
),
|
||||
@@ -167,7 +170,7 @@ class BudgetDetailsPage extends StatelessWidget {
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Text(
|
||||
"Days left",
|
||||
t.pages.budgets.details.daysLeft,
|
||||
textAlign: TextAlign.center,
|
||||
style:
|
||||
Theme.of(
|
||||
@@ -199,7 +202,7 @@ class BudgetDetailsPage extends StatelessWidget {
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Text(
|
||||
"Budget left",
|
||||
t.pages.budgets.details.budgetLeft,
|
||||
textAlign: TextAlign.center,
|
||||
style:
|
||||
Theme.of(
|
||||
@@ -233,7 +236,7 @@ class BudgetDetailsPage extends StatelessWidget {
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Text(
|
||||
"Budget total",
|
||||
t.pages.budgets.details.totalBudget,
|
||||
textAlign: TextAlign.center,
|
||||
style:
|
||||
Theme.of(
|
||||
@@ -276,14 +279,21 @@ class BudgetDetailsPage extends StatelessWidget {
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
titleText: "Budget breakdown",
|
||||
titleText:
|
||||
t.pages.budgets.details.budgetBreakdown.title,
|
||||
),
|
||||
),
|
||||
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 8),
|
||||
child: PieChartCard(
|
||||
fallbackText: "No spending available",
|
||||
fallbackText:
|
||||
t
|
||||
.pages
|
||||
.budgets
|
||||
.details
|
||||
.budgetBreakdown
|
||||
.noSpendingAvailable,
|
||||
valueConverter: formatCurrency,
|
||||
items:
|
||||
spending.entries
|
||||
@@ -295,7 +305,13 @@ class BudgetDetailsPage extends StatelessWidget {
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
titleText: "Spending Breakdown",
|
||||
titleText:
|
||||
t
|
||||
.pages
|
||||
.budgets
|
||||
.details
|
||||
.spendingBreakdown
|
||||
.title,
|
||||
),
|
||||
),
|
||||
],
|
||||
@@ -306,7 +322,7 @@ class BudgetDetailsPage extends StatelessWidget {
|
||||
child: Row(
|
||||
children: [
|
||||
Text(
|
||||
"Budget items",
|
||||
t.pages.budgets.details.budgetItems,
|
||||
style: Theme.of(context).textTheme.titleMedium,
|
||||
),
|
||||
Padding(
|
||||
@@ -337,8 +353,12 @@ class BudgetDetailsPage extends StatelessWidget {
|
||||
: item.amount + spent;
|
||||
final subtitleText =
|
||||
left < 0
|
||||
? "${formatCurrency(left)} over"
|
||||
: "${formatCurrency(left)} left";
|
||||
? t.pages.budgets.details.items.over(
|
||||
amount: formatCurrency(left),
|
||||
)
|
||||
: t.pages.budgets.details.items.remaining(
|
||||
amount: formatCurrency(left),
|
||||
);
|
||||
return ListTile(
|
||||
title: Text(
|
||||
"${item.expenseCategory.value!.name} ($amount)",
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:get_it/get_it.dart';
|
||||
import 'package:okane/i18n/strings.g.dart';
|
||||
import 'package:okane/screen.dart';
|
||||
import 'package:okane/ui/pages/budgets/add_budget.dart';
|
||||
import 'package:okane/ui/pages/budgets/edit_budget.dart';
|
||||
@@ -19,7 +20,7 @@ class BudgetListPage extends StatelessWidget {
|
||||
if (state.budgets.isEmpty) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [Text("No budgets")],
|
||||
children: [Text(t.pages.budgets.noBudgets)],
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:okane/database/collections/budget.dart';
|
||||
import 'package:okane/database/database.dart';
|
||||
import 'package:okane/i18n/strings.g.dart';
|
||||
|
||||
class EditBudgetPopup extends StatefulWidget {
|
||||
final Budget budget;
|
||||
@@ -36,12 +37,14 @@ class EditBudgetState extends State<EditBudgetPopup> {
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
TextField(
|
||||
decoration: InputDecoration(hintText: "Name"),
|
||||
decoration: InputDecoration(
|
||||
hintText: t.pages.budgets.addBudget.budgetNameHint,
|
||||
),
|
||||
controller: _budgetNameEditController,
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Text("Include other spendings"),
|
||||
Text(t.pages.budgets.addBudget.includeOtherSpendings),
|
||||
Switch(
|
||||
value: _includeOtherSpendings,
|
||||
onChanged: (value) {
|
||||
@@ -71,7 +74,7 @@ class EditBudgetState extends State<EditBudgetPopup> {
|
||||
await upsertBudget(widget.budget);
|
||||
widget.onDone();
|
||||
},
|
||||
child: Text("Save"),
|
||||
child: Text(t.modals.save),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user