App settings & custom display language

This commit is contained in:
LittleSheep 2025-05-10 14:09:25 +08:00
parent a9cfbe7817
commit e4c6477bba
11 changed files with 394 additions and 112 deletions

View File

@ -116,6 +116,11 @@
"checkInResultLevel2": "A Normal Day", "checkInResultLevel2": "A Normal Day",
"checkInResultLevel3": "Good Luck", "checkInResultLevel3": "Good Luck",
"checkInResultLevel4": "Best Luck", "checkInResultLevel4": "Best Luck",
"checkInResultLevelShort0": "Wrost",
"checkInResultLevelShort1": "Bad",
"checkInResultLevelShort2": "Normal",
"checkInResultLevelShort3": "Good",
"checkInResultLevelShort4": "Best",
"checkInActivityTitle": "{} checked in on {} and got a {}", "checkInActivityTitle": "{} checked in on {} and got a {}",
"eventCalander": "Event Calander", "eventCalander": "Event Calander",
"eventCalanderEmpty": "No events on that day.", "eventCalanderEmpty": "No events on that day.",
@ -141,5 +146,10 @@
"offline": "Offline", "offline": "Offline",
"status": "Status", "status": "Status",
"statusActivityTitle": "{} is {} {}", "statusActivityTitle": "{} is {} {}",
"statusActivityEndedTitle": "{} is {} {} until {}" "statusActivityEndedTitle": "{} is {} {} until {}",
"appSettings": "App Settings",
"settings": "Settings",
"language": "Language",
"settingsDisplayLanguage": "Display Language",
"languageFollowSystem": "Follow System"
} }

150
assets/i18n/zh-TW.json Normal file
View File

@ -0,0 +1,150 @@
{
"login": "登入",
"forgotPassword": "忘記密碼",
"loginPickFactor": "選擇驗證方式",
"loginMultiFactor": {
"one": "剩餘 {} 步驟",
"other": "剩餘 {} 步驟"
},
"loginEnterPassword": "輸入驗證碼",
"loginSuccess": "已登入為 {}",
"loginGreeting": "歡迎回來!",
"username": "使用者名稱",
"usernameCannotChangeHint": "使用者名稱建立後無法更改。",
"usernameLookupHint": "我們也接受您的電子郵件地址。",
"unknown": "未知",
"termAcceptNextWithAgree": "繼續即表示您同意我們的服務條款及其他條款與條件。",
"termAcceptLink": "查看詳情",
"loginResetPasswordHint": "請提供您的使用者名稱以接收重設密碼連結。",
"password": "密碼",
"next": "下一步",
"createAccount": "建立帳號",
"nickname": "暱稱",
"email": "電子郵件",
"bio": "個人簡介",
"fieldCannotBeEmpty": "此欄位不得為空。",
"fieldEmailAddressMustBeValid": "電子郵件地址必須有效。",
"logout": "登出",
"updateYourProfile": "編輯個人資料",
"accountBasicInfo": "基本資訊",
"accountProfile": "您的個人資料",
"saveChanges": "儲存變更",
"publishers": "發布者",
"managedPublisher": "管理的發布者",
"createPublisher": "建立發布者",
"createPublisherHint": "用於創建貼文、合輯等。",
"editPublisher": "編輯發布者",
"syncPublisher": "使用帳號資料",
"create": "建立",
"update": "更新",
"edit": "編輯",
"delete": "刪除",
"deletePublisher": "刪除發布者 {}",
"deletePublisherHint": "您確定要刪除此發布者嗎?這也會刪除此發布者下的所有貼文和合輯。",
"somethingWentWrong": "發生了一些錯誤...",
"deletePost": "刪除貼文",
"deletePostHint": "您確定要刪除此貼文嗎?",
"copyLink": "複製連結",
"postCreateAccountTitle": "感謝您的加入!",
"postCreateAccountNext": "下一步是什麼?",
"postCreateAccountNext1": "前往您的電子郵件收件匣並接收帳號啟用郵件。",
"postCreateAccountNext2": "登入您的帳號並開始探索 Solar Network",
"postPlaceholder": "您在想些什麼?",
"publishersEmpty": "尚無發布者",
"publishersEmptyDescription": "您需要建立一個發布者才能開始發布您的貼文。",
"authFactorPassword": "密碼",
"authFactorPasswordDescription": "您註冊時設定的密碼。",
"authFactorEmail": "電子郵件驗證碼",
"authFactorEmailDescription": "發送到您註冊時設定的電子郵件地址的一次性驗證碼。",
"authFactorTOTP": "時間戳記一次性密碼 (TOTP)",
"authFactorTOTPDescription": "由 TOTP 驗證器(例如 Google Authenticator 或 Authy產生的一次性驗證碼。",
"authFactorInAppNotify": "應用程式內通知",
"authFactorInAppNotifyDescription": "透過應用程式內通知發送的一次性驗證碼。",
"realms": "領域",
"createRealm": "建立領域",
"createRealmHint": "結識有相同興趣的朋友、建立社群等等。",
"editRealm": "編輯領域",
"deleteRealm": "刪除領域",
"deleteRealmHint": "您確定要刪除此領域嗎?這也會刪除此領域下的所有頻道、發布者和貼文。",
"explore": "探索",
"account": "帳號",
"name": "名稱",
"description": "描述",
"slug": "網址別名",
"slugHint": "網址別名將用於存取此資源的 URL應為唯一且符合 URL 安全規範。",
"createChatRoom": "建立聊天室",
"editChatRoom": "編輯聊天室",
"deleteChatRoom": "刪除聊天室",
"deleteChatRoomHint": "您確定要刪除此聊天室嗎?此操作無法復原。",
"chat": "聊天",
"chatMessageHint": "在 {} 中傳送訊息",
"chatDirectMessageHint": "傳送訊息給 {}",
"loading": "載入中...",
"descriptionNone": "尚無描述。",
"invites": "邀請",
"invitesEmpty": "尚無邀請,真是寂寞...",
"members": {
"one": "{} 位成員",
"other": "{} 位成員"
},
"permissionOwner": "擁有者",
"permissionModerator": "版主",
"permissionMember": "成員",
"reply": "回覆",
"forward": "轉寄",
"edited": "已編輯",
"addVideo": "新增影片",
"addPhoto": "新增照片",
"createDirectMessage": "新增私訊",
"react": "表情符號",
"reactions": {
"zero": "表情符號",
"one": "{} 個表情符號",
"other": "{} 個表情符號"
},
"reactionPositive": "正面",
"reactionNegative": "負面",
"reactionNeutral": "中性",
"connectionConnected": "已連線",
"connectionDisconnected": "已斷線",
"connectionReconnecting": "重新連線中",
"checkIn": "簽到",
"checkInNone": "尚未簽到",
"checkInNoneHint": "透過簽到獲取今日運勢提醒和每日獎勵。",
"checkInResultLevel0": "運勢最差",
"checkInResultLevel1": "運勢不佳",
"checkInResultLevel2": "普通的一天",
"checkInResultLevel3": "運勢不錯",
"checkInResultLevel4": "運勢極佳",
"checkInResultLevelShort0": "大兇",
"checkInResultLevelShort1": "兇",
"checkInResultLevelShort2": "中平",
"checkInResultLevelShort3": "吉",
"checkInResultLevelShort4": "大吉",
"checkInActivityTitle": "{} 在 {} 簽到並獲得了 {}",
"eventCalander": "活動日曆",
"eventCalanderEmpty": "當天沒有活動。",
"creatorHub": "創作者中心",
"creatorHubDescription": "管理貼文、數據分析等。",
"developerPortal": "開發者平台",
"developerPortalDescription": "使用 Solar Network™ 進行開發。",
"statusCreateHint": "您在想些什麼?新增一個狀態。",
"statusCreate": "新增狀態",
"statusUpdate": "更新狀態",
"statusLabel": "狀態",
"statusAttitude": "心情",
"attitudePositive": "正面",
"attitudeNeutral": "中性",
"attitudeNegative": "負面",
"statusInvisible": "隱形",
"statusInvisibleDescription": "您將對其他人顯示為離線。",
"statusNotDisturb": "請勿打擾",
"statusNotDisturbDescription": "推播通知將被禁用。",
"statusClearTime": "已清除於",
"statusNoAutoClear": "不要自動清除",
"online": "在線",
"offline": "離線",
"status": "狀態",
"statusActivityTitle": "{} {} {}",
"statusActivityEndedTitle": "{} 在 {} 於 {} 直到 {}"
}

