Merge pull request #22 from ente-io/l10n

Basic setup for L10n
This commit is contained in:
Neeraj Gupta 2021-08-31 16:08:46 +05:30 committed by GitHub
commit 4d155651de
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 111 additions and 30 deletions

View file

@ -0,0 +1,12 @@
{
"hi": [
"sign_up",
"log_in",
"oops",
"start_backup",
"auth_session_expired",
"auth_login_again",
"auth_logging_out",
"email_already_claimed"
]
}

4
l10n.yaml Normal file
View file

@ -0,0 +1,4 @@
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart
untranslated-messages-file: l10n-missing-translation.json

17
lib/l10n/app_en.arb Normal file
View file

@ -0,0 +1,17 @@
{
"sign_up": "sign up",
"@sign_up": {
"description": "Text on the sign up button used during registration"
},
"log_in": "log in",
"ok": "ok",
"oops": "oops",
"@oops": {
"description": "Usage: 'oops, I'm sorry!' or 'oops, verification failed'"
},
"start_backup": "start backup",
"auth_session_expired": "session expired",
"auth_login_again": "please login again",
"auth_logging_out": "logging out...",
"email_already_claimed": "this email is already in use"
}

3
lib/l10n/app_hi.arb Normal file
View file

@ -0,0 +1,3 @@
{
"ok": "ok"
}

8
lib/l10n/l10n.dart Normal file
View file

@ -0,0 +1,8 @@
import 'dart:ui';
class L10n {
static final all = [
const Locale('en'),
const Locale('hi'),
];
}

View file

@ -4,6 +4,7 @@ import 'package:background_fetch/background_fetch.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:in_app_purchase/in_app_purchase.dart';
import 'package:logging/logging.dart';
import 'package:path_provider/path_provider.dart';
@ -27,6 +28,9 @@ import 'package:photos/utils/crypto_util.dart';
import 'package:photos/utils/file_uploader.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:super_logging/super_logging.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'l10n/l10n.dart';
final _logger = Logger("main");
@ -241,6 +245,13 @@ class _EnteAppState extends State<EnteApp> with WidgetsBindingObserver {
home: EnteApp._homeWidget,
debugShowCheckedModeBanner: false,
builder: EasyLoading.init(),
supportedLocales: L10n.all,
localizationsDelegates: [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
);
}

View file

@ -28,7 +28,7 @@ import 'package:photos/utils/crypto_util.dart';
import 'package:photos/utils/dialog_util.dart';
import 'package:photos/utils/navigation_util.dart';
import 'package:photos/utils/toast_util.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class UserService {
final _dio = Network.instance.getDio();
final _logger = Logger("UserAuthenticator");
@ -71,7 +71,8 @@ class UserService {
} on DioError catch (e) {
await dialog.hide();
if (e.response != null && e.response.statusCode == 403) {
showErrorDialog(context, "oops", "this email is already in use");
showErrorDialog(context, AppLocalizations.of(context).oops,
AppLocalizations.of(context).email_already_claimed);
} else {
showGenericErrorDialog(context);
}
@ -179,13 +180,14 @@ class UserService {
(route) => route.isFirst,
);
} else {
showErrorDialog(
context, "oops", "verification failed, please try again");
showErrorDialog(context, AppLocalizations.of(context).oops,
"verification failed, please try again");
}
} catch (e) {
await dialog.hide();
_logger.severe(e);
showErrorDialog(context, "oops", "verification failed, please try again");
showErrorDialog(context, AppLocalizations.of(context).oops,
"verification failed, please try again");
}
}
@ -217,11 +219,13 @@ class UserService {
Bus.instance.fire(EmailChangedEvent());
return;
}
showErrorDialog(context, "oops", "verification failed, please try again");
showErrorDialog(context, AppLocalizations.of(context).oops,
"verification failed, please try again");
} on DioError catch (e) {
await dialog.hide();
if (e.response != null && e.response.statusCode == 403) {
showErrorDialog(context, "oops", "this email is already in use");
showErrorDialog(context, AppLocalizations.of(context).oops,
AppLocalizations.of(context).email_already_claimed);
} else {
showErrorDialog(context, "incorrect code",
"authentication failed, please try again");
@ -229,7 +233,8 @@ class UserService {
} catch (e) {
await dialog.hide();
_logger.severe(e);
showErrorDialog(context, "oops", "verification failed, please try again");
showErrorDialog(context, AppLocalizations.of(context).oops,
"verification failed, please try again");
}
}
@ -352,7 +357,8 @@ class UserService {
await dialog.hide();
_logger.severe(e);
showErrorDialog(
context, "oops", "authentication failed, please try again");
context, AppLocalizations.of(context).oops,
"authentication failed, please try again");
}
}
@ -393,12 +399,14 @@ class UserService {
);
} else {
showErrorDialog(
context, "oops", "something went wrong, please try again");
context, AppLocalizations.of(context).oops,
"something went wrong, please try again");
}
} catch (e) {
_logger.severe(e);
showErrorDialog(
context, "oops", "something went wrong, please try again");
context, AppLocalizations.of(context).oops,
"something went wrong, please try again");
} finally {
await dialog.hide();
}
@ -459,12 +467,14 @@ class UserService {
);
} else {
showErrorDialog(
context, "oops", "something went wrong, please try again");
context, AppLocalizations.of(context).oops,
"something went wrong, please try again");
}
} catch (e) {
_logger.severe(e);
showErrorDialog(
context, "oops", "something went wrong, please try again");
context, AppLocalizations.of(context).oops,
"something went wrong, please try again");
} finally {
await dialog.hide();
}

