feat(ui): Localise more pages
This commit is contained in:
parent
1e3fc9be3d
commit
a30b8f888d
@ -6,12 +6,50 @@
|
||||
"loginButton": "Login",
|
||||
"registerButton": "Register"
|
||||
},
|
||||
"login": {
|
||||
"title": "Login",
|
||||
"xmppAddress": "XMPP-Address",
|
||||
"password": "Password",
|
||||
"advancedOptions": "Advanced options",
|
||||
"createAccount": "Create account on server"
|
||||
},
|
||||
"conversations": {
|
||||
"speeddialNewChat": "New chat",
|
||||
"speeddialJoinGroupchat": "Join groupchat",
|
||||
"overlaySettings": "Settings",
|
||||
"noOpenChats": "You have no open chats",
|
||||
"startChat": "Start a chat"
|
||||
},
|
||||
"addcontact": {
|
||||
"title": "Add new contact",
|
||||
"xmppAddress": "XMPP-Address",
|
||||
"subtitle": "You can add a contact either by typing in their XMPP address or by scanning their QR code",
|
||||
"buttonAddToContact": "Add to contacts"
|
||||
},
|
||||
"newconversation": {
|
||||
"title": "Start new chat",
|
||||
"addContact": "Add contact",
|
||||
"createGroupchat": "Create groupchat"
|
||||
},
|
||||
"crop": {
|
||||
"setProfilePicture": "Set as profile picture"
|
||||
},
|
||||
"shareselection": {
|
||||
"shareWith": "Share with...",
|
||||
"confirmTitle": "Send file",
|
||||
"confirmBody": "One or more chats are unencrypted. This means that the file will be leaked to the server. Do you still want to continue?"
|
||||
},
|
||||
"profile": {
|
||||
"self": {
|
||||
"devices": "Devices"
|
||||
},
|
||||
"conversation": {
|
||||
"muteChatTooltip": "Mute chat",
|
||||
"unmuteChatTooltip": "Unmute chat",
|
||||
"muteChat": "Mute",
|
||||
"unmuteChat": "Unmute",
|
||||
"devices": "Devices"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -6,12 +6,50 @@
|
||||
"loginButton": "Einloggen",
|
||||
"registerButton": "Registrieren"
|
||||
},
|
||||
"login": {
|
||||
"title": "Login",
|
||||
"xmppAddress": "XMPP-Adresse",
|
||||
"password": "Passwort",
|
||||
"advancedOptions": "Fortgeschrittene Optionen",
|
||||
"createAccount": "Account auf dem Server erstellen"
|
||||
},
|
||||
"conversations": {
|
||||
"speeddialNewChat": "Neuer chat",
|
||||
"speeddialJoinGroupchat": "Gruppenchat beitreten",
|
||||
"overlaySettings": "Einstellungen",
|
||||
"noOpenChats": "Du hast keine offenen chats",
|
||||
"startChat": "Einen chat anfangen"
|
||||
},
|
||||
"addcontact": {
|
||||
"title": "Neuen Kontakt hinzufügen",
|
||||
"xmppAddress": "XMPP-Adresse",
|
||||
"subtitle": "Du kannst einen Kontakt hinzufügen, indem Du entweder die XMPP-Adresse eingibst oder den QR-Code deines Kontaktes scannst",
|
||||
"buttonAddToContact": "Kontakt hinzufügen"
|
||||
},
|
||||
"newconversation": {
|
||||
"title": "Neuer chat",
|
||||
"addContact": "Kontakt hinzufügen",
|
||||
"createGroupchat": "Gruppenchat erstellen"
|
||||
},
|
||||
"crop": {
|
||||
"setProfilePicture": "Als Profilbild festlegen"
|
||||
},
|
||||
"shareselection": {
|
||||
"shareWith": "Teilen mit...",
|
||||
"confirmTitle": "Dateien senden?",
|
||||
"confirmTitle": "Einer oder mehr Chats sind unverschlüsselt. Das bedeutet, dass die Dateien dem Server unverschlüsselt vorliegen. Dateien trotzdem senden?"
|
||||
},
|
||||
"profile": {
|
||||
"self": {
|
||||
"devices": "Geräte"
|
||||
},
|
||||
"conversation": {
|
||||
"muteChatTooltip": "Chat stummschalten",
|
||||
"unmuteChatTooltip": "Chat lautstellen",
|
||||
"muteChat": "Stummschalten",
|
||||
"unmuteChat": "Lautstellen",
|
||||
"devices": "Geräte"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:moxxyv2/i18n/strings.g.dart';
|
||||
import 'package:moxxyv2/ui/bloc/addcontact_bloc.dart';
|
||||
import 'package:moxxyv2/ui/constants.dart';
|
||||
import 'package:moxxyv2/ui/helpers.dart';
|
||||
@ -21,7 +22,7 @@ class AddContactPage extends StatelessWidget {
|
||||
Widget build(BuildContext context) {
|
||||
return BlocBuilder<AddContactBloc, AddContactState>(
|
||||
builder: (context, state) => Scaffold(
|
||||
appBar: BorderlessTopbar.simple('Add new contact'),
|
||||
appBar: BorderlessTopbar.simple(t.pages.addcontact.title),
|
||||
body: Column(
|
||||
children: [
|
||||
Visibility(
|
||||
@ -32,7 +33,7 @@ class AddContactPage extends StatelessWidget {
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: paddingVeryLarge).add(const EdgeInsets.only(top: 8)),
|
||||
child: CustomTextField(
|
||||
labelText: 'XMPP-Address',
|
||||
labelText: t.pages.addcontact.xmppAddress,
|
||||
onChanged: (value) => context.read<AddContactBloc>().add(
|
||||
JidChangedEvent(value),
|
||||
),
|
||||
@ -52,9 +53,7 @@ class AddContactPage extends StatelessWidget {
|
||||
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: paddingVeryLarge).add(const EdgeInsets.only(top: 8)),
|
||||
child: const Text(
|
||||
'You can add a contact either by typing in their XMPP address or by scanning their QR code',
|
||||
),
|
||||
child: Text(t.pages.addcontact.subtitle),
|
||||
),
|
||||
|
||||
Padding(
|
||||
@ -66,7 +65,7 @@ class AddContactPage extends StatelessWidget {
|
||||
cornerRadius: 32,
|
||||
onTap: () => context.read<AddContactBloc>().add(AddedContactEvent()),
|
||||
enabled: !state.working,
|
||||
child: const Text('Add to contacts'),
|
||||
child: Text(t.pages.addcontact.buttonAddToContact),
|
||||
),
|
||||
)
|
||||
],
|
||||
|
@ -1,6 +1,7 @@
|
||||
import 'package:crop_your_image/crop_your_image.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:moxxyv2/i18n/strings.g.dart';
|
||||
import 'package:moxxyv2/ui/bloc/crop_bloc.dart';
|
||||
import 'package:moxxyv2/ui/constants.dart';
|
||||
import 'package:moxxyv2/ui/widgets/button.dart';
|
||||
@ -60,7 +61,7 @@ class CropPage extends StatelessWidget {
|
||||
RoundedButton(
|
||||
cornerRadius: 100,
|
||||
onTap: _controller.crop,
|
||||
child: const Text('Set as profile picture'),
|
||||
child: Text(t.pages.crop.setProfilePicture),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
@ -1,5 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:moxxyv2/i18n/strings.g.dart';
|
||||
import 'package:moxxyv2/ui/bloc/login_bloc.dart';
|
||||
import 'package:moxxyv2/ui/constants.dart';
|
||||
import 'package:moxxyv2/ui/widgets/button.dart';
|
||||
@ -21,7 +22,7 @@ class Login extends StatelessWidget {
|
||||
builder: (BuildContext context, LoginState state) => WillPopScope(
|
||||
onWillPop: () async => !state.working,
|
||||
child: Scaffold(
|
||||
appBar: BorderlessTopbar.simple('Login'),
|
||||
appBar: BorderlessTopbar.simple(t.pages.login.title),
|
||||
body: Column(
|
||||
children: [
|
||||
Visibility(
|
||||
@ -35,7 +36,7 @@ class Login extends StatelessWidget {
|
||||
child: CustomTextField(
|
||||
// ignore: avoid_dynamic_calls
|
||||
errorText: state.jidState.error,
|
||||
labelText: 'XMPP-Address',
|
||||
labelText: t.pages.login.xmppAddress,
|
||||
enabled: !state.working,
|
||||
cornerRadius: textfieldRadiusRegular,
|
||||
borderColor: primaryColor,
|
||||
@ -49,7 +50,7 @@ class Login extends StatelessWidget {
|
||||
child: CustomTextField(
|
||||
// ignore: avoid_dynamic_calls
|
||||
errorText: state.passwordState.error,
|
||||
labelText: 'Password',
|
||||
labelText: t.pages.login.password,
|
||||
suffixIcon: Padding(
|
||||
padding: const EdgeInsetsDirectional.only(end: 8),
|
||||
child: InkWell(
|
||||
@ -71,12 +72,12 @@ class Login extends StatelessWidget {
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: paddingVeryLarge).add(const EdgeInsets.only(top: 8)),
|
||||
child: ExpansionTile(
|
||||
title: const Text('Advanced options'),
|
||||
title: Text(t.pages.login.advancedOptions),
|
||||
children: [
|
||||
Column(
|
||||
children: [
|
||||
SwitchListTile(
|
||||
title: const Text('Create account on server'),
|
||||
title: Text(t.pages.login.createAccount),
|
||||
value: false,
|
||||
// TODO(Unknown): Implement
|
||||
onChanged: state.working ? null : (value) {},
|
||||
|
@ -1,5 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:moxxyv2/i18n/strings.g.dart';
|
||||
import 'package:moxxyv2/shared/constants.dart';
|
||||
import 'package:moxxyv2/ui/bloc/newconversation_bloc.dart';
|
||||
import 'package:moxxyv2/ui/constants.dart';
|
||||
@ -49,7 +50,7 @@ class NewConversationPage extends StatelessWidget {
|
||||
Widget build(BuildContext context) {
|
||||
final maxTextWidth = MediaQuery.of(context).size.width * 0.6;
|
||||
return Scaffold(
|
||||
appBar: BorderlessTopbar.simple('Start new chat'),
|
||||
appBar: BorderlessTopbar.simple(t.pages.newconversation.title),
|
||||
body: BlocBuilder<NewConversationBloc, NewConversationState>(
|
||||
builder: (BuildContext context, NewConversationState state) => ListView.builder(
|
||||
itemCount: state.roster.length + 2,
|
||||
@ -57,12 +58,12 @@ class NewConversationPage extends StatelessWidget {
|
||||
switch(index) {
|
||||
case 0: return _renderIconEntry(
|
||||
Icons.person_add,
|
||||
'Add contact',
|
||||
t.pages.newconversation.addContact,
|
||||
() => Navigator.pushNamed(context, addContactRoute),
|
||||
);
|
||||
case 1: return _renderIconEntry(
|
||||
Icons.group_add,
|
||||
'Create groupchat',
|
||||
t.pages.newconversation.createGroupchat,
|
||||
() => showNotImplementedDialog('groupchat', context),
|
||||
);
|
||||
default:
|
||||
|
@ -1,5 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get_it/get_it.dart';
|
||||
import 'package:moxxyv2/i18n/strings.g.dart';
|
||||
import 'package:moxxyv2/shared/models/conversation.dart';
|
||||
import 'package:moxxyv2/ui/bloc/devices_bloc.dart';
|
||||
import 'package:moxxyv2/ui/bloc/profile_bloc.dart';
|
||||
@ -55,8 +56,8 @@ class ConversationProfileHeader extends StatelessWidget {
|
||||
children: [
|
||||
Tooltip(
|
||||
message: conversation.muted ?
|
||||
'Unmute chat' :
|
||||
'Mute chat',
|
||||
t.pages.profile.conversation.unmuteChatTooltip :
|
||||
t.pages.profile.conversation.muteChatTooltip,
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
@ -84,8 +85,8 @@ class ConversationProfileHeader extends StatelessWidget {
|
||||
),
|
||||
Text(
|
||||
conversation.muted ?
|
||||
'Unmute' :
|
||||
'Mute',
|
||||
t.pages.profile.conversation.unmuteChat :
|
||||
t.pages.profile.conversation.muteChat,
|
||||
style: const TextStyle(
|
||||
fontSize: fontsizeAppbar,
|
||||
),
|
||||
@ -95,7 +96,7 @@ class ConversationProfileHeader extends StatelessWidget {
|
||||
),
|
||||
// TODO(PapaTutuWawa): Only show when the chat partner has OMEMO keys
|
||||
Tooltip(
|
||||
message: 'Devices',
|
||||
message: t.pages.profile.conversation.devices,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: [
|
||||
@ -114,9 +115,9 @@ class ConversationProfileHeader extends StatelessWidget {
|
||||
GetIt.I.get<DevicesBloc>().add(DevicesRequestedEvent(conversation.jid));
|
||||
},
|
||||
),
|
||||
const Text(
|
||||
'Devices',
|
||||
style: TextStyle(
|
||||
Text(
|
||||
t.pages.profile.conversation.devices,
|
||||
style: const TextStyle(
|
||||
fontSize: fontsizeAppbar,
|
||||
),
|
||||
),
|
||||
|
@ -1,5 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get_it/get_it.dart';
|
||||
import 'package:moxxyv2/i18n/strings.g.dart';
|
||||
import 'package:moxxyv2/ui/bloc/own_devices_bloc.dart';
|
||||
import 'package:moxxyv2/ui/constants.dart';
|
||||
import 'package:moxxyv2/ui/helpers.dart';
|
||||
@ -111,7 +112,7 @@ class SelfProfileHeader extends StatelessWidget {
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: [
|
||||
Tooltip(
|
||||
message: 'Devices',
|
||||
message: t.pages.profile.self.devices,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: [
|
||||
@ -130,9 +131,9 @@ class SelfProfileHeader extends StatelessWidget {
|
||||
GetIt.I.get<OwnDevicesBloc>().add(OwnDevicesRequestedEvent());
|
||||
},
|
||||
),
|
||||
const Text(
|
||||
'Devices',
|
||||
style: TextStyle(
|
||||
Text(
|
||||
t.pages.profile.self.devices,
|
||||
style: const TextStyle(
|
||||
fontSize: fontsizeAppbar,
|
||||
),
|
||||
),
|
||||
|
@ -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:move_to_background/move_to_background.dart';
|
||||
import 'package:moxxyv2/i18n/strings.g.dart';
|
||||
import 'package:moxxyv2/shared/constants.dart';
|
||||
import 'package:moxxyv2/ui/bloc/navigation_bloc.dart' as navigation;
|
||||
import 'package:moxxyv2/ui/bloc/share_selection_bloc.dart';
|
||||
@ -53,7 +54,7 @@ class ShareSelectionPage extends StatelessWidget {
|
||||
child: BlocBuilder<ShareSelectionBloc, ShareSelectionState>(
|
||||
buildWhen: _buildWhen,
|
||||
builder: (context, state) => Scaffold(
|
||||
appBar: BorderlessTopbar.simple('Share with...'),
|
||||
appBar: BorderlessTopbar.simple(t.pages.shareselection.shareWith),
|
||||
body: ListView.builder(
|
||||
itemCount: state.items.length,
|
||||
itemBuilder: (context, index) {
|
||||
@ -101,8 +102,8 @@ class ShareSelectionPage extends StatelessWidget {
|
||||
// Warn the user
|
||||
if (hasUnencrypted && hasEncrypted) {
|
||||
showConfirmationDialog(
|
||||
'Send file',
|
||||
'One or more chats are unencrypted. This means that the file will be leaked to the server. Do you still want to continue?',
|
||||
t.pages.shareselection.confirmTitle,
|
||||
t.pages.shareselection.confirmBody,
|
||||
context,
|
||||
() {
|
||||
bloc.add(SubmittedEvent());
|
||||
|
Loading…
Reference in New Issue
Block a user