Commit 55dba8dc4b9466d1cd3098f35f1d7617398ac51b

Authored by 常守达
1 parent df1e3d3b

feat(login): 更新国际化及切图

40.4 KB | W: | H:

45.4 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
... ... @@ -18,6 +18,7 @@ import 'package:doublefeel_flutter/data/models/user/user_models.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:intl/intl.dart';
import '../../../../../core/theme/app_colors.dart';
... ... @@ -536,7 +537,7 @@ class _ProCard extends StatelessWidget {
),
const SizedBox(height: 2),
Text(
_vipSubtitle(vipInfo),
_vipSubtitle(vipInfo, context),
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: const TextStyle(
... ... @@ -565,21 +566,25 @@ class _ProCard extends StatelessWidget {
);
}
String _vipSubtitle(UserPreferencesVipInfo? vipInfo) {
String _vipSubtitle(UserPreferencesVipInfo? vipInfo, BuildContext context) {
final endDate = vipInfo?.vipEndDate ?? 0;
if (vipInfo?.isVip != true || endDate <= 0) {
return '立即解锁';
return l10n.unlockNow;
}
if (vipInfo?.isForeverVip ?? false) {
return '终身会员';
return l10n.purchaseLifetimePlan;
}
final milliseconds = endDate > 1000000000000 ? endDate : endDate * 1000;
final date = DateTime.fromMillisecondsSinceEpoch(milliseconds);
final month = date.month.toString().padLeft(2, '0');
final day = date.day.toString().padLeft(2, '0');
return '有效期至 ${date.year}-$month-$day';
// final month = date.month.toString().padLeft(2, '0');
// final day = date.day.toString().padLeft(2, '0');
final locale = Localizations.localeOf(context).languageCode;
final dateStr = DateFormat.yMMMd(locale).format(date);
return l10n.membershipValidUntilDate(dateStr);
}
}
... ...
... ... @@ -7,8 +7,10 @@ import 'package:doublefeel_flutter/core/theme/app_theme.dart';
import 'package:doublefeel_flutter/data/local/user_preferences_storage.dart';
import 'package:doublefeel_flutter/data/models/local/user_preferences.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart';
import 'package:doublefeel_flutter/l10n/l10n_extensions.dart' as context;
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:intl/intl.dart';
class MembershipDetailView extends GetView<MembershipDetailController> {
const MembershipDetailView({super.key});
... ... @@ -115,7 +117,7 @@ class MembershipDetailView extends GetView<MembershipDetailController> {
final preferences = userPrefs.preferences.value;
final vipInfo = preferences.vipInfo;
return Text(
_vipSubtitle(vipInfo),
_vipSubtitle(vipInfo, context),
style: TextStyle(
color: context.colors.textPrimary,
fontSize: 14,
... ... @@ -140,7 +142,7 @@ class MembershipDetailView extends GetView<MembershipDetailController> {
padding: const EdgeInsets.only(
top: 28, left: 16, right: 16, bottom: 16),
child: Text(
'畅享全部高级权益',
context.l10n.enjoyAllPremiumBenefits,
style: TextStyle(
color: Colors.black,
fontSize: 18,
... ... @@ -164,7 +166,7 @@ class MembershipDetailView extends GetView<MembershipDetailController> {
padding: const EdgeInsets.only(
top: 28, left: 16, right: 16),
child: Text(
'会员管理',
context.l10n.membershipManagement,
style: TextStyle(
color: Colors.black,
fontSize: 18,
... ... @@ -189,7 +191,7 @@ class MembershipDetailView extends GetView<MembershipDetailController> {
child: Row(
children: [
Text(
'会员类型',
context.l10n.membershipTypes,
textAlign: TextAlign.center,
style: TextStyle(
color: context.colors.textPrimary,
... ... @@ -220,7 +222,7 @@ class MembershipDetailView extends GetView<MembershipDetailController> {
child: Row(
children: [
Text(
'有效期至',
context.l10n.validUntil,
textAlign: TextAlign.center,
style: TextStyle(
color: context.colors.textPrimary,
... ... @@ -234,7 +236,7 @@ class MembershipDetailView extends GetView<MembershipDetailController> {
userPrefs.preferences.value;
final vipInfo = preferences.vipInfo;
return Text(
_vipExprieDate(vipInfo),
_vipExprieDate(vipInfo, context),
textAlign: TextAlign.center,
style: TextStyle(
color: context.colors.textPrimary,
... ... @@ -260,7 +262,7 @@ class MembershipDetailView extends GetView<MembershipDetailController> {
child: Row(
children: [
Text(
'管理订阅',
context.l10n.manageSubscriptions,
textAlign: TextAlign.center,
style: TextStyle(
color: context.colors.textPrimary,
... ... @@ -294,57 +296,61 @@ class MembershipDetailView extends GetView<MembershipDetailController> {
);
}
String _vipSubtitle(UserPreferencesVipInfo? vipInfo) {
String _vipSubtitle(UserPreferencesVipInfo? vipInfo, BuildContext context) {
final endDate = vipInfo?.vipEndDate ?? 0;
if (vipInfo?.isVip != true || endDate <= 0) {
return '立即解锁';
return l10n.unlockNow;
}
if (vipInfo?.isForeverVip ?? false) {
return '终身使用,免费更新';
return l10n.purchaseLifetimePlan;
}
final milliseconds = endDate > 1000000000000 ? endDate : endDate * 1000;
final date = DateTime.fromMillisecondsSinceEpoch(milliseconds);
final month = date.month.toString().padLeft(2, '0');
final day = date.day.toString().padLeft(2, '0');
return '有效期至 ${date.year}-$month-$day';
final locale = Localizations.localeOf(context).languageCode;
final dateStr = DateFormat.yMMMd(locale).format(date);
return l10n.membershipValidUntilDate(dateStr);
}
String _vipExprieDate(UserPreferencesVipInfo? vipInfo) {
String _vipExprieDate(UserPreferencesVipInfo? vipInfo, BuildContext context) {
final endDate = vipInfo?.vipEndDate ?? 0;
if (vipInfo?.isVip != true || endDate <= 0) {
return '立即解锁';
return l10n.unlockNow;
}
if (vipInfo?.isForeverVip ?? false) {
return '永不过期';
return l10n.purchaseLifetimePlan;
}
final milliseconds = endDate > 1000000000000 ? endDate : endDate * 1000;
final date = DateTime.fromMillisecondsSinceEpoch(milliseconds);
final month = date.month.toString().padLeft(2, '0');
final day = date.day.toString().padLeft(2, '0');
return '${date.year}-$month-$day';
final locale = Localizations.localeOf(context).languageCode;
final dateStr = DateFormat.yMMMd(locale).format(date);
return l10n.membershipValidUntilDate(dateStr);
}
String _vipType(UserPreferencesVipInfo? vipInfo) {
if (vipInfo == null || vipInfo.isVip != true || vipInfo.vipEndDate <= 0) {
return '立即解锁';
return l10n.unlockNow;
}
if (vipInfo.isForeverVip) {
return '终身会员';
return l10n.purchaseLifetimePlan;
}
switch (vipInfo.vipType) {
case 1:
return '月度会员';
return context.l10n.monthlyMembership;
case 2:
return '季度会员';
return context.l10n.quarterlyMembership;
case 3:
return '年度会员';
return context.l10n.annualMembership;
case 10:
return '终身会员';
return context.l10n.lifetimeMembership;
default:
return '';
}
... ...
... ... @@ -245,7 +245,7 @@
"realTimePressure": "Live Stress",
"accountInformation": "Account Information",
"help": "Help",
"changeNickname": "Change Nickname",
"changeNickname": "Edit Name",
"pleaseEnterANickname": "Please enter a nickname",
"feedbackLog": "Feedback Log",
"noFeedbackRecordsYet": "No feedback records yet",
... ... @@ -522,7 +522,7 @@
"purchaseBenefitCustomWatchFace": "Exclusive Custom Watch Faces",
"purchaseBenefitSleepAnalysis": "Sleep analysis",
"purchaseBenefitFutureFeatures": "More Pro Benefits Coming Soon",
"purchaseNotesTitle": "Notes",
"purchaseNotesTitle": "Instructions",
"purchaseNoteSubscription": "After you confirm and pay, the subscription will renew automatically through your iTunes account. Your Apple account will be charged within 24 hours before the current period ends, and the subscription will renew for another period. To cancel, turn off auto-renewal in your iTunes/Apple ID subscription settings at least 24 hours before the current period ends.\n\nDoubleFeel Pro is a virtual product. Purchases are non-refundable except through the App Store refund process. Tap ",
"purchaseLinkLearnMore": "Learn More",
"purchaseNoteRestore": "If your purchase does not take effect, tap Restore Purchases.",
... ... @@ -584,8 +584,8 @@
"pressure": "Pressure",
"mostRecent": "Latest Reading",
"theDayBeforeYesterday": "The day before yesterday",
"uploadPhotos": "Upload Photos",
"filming": "Filming",
"uploadPhotos": "Choose from Library",
"filming": "Take Photo",
"unlockTheProVersion": "Unlock Pro",
"embarkOnAJourneyOfStressAwarenessAndWellnessSupport": "Begin Your Stress Alerts & Health Journey",
"sharePartnerCodeTemplate": "My friend ID: {inviteCode}. Hey❤! Come and use DoubleFeel with me! It helps us care for each other—track stress and sleep, view HRV and body status, and stay updated on each other's health in real-time. Come join me 👉 https://apps.apple.com/cn/app/doublefeel-%E5%8F%8C%E4%BA%BA%E6%83%85%E7%BB%AA%E5%85%B1%E4%BA%ABhrv%E5%8E%8B%E5%8A%9B%E6%B0%B4%E5%B9%B3%E8%87%AA%E6%B5%8B%E7%9D%A1%E7%9C%A0%E8%AE%B0%E5%BD%95/id6747254434",
... ... @@ -850,5 +850,22 @@
"sendResetEmail": "Send reset email",
"invalidCode": "Invalid code",
"paswordHasBeenChanged": "Pasword has been changed",
"copiedSuccessfully": "Copied successfully"
"copiedSuccessfully": "Copied successfully",
"enjoyAllPremiumBenefits": "Enjoy All Premium Benefits",
"membershipManagement": "Membership",
"membershipTypes": "Plan",
"validUntil": "Valid until",
"manageSubscriptions": "Manage Subscription",
"membershipValidUntilDate": "Membership Valid Until {date}",
"@membershipValidUntilDate": {
"placeholders": {
"date": {
"type": "String"
}
}
},
"monthlyMembership": "Monthly",
"quarterlyMembership": "Quarterly",
"annualMembership": "Annual",
"lifetimeMembership": "Lifetime"
}
\ No newline at end of file
... ...
... ... @@ -1243,5 +1243,22 @@
"sendResetEmail": "发送重置邮件",
"invalidCode": "无效代码",
"paswordHasBeenChanged": "密码已更改",
"copiedSuccessfully": "复制成功"
"copiedSuccessfully": "复制成功",
"enjoyAllPremiumBenefits": "畅享全部高级权益",
"membershipManagement": "会员管理",
"membershipTypes": "会员类型",
"validUntil": "有效期至",
"manageSubscriptions": "管理订阅",
"membershipValidUntilDate": "有效期至 {date}",
"@membershipValidUntilDate": {
"placeholders": {
"date": {
"type": "String"
}
}
},
"monthlyMembership": "月度会员",
"quarterlyMembership": "季度会员",
"annualMembership": "年度会员",
"lifetimeMembership": "终身会员"
}
\ No newline at end of file
... ...
... ... @@ -4507,6 +4507,66 @@ abstract class AppLocalizations {
/// In zh, this message translates to:
/// **'复制成功'**
String get copiedSuccessfully;
/// No description provided for @enjoyAllPremiumBenefits.
///
/// In zh, this message translates to:
/// **'畅享全部高级权益'**
String get enjoyAllPremiumBenefits;
/// No description provided for @membershipManagement.
///
/// In zh, this message translates to:
/// **'会员管理'**
String get membershipManagement;
/// No description provided for @membershipTypes.
///
/// In zh, this message translates to:
/// **'会员类型'**
String get membershipTypes;
/// No description provided for @validUntil.
///
/// In zh, this message translates to:
/// **'有效期至'**
String get validUntil;
/// No description provided for @manageSubscriptions.
///
/// In zh, this message translates to:
/// **'管理订阅'**
String get manageSubscriptions;
/// No description provided for @membershipValidUntilDate.
///
/// In zh, this message translates to:
/// **'有效期至 {date}'**
String membershipValidUntilDate(String date);
/// No description provided for @monthlyMembership.
///
/// In zh, this message translates to:
/// **'月度会员'**
String get monthlyMembership;
/// No description provided for @quarterlyMembership.
///
/// In zh, this message translates to:
/// **'季度会员'**
String get quarterlyMembership;
/// No description provided for @annualMembership.
///
/// In zh, this message translates to:
/// **'年度会员'**
String get annualMembership;
/// No description provided for @lifetimeMembership.
///
/// In zh, this message translates to:
/// **'终身会员'**
String get lifetimeMembership;
}
class _AppLocalizationsDelegate
... ...
... ... @@ -854,7 +854,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get help => 'Help';
@override
String get changeNickname => 'Change Nickname';
String get changeNickname => 'Edit Name';
@override
String get pleaseEnterANickname => 'Please enter a nickname';
... ... @@ -1758,7 +1758,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get purchaseBenefitFutureFeatures => 'More Pro Benefits Coming Soon';
@override
String get purchaseNotesTitle => 'Notes';
String get purchaseNotesTitle => 'Instructions';
@override
String get purchaseNoteSubscription =>
... ... @@ -1973,10 +1973,10 @@ class AppLocalizationsEn extends AppLocalizations {
String get theDayBeforeYesterday => 'The day before yesterday';
@override
String get uploadPhotos => 'Upload Photos';
String get uploadPhotos => 'Choose from Library';
@override
String get filming => 'Filming';
String get filming => 'Take Photo';
@override
String get unlockTheProVersion => 'Unlock Pro';
... ... @@ -2527,4 +2527,36 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get copiedSuccessfully => 'Copied successfully';
@override
String get enjoyAllPremiumBenefits => 'Enjoy All Premium Benefits';
@override
String get membershipManagement => 'Membership';
@override
String get membershipTypes => 'Plan';
@override
String get validUntil => 'Valid until';
@override
String get manageSubscriptions => 'Manage Subscription';
@override
String membershipValidUntilDate(String date) {
return 'Membership Valid Until $date';
}
@override
String get monthlyMembership => 'Monthly';
@override
String get quarterlyMembership => 'Quarterly';
@override
String get annualMembership => 'Annual';
@override
String get lifetimeMembership => 'Lifetime';
}
... ...
... ... @@ -2428,4 +2428,36 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get copiedSuccessfully => '复制成功';
@override
String get enjoyAllPremiumBenefits => '畅享全部高级权益';
@override
String get membershipManagement => '会员管理';
@override
String get membershipTypes => '会员类型';
@override
String get validUntil => '有效期至';
@override
String get manageSubscriptions => '管理订阅';
@override
String membershipValidUntilDate(String date) {
return '有效期至 $date';
}
@override
String get monthlyMembership => '月度会员';
@override
String get quarterlyMembership => '季度会员';
@override
String get annualMembership => '年度会员';
@override
String get lifetimeMembership => '终身会员';
}
... ...