View file

@ -15,6 +15,7 @@ import 'package:photos/ui/web_page.dart';
import 'package:photos/utils/data_util.dart';
import 'package:photos/utils/dialog_util.dart';
import 'package:photos/utils/email_util.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class EmailEntryPage extends StatefulWidget {
EmailEntryPage({Key key}) : super(key: key);
@ -65,7 +66,7 @@ class _EmailEntryPageState extends State<EmailEntryPage> {
child: Material(
type: MaterialType.transparency,
child: Text(
"sign up",
AppLocalizations.of(context).sign_up,
style: TextStyle(
fontSize: 18,
letterSpacing: 0.6,
@ -200,7 +201,7 @@ class _EmailEntryPageState extends State<EmailEntryPage> {
height: 64,
padding: const EdgeInsets.fromLTRB(80, 0, 80, 0),
child: button(
"sign up",
AppLocalizations.of(context).sign_up,
onPressed: _isFormValid()
? () {
if (!isValidEmail(_email)) {

View file

@ -45,6 +45,7 @@ import 'package:photos/utils/dialog_util.dart';
import 'package:photos/utils/navigation_util.dart';
import 'package:receive_sharing_intent/receive_sharing_intent.dart';
import 'package:uni_links/uni_links.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class HomeWidget extends StatefulWidget {
const HomeWidget({Key key}) : super(key: key);
@ -116,19 +117,19 @@ class _HomeWidgetState extends State<HomeWidget> {
_triggerLogoutEvent =
Bus.instance.on<TriggerLogoutEvent>().listen((event) async {
AlertDialog alert = AlertDialog(
title: Text("session expired"),
content: Text("please login again"),
title: Text(AppLocalizations.of(context).auth_session_expired),
content: Text(AppLocalizations.of(context).auth_login_again),
actions: [
TextButton(
child: Text(
"ok",
AppLocalizations.of(context).ok,
style: TextStyle(
color: Theme.of(context).buttonColor,
),
),
onPressed: () async {
Navigator.of(context, rootNavigator: true).pop('dialog');
final dialog = createProgressDialog(context, "logging out...");
final dialog = createProgressDialog(context, AppLocalizations.of(context).auth_logging_out);
await dialog.show();
await Configuration.instance.logout();
await dialog.hide();
@ -388,7 +389,7 @@ class _HomeWidgetState extends State<HomeWidget> {
height: 64,
padding: const EdgeInsets.fromLTRB(60, 0, 60, 0),
child: button(
"start backup",
AppLocalizations.of(context).start_backup,
fontSize: 16,
lineHeight: 1.5,
padding: EdgeInsets.only(bottom: 4),
@ -401,7 +402,7 @@ class _HomeWidgetState extends State<HomeWidget> {
context,
BackupFolderSelectionPage(
shouldSelectAll: true,
buttonText: "start backup",
buttonText: AppLocalizations.of(context).start_backup,
),
);
}

View file

@ -7,7 +7,7 @@ import 'package:photos/ui/login_page.dart';
import 'package:photos/ui/password_entry_page.dart';
import 'package:photos/ui/password_reentry_page.dart';
import 'package:photos/ui/payment/subscription.dart';
import 'package:photos/ui/payment/subscription_page.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class LandingPageWidget extends StatefulWidget {
const LandingPageWidget({Key key}) : super(key: key);
@ -110,7 +110,7 @@ class _LandingPageWidgetState extends State<LandingPageWidget> {
child: Material(
type: MaterialType.transparency,
child: Text(
"log in",
AppLocalizations.of(context).log_in,
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 16,
@ -153,7 +153,7 @@ class _LandingPageWidgetState extends State<LandingPageWidget> {
child: Material(
type: MaterialType.transparency,
child: Text(
"sign up",
AppLocalizations.of(context).sign_up,
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 18,

View file

@ -8,6 +8,7 @@ import 'package:photos/ui/common_elements.dart';
import 'package:photos/ui/web_page.dart';
import 'package:photos/utils/dialog_util.dart';
import 'package:photos/utils/email_util.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class LoginPage extends StatefulWidget {
LoginPage({Key key}) : super(key: key);
@ -35,7 +36,7 @@ class _LoginPageState extends State<LoginPage> {
child: Material(
type: MaterialType.transparency,
child: Text(
"log in",
AppLocalizations.of(context).log_in,
style: TextStyle(
fontSize: 16,
letterSpacing: 0.6,
@ -137,7 +138,7 @@ class _LoginPageState extends State<LoginPage> {
height: 64,
padding: const EdgeInsets.fromLTRB(80, 0, 80, 0),
child: button(
"log in",
AppLocalizations.of(context).log_in,
onPressed: _email != null && _email.isNotEmpty
? () {
if (!isValidEmail(_email)) {

View file

@ -7,6 +7,7 @@ import 'package:photos/events/subscription_purchased_event.dart';
import 'package:photos/ui/common_elements.dart';
import 'package:photos/ui/recovery_page.dart';
import 'package:photos/utils/dialog_util.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class PasswordReentryPage extends StatefulWidget {
PasswordReentryPage({Key key}) : super(key: key);
@ -92,7 +93,7 @@ class _PasswordReentryPageState extends State<PasswordReentryPage> {
width: double.infinity,
height: 64,
child: button(
"log in",
AppLocalizations.of(context).log_in,
fontSize: 18,
onPressed: _passwordController.text.isNotEmpty
? () async {

View file

@ -18,6 +18,7 @@ import 'package:photos/utils/dialog_util.dart';
import 'package:photos/utils/email_util.dart';
import 'package:photos/utils/share_util.dart';
import 'package:photos/utils/toast_util.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class SharingDialog extends StatefulWidget {
final Collection collection;
@ -156,11 +157,12 @@ class _SharingDialogState extends State<SharingDialog> {
"please enter a valid email address.");
return;
} else if (email == Configuration.instance.getEmail()) {
showErrorDialog(context, "oops", "you cannot share with yourself");
showErrorDialog(context, AppLocalizations.of(context).oops,
"you cannot share with yourself");
return;
} else if (widget.collection.sharees.any((user) => user.email == email)) {
showErrorDialog(
context, "oops", "you're already sharing this with " + email);
showErrorDialog(context, AppLocalizations.of(context).oops,
"you're already sharing this with " + email);
return;
}
if (publicKey == null) {

View file

@ -337,6 +337,11 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.0"
flutter_localizations:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_native_splash:
dependency: "direct dev"
description:

View file

@ -39,6 +39,8 @@ dependencies:
path: thirdparty/extended_image
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
flutter_cache_manager: ^3.0.1
flutter_easyloading: ^3.0.0
flutter_email_sender: ^5.0.0
@ -144,6 +146,9 @@ flutter:
# the material Icons class.
uses-material-design: true
# Flutter localization
generate: true
# To add assets to your application, add an assets section, like this:
# assets:
# - images/a_dot_burr.jpeg