- Introduced new translation files for medication, personal, and weight management in Chinese. - Updated the main index file to include the new translation modules. - Enhanced the medication type definitions to include 'ointment'. - Refactored workout type labels to utilize i18n for better localization support. - Improved sleep quality descriptions and recommendations with i18n integration.
304 lines
9.6 KiB
TypeScript
304 lines
9.6 KiB
TypeScript
export const challengeDetail = {
|
|
title: 'Challenge Details',
|
|
notFound: 'Challenge not found, please try again later.',
|
|
loading: 'Loading challenge details…',
|
|
retry: 'Reload',
|
|
share: {
|
|
generating: 'Generating share card...',
|
|
failed: 'Share failed, please try again later',
|
|
messageJoined: 'I\'m participating in "{{title}}" challenge, completed {{completed}}/{{target}} days! Join me!',
|
|
messageNotJoined: 'Found an amazing challenge "{{title}}", let\'s join together!',
|
|
},
|
|
dateRange: {
|
|
format: '{{start}} - {{end}}',
|
|
monthDay: 'Month {{month}} Day {{day}}',
|
|
ongoing: 'Ongoing updates',
|
|
},
|
|
participants: {
|
|
count: '{{count}} participants',
|
|
ongoing: 'Ongoing updates',
|
|
more: 'More',
|
|
},
|
|
detail: {
|
|
requirement: 'Daily check-in auto accumulates',
|
|
viewAllRanking: 'View All',
|
|
},
|
|
checkIn: {
|
|
title: 'Challenge Check-in',
|
|
todayChecked: 'Checked in today',
|
|
subtitle: 'Daily check-ins accumulate progress towards goal',
|
|
subtitleChecked: 'Today\'s progress recorded, keep it up tomorrow',
|
|
button: {
|
|
checkIn: 'Check In Now',
|
|
checking: 'Checking in…',
|
|
checked: 'Checked in today',
|
|
notJoined: 'Join to check in',
|
|
upcoming: 'Not started yet',
|
|
expired: 'Challenge ended',
|
|
},
|
|
toast: {
|
|
alreadyChecked: 'Already checked in today',
|
|
notStarted: 'Challenge not started yet, check in after it begins',
|
|
expired: 'Challenge has ended, cannot check in',
|
|
mustJoin: 'Join the challenge to check in',
|
|
success: 'Check-in successful, keep going!',
|
|
failed: 'Check-in failed, please try again',
|
|
},
|
|
},
|
|
cta: {
|
|
join: 'Join Challenge',
|
|
joining: 'Joining…',
|
|
leave: 'Leave Challenge',
|
|
leaving: 'Leaving…',
|
|
delete: 'Delete Challenge',
|
|
deleting: 'Deleting…',
|
|
upcoming: 'Starting Soon',
|
|
expired: 'Challenge Ended',
|
|
},
|
|
highlight: {
|
|
join: {
|
|
title: 'Join Challenge Now',
|
|
subtitle: 'Invite friends to persist together, achieve more easily',
|
|
},
|
|
leave: {
|
|
title: 'Don\'t leave just yet',
|
|
subtitle: 'Keep going, the next milestone is around the corner',
|
|
},
|
|
upcoming: {
|
|
title: 'Challenge Starting Soon',
|
|
subtitle: 'Starts on {{date}}, stay tuned',
|
|
subtitleFallback: 'Challenge coming soon, stay tuned',
|
|
},
|
|
expired: {
|
|
title: 'Challenge Ended',
|
|
subtitle: 'Ended on {{date}}, look forward to the next one',
|
|
subtitleFallback: 'This round has ended, look forward to the next challenge',
|
|
},
|
|
},
|
|
alert: {
|
|
leaveConfirm: {
|
|
title: 'Confirm leaving challenge?',
|
|
message: 'You will need to rejoin to continue.',
|
|
cancel: 'Cancel',
|
|
confirm: 'Leave Challenge',
|
|
},
|
|
joinFailed: 'Failed to join challenge',
|
|
leaveFailed: 'Failed to leave challenge',
|
|
archiveConfirm: {
|
|
title: 'Delete this challenge?',
|
|
message: 'This cannot be undone and participants will lose access.',
|
|
cancel: 'Cancel',
|
|
confirm: 'Delete Challenge',
|
|
},
|
|
archiveFailed: 'Failed to delete challenge',
|
|
archiveSuccess: 'Challenge deleted',
|
|
},
|
|
ranking: {
|
|
title: 'Leaderboard',
|
|
description: '',
|
|
empty: 'Leaderboard opening soon, grab your spot.',
|
|
today: 'Today',
|
|
todayGoal: 'Today\'s Goal',
|
|
hour: 'hrs',
|
|
},
|
|
leaderboard: {
|
|
title: 'Leaderboard',
|
|
loading: 'Loading leaderboard…',
|
|
notFound: 'Challenge not found.',
|
|
loadFailed: 'Unable to load leaderboard, please try again later.',
|
|
empty: 'Leaderboard opening soon, grab your spot.',
|
|
loadMore: 'Loading more…',
|
|
loadMoreFailed: 'Failed to load more, pull to refresh and retry',
|
|
},
|
|
shareCard: {
|
|
footer: 'Out Live · Beyond Life',
|
|
progress: {
|
|
label: 'My Progress',
|
|
days: '{{completed}} / {{target}} days',
|
|
completed: '🎉 Challenge Completed!',
|
|
remaining: '{{remaining}} days to complete',
|
|
},
|
|
info: {
|
|
checkInDaily: 'Daily check-in',
|
|
joinUs: 'Join us!',
|
|
},
|
|
shareCode: {
|
|
copied: 'Share code copied',
|
|
},
|
|
},
|
|
shareCode: {
|
|
copied: 'Share code copied',
|
|
},
|
|
};
|
|
|
|
export const badges = {
|
|
title: 'Badge Gallery',
|
|
subtitle: 'Celebrate every effort',
|
|
hero: {
|
|
highlight: 'Keep checking in to unlock rarer badges.',
|
|
earnedLabel: 'Earned',
|
|
totalLabel: 'Total',
|
|
progressLabel: 'Progress',
|
|
},
|
|
categories: {
|
|
all: 'All',
|
|
sleep: 'Sleep',
|
|
exercise: 'Exercise',
|
|
diet: 'Nutrition',
|
|
challenge: 'Challenge',
|
|
social: 'Social',
|
|
special: 'Special',
|
|
},
|
|
rarities: {
|
|
common: 'Common',
|
|
uncommon: 'Uncommon',
|
|
rare: 'Rare',
|
|
epic: 'Epic',
|
|
legendary: 'Legendary',
|
|
},
|
|
status: {
|
|
earned: 'Unlocked',
|
|
locked: 'Locked',
|
|
earnedAt: 'Unlocked on {{date}}',
|
|
},
|
|
legend: 'Rarity legend',
|
|
filterLabel: 'Badge categories',
|
|
empty: {
|
|
title: 'No badges yet',
|
|
description: 'Complete sleep, workout, or challenge tasks to earn your first badge.',
|
|
action: 'Explore plans',
|
|
},
|
|
};
|
|
|
|
export const challenges = {
|
|
title: 'Challenges',
|
|
subtitle: 'Join challenges to stay consistent',
|
|
loading: 'Loading challenges…',
|
|
loadFailed: 'Failed to load challenges, please try again later.',
|
|
retry: 'Retry',
|
|
empty: 'No challenges yet. Join one to get started.',
|
|
customChallenges: 'Custom Challenges',
|
|
officialChallengesTitle: 'Official Challenges',
|
|
officialChallenges: 'Official challenges launching soon.',
|
|
join: 'Join',
|
|
joined: 'Joined',
|
|
invalidInviteCode: 'Please enter a valid invite code',
|
|
joinSuccess: 'Joined challenge successfully',
|
|
joinFailed: 'Failed to join challenge',
|
|
joinModal: {
|
|
title: 'Join via invite code',
|
|
description: 'Enter the invite code to join a challenge',
|
|
confirm: 'Join',
|
|
joining: 'Joining…',
|
|
cancel: 'Cancel',
|
|
placeholder: 'Enter invite code',
|
|
},
|
|
statusLabels: {
|
|
upcoming: 'Upcoming',
|
|
ongoing: 'Ongoing',
|
|
expired: 'Ended',
|
|
},
|
|
createCustom: {
|
|
title: 'Create Challenge',
|
|
editTitle: 'Edit Challenge',
|
|
yourChallenge: 'Your challenge',
|
|
basicInfo: 'Basic Info',
|
|
challengeSettings: 'Challenge Settings',
|
|
displayInteraction: 'Display & Interaction',
|
|
durationDays: '{{days}} days',
|
|
durationDaysChallenge: '{{days}}-day challenge',
|
|
dayUnit: 'days',
|
|
defaultTitle: 'Custom Challenge',
|
|
rankingDescription: 'Leaderboard updates daily',
|
|
typeLabels: {
|
|
water: 'Hydration',
|
|
exercise: 'Exercise',
|
|
diet: 'Diet',
|
|
sleep: 'Sleep',
|
|
mood: 'Mood',
|
|
weight: 'Weight',
|
|
custom: 'Custom',
|
|
},
|
|
fields: {
|
|
title: 'Challenge title',
|
|
titlePlaceholder: 'e.g., 21-day hydration',
|
|
coverImage: 'Cover image',
|
|
uploadCover: 'Upload cover',
|
|
challengeDescription: 'Challenge description',
|
|
descriptionPlaceholder: 'Describe the goal and check-in rules',
|
|
challengeType: 'Challenge type',
|
|
challengeTypeHelper: 'Pick the category closest to your goal',
|
|
timeRange: 'Time range',
|
|
start: 'Start date',
|
|
end: 'End date',
|
|
duration: 'Duration',
|
|
periodLabel: 'Period label',
|
|
periodLabelPlaceholder: 'e.g., 21-day sprint',
|
|
dailyTargetAndUnit: 'Daily target & unit',
|
|
dailyTargetPlaceholder: 'Daily target value',
|
|
unitPlaceholder: 'Unit (cups / mins / steps...)',
|
|
unitHelper: 'Optional, shown after the daily target',
|
|
minimumCheckInDays: 'Minimum check-in days',
|
|
minimumCheckInDaysPlaceholder: 'Cannot exceed total duration',
|
|
maxParticipants: 'Max participants',
|
|
noLimit: 'No limit',
|
|
isPublic: 'Allow public join',
|
|
publicDescription: 'Others can join with the invite code when enabled.',
|
|
},
|
|
floatingCTA: {
|
|
title: 'Generate invite code',
|
|
subtitle: 'Create a challenge and share it with friends',
|
|
editTitle: 'Save changes',
|
|
editSubtitle: 'Update the challenge for all participants',
|
|
},
|
|
buttons: {
|
|
createAndGenerateCode: 'Create & generate code',
|
|
creating: 'Creating…',
|
|
updateAndSave: 'Save changes',
|
|
updating: 'Saving…',
|
|
},
|
|
datePicker: {
|
|
confirm: 'Confirm',
|
|
cancel: 'Cancel',
|
|
},
|
|
alerts: {
|
|
titleRequired: 'Please enter a challenge title',
|
|
endTimeError: 'End date must be after start date',
|
|
targetValueError: 'Daily target must be between 1 and 1000',
|
|
minimumDaysError: 'Minimum check-in days must be between 1 and 365',
|
|
minimumDaysExceedError: 'Minimum check-in days cannot exceed total duration',
|
|
participantsError: 'Participants must be between 2 and 10000 or leave empty',
|
|
createFailed: 'Failed to create challenge',
|
|
createSuccess: 'Challenge created',
|
|
updateSuccess: 'Challenge updated',
|
|
},
|
|
imageUpload: {
|
|
selectSource: 'Choose cover',
|
|
selectMessage: 'Take a photo or pick from album',
|
|
camera: 'Camera',
|
|
album: 'Album',
|
|
cancel: 'Cancel',
|
|
cameraPermission: 'Camera permission required',
|
|
cameraPermissionMessage: 'Enable camera access to take a photo.',
|
|
albumPermissionMessage: 'Enable photo access to choose from library.',
|
|
cameraFailed: 'Failed to open camera',
|
|
cameraFailedMessage: 'Please try again or choose from album.',
|
|
selectFailed: 'Selection failed',
|
|
selectFailedMessage: 'Could not select an image, please try again.',
|
|
uploadFailed: 'Upload failed',
|
|
uploadFailedMessage: 'Cover upload failed, please retry.',
|
|
uploading: 'Uploading…',
|
|
clear: 'Remove cover',
|
|
helper: 'Use a 16:9 cover under 2MB for better results.',
|
|
},
|
|
shareModal: {
|
|
title: 'Invite code generated',
|
|
subtitle: 'Share this code so others can join your challenge',
|
|
generatingCode: 'Generating…',
|
|
copyCode: 'Copy code',
|
|
viewChallenge: 'View challenge',
|
|
later: 'Share later',
|
|
},
|
|
},
|
|
};
|