Skip to content

Commit f3894ee

Browse files
authored
Localize page titles (#277)
* Localize page titles
1 parent 1033eb2 commit f3894ee

28 files changed

+603
-142
lines changed

lib/app.dart

+36-5
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,22 @@ class UbuntuSettingsApp extends StatefulWidget {
1818
class _UbuntuSettingsAppState extends State<UbuntuSettingsApp> {
1919
final _filteredItems = <YaruPageItem>[];
2020
final _searchController = TextEditingController();
21+
late List<YaruPageItem> pageItems = getPageItems(context);
2122

2223
void _onEscape() => setState(() {
2324
_filteredItems.clear();
2425
_searchController.clear();
2526
});
2627

27-
void _onSearchChanged(String value) {
28+
void _onSearchChanged(String value, BuildContext context) {
2829
setState(() {
2930
_filteredItems.clear();
30-
_filteredItems.addAll(pageItems.where((element) =>
31-
element.title.toLowerCase().contains(value.toLowerCase())));
31+
_filteredItems.addAll(pageItems.where((pageItem) {
32+
if (pageItem.searchMatches != null) {
33+
return pageItem.searchMatches!(value, context);
34+
}
35+
return false;
36+
}));
3237
});
3338
}
3439

@@ -46,10 +51,10 @@ class _UbuntuSettingsAppState extends State<UbuntuSettingsApp> {
4651
searchHint: context.l10n.searchHint,
4752
searchIconData: YaruIcons.search,
4853
appBar: YaruSearchAppBar(
49-
searchHint: 'Search...',
54+
searchHint: context.l10n.searchHint,
5055
clearSearchIconData: YaruIcons.window_close,
5156
searchController: _searchController,
52-
onChanged: _onSearchChanged,
57+
onChanged: (v) => _onSearchChanged(v, context),
5358
onEscape: _onEscape,
5459
appBarHeight: 48,
5560
searchIconData: YaruIcons.search,
@@ -65,3 +70,29 @@ class _UbuntuSettingsAppState extends State<UbuntuSettingsApp> {
6570
);
6671
}
6772
}
73+
74+
class MySearchDelegate extends SearchDelegate<String> {
75+
@override
76+
List<Widget>? buildActions(BuildContext context) {
77+
// TODO: implement buildActions
78+
throw UnimplementedError();
79+
}
80+
81+
@override
82+
Widget? buildLeading(BuildContext context) {
83+
// TODO: implement buildLeading
84+
throw UnimplementedError();
85+
}
86+
87+
@override
88+
Widget buildResults(BuildContext context) {
89+
// TODO: implement buildResults
90+
throw UnimplementedError();
91+
}
92+
93+
@override
94+
Widget buildSuggestions(BuildContext context) {
95+
// TODO: implement buildSuggestions
96+
throw UnimplementedError();
97+
}
98+
}

lib/l10n/app_de.arb

+29-1
Original file line numberDiff line numberDiff line change
@@ -71,5 +71,33 @@
7171
"thunderBoltPageTitle": "Thunderbolt",
7272
"houseKeepingPageTitle": "Datenbereinigung",
7373
"screenLockPageTitle": "Bildschirmsperre",
74-
"diagnosisPageTitle": "Fehlerdiagnose"
74+
"diagnosisPageTitle": "Fehlerdiagnose",
75+
"connectionsPageTitle": "Verbindungen",
76+
"wifiPageTitle": "Wi-Fi",
77+
"ethernetPageTitle": "Ethernet",
78+
"cellularPageTitle": "Mobilfunk",
79+
"bluetoothPageTitle": "Bluetooth",
80+
"wallpaperPageTitle": "Hintergrund",
81+
"appearancePageTitle": "Erscheinungsbild",
82+
"multiTaskingPageTitle": "Multi-tasking",
83+
"notificationsPageTitle": "Benachrichtigungen",
84+
"searchPageTitle": "Suche",
85+
"appsPageTitle": "Apps",
86+
"onlineAccountsPageTitle": "Online Konten",
87+
"soundPageTitle": "Klang",
88+
"powerPageTitle": "Energie",
89+
"displaysPageTitle": "Anzeige",
90+
"mouseAndTouchPadPageTitle": "Maus und Touchpad",
91+
"keyboardPageTitle": "Tastatur",
92+
"keyboardSettingsPageTitle": "Tastatureinstellungen",
93+
"keyboardShortCutsPageTitle": "Tastaturkürzel",
94+
"printersPageTitle": "Drucker",
95+
"removableMediaPageTitle": "Wechselmedien",
96+
"colorPageTitle": "Farbe",
97+
"regionAndLanguagePageTitle": "Region und Sprache",
98+
"accessibilityPageTitle": "Erleichterte Bedienung",
99+
"usersPageTitle": "Benutzer",
100+
"defaultAppsPageTitle": "Vorgabeanwendungen",
101+
"dateAndTimePageTitle": "Datum und Uhrzeit",
102+
"infoPageTitle": "Info"
75103
}

lib/l10n/app_en.arb

+29-1
Original file line numberDiff line numberDiff line change
@@ -71,5 +71,33 @@
7171
"thunderBoltPageTitle": "Thunderbolt",
7272
"houseKeepingPageTitle": "House Keeping",
7373
"screenLockPageTitle": "Screen Lock",
74-
"diagnosisPageTitle": "Diagnostics"
74+
"diagnosisPageTitle": "Diagnostics",
75+
"connectionsPageTitle": "Connections",
76+
"wifiPageTitle": "Wi-Fi",
77+
"ethernetPageTitle": "Ethernet",
78+
"cellularPageTitle": "Cellular",
79+
"bluetoothPageTitle": "Bluetooth",
80+
"wallpaperPageTitle": "Wallpaper",
81+
"appearancePageTitle": "Appearance",
82+
"multiTaskingPageTitle": "Multi-tasking",
83+
"notificationsPageTitle": "Notifications",
84+
"searchPageTitle": "Search",
85+
"appsPageTitle": "Apps",
86+
"onlineAccountsPageTitle": "Online Accounts",
87+
"soundPageTitle": "Sound",
88+
"powerPageTitle": "Power",
89+
"displaysPageTitle": "Displays",
90+
"mouseAndTouchPadPageTitle": "Mouse and touch pad",
91+
"keyboardPageTitle": "Keyboard",
92+
"keyboardSettingsPageTitle": "Keyboard Settings",
93+
"keyboardShortCutsPageTitle": "Keyboard Shortcuts",
94+
"printersPageTitle": "Printers",
95+
"removableMediaPageTitle": "Removable Media",
96+
"colorPageTitle": "Color",
97+
"regionAndLanguagePageTitle": "Region and language",
98+
"accessibilityPageTitle": "Accessibility",
99+
"usersPageTitle": "Users",
100+
"defaultAppsPageTitle": "Default Applications",
101+
"dateAndTimePageTitle": "Date and time",
102+
"infoPageTitle": "Info"
75103
}

lib/view/pages/accessibility/accessibility_page.dart

+11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:flutter/material.dart';
22
import 'package:provider/provider.dart';
3+
import 'package:settings/l10n/l10n.dart';
34
import 'package:settings/services/settings_service.dart';
45
import 'package:settings/view/pages/accessibility/accessibility_model.dart';
56
import 'package:settings/view/pages/accessibility/global_section.dart';
@@ -20,6 +21,16 @@ class AccessibilityPage extends StatelessWidget {
2021
);
2122
}
2223

24+
static Widget createTitle(BuildContext context) =>
25+
Text(context.l10n.accessibilityPageTitle);
26+
27+
static bool searchMatches(String value, BuildContext context) =>
28+
value.isNotEmpty
29+
? context.l10n.accessibilityPageTitle
30+
.toLowerCase()
31+
.contains(value.toLowerCase())
32+
: false;
33+
2334
@override
2435
Widget build(BuildContext context) {
2536
return const YaruPage(

lib/view/pages/appearance/appearance_page.dart

+9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:flutter/material.dart';
22
import 'package:provider/provider.dart';
3+
import 'package:settings/l10n/l10n.dart';
34
import 'package:settings/services/settings_service.dart';
45
import 'package:settings/view/pages/appearance/dock_model.dart';
56
import 'package:settings/view/pages/appearance/dark_mode_section.dart';
@@ -17,6 +18,14 @@ class AppearancePage extends StatelessWidget {
1718
);
1819
}
1920

21+
static Widget createTitle(BuildContext context) =>
22+
Text(context.l10n.appearancePageTitle);
23+
24+
static bool searchMatches(String value, BuildContext context) => value
25+
.isNotEmpty
26+
? context.l10n.appsPageTitle.toLowerCase().contains(value.toLowerCase())
27+
: false;
28+
2029
@override
2130
Widget build(BuildContext context) {
2231
return const YaruPage(

lib/view/pages/apps/apps_page.dart

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:settings/l10n/l10n.dart';
3+
import 'package:yaru_widgets/yaru_widgets.dart';
4+
5+
class AppsPage extends StatelessWidget {
6+
const AppsPage({Key? key}) : super(key: key);
7+
8+
static Widget create(BuildContext context) => const AppsPage();
9+
10+
static Widget createTitle(BuildContext context) =>
11+
Text(context.l10n.appsPageTitle);
12+
13+
static bool searchMatches(String value, BuildContext context) => value
14+
.isNotEmpty
15+
? context.l10n.appsPageTitle.toLowerCase().contains(value.toLowerCase())
16+
: false;
17+
18+
@override
19+
Widget build(BuildContext context) {
20+
return YaruPage(children: [
21+
Center(
22+
child: Text(context.l10n.appsPageTitle),
23+
)
24+
]);
25+
}
26+
}

lib/view/pages/bluetooth/bluetooth_page.dart

+11
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,22 @@ import 'package:bluez/bluez.dart';
22
import 'package:flutter/material.dart';
33
import 'package:provider/provider.dart';
44
import 'package:settings/constants.dart';
5+
import 'package:settings/l10n/l10n.dart';
56
import 'package:settings/view/pages/bluetooth/bluetooth_device_row.dart';
67
import 'package:settings/view/pages/bluetooth/bluetooth_model.dart';
78
import 'package:yaru_widgets/yaru_widgets.dart';
89

910
class BluetoothPage extends StatefulWidget {
11+
static bool searchMatches(String value, BuildContext context) =>
12+
value.isNotEmpty
13+
? context.l10n.bluetoothPageTitle
14+
.toLowerCase()
15+
.contains(value.toLowerCase())
16+
: false;
17+
18+
static Widget createTitle(BuildContext context) =>
19+
Text(context.l10n.bluetoothPageTitle);
20+
1021
const BluetoothPage({Key? key}) : super(key: key);
1122

1223
static Widget create(BuildContext context) {

lib/view/pages/color/color_page.dart

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:settings/l10n/l10n.dart';
3+
import 'package:yaru_widgets/yaru_widgets.dart';
4+
5+
class ColorPage extends StatelessWidget {
6+
const ColorPage({Key? key}) : super(key: key);
7+
8+
static Widget create(BuildContext context) => const ColorPage();
9+
10+
static Widget createTitle(BuildContext context) =>
11+
Text(context.l10n.colorPageTitle);
12+
13+
static bool searchMatches(String value, BuildContext context) => value
14+
.isNotEmpty
15+
? context.l10n.colorPageTitle.toLowerCase().contains(value.toLowerCase())
16+
: false;
17+
18+
@override
19+
Widget build(BuildContext context) {
20+
return YaruPage(
21+
children: [Center(child: Text(context.l10n.colorPageTitle))]);
22+
}
23+
}

lib/view/pages/connections/connections_page.dart

+11
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
22
import 'package:nm/nm.dart';
33
import 'package:provider/provider.dart';
44
import 'package:settings/constants.dart';
5+
import 'package:settings/l10n/l10n.dart';
56
import 'package:settings/view/pages/connections/wifi_content.dart';
67
import 'package:yaru_icons/yaru_icons.dart';
78
import 'package:yaru_widgets/yaru_widgets.dart';
@@ -17,6 +18,16 @@ class ConnectionsPage extends StatefulWidget {
1718
);
1819
}
1920

21+
static Widget createTitle(BuildContext context) =>
22+
Text(context.l10n.connectionsPageTitle);
23+
24+
static bool searchMatches(String value, BuildContext context) =>
25+
value.isNotEmpty
26+
? context.l10n.connectionsPageTitle
27+
.toLowerCase()
28+
.contains(value.toLowerCase())
29+
: false;
30+
2031
const ConnectionsPage({Key? key}) : super(key: key);
2132

2233
@override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:settings/l10n/l10n.dart';
3+
import 'package:yaru_widgets/yaru_widgets.dart';
4+
5+
class DateAndTimePage extends StatelessWidget {
6+
const DateAndTimePage({Key? key}) : super(key: key);
7+
8+
static Widget create(BuildContext context) => const DateAndTimePage();
9+
10+
static Widget createTitle(BuildContext context) =>
11+
Text(context.l10n.dateAndTimePageTitle);
12+
13+
static bool searchMatches(String value, BuildContext context) =>
14+
value.isNotEmpty
15+
? context.l10n.dateAndTimePageTitle
16+
.toLowerCase()
17+
.contains(value.toLowerCase())
18+
: false;
19+
20+
@override
21+
Widget build(BuildContext context) {
22+
return YaruPage(children: [
23+
Center(
24+
child: Text(context.l10n.dateAndTimePageTitle),
25+
)
26+
]);
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:settings/l10n/l10n.dart';
3+
import 'package:yaru_widgets/yaru_widgets.dart';
4+
5+
class DefaultAppsPage extends StatelessWidget {
6+
const DefaultAppsPage({Key? key}) : super(key: key);
7+
8+
static Widget create(BuildContext context) => const DefaultAppsPage();
9+
10+
static Widget createTitle(BuildContext context) =>
11+
Text(context.l10n.defaultAppsPageTitle);
12+
13+
static bool searchMatches(String value, BuildContext context) =>
14+
value.isNotEmpty
15+
? context.l10n.defaultAppsPageTitle
16+
.toLowerCase()
17+
.contains(value.toLowerCase())
18+
: false;
19+
20+
@override
21+
Widget build(BuildContext context) {
22+
return YaruPage(children: [
23+
Center(
24+
child: Text(context.l10n.defaultAppsPageTitle),
25+
)
26+
]);
27+
}
28+
}

lib/view/pages/info/info_page.dart

+9
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:provider/provider.dart';
66
import 'package:rive/rive.dart';
77
import 'package:settings/api/pdf_api.dart';
88
import 'package:settings/constants.dart';
9+
import 'package:settings/l10n/l10n.dart';
910
import 'package:settings/services/hostname_service.dart';
1011
import 'package:udisks/udisks.dart';
1112
import 'package:yaru_icons/yaru_icons.dart';
@@ -26,6 +27,14 @@ class InfoPage extends StatefulWidget {
2627
);
2728
}
2829

30+
static Widget createTitle(BuildContext context) =>
31+
Text(context.l10n.infoPageTitle);
32+
33+
static bool searchMatches(String value, BuildContext context) => value
34+
.isNotEmpty
35+
? context.l10n.infoPageTitle.toLowerCase().contains(value.toLowerCase())
36+
: false;
37+
2938
@override
3039
_InfoPageState createState() => _InfoPageState();
3140
}

lib/view/pages/keyboard/keyboard_page.dart

+12-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:flutter/material.dart';
22
import 'package:settings/constants.dart';
3+
import 'package:settings/l10n/l10n.dart';
34
import 'package:settings/view/pages/keyboard/keyboard_settings_page.dart';
45
import 'package:settings/view/pages/keyboard/keyboard_shortcuts_page.dart';
56
import 'package:yaru_icons/yaru_icons.dart';
@@ -8,9 +9,17 @@ import 'package:yaru_widgets/yaru_widgets.dart';
89
class KeyboardPage extends StatefulWidget {
910
const KeyboardPage({Key? key}) : super(key: key);
1011

11-
static Widget create(BuildContext context) {
12-
return const KeyboardPage();
13-
}
12+
static Widget create(BuildContext context) => const KeyboardPage();
13+
14+
static Widget createTitle(BuildContext context) =>
15+
Text(context.l10n.onlineAccountsPageTitle);
16+
17+
static bool searchMatches(String value, BuildContext context) =>
18+
value.isNotEmpty
19+
? context.l10n.keyboardPageTitle
20+
.toLowerCase()
21+
.contains(value.toLowerCase())
22+
: false;
1423

1524
@override
1625
State<KeyboardPage> createState() => _KeyboardPageState();

0 commit comments

Comments
 (0)