feat(mobile): album management pages with qr share

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-19 01:56:38 +08:00
parent 8be21b856b
commit bbea1dd364
27 changed files with 5485 additions and 28 deletions
+72 -1
View File
@@ -36,5 +36,76 @@
"errorValidation": "Invalid input. Please check and retry",
"errorNetwork": "Network error. Check your connection and retry",
"errorNetworkTimeout": "Network timed out. Please retry",
"errorInternal": "Service temporarily unavailable. Please retry later"
"errorInternal": "Service temporarily unavailable. Please retry later",
"albumsEmpty": "No albums yet. Tap \"Create album\" to get started",
"loadMoreFailed": "Failed to load more. Tap to retry",
"albumCreate": "Create album",
"albumEdit": "Edit album",
"albumTitle": "Title",
"albumDescription": "Description",
"albumVenue": "Venue",
"albumAddress": "Address",
"albumDefaultLocale": "Default locale",
"albumStartAt": "Start time",
"albumEndAtOptional": "End time (optional)",
"clearEndAt": "Clear end time",
"albumTimezone": "Timezone",
"albumTimezoneInvalid": "Invalid IANA timezone name",
"switchUpload": "Allow uploads",
"switchPublic": "Publicly visible",
"switchDownload": "Allow downloads",
"switchOriginalDownload": "Allow original downloads",
"formStartAtRequired": "Pick a start time",
"formDefaultLocaleMissing": "Default locale must have a title",
"formTitleRequiredWithFields": "Title is required when description, venue or address is filled",
"formEndAtNotAfterStartAt": "End time must be after start time",
"create": "Create",
"save": "Save",
"albumStatusActive": "Active",
"albumStatusOffline": "Offline",
"tagUpload": "Upload",
"tagPublic": "Public",
"tagDownload": "Download",
"tagOriginal": "Original",
"notSet": "Not set",
"actionEdit": "Edit",
"albumMembers": "Members",
"albumCategories": "Categories",
"shareQrTitle": "Share QR code",
"albumPhotos": "Photos",
"delete": "Delete",
"deleteConfirmCategory": "Delete this category? Its photos will become uncategorized.",
"categoryEmpty": "No categories yet. Tap + to add one",
"categoryAdd": "Add category",
"categoryEdit": "Edit category",
"categoryNameZh": "Chinese name",
"categoryNameEn": "English name",
"categorySortOrder": "Sort order",
"categoryNameRequired": "At least one language name is required",
"categorySortOrderInvalid": "Sort order must be an integer",
"albumMembersEmpty": "No members yet",
"inviteSearchHint": "Search by account prefix to invite (at least 2 characters)",
"inviteNoResults": "No matching users",
"invite": "Invite",
"memberInvited": "Invited",
"removeMember": "Remove member",
"removeMemberConfirm": "Remove this member?",
"roleOwner": "Owner",
"roleCollaborator": "Collaborator",
"selfMarker": " (you)",
"errorMemberConflict": "User is already a member",
"qrHint": "Scan the code or open the link to view",
"copyLink": "Copy link",
"copiedToClipboard": "Copied",
"photosTask9Placeholder": "Photo management is a placeholder; the full experience ships in Task 9",
"albumPhotosEmpty": "No photos yet",
"visibilityPublished": "Published",
"visibilityUnpublished": "Unpublished",
"visibilityHidden": "Hidden",
"visibilityDeleted": "Deleted",
"procPendingUpload": "Pending upload",
"procUploaded": "Uploaded",
"procProcessing": "Processing",
"procReady": "Ready",
"procProcessingFailed": "Processing failed"
}
+426
View File
@@ -319,6 +319,432 @@ abstract class AppLocalizations {
/// In zh, this message translates to:
/// **'服务暂时不可用,请稍后重试'**
String get errorInternal;
/// No description provided for @albumsEmpty.
///
/// In zh, this message translates to:
/// **'暂无相册,点击「新建相册」开始'**
String get albumsEmpty;
/// No description provided for @loadMoreFailed.
///
/// In zh, this message translates to:
/// **'加载更多失败,点击重试'**
String get loadMoreFailed;
/// No description provided for @albumCreate.
///
/// In zh, this message translates to:
/// **'新建相册'**
String get albumCreate;
/// No description provided for @albumEdit.
///
/// In zh, this message translates to:
/// **'编辑相册'**
String get albumEdit;
/// No description provided for @albumTitle.
///
/// In zh, this message translates to:
/// **'标题'**
String get albumTitle;
/// No description provided for @albumDescription.
///
/// In zh, this message translates to:
/// **'描述'**
String get albumDescription;
/// No description provided for @albumVenue.
///
/// In zh, this message translates to:
/// **'场地'**
String get albumVenue;
/// No description provided for @albumAddress.
///
/// In zh, this message translates to:
/// **'地址'**
String get albumAddress;
/// No description provided for @albumDefaultLocale.
///
/// In zh, this message translates to:
/// **'默认语言'**
String get albumDefaultLocale;
/// No description provided for @albumStartAt.
///
/// In zh, this message translates to:
/// **'开始时间'**
String get albumStartAt;
/// No description provided for @albumEndAtOptional.
///
/// In zh, this message translates to:
/// **'结束时间(可选)'**
String get albumEndAtOptional;
/// No description provided for @clearEndAt.
///
/// In zh, this message translates to:
/// **'清除结束时间'**
String get clearEndAt;
/// No description provided for @albumTimezone.
///
/// In zh, this message translates to:
/// **'时区'**
String get albumTimezone;
/// No description provided for @albumTimezoneInvalid.
///
/// In zh, this message translates to:
/// **'无效的 IANA 时区名称'**
String get albumTimezoneInvalid;
/// No description provided for @switchUpload.
///
/// In zh, this message translates to:
/// **'允许上传'**
String get switchUpload;
/// No description provided for @switchPublic.
///
/// In zh, this message translates to:
/// **'公开可见'**
String get switchPublic;
/// No description provided for @switchDownload.
///
/// In zh, this message translates to:
/// **'允许下载'**
String get switchDownload;
/// No description provided for @switchOriginalDownload.
///
/// In zh, this message translates to:
/// **'允许下载原图'**
String get switchOriginalDownload;
/// No description provided for @formStartAtRequired.
///
/// In zh, this message translates to:
/// **'请选择开始时间'**
String get formStartAtRequired;
/// No description provided for @formDefaultLocaleMissing.
///
/// In zh, this message translates to:
/// **'默认语言必须填写标题'**
String get formDefaultLocaleMissing;
/// No description provided for @formTitleRequiredWithFields.
///
/// In zh, this message translates to:
/// **'填写了描述/场地/地址时,标题不能为空'**
String get formTitleRequiredWithFields;
/// No description provided for @formEndAtNotAfterStartAt.
///
/// In zh, this message translates to:
/// **'结束时间必须晚于开始时间'**
String get formEndAtNotAfterStartAt;
/// No description provided for @create.
///
/// In zh, this message translates to:
/// **'创建'**
String get create;
/// No description provided for @save.
///
/// In zh, this message translates to:
/// **'保存'**
String get save;
/// No description provided for @albumStatusActive.
///
/// In zh, this message translates to:
/// **'正常'**
String get albumStatusActive;
/// No description provided for @albumStatusOffline.
///
/// In zh, this message translates to:
/// **'下线'**
String get albumStatusOffline;
/// No description provided for @tagUpload.
///
/// In zh, this message translates to:
/// **'上传'**
String get tagUpload;
/// No description provided for @tagPublic.
///
/// In zh, this message translates to:
/// **'公开'**
String get tagPublic;
/// No description provided for @tagDownload.
///
/// In zh, this message translates to:
/// **'下载'**
String get tagDownload;
/// No description provided for @tagOriginal.
///
/// In zh, this message translates to:
/// **'原图'**
String get tagOriginal;
/// No description provided for @notSet.
///
/// In zh, this message translates to:
/// **'未定'**
String get notSet;
/// No description provided for @actionEdit.
///
/// In zh, this message translates to:
/// **'编辑'**
String get actionEdit;
/// No description provided for @albumMembers.
///
/// In zh, this message translates to:
/// **'成员管理'**
String get albumMembers;
/// No description provided for @albumCategories.
///
/// In zh, this message translates to:
/// **'分类管理'**
String get albumCategories;
/// No description provided for @shareQrTitle.
///
/// In zh, this message translates to:
/// **'分享二维码'**
String get shareQrTitle;
/// No description provided for @albumPhotos.
///
/// In zh, this message translates to:
/// **'照片管理'**
String get albumPhotos;
/// No description provided for @delete.
///
/// In zh, this message translates to:
/// **'删除'**
String get delete;
/// No description provided for @deleteConfirmCategory.
///
/// In zh, this message translates to:
/// **'确定删除该分类?该分类下的照片将变为未分类。'**
String get deleteConfirmCategory;
/// No description provided for @categoryEmpty.
///
/// In zh, this message translates to:
/// **'暂无分类,点击右上角新增'**
String get categoryEmpty;
/// No description provided for @categoryAdd.
///
/// In zh, this message translates to:
/// **'新增分类'**
String get categoryAdd;
/// No description provided for @categoryEdit.
///
/// In zh, this message translates to:
/// **'编辑分类'**
String get categoryEdit;
/// No description provided for @categoryNameZh.
///
/// In zh, this message translates to:
/// **'中文名称'**
String get categoryNameZh;
/// No description provided for @categoryNameEn.
///
/// In zh, this message translates to:
/// **'英文名称'**
String get categoryNameEn;
/// No description provided for @categorySortOrder.
///
/// In zh, this message translates to:
/// **'排序序号'**
String get categorySortOrder;
/// No description provided for @categoryNameRequired.
///
/// In zh, this message translates to:
/// **'至少填写一个语言的名称'**
String get categoryNameRequired;
/// No description provided for @categorySortOrderInvalid.
///
/// In zh, this message translates to:
/// **'排序序号必须是整数'**
String get categorySortOrderInvalid;
/// No description provided for @albumMembersEmpty.
///
/// In zh, this message translates to:
/// **'暂无成员'**
String get albumMembersEmpty;
/// No description provided for @inviteSearchHint.
///
/// In zh, this message translates to:
/// **'输入账号前缀搜索邀请(至少 2 个字符)'**
String get inviteSearchHint;
/// No description provided for @inviteNoResults.
///
/// In zh, this message translates to:
/// **'未找到匹配用户'**
String get inviteNoResults;
/// No description provided for @invite.
///
/// In zh, this message translates to:
/// **'邀请'**
String get invite;
/// No description provided for @memberInvited.
///
/// In zh, this message translates to:
/// **'已邀请'**
String get memberInvited;
/// No description provided for @removeMember.
///
/// In zh, this message translates to:
/// **'移除成员'**
String get removeMember;
/// No description provided for @removeMemberConfirm.
///
/// In zh, this message translates to:
/// **'确定移除该成员?'**
String get removeMemberConfirm;
/// No description provided for @roleOwner.
///
/// In zh, this message translates to:
/// **'创建者'**
String get roleOwner;
/// No description provided for @roleCollaborator.
///
/// In zh, this message translates to:
/// **'协作者'**
String get roleCollaborator;
/// No description provided for @selfMarker.
///
/// In zh, this message translates to:
/// **'(我)'**
String get selfMarker;
/// No description provided for @errorMemberConflict.
///
/// In zh, this message translates to:
/// **'该用户已是相册成员'**
String get errorMemberConflict;
/// No description provided for @qrHint.
///
/// In zh, this message translates to:
/// **'扫码或打开链接观看'**
String get qrHint;
/// No description provided for @copyLink.
///
/// In zh, this message translates to:
/// **'复制链接'**
String get copyLink;
/// No description provided for @copiedToClipboard.
///
/// In zh, this message translates to:
/// **'已复制'**
String get copiedToClipboard;
/// No description provided for @photosTask9Placeholder.
///
/// In zh, this message translates to:
/// **'照片管理为占位版本,完整功能将在任务 9 上线'**
String get photosTask9Placeholder;
/// No description provided for @albumPhotosEmpty.
///
/// In zh, this message translates to:
/// **'暂无照片'**
String get albumPhotosEmpty;
/// No description provided for @visibilityPublished.
///
/// In zh, this message translates to:
/// **'已发布'**
String get visibilityPublished;
/// No description provided for @visibilityUnpublished.
///
/// In zh, this message translates to:
/// **'未发布'**
String get visibilityUnpublished;
/// No description provided for @visibilityHidden.
///
/// In zh, this message translates to:
/// **'已隐藏'**
String get visibilityHidden;
/// No description provided for @visibilityDeleted.
///
/// In zh, this message translates to:
/// **'已删除'**
String get visibilityDeleted;
/// No description provided for @procPendingUpload.
///
/// In zh, this message translates to:
/// **'待上传'**
String get procPendingUpload;
/// No description provided for @procUploaded.
///
/// In zh, this message translates to:
/// **'已上传'**
String get procUploaded;
/// No description provided for @procProcessing.
///
/// In zh, this message translates to:
/// **'处理中'**
String get procProcessing;
/// No description provided for @procReady.
///
/// In zh, this message translates to:
/// **'就绪'**
String get procReady;
/// No description provided for @procProcessingFailed.
///
/// In zh, this message translates to:
/// **'处理失败'**
String get procProcessingFailed;
}
class _AppLocalizationsDelegate
@@ -120,4 +120,222 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get errorInternal =>
'Service temporarily unavailable. Please retry later';
@override
String get albumsEmpty =>
'No albums yet. Tap \"Create album\" to get started';
@override
String get loadMoreFailed => 'Failed to load more. Tap to retry';
@override
String get albumCreate => 'Create album';
@override
String get albumEdit => 'Edit album';
@override
String get albumTitle => 'Title';
@override
String get albumDescription => 'Description';
@override
String get albumVenue => 'Venue';
@override
String get albumAddress => 'Address';
@override
String get albumDefaultLocale => 'Default locale';
@override
String get albumStartAt => 'Start time';
@override
String get albumEndAtOptional => 'End time (optional)';
@override
String get clearEndAt => 'Clear end time';
@override
String get albumTimezone => 'Timezone';
@override
String get albumTimezoneInvalid => 'Invalid IANA timezone name';
@override
String get switchUpload => 'Allow uploads';
@override
String get switchPublic => 'Publicly visible';
@override
String get switchDownload => 'Allow downloads';
@override
String get switchOriginalDownload => 'Allow original downloads';
@override
String get formStartAtRequired => 'Pick a start time';
@override
String get formDefaultLocaleMissing => 'Default locale must have a title';
@override
String get formTitleRequiredWithFields =>
'Title is required when description, venue or address is filled';
@override
String get formEndAtNotAfterStartAt => 'End time must be after start time';
@override
String get create => 'Create';
@override
String get save => 'Save';
@override
String get albumStatusActive => 'Active';
@override
String get albumStatusOffline => 'Offline';
@override
String get tagUpload => 'Upload';
@override
String get tagPublic => 'Public';
@override
String get tagDownload => 'Download';
@override
String get tagOriginal => 'Original';
@override
String get notSet => 'Not set';
@override
String get actionEdit => 'Edit';
@override
String get albumMembers => 'Members';
@override
String get albumCategories => 'Categories';
@override
String get shareQrTitle => 'Share QR code';
@override
String get albumPhotos => 'Photos';
@override
String get delete => 'Delete';
@override
String get deleteConfirmCategory =>
'Delete this category? Its photos will become uncategorized.';
@override
String get categoryEmpty => 'No categories yet. Tap + to add one';
@override
String get categoryAdd => 'Add category';
@override
String get categoryEdit => 'Edit category';
@override
String get categoryNameZh => 'Chinese name';
@override
String get categoryNameEn => 'English name';
@override
String get categorySortOrder => 'Sort order';
@override
String get categoryNameRequired => 'At least one language name is required';
@override
String get categorySortOrderInvalid => 'Sort order must be an integer';
@override
String get albumMembersEmpty => 'No members yet';
@override
String get inviteSearchHint =>
'Search by account prefix to invite (at least 2 characters)';
@override
String get inviteNoResults => 'No matching users';
@override
String get invite => 'Invite';
@override
String get memberInvited => 'Invited';
@override
String get removeMember => 'Remove member';
@override
String get removeMemberConfirm => 'Remove this member?';
@override
String get roleOwner => 'Owner';
@override
String get roleCollaborator => 'Collaborator';
@override
String get selfMarker => ' (you)';
@override
String get errorMemberConflict => 'User is already a member';
@override
String get qrHint => 'Scan the code or open the link to view';
@override
String get copyLink => 'Copy link';
@override
String get copiedToClipboard => 'Copied';
@override
String get photosTask9Placeholder =>
'Photo management is a placeholder; the full experience ships in Task 9';
@override
String get albumPhotosEmpty => 'No photos yet';
@override
String get visibilityPublished => 'Published';
@override
String get visibilityUnpublished => 'Unpublished';
@override
String get visibilityHidden => 'Hidden';
@override
String get visibilityDeleted => 'Deleted';
@override
String get procPendingUpload => 'Pending upload';
@override
String get procUploaded => 'Uploaded';
@override
String get procProcessing => 'Processing';
@override
String get procReady => 'Ready';
@override
String get procProcessingFailed => 'Processing failed';
}
@@ -118,4 +118,217 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get errorInternal => '服务暂时不可用,请稍后重试';
@override
String get albumsEmpty => '暂无相册,点击「新建相册」开始';
@override
String get loadMoreFailed => '加载更多失败,点击重试';
@override
String get albumCreate => '新建相册';
@override
String get albumEdit => '编辑相册';
@override
String get albumTitle => '标题';
@override
String get albumDescription => '描述';
@override
String get albumVenue => '场地';
@override
String get albumAddress => '地址';
@override
String get albumDefaultLocale => '默认语言';
@override
String get albumStartAt => '开始时间';
@override
String get albumEndAtOptional => '结束时间(可选)';
@override
String get clearEndAt => '清除结束时间';
@override
String get albumTimezone => '时区';
@override
String get albumTimezoneInvalid => '无效的 IANA 时区名称';
@override
String get switchUpload => '允许上传';
@override
String get switchPublic => '公开可见';
@override
String get switchDownload => '允许下载';
@override
String get switchOriginalDownload => '允许下载原图';
@override
String get formStartAtRequired => '请选择开始时间';
@override
String get formDefaultLocaleMissing => '默认语言必须填写标题';
@override
String get formTitleRequiredWithFields => '填写了描述/场地/地址时,标题不能为空';
@override
String get formEndAtNotAfterStartAt => '结束时间必须晚于开始时间';
@override
String get create => '创建';
@override
String get save => '保存';
@override
String get albumStatusActive => '正常';
@override
String get albumStatusOffline => '下线';
@override
String get tagUpload => '上传';
@override
String get tagPublic => '公开';
@override
String get tagDownload => '下载';
@override
String get tagOriginal => '原图';
@override
String get notSet => '未定';
@override
String get actionEdit => '编辑';
@override
String get albumMembers => '成员管理';
@override
String get albumCategories => '分类管理';
@override
String get shareQrTitle => '分享二维码';
@override
String get albumPhotos => '照片管理';
@override
String get delete => '删除';
@override
String get deleteConfirmCategory => '确定删除该分类?该分类下的照片将变为未分类。';
@override
String get categoryEmpty => '暂无分类,点击右上角新增';
@override
String get categoryAdd => '新增分类';
@override
String get categoryEdit => '编辑分类';
@override
String get categoryNameZh => '中文名称';
@override
String get categoryNameEn => '英文名称';
@override
String get categorySortOrder => '排序序号';
@override
String get categoryNameRequired => '至少填写一个语言的名称';
@override
String get categorySortOrderInvalid => '排序序号必须是整数';
@override
String get albumMembersEmpty => '暂无成员';
@override
String get inviteSearchHint => '输入账号前缀搜索邀请(至少 2 个字符)';
@override
String get inviteNoResults => '未找到匹配用户';
@override
String get invite => '邀请';
@override
String get memberInvited => '已邀请';
@override
String get removeMember => '移除成员';
@override
String get removeMemberConfirm => '确定移除该成员?';
@override
String get roleOwner => '创建者';
@override
String get roleCollaborator => '协作者';
@override
String get selfMarker => '(我)';
@override
String get errorMemberConflict => '该用户已是相册成员';
@override
String get qrHint => '扫码或打开链接观看';
@override
String get copyLink => '复制链接';
@override
String get copiedToClipboard => '已复制';
@override
String get photosTask9Placeholder => '照片管理为占位版本,完整功能将在任务 9 上线';
@override
String get albumPhotosEmpty => '暂无照片';
@override
String get visibilityPublished => '已发布';
@override
String get visibilityUnpublished => '未发布';
@override
String get visibilityHidden => '已隐藏';
@override
String get visibilityDeleted => '已删除';
@override
String get procPendingUpload => '待上传';
@override
String get procUploaded => '已上传';
@override
String get procProcessing => '处理中';
@override
String get procReady => '就绪';
@override
String get procProcessingFailed => '处理失败';
}
+72 -1
View File
@@ -36,5 +36,76 @@
"errorValidation": "输入有误,请检查后重试",
"errorNetwork": "网络连接失败,请检查网络后重试",
"errorNetworkTimeout": "网络超时,请重试",
"errorInternal": "服务暂时不可用,请稍后重试"
"errorInternal": "服务暂时不可用,请稍后重试",
"albumsEmpty": "暂无相册,点击「新建相册」开始",
"loadMoreFailed": "加载更多失败,点击重试",
"albumCreate": "新建相册",
"albumEdit": "编辑相册",
"albumTitle": "标题",
"albumDescription": "描述",
"albumVenue": "场地",
"albumAddress": "地址",
"albumDefaultLocale": "默认语言",
"albumStartAt": "开始时间",
"albumEndAtOptional": "结束时间(可选)",
"clearEndAt": "清除结束时间",
"albumTimezone": "时区",
"albumTimezoneInvalid": "无效的 IANA 时区名称",
"switchUpload": "允许上传",
"switchPublic": "公开可见",
"switchDownload": "允许下载",
"switchOriginalDownload": "允许下载原图",
"formStartAtRequired": "请选择开始时间",
"formDefaultLocaleMissing": "默认语言必须填写标题",
"formTitleRequiredWithFields": "填写了描述/场地/地址时,标题不能为空",
"formEndAtNotAfterStartAt": "结束时间必须晚于开始时间",
"create": "创建",
"save": "保存",
"albumStatusActive": "正常",
"albumStatusOffline": "下线",
"tagUpload": "上传",
"tagPublic": "公开",
"tagDownload": "下载",
"tagOriginal": "原图",
"notSet": "未定",
"actionEdit": "编辑",
"albumMembers": "成员管理",
"albumCategories": "分类管理",
"shareQrTitle": "分享二维码",
"albumPhotos": "照片管理",
"delete": "删除",
"deleteConfirmCategory": "确定删除该分类?该分类下的照片将变为未分类。",
"categoryEmpty": "暂无分类,点击右上角新增",
"categoryAdd": "新增分类",
"categoryEdit": "编辑分类",
"categoryNameZh": "中文名称",
"categoryNameEn": "英文名称",
"categorySortOrder": "排序序号",
"categoryNameRequired": "至少填写一个语言的名称",
"categorySortOrderInvalid": "排序序号必须是整数",
"albumMembersEmpty": "暂无成员",
"inviteSearchHint": "输入账号前缀搜索邀请(至少 2 个字符)",
"inviteNoResults": "未找到匹配用户",
"invite": "邀请",
"memberInvited": "已邀请",
"removeMember": "移除成员",
"removeMemberConfirm": "确定移除该成员?",
"roleOwner": "创建者",
"roleCollaborator": "协作者",
"selfMarker": "(我)",
"errorMemberConflict": "该用户已是相册成员",
"qrHint": "扫码或打开链接观看",
"copyLink": "复制链接",
"copiedToClipboard": "已复制",
"photosTask9Placeholder": "照片管理为占位版本,完整功能将在任务 9 上线",
"albumPhotosEmpty": "暂无照片",
"visibilityPublished": "已发布",
"visibilityUnpublished": "未发布",
"visibilityHidden": "已隐藏",
"visibilityDeleted": "已删除",
"procPendingUpload": "待上传",
"procUploaded": "已上传",
"procProcessing": "处理中",
"procReady": "就绪",
"procProcessingFailed": "处理失败"
}