commit
4d155651de
12
l10n-missing-translation.json
Normal file
12
l10n-missing-translation.json
Normal 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
4
l10n.yaml
Normal 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
17
lib/l10n/app_en.arb
Normal 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
3
lib/l10n/app_hi.arb
Normal file
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"ok": "ok"
|
||||
}
|
8
lib/l10n/l10n.dart
Normal file
8
lib/l10n/l10n.dart
Normal file
|
@ -0,0 +1,8 @@
|
|||
import 'dart:ui';
|
||||
|
||||
class L10n {
|
||||
static final all = [
|
||||
const Locale('en'),
|
||||
const Locale('hi'),
|
||||
];
|
||||
}
|
|
@ -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,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue