Add i18n via slang

This commit is contained in:
2025-05-12 00:02:19 +02:00
parent 99ab2f006d
commit e0fba11f25
25 changed files with 447 additions and 415 deletions

View File

@@ -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),
),
],
),

View File

@@ -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),
),
],
),

View File

@@ -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)",

View File

@@ -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)],
);
}

View File

@@ -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),
),
],
),