feat: 优化

This commit is contained in:
jinyaqiu 2025-07-24 20:39:57 +08:00
parent 12fce0021a
commit a0c1f0e8b6
9 changed files with 95 additions and 40 deletions

View File

@ -9,12 +9,14 @@ import { ThemedText } from '@/components/ThemedText';
import { fetchApi } from '@/lib/server-api-util'; import { fetchApi } from '@/lib/server-api-util';
import { useLocalSearchParams, useRouter } from "expo-router"; import { useLocalSearchParams, useRouter } from "expo-router";
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { Image, ScrollView, StyleSheet, TouchableOpacity, View } from 'react-native'; import { Image, ScrollView, StyleSheet, TouchableOpacity, View } from 'react-native';
import { useSafeAreaInsets } from "react-native-safe-area-context"; import { useSafeAreaInsets } from "react-native-safe-area-context";
export default function Rights() { export default function Rights() {
const insets = useSafeAreaInsets(); const insets = useSafeAreaInsets();
const router = useRouter(); const router = useRouter();
const { t } = useTranslation();
// 获取路由参数 // 获取路由参数
const { credit } = useLocalSearchParams<{ const { credit } = useLocalSearchParams<{
credit: string; credit: string;
@ -53,7 +55,7 @@ export default function Rights() {
<ReturnArrowSvg /> <ReturnArrowSvg />
</TouchableOpacity> </TouchableOpacity>
<ThemedText style={styles.headerTitle}> <ThemedText style={styles.headerTitle}>
Subscription {t('rights.title', { ns: 'personal' })}
</ThemedText> </ThemedText>
<ThemedText className='opacity-0'>123</ThemedText> <ThemedText className='opacity-0'>123</ThemedText>
</View> </View>
@ -67,7 +69,7 @@ export default function Rights() {
<View style={styles.cardContent}> <View style={styles.cardContent}>
<View style={styles.cardinfo}> <View style={styles.cardinfo}>
<ThemedText style={styles.cardTitle}> <ThemedText style={styles.cardTitle}>
Purchase {t('rights.purchase', { ns: 'personal' })}
</ThemedText> </ThemedText>
<View style={styles.cardPoints}> <View style={styles.cardPoints}>
<StarSvg /> <StarSvg />
@ -85,13 +87,13 @@ export default function Rights() {
onPress={() => { setUserType("normal") }} onPress={() => { setUserType("normal") }}
style={[styles.switchButtonItem, { backgroundColor: userType === 'normal' ? "#FFB645" : "#fff", borderColor: userType === 'normal' ? "#FFB645" : "#E2793F" }]} style={[styles.switchButtonItem, { backgroundColor: userType === 'normal' ? "#FFB645" : "#fff", borderColor: userType === 'normal' ? "#FFB645" : "#E2793F" }]}
> >
<ThemedText style={{ color: userType === 'normal' ? "#fff" : "#E2793F" }}>Free</ThemedText> <ThemedText style={{ color: userType === 'normal' ? "#fff" : "#E2793F" }}> {t('rights.free', { ns: 'personal' })}</ThemedText>
</TouchableOpacity> </TouchableOpacity>
<TouchableOpacity <TouchableOpacity
onPress={() => { setUserType("premium") }} onPress={() => { setUserType("premium") }}
style={[styles.switchButtonItem, { backgroundColor: userType === 'premium' ? "#E2793F" : "#fff", borderColor: userType === 'premium' ? "#E2793F" : "#E2793F" }]} style={[styles.switchButtonItem, { backgroundColor: userType === 'premium' ? "#E2793F" : "#fff", borderColor: userType === 'premium' ? "#E2793F" : "#E2793F" }]}
> >
<ThemedText style={{ color: userType === 'premium' ? "#fff" : "#E2793F" }}>Pro</ThemedText> <ThemedText style={{ color: userType === 'premium' ? "#fff" : "#E2793F" }}>{t('rights.premium', { ns: 'personal' })}</ThemedText>
</TouchableOpacity> </TouchableOpacity>
</View> </View>
{/* 普通权益 */} {/* 普通权益 */}
@ -124,7 +126,7 @@ export default function Rights() {
activeOpacity={0.8} activeOpacity={0.8}
> >
<ThemedText style={{ color: '#fff', fontWeight: '700', fontSize: 14 }}> <ThemedText style={{ color: '#fff', fontWeight: '700', fontSize: 14 }}>
Subscribe Yearly {t('rights.subscribe', { ns: 'personal' })}
</ThemedText> </ThemedText>
</TouchableOpacity> </TouchableOpacity>
<TouchableOpacity <TouchableOpacity
@ -134,7 +136,7 @@ export default function Rights() {
activeOpacity={0.8} activeOpacity={0.8}
> >
<ThemedText style={{ color: '#AC7E35', fontWeight: '400', fontSize: 11, textDecorationLine: 'underline', textAlign: 'center' }}> <ThemedText style={{ color: '#AC7E35', fontWeight: '400', fontSize: 11, textDecorationLine: 'underline', textAlign: 'center' }}>
Terms Privacy {t('rights.terms', { ns: 'personal' })}
</ThemedText> </ThemedText>
</TouchableOpacity> </TouchableOpacity>
</View> </View>

View File

@ -16,7 +16,7 @@ import * as Location from 'expo-location';
import { useRouter } from 'expo-router'; import { useRouter } from 'expo-router';
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { Linking, Pressable, ScrollView, StyleSheet, Text, TouchableOpacity, View } from 'react-native'; import { Linking, Platform, Pressable, ScrollView, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
import { useSafeAreaInsets } from "react-native-safe-area-context"; import { useSafeAreaInsets } from "react-native-safe-area-context";
const Setting = (props: { modalVisible: boolean, setModalVisible: (visible: boolean) => void, userInfo: User }) => { const Setting = (props: { modalVisible: boolean, setModalVisible: (visible: boolean) => void, userInfo: User }) => {
@ -98,11 +98,9 @@ const Setting = (props: { modalVisible: boolean, setModalVisible: (visible: bool
try { try {
// 1. 首先检查当前权限状态 -- 获取当前的位置权限 // 1. 首先检查当前权限状态 -- 获取当前的位置权限
let currentStatus = await getLocationPermission(); let currentStatus = await getLocationPermission();
console.log('当前权限状态:', currentStatus);
// 2. 如果没有权限,则跳过获取位置 // 2. 如果没有权限,则跳过获取位置
if (!currentStatus) { if (!currentStatus) {
console.log('没有权限,跳过获取位置')
return; return;
// const newStatus = await requestLocationPermission(); // const newStatus = await requestLocationPermission();
// setLocationEnabled(newStatus); // setLocationEnabled(newStatus);
@ -117,16 +115,14 @@ const Setting = (props: { modalVisible: boolean, setModalVisible: (visible: bool
// 3. 确保位置服务已启用 // 3. 确保位置服务已启用
const isEnabled = await Location.hasServicesEnabledAsync(); const isEnabled = await Location.hasServicesEnabledAsync();
if (!isEnabled) { if (!isEnabled) {
alert('请先启用位置服务'); alert(t('permission.locationPermissionRequired', { ns: 'common' }));
return; return;
} }
console.log('位置服务已启用');
// 4. 获取当前位置 // 4. 获取当前位置
const location = await Location.getCurrentPositionAsync({ const location = await Location.getCurrentPositionAsync({
accuracy: Location.Accuracy.High, // 使用高精度 accuracy: Location.Accuracy.High, // 使用高精度
timeInterval: 10000, // 可选:最大等待时间(毫秒) timeInterval: 10000, // 可选:最大等待时间(毫秒)
}); });
console.log('位置:', location);
// 地理位置逆编码 // 地理位置逆编码
const address = await reverseGeocode(location.coords.latitude, location.coords.longitude); const address = await reverseGeocode(location.coords.latitude, location.coords.longitude);
@ -137,12 +133,10 @@ const Setting = (props: { modalVisible: boolean, setModalVisible: (visible: bool
return location; return location;
} catch (error: any) { } catch (error: any) {
if (error.code === 'PERMISSION_DENIED' || error.code === 'PERMISSION_DENIED_ERROR') { if (error.code === 'TIMEOUT') {
alert('位置权限被拒绝,请在设置中启用位置服务'); alert(t('permission.timeout', { ns: 'common' }));
} else if (error.code === 'TIMEOUT') {
alert('获取位置超时,请检查网络和位置服务');
} else { } else {
alert(`无法获取您的位置: ${error.message || '未知错误'}`); alert(t('permission.notLocation', { ns: 'common' }) + error.message || t('permission.notError', { ns: 'common' }));
} }
throw error; // 重新抛出错误以便上层处理 throw error; // 重新抛出错误以便上层处理
} finally { } finally {
@ -173,17 +167,14 @@ const Setting = (props: { modalVisible: boolean, setModalVisible: (visible: bool
if (modalVisible) { if (modalVisible) {
// 位置权限 // 位置权限
getLocationPermission().then((res: boolean | ((prevState: boolean) => boolean)) => { getLocationPermission().then((res: boolean | ((prevState: boolean) => boolean)) => {
console.log('位置权限:', res);
setLocationEnabled(res); setLocationEnabled(res);
}) })
// 媒体库权限 // 媒体库权限
getPermissions().then((res: boolean | ((prevState: boolean) => boolean)) => { getPermissions().then((res: boolean | ((prevState: boolean) => boolean)) => {
console.log('媒体库权限:', res);
setAlbumEnabled(res); setAlbumEnabled(res);
}) })
// 通知权限 // 通知权限
checkNotificationPermission().then((res: boolean | ((prevState: boolean) => boolean)) => { checkNotificationPermission().then((res: boolean | ((prevState: boolean) => boolean)) => {
console.log('通知权限:', res);
setNotificationsEnabled(res); setNotificationsEnabled(res);
}) })
} }
@ -344,8 +335,8 @@ const Setting = (props: { modalVisible: boolean, setModalVisible: (visible: bool
<RightArrowSvg /> <RightArrowSvg />
</TouchableOpacity> </TouchableOpacity>
<Divider /> <Divider />
<TouchableOpacity style={styles.item} onPress={() => Linking.openURL("https://beian.miit.gov.cn/")} > <TouchableOpacity style={[styles.item, { display: Platform.OS === 'ios' ? 'none' : 'flex' }]} onPress={() => Linking.openURL("https://beian.miit.gov.cn/")} >
<ThemedText style={styles.itemText}>{t('lcenses.ICP', { ns: 'personal' })}ICP备2023032876号-4</ThemedText> <ThemedText style={styles.itemText}>{t('lcenses.ICP', { ns: 'personal' })}ICP备2025133004号-2A</ThemedText>
<RightArrowSvg /> <RightArrowSvg />
</TouchableOpacity> </TouchableOpacity>
</View> </View>

View File

@ -1,5 +1,6 @@
import GetSvg from "@/assets/icons/svg/get.svg"; import GetSvg from "@/assets/icons/svg/get.svg";
import { ThemedText } from "@/components/ThemedText"; import { ThemedText } from "@/components/ThemedText";
import { useTranslation } from "react-i18next";
import { StyleProp, StyleSheet, TouchableOpacity, View, ViewStyle } from "react-native"; import { StyleProp, StyleSheet, TouchableOpacity, View, ViewStyle } from "react-native";
interface Props { interface Props {
@ -9,6 +10,7 @@ interface Props {
const Normal = (props: Props) => { const Normal = (props: Props) => {
const { setUserType } = props; const { setUserType } = props;
const { t } = useTranslation();
return ( return (
<View style={[styles.normalInfo, props.style]}> <View style={[styles.normalInfo, props.style]}>
@ -16,16 +18,16 @@ const Normal = (props: Props) => {
<View style={styles.normalItemContent}> <View style={styles.normalItemContent}>
<View style={{ flexDirection: "row", alignItems: "center", gap: 8 }}> <View style={{ flexDirection: "row", alignItems: "center", gap: 8 }}>
<GetSvg style={{ marginTop: 8 }} /> <GetSvg style={{ marginTop: 8 }} />
<ThemedText style={{ fontSize: 12, fontWeight: '500', color: "#4C320C" }}>Enjoy 100 Bonus Credits Every Month</ThemedText> <ThemedText style={{ fontSize: 12, fontWeight: '500', color: "#4C320C" }}>{t('rights.100Bonus', { ns: 'personal' })}</ThemedText>
</View> </View>
<ThemedText style={{ fontSize: 10, color: "#AC7E35", marginLeft: 20 }}>Generate more memory pictures & videos and explore your past.</ThemedText> <ThemedText style={{ fontSize: 10, color: "#AC7E35", marginLeft: 20 }}>{t('rights.100BonusText', { ns: 'personal' })}</ThemedText>
</View> </View>
<View style={styles.normalItemContent}> <View style={styles.normalItemContent}>
<View style={{ flexDirection: "row", alignItems: "center", gap: 8 }}> <View style={{ flexDirection: "row", alignItems: "center", gap: 8 }}>
<GetSvg style={{ marginTop: 8 }} /> <GetSvg style={{ marginTop: 8 }} />
<ThemedText style={{ fontSize: 12, fontWeight: '500', color: "#4C320C" }}>10GB of Cloud Storage</ThemedText> <ThemedText style={{ fontSize: 12, fontWeight: '500', color: "#4C320C" }}>{t('rights.10G', { ns: 'personal' })}</ThemedText>
</View> </View>
<ThemedText style={{ fontSize: 10, color: "#AC7E35", marginLeft: 20 }}>Safely store your cherished photos, videos, and generated memories.</ThemedText> <ThemedText style={{ fontSize: 10, color: "#AC7E35", marginLeft: 20 }}>{t('rights.10GText', { ns: 'personal' })}</ThemedText>
</View> </View>
</View> </View>
<TouchableOpacity <TouchableOpacity
@ -36,7 +38,7 @@ const Normal = (props: Props) => {
activeOpacity={0.8} activeOpacity={0.8}
> >
<ThemedText style={{ color: '#fff', fontWeight: '700', fontSize: 14 }}> <ThemedText style={{ color: '#fff', fontWeight: '700', fontSize: 14 }}>
Go Premium {t('rights.purchase', { ns: 'personal' })}
</ThemedText> </ThemedText>
</TouchableOpacity> </TouchableOpacity>
</View> </View>

View File

@ -1,5 +1,6 @@
import BlackStarSvg from '@/assets/icons/svg/blackStar.svg'; import BlackStarSvg from '@/assets/icons/svg/blackStar.svg';
import { ThemedText } from "@/components/ThemedText"; import { ThemedText } from "@/components/ThemedText";
import { useTranslation } from 'react-i18next';
import { ScrollView, StyleProp, StyleSheet, TouchableOpacity, View, ViewStyle } from "react-native"; import { ScrollView, StyleProp, StyleSheet, TouchableOpacity, View, ViewStyle } from "react-native";
import { maxDiscountProduct } from './utils'; import { maxDiscountProduct } from './utils';
@ -31,6 +32,7 @@ export interface PayItem {
const Premium = (props: Props) => { const Premium = (props: Props) => {
const { style, payType, setPayType, premiumPay, loading, setShowTerms } = props; const { style, payType, setPayType, premiumPay, loading, setShowTerms } = props;
const bestValue = maxDiscountProduct(premiumPay)?.product_code const bestValue = maxDiscountProduct(premiumPay)?.product_code
const { t } = useTranslation();
return ( return (
<View style={[styles.proInfo, style]}> <View style={[styles.proInfo, style]}>
@ -43,7 +45,7 @@ const Premium = (props: Props) => {
{loading {loading
? ?
<ThemedText style={{ fontSize: 12, color: "#4C320C", fontWeight: "700", width: "100%", textAlign: "center" }}> <ThemedText style={{ fontSize: 12, color: "#4C320C", fontWeight: "700", width: "100%", textAlign: "center" }}>
Loading... {t('loading', { ns: 'common' })}
</ThemedText> </ThemedText>
: :
premiumPay?.map((item: PayItem) => { premiumPay?.map((item: PayItem) => {
@ -57,7 +59,7 @@ const Premium = (props: Props) => {
<View style={[styles.title, { opacity: item?.product_code === bestValue ? 1 : 0 }]}> <View style={[styles.title, { opacity: item?.product_code === bestValue ? 1 : 0 }]}>
<BlackStarSvg /> <BlackStarSvg />
<ThemedText style={[styles.titleText, { fontSize: 14 }]}> <ThemedText style={[styles.titleText, { fontSize: 14 }]}>
Best Value {t('rights.bestValue', { ns: 'personal' })}
</ThemedText> </ThemedText>
<BlackStarSvg /> <BlackStarSvg />
</View> </View>
@ -78,10 +80,10 @@ const Premium = (props: Props) => {
</ScrollView> </ScrollView>
<View style={{ flexDirection: 'row', gap: 8, marginLeft: 4 }}> <View style={{ flexDirection: 'row', gap: 8, marginLeft: 4 }}>
<ThemedText style={{ color: '#AC7E35', fontSize: 10 }}> <ThemedText style={{ color: '#AC7E35', fontSize: 10 }}>
Cancel anytime before renewal. Learn more {t('rights.cancelAnytimeBeforeRenewal', { ns: 'personal' })}
</ThemedText> </ThemedText>
<ThemedText style={{ color: '#E2793F', fontSize: 10, textDecorationLine: 'underline' }} onPress={() => setShowTerms(true)}> <ThemedText style={{ color: '#E2793F', fontSize: 10, textDecorationLine: 'underline' }} onPress={() => setShowTerms(true)}>
Terms & Conditions {t('rights.terms', { ns: 'personal' })}
</ThemedText> </ThemedText>
</View> </View>
</View> </View>

View File

@ -1,33 +1,35 @@
import GetSvg from "@/assets/icons/svg/get.svg"; import GetSvg from "@/assets/icons/svg/get.svg";
import { ThemedText } from "@/components/ThemedText"; import { ThemedText } from "@/components/ThemedText";
import { useTranslation } from "react-i18next";
import { StyleProp, StyleSheet, View, ViewStyle } from "react-native"; import { StyleProp, StyleSheet, View, ViewStyle } from "react-native";
const ProRights = (props: { style?: StyleProp<ViewStyle> }) => { const ProRights = (props: { style?: StyleProp<ViewStyle> }) => {
const { style } = props; const { style } = props;
const { t } = useTranslation();
return ( return (
<View style={[styles.proRights, style]}> <View style={[styles.proRights, style]}>
<ThemedText style={{ fontSize: 12, color: "#4C320C", fontWeight: "700", width: "100%", textAlign: "center" }}> <ThemedText style={{ fontSize: 12, color: "#4C320C", fontWeight: "700", width: "100%", textAlign: "center" }}>
Enjoy MemoWake Pro Benefits {t('rights.proTitle', { ns: 'personal' })}
</ThemedText> </ThemedText>
<View style={{ display: "flex", flexDirection: "column", }}> <View style={{ display: "flex", flexDirection: "column", }}>
<View style={{ flexDirection: "row", alignItems: "center", gap: 8 }}> <View style={{ flexDirection: "row", alignItems: "center", gap: 8 }}>
<GetSvg style={{ marginTop: 8 }} /> <GetSvg style={{ marginTop: 8 }} />
<ThemedText style={{ fontSize: 12, fontWeight: '500', color: "#4C320C" }}>no advertisement</ThemedText> <ThemedText style={{ fontSize: 12, fontWeight: '500', color: "#4C320C" }}>{t('rights.noAd', { ns: 'personal' })}</ThemedText>
</View> </View>
<ThemedText style={{ fontSize: 10, color: "#AC7E35", marginLeft: 20 }}>There are no advertisements, so you can use the product with peace of mind.</ThemedText> <ThemedText style={{ fontSize: 10, color: "#AC7E35", marginLeft: 20 }}>{t('rights.noAdText', { ns: 'personal' })}</ThemedText>
</View> </View>
<View style={styles.itemContent}> <View style={styles.itemContent}>
<View style={{ flexDirection: "row", alignItems: "center", gap: 8 }}> <View style={{ flexDirection: "row", alignItems: "center", gap: 8 }}>
<GetSvg style={{ marginTop: 8 }} /> <GetSvg style={{ marginTop: 8 }} />
<ThemedText style={{ fontSize: 12, fontWeight: '500', color: "#4C320C" }}>Enjoy 1000 Bonus Credits Every Month</ThemedText> <ThemedText style={{ fontSize: 12, fontWeight: '500', color: "#4C320C" }}>{t('rights.bonus', { ns: 'personal' })}</ThemedText>
</View> </View>
<ThemedText style={{ fontSize: 10, color: "#AC7E35", marginLeft: 20 }}>Generate more memory pictures & videos and explore your past.</ThemedText> <ThemedText style={{ fontSize: 10, color: "#AC7E35", marginLeft: 20 }}>{t('rights.bonusText', { ns: 'personal' })}</ThemedText>
</View> </View>
<View style={styles.itemContent}> <View style={styles.itemContent}>
<View style={{ flexDirection: "row", alignItems: "center", gap: 8 }}> <View style={{ flexDirection: "row", alignItems: "center", gap: 8 }}>
<GetSvg style={{ marginTop: 8 }} /> <GetSvg style={{ marginTop: 8 }} />
<ThemedText style={{ fontSize: 12, fontWeight: '500', color: "#4C320C" }}>100GB of Cloud Storage</ThemedText> <ThemedText style={{ fontSize: 12, fontWeight: '500', color: "#4C320C" }}>{t('rights.storage', { ns: 'personal' })}</ThemedText>
</View> </View>
<ThemedText style={{ fontSize: 10, color: "#AC7E35", marginLeft: 20 }}>Safely store your cherished photos, videos, and generated memories.</ThemedText> <ThemedText style={{ fontSize: 10, color: "#AC7E35", marginLeft: 20 }}>{t('rights.storageText', { ns: 'personal' })}</ThemedText>
</View> </View>
</View> </View>
); );

View File

@ -111,5 +111,11 @@
"required": "You must agree to the Terms and Privacy Policy" "required": "You must agree to the Terms and Privacy Policy"
} }
}, },
"loading": "Loading..." "loading": "Loading...",
"permission": {
"locationPermissionRequired": "Location permission is required, please enable location service in settings",
"timeout": "Location timeout, please check network and location service",
"notLocation": "Unable to get your location: ",
"notError": "Unknown error"
}
} }

View File

@ -88,5 +88,27 @@
"unlock": "Unlock more memory magic", "unlock": "Unlock more memory magic",
"delete": "Are you sure you want to delete your account?", "delete": "Are you sure you want to delete your account?",
"cancel": "Cancel" "cancel": "Cancel"
},
"rights": {
"title": "Subscription",
"premium": "Pro",
"purchase": "Purchase",
"free": "Free",
"subscribe": "Subscribe",
"terms": "Terms",
"100Bonus": "Enjoy 100 Bonus Credits Every Month",
"100BonusText": "Generate more memory pictures & videos and explore your past.",
"10G": "10GB of Cloud Storage",
"10GText": "Safely store your cherished photos, videos, and generated memories.",
"goPremium": "Go Premium",
"bestValue": "Best Value",
"cancelAnytimeBeforeRenewal": "Cancel anytime before renewal. Learn more",
"proTitle": "Enjoy MemoWake Pro Benefits",
"noAd": "No advertisements",
"noAdText": "There are no advertisements, so you can use the product with peace of mind.",
"bonus": "Enjoy 100 Bonus Credits Every Month",
"bonusText": "Generate more memory pictures & videos and explore your past.",
"storage": "10GB of Cloud Storage",
"storageText": "Safely store your cherished photos, videos, and generated memories."
} }
} }

View File

@ -110,5 +110,11 @@
"required": "您必须同意服务条款和隐私政策" "required": "您必须同意服务条款和隐私政策"
} }
}, },
"loading": "加载中..." "loading": "加载中...",
"permission": {
"locationPermissionRequired": "位置权限被拒绝,请在设置中启用位置服务",
"timeout": "获取位置超时,请检查网络和位置服务",
"notLocation": "无法获取您的位置: ",
"notError": "未知错误"
}
} }

View File

@ -88,5 +88,27 @@
"unlock": "解锁更多记忆魔法", "unlock": "解锁更多记忆魔法",
"delete": "确定要注销账号吗?", "delete": "确定要注销账号吗?",
"cancel": "取消" "cancel": "取消"
},
"rights": {
"title": "权益",
"purchase": "购买",
"free": "免费用户",
"premium": "会员",
"subscribe": "订阅",
"terms": "用户协议",
"100Bonus": "每月享受100积分",
"100BonusText": "生成更多记忆照片和视频,探索你的过去。",
"10G": "10GB的云存储",
"10GText": "安全存储你的珍贵照片、视频和生成的记忆。",
"goPremium": "升级至会员",
"bestValue": "最佳值",
"cancelAnytimeBeforeRenewal": "在续订前随时取消。了解更多",
"proTitle": "享受MemoWake Pro权益",
"noAd": "无广告",
"noAdText": "没有广告,所以你可以安心使用产品。",
"bonus": "每月享受100积分",
"bonusText": "生成更多记忆照片和视频,探索你的过去。",
"storage": "10GB的云存储",
"storageText": "安全存储你的珍贵照片、视频和生成的记忆。"
} }
} }