View File

@ -54,7 +54,11 @@ void main() async {
child: Directionality( child: Directionality(
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
child: EasyLocalization( child: EasyLocalization(
supportedLocales: [Locale('en', 'US')], supportedLocales: [
Locale('en', 'US'),
Locale('zh', 'CN'),
Locale('zh', 'TW'),
],
path: 'assets/i18n', path: 'assets/i18n',
fallbackLocale: Locale('en', 'US'), fallbackLocale: Locale('en', 'US'),
useFallbackTranslations: true, useFallbackTranslations: true,

View File

@ -19,6 +19,7 @@ class AppRouter extends RootStackRouter {
AutoRoute(page: ChatListRoute.page, path: 'chat'), AutoRoute(page: ChatListRoute.page, path: 'chat'),
], ],
), ),
AutoRoute(page: SettingsRoute.page, path: '/settings'),
AutoRoute(page: LoginRoute.page, path: '/auth/login'), AutoRoute(page: LoginRoute.page, path: '/auth/login'),
AutoRoute(page: CreateAccountRoute.page, path: '/auth/create-account'), AutoRoute(page: CreateAccountRoute.page, path: '/auth/create-account'),
AutoRoute(page: MyselfProfileRoute.page, path: '/account/me'), AutoRoute(page: MyselfProfileRoute.page, path: '/account/me'),

View File

@ -9,18 +9,18 @@
// coverage:ignore-file // coverage:ignore-file
// ignore_for_file: no_leading_underscores_for_library_prefixes // ignore_for_file: no_leading_underscores_for_library_prefixes
import 'package:auto_route/auto_route.dart' as _i18; import 'package:auto_route/auto_route.dart' as _i19;
import 'package:flutter/material.dart' as _i19; import 'package:flutter/material.dart' as _i20;
import 'package:island/models/post.dart' as _i20; import 'package:island/models/post.dart' as _i21;
import 'package:island/screens/account.dart' as _i2; import 'package:island/screens/account.dart' as _i2;
import 'package:island/screens/account/me.dart' as _i12; import 'package:island/screens/account/me.dart' as _i12;
import 'package:island/screens/account/me/event_calendar.dart' as _i11; import 'package:island/screens/account/me/event_calendar.dart' as _i11;
import 'package:island/screens/account/me/publishers.dart' as _i7; import 'package:island/screens/account/me/publishers.dart' as _i7;
import 'package:island/screens/account/me/update.dart' as _i17; import 'package:island/screens/account/me/update.dart' as _i18;
import 'package:island/screens/account/profile.dart' as _i1; import 'package:island/screens/account/profile.dart' as _i1;
import 'package:island/screens/auth/create_account.dart' as _i6; import 'package:island/screens/auth/create_account.dart' as _i6;
import 'package:island/screens/auth/login.dart' as _i10; import 'package:island/screens/auth/login.dart' as _i10;
import 'package:island/screens/auth/tabs.dart' as _i16; import 'package:island/screens/auth/tabs.dart' as _i17;
import 'package:island/screens/chat/chat.dart' as _i4; import 'package:island/screens/chat/chat.dart' as _i4;
import 'package:island/screens/chat/room.dart' as _i5; import 'package:island/screens/chat/room.dart' as _i5;
import 'package:island/screens/chat/room_detail.dart' as _i3; import 'package:island/screens/chat/room_detail.dart' as _i3;
@ -29,14 +29,15 @@ import 'package:island/screens/posts/compose.dart' as _i13;
import 'package:island/screens/posts/detail.dart' as _i14; import 'package:island/screens/posts/detail.dart' as _i14;
import 'package:island/screens/realm/detail.dart' as _i15; import 'package:island/screens/realm/detail.dart' as _i15;
import 'package:island/screens/realm/realms.dart' as _i8; import 'package:island/screens/realm/realms.dart' as _i8;
import 'package:island/screens/settings.dart' as _i16;
/// generated route for /// generated route for
/// [_i1.AccountProfileScreen] /// [_i1.AccountProfileScreen]
class AccountProfileRoute extends _i18.PageRouteInfo<AccountProfileRouteArgs> { class AccountProfileRoute extends _i19.PageRouteInfo<AccountProfileRouteArgs> {
AccountProfileRoute({ AccountProfileRoute({
_i19.Key? key, _i20.Key? key,
required String name, required String name,
List<_i18.PageRouteInfo>? children, List<_i19.PageRouteInfo>? children,
}) : super( }) : super(
AccountProfileRoute.name, AccountProfileRoute.name,
args: AccountProfileRouteArgs(key: key, name: name), args: AccountProfileRouteArgs(key: key, name: name),
@ -46,7 +47,7 @@ class AccountProfileRoute extends _i18.PageRouteInfo<AccountProfileRouteArgs> {
static const String name = 'AccountProfileRoute'; static const String name = 'AccountProfileRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
final pathParams = data.inheritedPathParams; final pathParams = data.inheritedPathParams;
@ -62,7 +63,7 @@ class AccountProfileRoute extends _i18.PageRouteInfo<AccountProfileRouteArgs> {
class AccountProfileRouteArgs { class AccountProfileRouteArgs {
const AccountProfileRouteArgs({this.key, required this.name}); const AccountProfileRouteArgs({this.key, required this.name});
final _i19.Key? key; final _i20.Key? key;
final String name; final String name;
@ -74,13 +75,13 @@ class AccountProfileRouteArgs {
/// generated route for /// generated route for
/// [_i2.AccountScreen] /// [_i2.AccountScreen]
class AccountRoute extends _i18.PageRouteInfo<void> { class AccountRoute extends _i19.PageRouteInfo<void> {
const AccountRoute({List<_i18.PageRouteInfo>? children}) const AccountRoute({List<_i19.PageRouteInfo>? children})
: super(AccountRoute.name, initialChildren: children); : super(AccountRoute.name, initialChildren: children);
static const String name = 'AccountRoute'; static const String name = 'AccountRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i2.AccountScreen(); return const _i2.AccountScreen();
@ -90,11 +91,11 @@ class AccountRoute extends _i18.PageRouteInfo<void> {
/// generated route for /// generated route for
/// [_i3.ChatDetailScreen] /// [_i3.ChatDetailScreen]
class ChatDetailRoute extends _i18.PageRouteInfo<ChatDetailRouteArgs> { class ChatDetailRoute extends _i19.PageRouteInfo<ChatDetailRouteArgs> {
ChatDetailRoute({ ChatDetailRoute({
_i19.Key? key, _i20.Key? key,
required int id, required int id,
List<_i18.PageRouteInfo>? children, List<_i19.PageRouteInfo>? children,
}) : super( }) : super(
ChatDetailRoute.name, ChatDetailRoute.name,
args: ChatDetailRouteArgs(key: key, id: id), args: ChatDetailRouteArgs(key: key, id: id),
@ -104,7 +105,7 @@ class ChatDetailRoute extends _i18.PageRouteInfo<ChatDetailRouteArgs> {
static const String name = 'ChatDetailRoute'; static const String name = 'ChatDetailRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
final pathParams = data.inheritedPathParams; final pathParams = data.inheritedPathParams;
@ -119,7 +120,7 @@ class ChatDetailRoute extends _i18.PageRouteInfo<ChatDetailRouteArgs> {
class ChatDetailRouteArgs { class ChatDetailRouteArgs {
const ChatDetailRouteArgs({this.key, required this.id}); const ChatDetailRouteArgs({this.key, required this.id});
final _i19.Key? key; final _i20.Key? key;
final int id; final int id;
@ -131,13 +132,13 @@ class ChatDetailRouteArgs {
/// generated route for /// generated route for
/// [_i4.ChatListScreen] /// [_i4.ChatListScreen]
class ChatListRoute extends _i18.PageRouteInfo<void> { class ChatListRoute extends _i19.PageRouteInfo<void> {
const ChatListRoute({List<_i18.PageRouteInfo>? children}) const ChatListRoute({List<_i19.PageRouteInfo>? children})
: super(ChatListRoute.name, initialChildren: children); : super(ChatListRoute.name, initialChildren: children);
static const String name = 'ChatListRoute'; static const String name = 'ChatListRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i4.ChatListScreen(); return const _i4.ChatListScreen();
@ -147,11 +148,11 @@ class ChatListRoute extends _i18.PageRouteInfo<void> {
/// generated route for /// generated route for
/// [_i5.ChatRoomScreen] /// [_i5.ChatRoomScreen]
class ChatRoomRoute extends _i18.PageRouteInfo<ChatRoomRouteArgs> { class ChatRoomRoute extends _i19.PageRouteInfo<ChatRoomRouteArgs> {
ChatRoomRoute({ ChatRoomRoute({
_i19.Key? key, _i20.Key? key,
required int id, required int id,
List<_i18.PageRouteInfo>? children, List<_i19.PageRouteInfo>? children,
}) : super( }) : super(
ChatRoomRoute.name, ChatRoomRoute.name,
args: ChatRoomRouteArgs(key: key, id: id), args: ChatRoomRouteArgs(key: key, id: id),
@ -161,7 +162,7 @@ class ChatRoomRoute extends _i18.PageRouteInfo<ChatRoomRouteArgs> {
static const String name = 'ChatRoomRoute'; static const String name = 'ChatRoomRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
final pathParams = data.inheritedPathParams; final pathParams = data.inheritedPathParams;
@ -176,7 +177,7 @@ class ChatRoomRoute extends _i18.PageRouteInfo<ChatRoomRouteArgs> {
class ChatRoomRouteArgs { class ChatRoomRouteArgs {
const ChatRoomRouteArgs({this.key, required this.id}); const ChatRoomRouteArgs({this.key, required this.id});
final _i19.Key? key; final _i20.Key? key;
final int id; final int id;
@ -188,13 +189,13 @@ class ChatRoomRouteArgs {
/// generated route for /// generated route for
/// [_i6.CreateAccountScreen] /// [_i6.CreateAccountScreen]
class CreateAccountRoute extends _i18.PageRouteInfo<void> { class CreateAccountRoute extends _i19.PageRouteInfo<void> {
const CreateAccountRoute({List<_i18.PageRouteInfo>? children}) const CreateAccountRoute({List<_i19.PageRouteInfo>? children})
: super(CreateAccountRoute.name, initialChildren: children); : super(CreateAccountRoute.name, initialChildren: children);
static const String name = 'CreateAccountRoute'; static const String name = 'CreateAccountRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i6.CreateAccountScreen(); return const _i6.CreateAccountScreen();
@ -204,8 +205,8 @@ class CreateAccountRoute extends _i18.PageRouteInfo<void> {
/// generated route for /// generated route for
/// [_i4.EditChatScreen] /// [_i4.EditChatScreen]
class EditChatRoute extends _i18.PageRouteInfo<EditChatRouteArgs> { class EditChatRoute extends _i19.PageRouteInfo<EditChatRouteArgs> {
EditChatRoute({_i19.Key? key, int? id, List<_i18.PageRouteInfo>? children}) EditChatRoute({_i20.Key? key, int? id, List<_i19.PageRouteInfo>? children})
: super( : super(
EditChatRoute.name, EditChatRoute.name,
args: EditChatRouteArgs(key: key, id: id), args: EditChatRouteArgs(key: key, id: id),
@ -215,7 +216,7 @@ class EditChatRoute extends _i18.PageRouteInfo<EditChatRouteArgs> {
static const String name = 'EditChatRoute'; static const String name = 'EditChatRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
final pathParams = data.inheritedPathParams; final pathParams = data.inheritedPathParams;
@ -230,7 +231,7 @@ class EditChatRoute extends _i18.PageRouteInfo<EditChatRouteArgs> {
class EditChatRouteArgs { class EditChatRouteArgs {
const EditChatRouteArgs({this.key, this.id}); const EditChatRouteArgs({this.key, this.id});
final _i19.Key? key; final _i20.Key? key;
final int? id; final int? id;
@ -242,11 +243,11 @@ class EditChatRouteArgs {
/// generated route for /// generated route for
/// [_i7.EditPublisherScreen] /// [_i7.EditPublisherScreen]
class EditPublisherRoute extends _i18.PageRouteInfo<EditPublisherRouteArgs> { class EditPublisherRoute extends _i19.PageRouteInfo<EditPublisherRouteArgs> {
EditPublisherRoute({ EditPublisherRoute({
_i19.Key? key, _i20.Key? key,
String? name, String? name,
List<_i18.PageRouteInfo>? children, List<_i19.PageRouteInfo>? children,
}) : super( }) : super(
EditPublisherRoute.name, EditPublisherRoute.name,
args: EditPublisherRouteArgs(key: key, name: name), args: EditPublisherRouteArgs(key: key, name: name),
@ -256,7 +257,7 @@ class EditPublisherRoute extends _i18.PageRouteInfo<EditPublisherRouteArgs> {
static const String name = 'EditPublisherRoute'; static const String name = 'EditPublisherRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
final pathParams = data.inheritedPathParams; final pathParams = data.inheritedPathParams;
@ -271,7 +272,7 @@ class EditPublisherRoute extends _i18.PageRouteInfo<EditPublisherRouteArgs> {
class EditPublisherRouteArgs { class EditPublisherRouteArgs {
const EditPublisherRouteArgs({this.key, this.name}); const EditPublisherRouteArgs({this.key, this.name});
final _i19.Key? key; final _i20.Key? key;
final String? name; final String? name;
@ -283,11 +284,11 @@ class EditPublisherRouteArgs {
/// generated route for /// generated route for
/// [_i8.EditRealmScreen] /// [_i8.EditRealmScreen]
class EditRealmRoute extends _i18.PageRouteInfo<EditRealmRouteArgs> { class EditRealmRoute extends _i19.PageRouteInfo<EditRealmRouteArgs> {
EditRealmRoute({ EditRealmRoute({
_i19.Key? key, _i20.Key? key,
String? slug, String? slug,
List<_i18.PageRouteInfo>? children, List<_i19.PageRouteInfo>? children,
}) : super( }) : super(
EditRealmRoute.name, EditRealmRoute.name,
args: EditRealmRouteArgs(key: key, slug: slug), args: EditRealmRouteArgs(key: key, slug: slug),
@ -297,7 +298,7 @@ class EditRealmRoute extends _i18.PageRouteInfo<EditRealmRouteArgs> {
static const String name = 'EditRealmRoute'; static const String name = 'EditRealmRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
final pathParams = data.inheritedPathParams; final pathParams = data.inheritedPathParams;
@ -312,7 +313,7 @@ class EditRealmRoute extends _i18.PageRouteInfo<EditRealmRouteArgs> {
class EditRealmRouteArgs { class EditRealmRouteArgs {
const EditRealmRouteArgs({this.key, this.slug}); const EditRealmRouteArgs({this.key, this.slug});
final _i19.Key? key; final _i20.Key? key;
final String? slug; final String? slug;
@ -324,13 +325,13 @@ class EditRealmRouteArgs {
/// generated route for /// generated route for
/// [_i9.ExploreScreen] /// [_i9.ExploreScreen]
class ExploreRoute extends _i18.PageRouteInfo<void> { class ExploreRoute extends _i19.PageRouteInfo<void> {
const ExploreRoute({List<_i18.PageRouteInfo>? children}) const ExploreRoute({List<_i19.PageRouteInfo>? children})
: super(ExploreRoute.name, initialChildren: children); : super(ExploreRoute.name, initialChildren: children);
static const String name = 'ExploreRoute'; static const String name = 'ExploreRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i9.ExploreScreen(); return const _i9.ExploreScreen();
@ -340,13 +341,13 @@ class ExploreRoute extends _i18.PageRouteInfo<void> {
/// generated route for /// generated route for
/// [_i10.LoginScreen] /// [_i10.LoginScreen]
class LoginRoute extends _i18.PageRouteInfo<void> { class LoginRoute extends _i19.PageRouteInfo<void> {
const LoginRoute({List<_i18.PageRouteInfo>? children}) const LoginRoute({List<_i19.PageRouteInfo>? children})
: super(LoginRoute.name, initialChildren: children); : super(LoginRoute.name, initialChildren: children);
static const String name = 'LoginRoute'; static const String name = 'LoginRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i10.LoginScreen(); return const _i10.LoginScreen();
@ -356,13 +357,13 @@ class LoginRoute extends _i18.PageRouteInfo<void> {
/// generated route for /// generated route for
/// [_i7.ManagedPublisherScreen] /// [_i7.ManagedPublisherScreen]
class ManagedPublisherRoute extends _i18.PageRouteInfo<void> { class ManagedPublisherRoute extends _i19.PageRouteInfo<void> {
const ManagedPublisherRoute({List<_i18.PageRouteInfo>? children}) const ManagedPublisherRoute({List<_i19.PageRouteInfo>? children})
: super(ManagedPublisherRoute.name, initialChildren: children); : super(ManagedPublisherRoute.name, initialChildren: children);
static const String name = 'ManagedPublisherRoute'; static const String name = 'ManagedPublisherRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i7.ManagedPublisherScreen(); return const _i7.ManagedPublisherScreen();
@ -372,13 +373,13 @@ class ManagedPublisherRoute extends _i18.PageRouteInfo<void> {
/// generated route for /// generated route for
/// [_i11.MyselfEventCalendarScreen] /// [_i11.MyselfEventCalendarScreen]
class MyselfEventCalendarRoute extends _i18.PageRouteInfo<void> { class MyselfEventCalendarRoute extends _i19.PageRouteInfo<void> {
const MyselfEventCalendarRoute({List<_i18.PageRouteInfo>? children}) const MyselfEventCalendarRoute({List<_i19.PageRouteInfo>? children})
: super(MyselfEventCalendarRoute.name, initialChildren: children); : super(MyselfEventCalendarRoute.name, initialChildren: children);
static const String name = 'MyselfEventCalendarRoute'; static const String name = 'MyselfEventCalendarRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i11.MyselfEventCalendarScreen(); return const _i11.MyselfEventCalendarScreen();
@ -388,13 +389,13 @@ class MyselfEventCalendarRoute extends _i18.PageRouteInfo<void> {
/// generated route for /// generated route for
/// [_i12.MyselfProfileScreen] /// [_i12.MyselfProfileScreen]
class MyselfProfileRoute extends _i18.PageRouteInfo<void> { class MyselfProfileRoute extends _i19.PageRouteInfo<void> {
const MyselfProfileRoute({List<_i18.PageRouteInfo>? children}) const MyselfProfileRoute({List<_i19.PageRouteInfo>? children})
: super(MyselfProfileRoute.name, initialChildren: children); : super(MyselfProfileRoute.name, initialChildren: children);
static const String name = 'MyselfProfileRoute'; static const String name = 'MyselfProfileRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i12.MyselfProfileScreen(); return const _i12.MyselfProfileScreen();
@ -404,13 +405,13 @@ class MyselfProfileRoute extends _i18.PageRouteInfo<void> {
/// generated route for /// generated route for
/// [_i4.NewChatScreen] /// [_i4.NewChatScreen]
class NewChatRoute extends _i18.PageRouteInfo<void> { class NewChatRoute extends _i19.PageRouteInfo<void> {
const NewChatRoute({List<_i18.PageRouteInfo>? children}) const NewChatRoute({List<_i19.PageRouteInfo>? children})
: super(NewChatRoute.name, initialChildren: children); : super(NewChatRoute.name, initialChildren: children);
static const String name = 'NewChatRoute'; static const String name = 'NewChatRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i4.NewChatScreen(); return const _i4.NewChatScreen();
@ -420,13 +421,13 @@ class NewChatRoute extends _i18.PageRouteInfo<void> {
/// generated route for /// generated route for
/// [_i7.NewPublisherScreen] /// [_i7.NewPublisherScreen]
class NewPublisherRoute extends _i18.PageRouteInfo<void> { class NewPublisherRoute extends _i19.PageRouteInfo<void> {
const NewPublisherRoute({List<_i18.PageRouteInfo>? children}) const NewPublisherRoute({List<_i19.PageRouteInfo>? children})
: super(NewPublisherRoute.name, initialChildren: children); : super(NewPublisherRoute.name, initialChildren: children);
static const String name = 'NewPublisherRoute'; static const String name = 'NewPublisherRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i7.NewPublisherScreen(); return const _i7.NewPublisherScreen();
@ -436,13 +437,13 @@ class NewPublisherRoute extends _i18.PageRouteInfo<void> {
/// generated route for /// generated route for
/// [_i8.NewRealmScreen] /// [_i8.NewRealmScreen]
class NewRealmRoute extends _i18.PageRouteInfo<void> { class NewRealmRoute extends _i19.PageRouteInfo<void> {
const NewRealmRoute({List<_i18.PageRouteInfo>? children}) const NewRealmRoute({List<_i19.PageRouteInfo>? children})
: super(NewRealmRoute.name, initialChildren: children); : super(NewRealmRoute.name, initialChildren: children);
static const String name = 'NewRealmRoute'; static const String name = 'NewRealmRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i8.NewRealmScreen(); return const _i8.NewRealmScreen();
@ -452,11 +453,11 @@ class NewRealmRoute extends _i18.PageRouteInfo<void> {
/// generated route for /// generated route for
/// [_i13.PostComposeScreen] /// [_i13.PostComposeScreen]
class PostComposeRoute extends _i18.PageRouteInfo<PostComposeRouteArgs> { class PostComposeRoute extends _i19.PageRouteInfo<PostComposeRouteArgs> {
PostComposeRoute({ PostComposeRoute({
_i19.Key? key, _i20.Key? key,
_i20.SnPost? originalPost, _i21.SnPost? originalPost,
List<_i18.PageRouteInfo>? children, List<_i19.PageRouteInfo>? children,
}) : super( }) : super(
PostComposeRoute.name, PostComposeRoute.name,
args: PostComposeRouteArgs(key: key, originalPost: originalPost), args: PostComposeRouteArgs(key: key, originalPost: originalPost),
@ -465,7 +466,7 @@ class PostComposeRoute extends _i18.PageRouteInfo<PostComposeRouteArgs> {
static const String name = 'PostComposeRoute'; static const String name = 'PostComposeRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
final args = data.argsAs<PostComposeRouteArgs>( final args = data.argsAs<PostComposeRouteArgs>(
@ -482,9 +483,9 @@ class PostComposeRoute extends _i18.PageRouteInfo<PostComposeRouteArgs> {
class PostComposeRouteArgs { class PostComposeRouteArgs {
const PostComposeRouteArgs({this.key, this.originalPost}); const PostComposeRouteArgs({this.key, this.originalPost});
final _i19.Key? key; final _i20.Key? key;
final _i20.SnPost? originalPost; final _i21.SnPost? originalPost;
@override @override
String toString() { String toString() {
@ -494,11 +495,11 @@ class PostComposeRouteArgs {
/// generated route for /// generated route for
/// [_i14.PostDetailScreen] /// [_i14.PostDetailScreen]
class PostDetailRoute extends _i18.PageRouteInfo<PostDetailRouteArgs> { class PostDetailRoute extends _i19.PageRouteInfo<PostDetailRouteArgs> {
PostDetailRoute({ PostDetailRoute({
_i19.Key? key, _i20.Key? key,
required int id, required int id,
List<_i18.PageRouteInfo>? children, List<_i19.PageRouteInfo>? children,
}) : super( }) : super(
PostDetailRoute.name, PostDetailRoute.name,
args: PostDetailRouteArgs(key: key, id: id), args: PostDetailRouteArgs(key: key, id: id),
@ -508,7 +509,7 @@ class PostDetailRoute extends _i18.PageRouteInfo<PostDetailRouteArgs> {
static const String name = 'PostDetailRoute'; static const String name = 'PostDetailRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
final pathParams = data.inheritedPathParams; final pathParams = data.inheritedPathParams;
@ -523,7 +524,7 @@ class PostDetailRoute extends _i18.PageRouteInfo<PostDetailRouteArgs> {
class PostDetailRouteArgs { class PostDetailRouteArgs {
const PostDetailRouteArgs({this.key, required this.id}); const PostDetailRouteArgs({this.key, required this.id});
final _i19.Key? key; final _i20.Key? key;
final int id; final int id;
@ -535,11 +536,11 @@ class PostDetailRouteArgs {
/// generated route for /// generated route for
/// [_i13.PostEditScreen] /// [_i13.PostEditScreen]
class PostEditRoute extends _i18.PageRouteInfo<PostEditRouteArgs> { class PostEditRoute extends _i19.PageRouteInfo<PostEditRouteArgs> {
PostEditRoute({ PostEditRoute({
_i19.Key? key, _i20.Key? key,
required int id, required int id,
List<_i18.PageRouteInfo>? children, List<_i19.PageRouteInfo>? children,
}) : super( }) : super(
PostEditRoute.name, PostEditRoute.name,
args: PostEditRouteArgs(key: key, id: id), args: PostEditRouteArgs(key: key, id: id),
@ -549,7 +550,7 @@ class PostEditRoute extends _i18.PageRouteInfo<PostEditRouteArgs> {
static const String name = 'PostEditRoute'; static const String name = 'PostEditRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
final pathParams = data.inheritedPathParams; final pathParams = data.inheritedPathParams;
@ -564,7 +565,7 @@ class PostEditRoute extends _i18.PageRouteInfo<PostEditRouteArgs> {
class PostEditRouteArgs { class PostEditRouteArgs {
const PostEditRouteArgs({this.key, required this.id}); const PostEditRouteArgs({this.key, required this.id});
final _i19.Key? key; final _i20.Key? key;
final int id; final int id;
@ -576,11 +577,11 @@ class PostEditRouteArgs {
/// generated route for /// generated route for
/// [_i15.RealmDetailScreen] /// [_i15.RealmDetailScreen]
class RealmDetailRoute extends _i18.PageRouteInfo<RealmDetailRouteArgs> { class RealmDetailRoute extends _i19.PageRouteInfo<RealmDetailRouteArgs> {
RealmDetailRoute({ RealmDetailRoute({
_i19.Key? key, _i20.Key? key,
required String slug, required String slug,
List<_i18.PageRouteInfo>? children, List<_i19.PageRouteInfo>? children,
}) : super( }) : super(
RealmDetailRoute.name, RealmDetailRoute.name,
args: RealmDetailRouteArgs(key: key, slug: slug), args: RealmDetailRouteArgs(key: key, slug: slug),
@ -590,7 +591,7 @@ class RealmDetailRoute extends _i18.PageRouteInfo<RealmDetailRouteArgs> {
static const String name = 'RealmDetailRoute'; static const String name = 'RealmDetailRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
final pathParams = data.inheritedPathParams; final pathParams = data.inheritedPathParams;
@ -605,7 +606,7 @@ class RealmDetailRoute extends _i18.PageRouteInfo<RealmDetailRouteArgs> {
class RealmDetailRouteArgs { class RealmDetailRouteArgs {
const RealmDetailRouteArgs({this.key, required this.slug}); const RealmDetailRouteArgs({this.key, required this.slug});
final _i19.Key? key; final _i20.Key? key;
final String slug; final String slug;
@ -617,13 +618,13 @@ class RealmDetailRouteArgs {
/// generated route for /// generated route for
/// [_i8.RealmListScreen] /// [_i8.RealmListScreen]
class RealmListRoute extends _i18.PageRouteInfo<void> { class RealmListRoute extends _i19.PageRouteInfo<void> {
const RealmListRoute({List<_i18.PageRouteInfo>? children}) const RealmListRoute({List<_i19.PageRouteInfo>? children})
: super(RealmListRoute.name, initialChildren: children); : super(RealmListRoute.name, initialChildren: children);
static const String name = 'RealmListRoute'; static const String name = 'RealmListRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i8.RealmListScreen(); return const _i8.RealmListScreen();
@ -632,33 +633,49 @@ class RealmListRoute extends _i18.PageRouteInfo<void> {
} }
/// generated route for /// generated route for
/// [_i16.TabsScreen] /// [_i16.SettingsScreen]
class TabsRoute extends _i18.PageRouteInfo<void> { class SettingsRoute extends _i19.PageRouteInfo<void> {
const TabsRoute({List<_i18.PageRouteInfo>? children}) const SettingsRoute({List<_i19.PageRouteInfo>? children})
: super(TabsRoute.name, initialChildren: children); : super(SettingsRoute.name, initialChildren: children);
static const String name = 'TabsRoute'; static const String name = 'SettingsRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i16.TabsScreen(); return const _i16.SettingsScreen();
}, },
); );
} }
/// generated route for /// generated route for
/// [_i17.UpdateProfileScreen] /// [_i17.TabsScreen]
class UpdateProfileRoute extends _i18.PageRouteInfo<void> { class TabsRoute extends _i19.PageRouteInfo<void> {
const UpdateProfileRoute({List<_i18.PageRouteInfo>? children}) const TabsRoute({List<_i19.PageRouteInfo>? children})
: super(TabsRoute.name, initialChildren: children);
static const String name = 'TabsRoute';
static _i19.PageInfo page = _i19.PageInfo(
name,
builder: (data) {
return const _i17.TabsScreen();
},
);
}
/// generated route for
/// [_i18.UpdateProfileScreen]
class UpdateProfileRoute extends _i19.PageRouteInfo<void> {
const UpdateProfileRoute({List<_i19.PageRouteInfo>? children})
: super(UpdateProfileRoute.name, initialChildren: children); : super(UpdateProfileRoute.name, initialChildren: children);
static const String name = 'UpdateProfileRoute'; static const String name = 'UpdateProfileRoute';
static _i18.PageInfo page = _i18.PageInfo( static _i19.PageInfo page = _i19.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i17.UpdateProfileScreen(); return const _i18.UpdateProfileScreen();
}, },
); );
} }

View File

@ -145,6 +145,17 @@ class AccountScreen extends HookConsumerWidget {
context.router.push(UpdateProfileRoute()); context.router.push(UpdateProfileRoute());
}, },
), ),
const Divider(height: 1).padding(vertical: 8),
ListTile(
minTileHeight: 48,
leading: const Icon(Symbols.settings),
trailing: const Icon(Symbols.chevron_right),
contentPadding: EdgeInsets.symmetric(horizontal: 24),
title: Text('appSettings').tr(),
onTap: () {
context.router.push(SettingsRoute());
},
),
if (kDebugMode) const Divider(height: 1).padding(vertical: 8), if (kDebugMode) const Divider(height: 1).padding(vertical: 8),
if (kDebugMode) if (kDebugMode)
ListTile( ListTile(

View File

@ -1,4 +1,5 @@
import 'package:auto_route/auto_route.dart'; import 'package:auto_route/auto_route.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
@ -26,7 +27,7 @@ class ExploreScreen extends ConsumerWidget {
final postsNotifier = ref.watch(activityListProvider.notifier); final postsNotifier = ref.watch(activityListProvider.notifier);
return AppScaffold( return AppScaffold(
appBar: AppBar(title: const Text('Explore')), appBar: AppBar(title: const Text('explore').tr()),
floatingActionButton: FloatingActionButton( floatingActionButton: FloatingActionButton(
heroTag: Key("explore-page-fab"), heroTag: Key("explore-page-fab"),
onPressed: () { onPressed: () {

69
lib/screens/settings.dart Normal file
View File

@ -0,0 +1,69 @@
import 'package:auto_route/auto_route.dart';
import 'package:collection/collection.dart';
import 'package:dropdown_button2/dropdown_button2.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:island/widgets/app_scaffold.dart';
import 'package:material_symbols_icons/symbols.dart';
import 'package:styled_widget/styled_widget.dart';
@RoutePage()
class SettingsScreen extends HookConsumerWidget {
const SettingsScreen({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
return AppScaffold(
appBar: AppBar(title: const Text('Settings')),
body: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ListTile(
minLeadingWidth: 48,
title: Text('settingsDisplayLanguage').tr(),
contentPadding: const EdgeInsets.only(left: 24, right: 17),
leading: const Icon(Symbols.translate),
trailing: DropdownButtonHideUnderline(
child: DropdownButton2<Locale?>(
isExpanded: true,
items: [
...EasyLocalization.of(
context,
)!.supportedLocales.mapIndexed((idx, ele) {
return DropdownMenuItem<Locale?>(
value: ele,
child: Text(
'${ele.languageCode}-${ele.countryCode}',
).fontSize(14),
);
}),
DropdownMenuItem<Locale?>(
value: null,
child: Text('languageFollowSystem').tr().fontSize(14),
),
],
value: EasyLocalization.of(context)!.currentLocale,
onChanged: (Locale? value) {
if (value != null) {
EasyLocalization.of(context)!.setLocale(value);
} else {
EasyLocalization.of(context)!.resetLocale();
}
},
buttonStyleData: const ButtonStyleData(
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 5),
height: 40,
width: 160,
),
menuItemStyleData: const MenuItemStyleData(height: 40),
),
),
),
],
),
),
);
}
}

View File

@ -127,7 +127,17 @@ class PostItem extends HookConsumerWidget {
], ],
), ),
if (item.attachments.isNotEmpty) if (item.attachments.isNotEmpty)
CloudFileList(files: item.attachments), Container(
margin: EdgeInsets.only(left: 48),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
border: Border.all(
color: Theme.of(context).dividerColor,
width: 1,
),
),
child: CloudFileList(files: item.attachments),
),
PostReactionList( PostReactionList(
parentId: item.id, parentId: item.id,
reactions: item.reactionsCount, reactions: item.reactionsCount,

View File

@ -441,6 +441,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.2.4" version: "0.2.4"
dropdown_button2:
dependency: "direct main"
description:
name: dropdown_button2
sha256: b0fe8d49a030315e9eef6c7ac84ca964250155a6224d491c1365061bc974a9e1
url: "https://pub.dev"
source: hosted
version: "2.3.9"
easy_localization: easy_localization:
dependency: "direct main" dependency: "direct main"
description: description:
@ -509,10 +517,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: file_picker name: file_picker
sha256: "978be1f602e0695daef8e345a3c597abf72b0c0ca6102fa2665eb549f5406a17" sha256: a222f231db4f822fc49e3b753674bda630e981873c84bf8604bceeb77fce0b24
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "10.1.5" version: "10.1.7"
file_selector_linux: file_selector_linux:
dependency: transitive dependency: transitive
description: description:
@ -2015,10 +2023,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: win32 name: win32
sha256: dc6ecaa00a7c708e5b4d10ee7bec8c270e9276dfcab1783f57e9962d7884305f sha256: "329edf97fdd893e0f1e3b9e88d6a0e627128cc17cc316a8d67fda8f1451178ba"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.12.0" version: "5.13.0"
win32_registry: win32_registry:
dependency: transitive dependency: transitive
description: description:

View File

@ -94,6 +94,7 @@ dependencies:
tencent_rtc_sdk: ^12.3.6 tencent_rtc_sdk: ^12.3.6
table_calendar: ^3.1.3 table_calendar: ^3.1.3
relative_time: ^5.0.0 relative_time: ^5.0.0
dropdown_button2: ^2.3.9
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: