From 6f6ac0d550e9864aca07487d43aeaa05f7fa84e0 Mon Sep 17 00:00:00 2001 From: Kevin Date: Wed, 13 May 2026 16:15:21 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=A4=B4=E5=83=8F=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=B7=EF=BC=9B=E7=A7=BB=E9=99=A4=E5=9B=9E?= =?UTF-8?q?=E5=BF=86=E5=BD=95=E6=92=B0=E5=86=99=E5=85=A5=E5=8F=A3=E8=B7=B3?= =?UTF-8?q?=E8=BD=AC=E8=81=8A=E5=A4=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - API:上传/预设头像 URL 追加 ?v=time.time_ns(),避免同路径缓存导致「只能换一次头像」 - Expo:回忆录 Tab 去掉撰写中「继续写作」及新建会话跳转;清理 memoir 文案键并更新 i18n 类型 未纳入提交:本地 api/uploads/(开发环境头像文件) Co-authored-by: Cursor --- api/app/features/auth/router.py | 6 +- app-expo/src/app/(tabs)/memoir.tsx | 22 - app-expo/src/i18n/generated/resources.ts | 490 ++++++++++++----------- app-expo/src/i18n/locales/en/memoir.json | 2 - app-expo/src/i18n/locales/zh/memoir.json | 2 - 5 files changed, 250 insertions(+), 272 deletions(-) diff --git a/api/app/features/auth/router.py b/api/app/features/auth/router.py index 92c2a97..799cea9 100644 --- a/api/app/features/auth/router.py +++ b/api/app/features/auth/router.py @@ -1,4 +1,5 @@ import io +import time from pathlib import Path from fastapi import APIRouter, Depends, File, HTTPException, UploadFile, status @@ -331,7 +332,8 @@ async def upload_avatar( image.save(file_path, "JPEG", quality=85, optimize=True) - avatar_url = f"/api/auth/avatars/{filename}" + # 路径固定为 {user_id}.jpg,客户端会缓存;每次写入新文件后 bump URL 以绕过缓存。 + avatar_url = f"/api/auth/avatars/{filename}?v={time.time_ns()}" user = await service.update_avatar_url(current_user.id, avatar_url) return _user_response(user) except HTTPException: @@ -379,7 +381,7 @@ async def set_avatar_preset( status_code=status.HTTP_400_BAD_REQUEST, detail="预设头像不可用", ) - avatar_url = avatar_url_for_preset_filename(filename) + avatar_url = f"{avatar_url_for_preset_filename(filename)}?v={time.time_ns()}" try: user = await service.update_avatar_url(current_user.id, avatar_url) except AuthError as e: diff --git a/app-expo/src/app/(tabs)/memoir.tsx b/app-expo/src/app/(tabs)/memoir.tsx index 5b539c7..816bdc9 100644 --- a/app-expo/src/app/(tabs)/memoir.tsx +++ b/app-expo/src/app/(tabs)/memoir.tsx @@ -24,7 +24,6 @@ import { Skeleton } from '@/components/ui/skeleton'; import { Text } from '@/components/ui/text'; import { ScreenGutter } from '@/constants/layout'; import { useTypography } from '@/core/typography-context'; -import { useCreateConversation } from '@/features/conversation/hooks'; import { buildFrameworkChapterPlaceholders, mergeFrameworkChaptersWithFetched, @@ -70,13 +69,11 @@ function ChapterCard({ variant, t, onReadPress, - onContinuePress, }: { item: ChapterViewModel; variant: ChapterVariant; t: (key: string) => string; onReadPress: () => void; - onContinuePress: () => void; }) { const typography = useTypography(); const { width } = useWindowDimensions(); @@ -238,15 +235,6 @@ function ChapterCard({ - - - {t('continueWriting')} - - ); } @@ -279,7 +267,6 @@ function MemoirLoadError({ onRetry }: { onRetry: () => void }) { export default function MemoirScreen() { const { t } = useTranslation('memoir'); const { viewModels: chapters, isLoading, isError, refetch } = useChapters(); - const createConversation = useCreateConversation(); const checkCover = useCheckCoverGeneration(); const [refreshing, setRefreshing] = useState(false); const didRunInitialCoverCheckRef = useRef(false); @@ -310,14 +297,6 @@ export default function MemoirScreen() { } }, [checkCover, refetch]); - const handleStartChapter = useCallback(() => { - createConversation.mutate(undefined, { - onSuccess: (result) => { - router.push(`/(main)/conversation/${result.id}`); - }, - }); - }, [createConversation]); - const handleReadChapter = useCallback((chapterId: string) => { router.push(`/(main)/chapter/${chapterId}`); }, []); @@ -357,7 +336,6 @@ export default function MemoirScreen() { variant={getChapterVariant(item)} t={t as (key: string) => string} onReadPress={() => handleReadChapter(item.id)} - onContinuePress={handleStartChapter} /> )) )} diff --git a/app-expo/src/i18n/generated/resources.ts b/app-expo/src/i18n/generated/resources.ts index 337753a..de4082a 100644 --- a/app-expo/src/i18n/generated/resources.ts +++ b/app-expo/src/i18n/generated/resources.ts @@ -1,249 +1,251 @@ // This file is automatically generated by i18next-cli. Do not edit manually. interface Resources { - app: { - languages: { - en: 'English'; - system: 'System'; - zh: 'Chinese'; - }; - name: 'Life Echo'; - tabs: { - conversations: 'Chats'; - explore: 'Explore'; - home: 'Home'; - memoir: 'Memoir'; - profile: 'Profile'; - }; - theme: { - default: 'Default'; - }; - }; - auth: { - login: { - codeLabel: 'Verification Code'; - getCode: 'Get Code'; - getCodeCountdown: 'Retry in {{seconds}}s'; - networkError: 'Network error. Please try again later.'; - phoneLabel: 'Phone Number'; - phonePlaceholder: 'Enter your phone number'; - privacyPolicy: 'Privacy Policy'; - submit: 'Login'; - termsAnd: 'and'; - termsIntro: 'I agree to the'; - termsRequired: 'Please agree to the User Agreement and Privacy Policy first'; - termsRequiredConfirm: 'OK'; - termsRequiredTitle: 'Agreement Required'; - userAgreement: 'User Agreement'; - welcomeSubtitle: 'Some lives grow richer the more you savor them.'; - welcomeTitle: 'Welcome back'; - }; - }; - common: { - chapterLabel: ''; - chapterReading: { - backgroundColor: ''; - bgPureWhite: ''; - bgSepia: ''; - close: ''; - fontSize: ''; - readingSettings: ''; - typography: ''; - }; - continueWriting: ''; - docs: 'Docs'; - emptySubtitle: ''; - emptyTitle: ''; - readMemory: ''; - startChapter: ''; - statusDrafting: ''; - statusLocked: ''; - statusPending: ''; - wordsCount: ''; - }; - conversation: { - addMore: 'More'; - agentName: 'Life Echo'; - assistantReplying: 'Replying…'; - cancel: 'Cancel'; - cancelRecording: 'Cancel recording'; - cannotReadAloud: 'Read unavailable'; - chatQueueSendTimeout: 'Connection timed out. Check your network and try again.'; - chatTitle: 'Conversation'; - chatUnavailableConnecting: 'Reconnecting now. You can keep typing and send once the connection is back.'; - chatUnavailableDisconnected: 'Connection lost. You can keep typing and send after reconnecting.'; - chatUnavailableTitle: 'Chat unavailable'; - confirm: 'OK'; - confirmDeleteConversation: 'Are you sure you want to delete this conversation? It cannot be recovered.'; - connectionConnected: 'Connected'; - connectionConnecting: 'Connecting...'; - connectionDisconnected: 'Disconnected'; - createError: 'Unable to create conversation. Please check your network and try again.'; - delete: 'Delete'; - deleteConversation: 'Delete Conversation'; - emptyGreetingSubtitle: 'Chat with your companion and record your stories.'; - greetingTitle: 'Say Hello'; - inputPlaceholder: 'Type a message...'; - inputPlaceholderVoice: 'Type here or hold the mic to speak...'; - me: 'Me'; - readAloudAgain: 'Play again'; - readAloudPause: 'Pause reading'; - readAloudResume: 'Resume reading'; - readAloudRequest: 'Read aloud'; - readAloudRequestFailed: 'Could not start playback. Check your connection.'; - readAloudNoMessageId: 'This message is not ready for on-demand reading yet. Pull to refresh or try again.'; - readingAloud: 'Reading aloud…'; - recentChats: 'Recent Chats'; - recordingPermissionDenied: 'Microphone permission is required to record'; - recordingStartFailed: 'Unable to start recording. Please try again.'; - resumeChatSubtitle: 'Open your latest conversation to keep talking.'; - resumeChatTitle: 'Continue chatting'; - send: 'Send'; - startNewSubtitle: 'Capture a new memory or share your thoughts with your companion.'; - stopReadingAloud: 'Stop reading aloud'; - switchToText: 'Switch to text input'; - switchToVoice: 'Switch to voice input'; - tapToEndRecording: 'Tap to end'; - tapToStartRecording: 'Tap to start recording'; - ttsThisTurn: 'Speak'; - ttsThisTurnAccessibility: 'When on, assistant replies synthesize speech before text appears.'; - topicSuggestionsDismiss: 'Hide'; - timeDaysAgo_one: '{{count}} day ago'; - timeDaysAgo_other: '{{count}} days ago'; - timeHoursAgo_one: '{{count}} hour ago'; - timeHoursAgo_other: '{{count}} hours ago'; - timeJustNow: 'Just now'; - timeMinutesAgo_one: '{{count}} minute ago'; - timeMinutesAgo_other: '{{count}} minutes ago'; - viewAll: 'View All'; - voiceMessagePreview: 'Voice message'; - }; - explore: {}; - home: {}; - legal: { - titlePrivacy: 'Privacy Policy'; - titleTerms: 'User Agreement'; - }; - memoir: { - chapterLabel: 'Chapter {{index}}'; - chapterReading: { - back: 'Back'; - backgroundColor: 'Background'; - bgPureWhite: 'White'; - bgSepia: 'Sepia'; - cancel: 'Cancel'; - chapterNotFound: 'Chapter not found'; - close: 'Close'; - confirmDeleteMessage: 'Are you sure you want to delete this chapter? You will no longer be able to view it, but the content will be kept for future reference.'; - deleteChapter: 'Delete Chapter'; - deleteChapterAction: 'Delete'; - fontSans: 'Sans'; - fontSerif: 'Serif'; - fontSize: 'Font Size'; - fontSizeDefault: 'Medium'; - fontSizeLarge: 'Large'; - fontSizeSmall: 'Small'; - readingSettings: 'Reading Settings'; - settings: 'Settings'; - typography: 'Typography'; - }; - continueWriting: 'Continue Writing'; - emptySubtitle: 'Chat with your companion to record your stories'; - emptyTitle: 'No memoir yet'; - frameworkChapters: { - chapter1: 'Childhood and upbringing'; - chapter2: 'Education and young adulthood'; - chapter3: 'Early career'; - chapter4: 'Major achievements and peak moments'; - chapter5: 'Setbacks, challenges, and turning points'; - chapter6: 'Family and relationships'; - chapter7: 'Beliefs and values'; - chapter8: 'Life summary'; - }; - loadErrorMessage: 'Could not load chapters'; - loadErrorRetry: 'Retry'; - pageTitle: 'Memoir'; - readMemory: 'Read Memory'; - startChapter: 'Start Writing'; - statusDrafting: 'Drafting'; - statusLocked: 'Locked'; - statusPending: 'Pending'; - wordsCount: '{{count}} words'; - }; - profile: { - about: { - aboutUs: 'About Us'; - title: 'About'; - }; - appExperience: { - language: 'Language'; - languageDesc: 'Display language'; - largeText: 'Large Text'; - largeTextDesc: 'Make reading easier'; - nightMode: 'Night Mode'; - nightModeDesc: 'Use dark theme'; - theme: 'Theme'; - themeDesc: 'Color theme'; - title: 'App Experience'; - }; - dataPrivacy: { - deleteAll: 'Delete All Data'; - deleteUnderDevelopment: 'Delete data feature is under development.'; - exportAll: 'Export All Data'; - exportUnderDevelopment: 'Export feature is under development.'; - purgeDialogCancel: 'Cancel'; - purgeDialogConfirm: 'Delete permanently'; - purgeDialogDescription: 'This cannot be undone. Your data will be removed immediately.'; - purgeDialogTitle: 'Final confirmation'; - purgeInputLabel: 'Confirmation phrase'; - purgeInputPlaceholder: 'Type the phrase shown above'; - purgeOpenConfirm: 'I understand, continue'; - purgePhraseHint: 'Type the following Chinese sentence exactly (every character and punctuation). The server only accepts this exact phrase:'; - purgeSubmitting: 'Deleting…'; - purgeWarningBody: 'This permanently deletes your conversations, memory, stories, chapters, orders, and related files in cloud storage. Profile fields such as birth year, birthplace, where you grew up, and occupation will also be cleared. All devices will be signed out.\nYou can still log in with the same phone number, but your previous content cannot be restored.'; - purgeWarningTitle: 'Before you continue'; - title: 'Data & Privacy'; - }; - editAvatar: 'Edit Profile Picture'; - helpSupport: { - faq: 'FAQ'; - feedback: 'Feedback & Support'; - feedbackPageTitle: 'Share your thoughts'; - title: 'Help & Support'; - }; - personalInfo: { - avatarPresetFailed: 'Could not set preset avatar'; - avatarUploadFailed: 'Could not upload avatar'; - birthPlacePlaceholder: 'Birthplace'; - birthYearPlaceholder: 'Birth year'; - cancel: 'Cancel'; - changeAvatar: 'Change photo'; - chooseFromLibrary: 'Choose from library'; - choosePreset: 'Preset avatars'; - grewUpPlaceholder: 'Where you grew up'; - libraryPermissionDenied: 'Photo library access is required to pick an image'; - nickname: 'Nickname'; - nicknamePlaceholder: 'Enter nickname'; - nicknameRequired: 'Please enter a nickname'; - occupationPlaceholder: 'Occupation'; - presetPickTitle: 'Choose a preset'; - save: 'Save'; - saveFailed: 'Could not save'; - savePartialBody: 'Your nickname was saved, but profile fields below could not be saved. Check your connection and tap Save again.'; - savePartialTitle: 'Partially saved'; - saving: 'Saving…'; - title: 'Personal info'; - }; - signOut: 'Sign Out'; - signingOut: 'Signing out...'; - tier: { - free: 'Free'; - pro: 'Pro'; - pro_plus: 'Pro+'; - test: 'Test'; - }; - userNamePlaceholder: 'User'; - userTier: '{{tier}}'; - }; + "app": { + "languages": { + "en": "English", + "system": "System", + "zh": "Chinese" + }, + "name": "Life Echo", + "tabs": { + "conversations": "Chats", + "explore": "Explore", + "home": "Home", + "memoir": "Memoir", + "profile": "Profile" + }, + "theme": { + "default": "Default" + } + }, + "auth": { + "login": { + "codeLabel": "Verification Code", + "getCode": "Get Code", + "getCodeCountdown": "Retry in {{seconds}}s", + "networkError": "Network error. Please try again later.", + "phoneLabel": "Phone Number", + "phonePlaceholder": "Enter your phone number", + "privacyPolicy": "Privacy Policy", + "submit": "Login", + "termsAnd": "and", + "termsIntro": "I agree to the", + "termsRequired": "Please agree to the User Agreement and Privacy Policy first", + "termsRequiredConfirm": "OK", + "termsRequiredTitle": "Agreement Required", + "userAgreement": "User Agreement", + "welcomeSubtitle": "Some lives grow richer the more you savor them.", + "welcomeTitle": "Welcome back" + } + }, + "common": { + "chapterLabel": "", + "chapterReading": { + "backgroundColor": "", + "bgPureWhite": "", + "bgSepia": "", + "close": "", + "fontSize": "", + "readingSettings": "", + "typography": "" + }, + "continueWriting": "", + "docs": "Docs", + "emptySubtitle": "", + "emptyTitle": "", + "readMemory": "", + "startChapter": "", + "statusDrafting": "", + "statusLocked": "", + "statusPending": "", + "wordsCount": "" + }, + "conversation": { + "addMore": "More", + "agentName": "Life Echo", + "assistantReplying": "Replying…", + "cancel": "Cancel", + "cancelRecording": "Cancel recording", + "cannotReadAloud": "Read unavailable", + "chatQueueSendTimeout": "Connection timed out. Check your network and try again.", + "chatTitle": "Conversation", + "chatUnavailableConnecting": "Reconnecting now. You can keep typing and send once the connection is back.", + "chatUnavailableDisconnected": "Connection lost. You can keep typing and send after reconnecting.", + "chatUnavailableTitle": "Chat unavailable", + "confirm": "OK", + "confirmDeleteConversation": "Are you sure you want to delete this conversation? It cannot be recovered.", + "connectionConnected": "Connected", + "connectionConnecting": "Connecting...", + "connectionDisconnected": "Disconnected", + "createError": "Unable to create conversation. Please check your network and try again.", + "delete": "Delete", + "deleteConversation": "Delete Conversation", + "emptyGreetingSubtitle": "Chat with your companion and record your stories.", + "greetingTitle": "Say Hello", + "inputPlaceholder": "Type a message...", + "inputPlaceholderVoice": "Type here or hold the mic to speak...", + "me": "Me", + "readAloudAgain": "Play again", + "readAloudNoMessageId": "This message is not ready for on-demand reading yet. Pull to refresh or try again.", + "readAloudPause": "Pause reading", + "readAloudRequest": "Read aloud", + "readAloudRequestFailed": "Could not start playback. Check your connection.", + "readAloudResume": "Resume reading", + "readingAloud": "Reading aloud…", + "recentChats": "Recent Chats", + "recordingPermissionDenied": "Microphone permission is required to record", + "recordingStartFailed": "Unable to start recording. Please try again.", + "resumeChatSubtitle": "Open your latest conversation to keep talking.", + "resumeChatTitle": "Continue chatting", + "send": "Send", + "startNewSubtitle": "Capture a new memory or share your thoughts with your companion.", + "stopReadingAloud": "Stop reading aloud", + "switchToText": "Switch to text input", + "switchToVoice": "Switch to voice input", + "tapToEndRecording": "Tap to end", + "tapToStartRecording": "Tap to start recording", + "timeDaysAgo_one": "{{count}} day ago", + "timeDaysAgo_other": "{{count}} days ago", + "timeHoursAgo_one": "{{count}} hour ago", + "timeHoursAgo_other": "{{count}} hours ago", + "timeJustNow": "Just now", + "timeMinutesAgo_one": "{{count}} minute ago", + "timeMinutesAgo_other": "{{count}} minutes ago", + "topicSuggestionsDismiss": "Hide", + "ttsThisTurn": "Speak", + "ttsThisTurnAccessibility": "When on, assistant replies synthesize speech before text appears.", + "viewAll": "View All", + "voiceMessagePreview": "Voice message" + }, + "explore": { + + }, + "home": { + + }, + "legal": { + "titlePrivacy": "Privacy Policy", + "titleTerms": "User Agreement" + }, + "memoir": { + "chapterLabel": "Chapter {{index}}", + "chapterReading": { + "back": "Back", + "backgroundColor": "Background", + "bgPureWhite": "White", + "bgSepia": "Sepia", + "cancel": "Cancel", + "chapterNotFound": "Chapter not found", + "close": "Close", + "confirmDeleteMessage": "Are you sure you want to delete this chapter? You will no longer be able to view it, but the content will be kept for future reference.", + "deleteChapter": "Delete Chapter", + "deleteChapterAction": "Delete", + "fontSans": "Sans", + "fontSerif": "Serif", + "fontSize": "Font Size", + "fontSizeDefault": "Medium", + "fontSizeLarge": "Large", + "fontSizeSmall": "Small", + "readingSettings": "Reading Settings", + "settings": "Settings", + "typography": "Typography" + }, + "emptySubtitle": "Chat with your companion to record your stories", + "emptyTitle": "No memoir yet", + "frameworkChapters": { + "chapter1": "Childhood and upbringing", + "chapter2": "Education and young adulthood", + "chapter3": "Early career", + "chapter4": "Major achievements and peak moments", + "chapter5": "Setbacks, challenges, and turning points", + "chapter6": "Family and relationships", + "chapter7": "Beliefs and values", + "chapter8": "Life summary" + }, + "loadErrorMessage": "Could not load chapters", + "loadErrorRetry": "Retry", + "pageTitle": "Memoir", + "readMemory": "Read Memory", + "statusDrafting": "Drafting", + "statusLocked": "Locked", + "statusPending": "Pending", + "wordsCount": "{{count}} words" + }, + "profile": { + "about": { + "aboutUs": "About Us", + "title": "About" + }, + "appExperience": { + "language": "Language", + "languageDesc": "Display language", + "largeText": "Large Text", + "largeTextDesc": "Make reading easier", + "nightMode": "Night Mode", + "nightModeDesc": "Use dark theme", + "theme": "Theme", + "themeDesc": "Color theme", + "title": "App Experience" + }, + "dataPrivacy": { + "deleteAll": "Delete All Data", + "deleteUnderDevelopment": "Delete data feature is under development.", + "exportAll": "Export All Data", + "exportUnderDevelopment": "Export feature is under development.", + "purgeDialogCancel": "Cancel", + "purgeDialogConfirm": "Delete permanently", + "purgeDialogDescription": "This cannot be undone. Your data will be removed immediately.", + "purgeDialogTitle": "Final confirmation", + "purgeInputLabel": "Confirmation phrase", + "purgeInputPlaceholder": "Type the phrase shown above", + "purgeOpenConfirm": "I understand, continue", + "purgePhraseHint": "Type the following Chinese sentence exactly (every character and punctuation). The server only accepts this exact phrase:", + "purgeSubmitting": "Deleting…", + "purgeWarningBody": "This permanently deletes your conversations, memory, stories, chapters, orders, and related files in cloud storage. Profile fields such as birth year, birthplace, where you grew up, and occupation will also be cleared. All devices will be signed out.\nYou can still log in with the same phone number, but your previous content cannot be restored.", + "purgeWarningTitle": "Before you continue", + "title": "Data & Privacy" + }, + "editAvatar": "Edit Profile Picture", + "helpSupport": { + "faq": "FAQ", + "feedback": "Feedback & Support", + "feedbackPageTitle": "Share your thoughts", + "title": "Help & Support" + }, + "personalInfo": { + "avatarPresetFailed": "Could not set preset avatar", + "avatarUploadFailed": "Could not upload avatar", + "birthPlacePlaceholder": "Birthplace", + "birthYearPlaceholder": "Birth year", + "cancel": "Cancel", + "changeAvatar": "Change photo", + "chooseFromLibrary": "Choose from library", + "choosePreset": "Preset avatars", + "grewUpPlaceholder": "Where you grew up", + "libraryPermissionDenied": "Photo library access is required to pick an image", + "nickname": "Nickname", + "nicknamePlaceholder": "Enter nickname", + "nicknameRequired": "Please enter a nickname", + "occupationPlaceholder": "Occupation", + "presetPickTitle": "Choose a preset", + "save": "Save", + "saveFailed": "Could not save", + "savePartialBody": "Your nickname was saved, but profile fields below could not be saved. Check your connection and tap Save again.", + "savePartialTitle": "Partially saved", + "saving": "Saving…", + "title": "Personal info" + }, + "signOut": "Sign Out", + "signingOut": "Signing out...", + "tier": { + "free": "Free", + "pro": "Pro", + "pro_plus": "Pro+", + "test": "Test" + }, + "userNamePlaceholder": "User", + "userTier": "{{tier}}" + } } export default Resources; diff --git a/app-expo/src/i18n/locales/en/memoir.json b/app-expo/src/i18n/locales/en/memoir.json index 713e6db..7c072ec 100644 --- a/app-expo/src/i18n/locales/en/memoir.json +++ b/app-expo/src/i18n/locales/en/memoir.json @@ -33,12 +33,10 @@ "settings": "Settings", "typography": "Typography" }, - "continueWriting": "Continue Writing", "emptySubtitle": "Chat with your companion to record your stories", "emptyTitle": "No memoir yet", "pageTitle": "Memoir", "readMemory": "Read Memory", - "startChapter": "Start Writing", "statusDrafting": "Drafting", "statusLocked": "Locked", "statusPending": "Pending", diff --git a/app-expo/src/i18n/locales/zh/memoir.json b/app-expo/src/i18n/locales/zh/memoir.json index 02ac934..b69c8f6 100644 --- a/app-expo/src/i18n/locales/zh/memoir.json +++ b/app-expo/src/i18n/locales/zh/memoir.json @@ -33,12 +33,10 @@ "settings": "设置", "typography": "字体" }, - "continueWriting": "继续写作", "emptySubtitle": "与岁月知己聊天,记录你的故事", "emptyTitle": "还没有回忆录", "pageTitle": "回忆录", "readMemory": "阅读回忆", - "startChapter": "开始写作", "statusDrafting": "撰写中", "statusLocked": "已锁定", "statusPending": "待解锁",