diff --git a/README.md b/README.md index 8fb71fd..31342c3 100644 --- a/README.md +++ b/README.md @@ -85,13 +85,13 @@ existing playlist entries can no longer resolve the track. Players can add public YouTube video links to their own library. Metadata is requested through YouTube's oEmbed endpoint on the server, while playback uses the embedded YouTube player only on -that player's NUI. Personal songs and playlists are stored per linked iFruit account, or per phone +that player's NUI. Personal songs and playlists are stored per linked Sky Cloud account, or per phone IMEI while signed out, in the `sky_phone_music_*` tables. Limits and rate controls are configured in `config/music.lua`. ## FlipTok accounts -FlipTok profiles use their own username and password login. Registration requires a linked iFruit +FlipTok profiles use their own username and password login. Registration requires a linked Sky Cloud account once so an existing creator profile, videos, followers, and verification can be claimed without data loss. Login sessions are stored per phone IMEI and survive resource or server restarts; signing out removes only that device session. @@ -106,7 +106,7 @@ set sky_phone_fliptok_password_pepper "replace-with-a-long-random-secret" Passwords are stored as salted hashes. The pepper is read server-side from the convar and is never included in the NUI bundle. -Standalone FiveM phone built with Vue 3, TypeScript, Pinia, Vue Router, Konsta UI 5, and Tailwind CSS 4. The phone opens through the usable item; `/phone` is disabled unless `Config.Phone.DevelopmentCommand` is enabled explicitly. Phone identity and SIM-card behavior are selected independently through `Config.Phone.Unique` and `Config.Sim.Enabled`. +Standalone FiveM phone built with Vue 3, TypeScript, Pinia, Vue Router, the Sky-owned FiveM UI system, and Tailwind CSS 4. Konsta UI remains only for screens that have not yet completed their migration. The phone opens through the usable item; `/phone` is disabled unless `Config.Phone.DevelopmentCommand` is enabled explicitly. Phone identity and SIM-card behavior are selected independently through `Config.Phone.Unique` and `Config.Sim.Enabled`. ### Ingame test data @@ -114,7 +114,7 @@ On development servers, enable `Config.TestData.Enabled` and run `/phonetestdata owns the phone. The command creates or refreshes idempotent, player-scoped fixtures for contacts, calls, messages, mail, notes, gallery, banking history, billing, calendar, map markers, music, radio, EasyShare, CityMarkt, Local Pages, Picstagram, FlipTok, Feather, Flare, DarkChat, CrewLink, SkyRide, -and company requests. It also creates a linked iFruit account and a registered SIM when the selected +and company requests. It also creates a linked Sky Cloud account and a registered SIM when the selected phone does not have them yet. Reopen the phone after the command completes. Garage and Housing intentionally continue to use the real configured provider data. Apps without @@ -122,7 +122,7 @@ persistent content, such as Calculator, Camera, Clock, Weather, Settings, and Pa database fixtures. Set `Config.TestData.AdminOnly = true` to restrict the command to the configured framework admin groups, and disable the feature outside development environments. -An iFruit account is optional. Unlinked devices retain local settings, alarms, media, apps, notes, contacts, and recent calls. Linking from Mail or Settings moves local data into an empty cloud account; an existing cloud dataset wins over local contacts and recents. Signing out keeps an editable local snapshot without deleting cloud data. +A Sky Cloud account is optional. Unlinked devices retain local settings, alarms, media, apps, notes, contacts, and recent calls. Linking from Mail or Settings moves local data into an empty Sky Cloud account; an existing Sky Cloud dataset wins over local contacts and recents. Signing out keeps an editable local snapshot without deleting Sky Cloud data. ## Phone identity and SIM modes @@ -136,7 +136,7 @@ Config.Sim.Enabled = true For backwards compatibility, an omitted switch is also treated as `true`. With `Config.Phone.Unique = true`, every phone item is one transferable physical Device. Its unique -15-digit IMEI is stored in item metadata, so its settings, PIN, local app data, linked iFruit +15-digit IMEI is stored in item metadata, so its settings, PIN, local app data, linked Sky Cloud account, and installed SIM travel with that item. The item must be non-stackable. With `Config.Phone.Unique = false`, the server assigns each framework character one persistent @@ -204,16 +204,17 @@ set sky_phone_giphy_api_key "replace-with-your-giphy-api-key" GIPHY provides trending and searched GIFs through a paginated server-side proxy. Only the server reads the key. Photo and video actions in Messages use media captured by the Camera app. -Database migrations run automatically. Existing `sky_phone_mail_accounts` installations are renamed to `sky_phone_accounts` while preserving account IDs and mail foreign keys. The migration also creates `sky_phone_character_devices` for persistent non-unique phone mappings and marks automatic SIMs through `sky_phone_sims.is_virtual`. iFruit passwords are intentional in-character credentials and remain plaintext `VARCHAR(64)` values; registration screens warn players never to reuse a real password. +Database migrations run automatically. Existing `sky_phone_mail_accounts` installations are renamed to `sky_phone_accounts` while preserving account IDs and mail foreign keys. The migration also creates `sky_phone_character_devices` for persistent non-unique phone mappings and marks automatic SIMs through `sky_phone_sims.is_virtual`. Sky Cloud passwords are intentional in-character credentials and remain plaintext `VARCHAR(64)` values; registration screens warn players never to reuse a real password. Camera and Gallery media is stored in `sky_phone_media`. Signed-out captures belong to the current -IMEI; linking an iFruit account moves those rows into the account gallery so every linked phone sees -them. Signing out hides cloud media without deleting it. Factory reset removes device-local media -and attempts to delete only Phone-created remote FiveManage files. Media imported from a website is -removed locally but never deleted at its source. Register import websites under -`Config.Media.Import.Websites` in `sky_phone/config/media.lua`; built-in adapters support FiveManage -files and version-1 JSON manifests. The Gallery import form accepts direct HTTPS image/video links -only when their hostname matches the selected website's `AllowedMediaHosts`. +IMEI; linking a Sky Cloud account moves those rows into the account gallery so every linked phone sees +them. Signing out hides Sky Cloud media without deleting it. Factory reset removes device-local media +and attempts to delete only remote FiveManage files created by `sky_phone`; account-owned media +remains in Sky Cloud. Media imported from a website is removed locally but never deleted at its +source. Register import websites under `Config.Media.Import.Websites` in +`sky_phone/config/media.lua`; built-in adapters support FiveManage files and version-1 JSON +manifests. The Gallery import form accepts direct HTTPS image/video links only when their hostname +matches the selected website's `AllowedMediaHosts`. For a fresh manual database installation, import `sky_phone/sql/install.sql`. It contains the complete current table, key, index, collation, and foreign-key schema. Runtime migrations remain authoritative for upgrading an existing installation and must stay enabled. @@ -249,7 +250,7 @@ Radio profiles are stored in `sky_phone_radio_profiles`. Runtime migration creat Inventory metadata has no framework-wide standard: providers differ in export names, callback payloads, slot handling, and whether metadata is called `metadata` or `info`. For that reason, `sky_phone` uses explicit provider adapters instead of guessing exports at runtime. Every supported adapter implements slot lookup, item lookup, metadata replacement, capacity handling, add/remove operations, and usable-item registration. Providers without a separate capacity export use their authoritative add operation as the final capacity gate. Phone item metadata is authoritative only when `Config.Phone.Unique = true`; in non-unique mode the persistent character mapping is authoritative instead. -When physical SIMs are enabled and a SIM is ejected or replaced, the returned inventory item is rebuilt from the authoritative `sky_phone_sims` row. Its metadata contains `sim_metadata_version`, `sim_id`, `phone_number`, `formatted_number`, and `sim_type`. Registered SIMs additionally contain `firstname`, `lastname`, `birthdate`, and `registered_at`. The internal framework owner identifier remains database-only. Inserting the item again resolves the SIM by `sim_id`; contacts and device/cloud data remain attached to their existing Device or cloud persistence instead of being copied into inventory metadata. Automatically created virtual SIMs remain database-only and never become inventory items. +When physical SIMs are enabled and a SIM is ejected or replaced, the returned inventory item is rebuilt from the authoritative `sky_phone_sims` row. Its metadata contains `sim_metadata_version`, `sim_id`, `phone_number`, `formatted_number`, and `sim_type`. Registered SIMs additionally contain `firstname`, `lastname`, `birthdate`, and `registered_at`. The internal framework owner identifier remains database-only. Inserting the item again resolves the SIM by `sim_id`; contacts and device/Sky Cloud data remain attached to their existing Device or Sky Cloud persistence instead of being copied into inventory metadata. Automatically created virtual SIMs remain database-only and never become inventory items. For `ox_inventory`, configure the phone with `stack = false` when `Config.Phone.Unique = true`; it may use `stack = true` in non-unique mode. Physical SIM items always use `stack = false` and are only needed when `Config.Sim.Enabled = true`. Every usable item should use `consume = 0`. Do not configure a client event or export. Ox then completes its normal server-authoritative use flow and emits `ox_inventory:usedItem`; the bridge resolves the authoritative slot again and only opens the matching Device or SIM. A client export would return before Ox calls `useItem` and therefore prevent `ox_inventory:usedItem` from being emitted. diff --git a/frontend/src/stores/phone.ts b/frontend/src/stores/phone.ts index 8de3c3b..b7e4fd3 100644 --- a/frontend/src/stores/phone.ts +++ b/frontend/src/stores/phone.ts @@ -549,10 +549,10 @@ const defaultLocales: LocaleTree = { name: 'CrewLink', connecting: 'Connecting your crew...', privateNetwork: 'Private location network', - signInTitle: 'Connect your iFruit Account', + signInTitle: 'Connect your Sky Cloud account', signInBody: - 'CrewLink uses your private iFruit identity to keep groups and roles available across your phones.', - openSettings: 'Open iFruit Settings', + 'CrewLink uses your private Sky Cloud identity to keep groups and roles available across your phones.', + openSettings: 'Open Sky Cloud settings', authEyebrow: 'Private crew network', authTitle: 'Welcome to CrewLink', authBody: @@ -564,7 +564,7 @@ const defaultLocales: LocaleTree = { camera: 'Camera', backToLogin: 'Back to CrewLink login', authErrors: { - no_ifruit_account: 'Sign in to your iFruit account in Settings first.', + no_ifruit_account: 'Sign in to your Sky Cloud account in Settings first.', invalid_username: 'Use 3–20 letters, numbers, dots, or underscores.', profile_not_found: 'No CrewLink profile exists for this iFruit email.', profile_exists: 'This iFruit email already has a CrewLink profile.', @@ -743,7 +743,7 @@ const defaultLocales: LocaleTree = { default: 'Your CrewLink group has an update.', }, errors: { - not_authenticated: 'Sign in to your iFruit Account first.', + not_authenticated: 'Sign in to your Sky Cloud account first.', profile_required: 'Create your CrewLink profile first.', invalid_username: 'Use 3–20 letters, numbers, dots, or underscores.', invalid_profile: 'Check your profile details.', @@ -773,7 +773,7 @@ const defaultLocales: LocaleTree = { name: 'Flare', signInTitle: 'Sign in to Flare', signInBody: - 'Flare profiles and matches are linked to your private iFruit account.', + 'Flare profiles and matches are linked to your private Sky Cloud account.', createProfile: 'Create your profile', welcome: 'Find your spark', welcomeBody: 'Build a profile and meet people across Los Santos.', @@ -947,7 +947,7 @@ const defaultLocales: LocaleTree = { 'Sign in to continue with your photos, stories, follows, and saved posts.', registerBody: 'Create a private Picstagram login for your photo profile.', registrationHint: - 'An iFruit account is required once to create and own a Picstagram profile.', + 'A Sky Cloud account is required once to create and own a Picstagram profile.', displayName: 'Name', username: 'Username', password: 'Password', @@ -1096,7 +1096,7 @@ const defaultLocales: LocaleTree = { invalid_password: 'Password must be 8–72 characters.', invalid_credentials: 'Username or password is incorrect.', already_registered: - 'This iFruit account already owns a Picstagram profile.', + 'This Sky Cloud account already owns a Picstagram profile.', handle_taken: 'This username is already taken.', post_not_found: 'This post is unavailable.', story_not_found: 'This story is unavailable.', @@ -1112,7 +1112,7 @@ const defaultLocales: LocaleTree = { not_authorized: 'You are not allowed to do that.', report_not_found: 'This report is no longer open.', rate_limited: 'Too many actions. Try again shortly.', - not_authenticated: 'Sign in to iFruit first.', + not_authenticated: 'Sign in to Sky Cloud first.', picstagram_not_authenticated: 'Sign in to Picstagram first.', request_failed: 'The request failed.', default: 'Picstagram could not complete the request.', @@ -1184,11 +1184,11 @@ const defaultLocales: LocaleTree = { registerNow: 'Create a profile', loginNow: 'Log in', authTrust: - 'This Feather session is separate from your other apps and linked to your iFruit email.', + 'Your Feather profile is linked to your Sky Cloud account through your iFruit email.', profileStep: 'Step 2 of 2', - accountConnected: 'iFruit account connected', + accountConnected: 'Sky Cloud account connected', authErrors: { - no_ifruit_account: 'Sign in to your iFruit account in Settings first.', + no_ifruit_account: 'Sign in to your Sky Cloud account in Settings first.', invalid_handle: 'Use 3–30 letters, numbers or underscores.', invalid_username: 'That username does not match your Feather profile.', profile_not_found: 'No Feather profile exists for this iFruit email.', @@ -1200,7 +1200,7 @@ const defaultLocales: LocaleTree = { }, welcome: 'Find your voice', welcomeBody: - 'Join the live conversation in Los Santos. Your Feather profile stays linked to your iFruit account.', + 'Join the live conversation in Los Santos. Your Feather profile stays linked to your Sky Cloud account.', createProfile: 'Create Feather profile', profileDetailsHint: 'Choose how people will recognize you.', displayName: 'Display name', @@ -1313,7 +1313,7 @@ const defaultLocales: LocaleTree = { quote: 'quoted your feather', }, errors: { - accountRequired: 'Sign in to iFruit in Settings first.', + accountRequired: 'Sign in to Sky Cloud in Settings first.', invalidHandle: 'Use 3–30 letters, numbers or underscores.', handleTaken: 'That handle is already taken.', invalidPost: 'Write something or attach a photo.', @@ -1422,7 +1422,7 @@ const defaultLocales: LocaleTree = { passwordPlaceholder: 'At least 8 characters', confirmPasswordPlaceholder: 'Enter password again', registrationHint: - 'An iFruit account is required once to create and own a FlipTok profile.', + 'A Sky Cloud account is required once to create and own a FlipTok profile.', accountDetails: 'Account details', profileDetails: 'Profile details', account: 'Account', @@ -1461,11 +1461,11 @@ const defaultLocales: LocaleTree = { invalid_password: 'Password must be 8–72 characters.', invalid_credentials: 'Username or password is incorrect.', already_registered: - 'This iFruit account already owns a registered FlipTok profile.', + 'This Sky Cloud account already owns a registered FlipTok profile.', handle_taken: 'This username is already taken.', video_not_found: 'This video is unavailable.', rate_limited: 'Too many actions. Try again shortly.', - not_authenticated: 'Sign in to iFruit first.', + not_authenticated: 'Sign in to Sky Cloud first.', blocked: 'This account is blocked.', not_authorized: 'You do not have moderation access.', report_not_found: 'This report is no longer open.', @@ -1477,7 +1477,7 @@ const defaultLocales: LocaleTree = { newMessage: 'New DarkChat message from {sender}', privateNotification: 'New DarkChat message', signInBody: - 'DarkChat identities are linked to your private iFruit account.', + 'DarkChat identities are linked to your private Sky Cloud account.', signInHint: 'Sign in through Settings to continue.', security: 'Security', privateNetwork: 'Private invitation-only network', @@ -1573,7 +1573,7 @@ const defaultLocales: LocaleTree = { microphoneUnavailable: 'The microphone is unavailable.', recordingTooLarge: 'The voice message is too large.', errors: { - not_authenticated: 'Sign in to your iFruit account first.', + not_authenticated: 'Sign in to your Sky Cloud account first.', invalid_dark_id: 'Enter a valid Dark-ID or invitation code.', profile_not_found: 'This private identity was not found.', self_chat: 'You cannot message your own identity.', @@ -2320,13 +2320,15 @@ const defaultLocales: LocaleTree = { }, house: { name: 'House', - subtitle: 'Homes and access', - myHomes: 'My Homes', + subtitle: 'Manage homes and access', + myHomes: 'Your Homes', properties: 'Properties', owned: 'Owned', shared: 'Shared with you', locked: 'Locked', unlocked: 'Unlocked', + lockDoor: 'Lock Door', + unlockDoor: 'Unlock Door', owner: 'Owner', keyholder: 'Key holder', openDetails: 'Open property details', @@ -2336,13 +2338,13 @@ const defaultLocales: LocaleTree = { offlineBody: 'Start a supported housing resource or review Config.Housing.', unavailable: 'Homes unavailable', - empty: 'No Homes', - emptyBody: 'Owned homes and homes shared with you will appear here.', + empty: 'No homes yet', + emptyBody: 'Homes you own or can access will appear here automatically.', provider: 'Housing data · {system}', access: 'Access', status: 'Status', - actions: 'Controls', - setWaypoint: 'Directions', + actions: 'Quick Actions', + setWaypoint: 'Get Directions', viewCamera: 'View Camera', garage: 'Garage', garageEnabled: 'Enabled', @@ -2696,7 +2698,7 @@ const defaultLocales: LocaleTree = { daysAgo: '{count}d ago', photos: 'photos', activeListings: 'active listings', - signInTitle: 'Sign in to iFruit', + signInTitle: 'Sign in to Sky Cloud', signInBody: 'Log in to your CityMarkt profile to sell, save or message.', authEyebrow: 'CityMarkt account', authTitle: 'Welcome to CityMarkt', @@ -2706,7 +2708,7 @@ const defaultLocales: LocaleTree = { register: 'Register', authUsername: 'Username', authErrors: { - no_ifruit_account: 'Connect an iFruit account in Settings first.', + no_ifruit_account: 'Connect a Sky Cloud account in Settings first.', invalid_username: 'Enter the username of your CityMarkt profile.', profile_not_found: 'No CityMarkt profile exists for this iFruit email.', profile_exists: @@ -2732,7 +2734,7 @@ const defaultLocales: LocaleTree = { phone: 'Phone', contactSeller: 'Contact seller', messagePlaceholder: 'Hi, is this still available?', - signInToMessage: 'Sign in to your iFruit account to send a message.', + signInToMessage: 'Sign in to your Sky Cloud account to send a message.', edit: 'Edit', makeActive: 'Make active', markSold: 'Mark sold', @@ -2829,7 +2831,7 @@ const defaultLocales: LocaleTree = { blocked: 'Messages are blocked between these accounts.', already_reported: 'You already reported this listing.', rate_limited: 'Too many requests. Try again shortly.', - not_authenticated: 'Sign in to your iFruit account first.', + not_authenticated: 'Sign in to your Sky Cloud account first.', conflict: 'The listing changed. Open it again.', request_failed: 'CityMarkt is temporarily unavailable.', default: 'The CityMarkt request failed.', @@ -2865,19 +2867,19 @@ const defaultLocales: LocaleTree = { noPostsBody: 'Be the first to share something with the city.', noPhoto: 'No photo attached', signInTitle: 'Your Local Pages profile', - signInBody: 'Sign in to iFruit in Settings to publish and save posts.', + signInBody: 'Sign in to Sky Cloud in Settings to publish and save posts.', authEyebrow: 'Local Pages account', authWelcome: 'Welcome to Local Pages', authBody: 'Your iFruit email is linked automatically. Use your Local Pages username to continue.', login: 'Sign in', register: 'Register', - loginTitle: 'Continue with iFruit', + loginTitle: 'Continue with Sky Cloud', loginBody: 'Your posts, saved items and profile stay linked to your account.', - registerTitle: 'Create an iFruit account', + registerTitle: 'Create your Local Pages profile', registerBody: - 'Choose your new iFruit address. Your Local Pages profile comes next.', + 'Choose a username and optional profile photo. Your iFruit email stays linked.', authEmail: 'iFruit address', authEmailPlaceholder: 'your.name', authPassword: 'Password', @@ -2940,7 +2942,7 @@ const defaultLocales: LocaleTree = { 'Review the listing and publish it when you are ready.', cityMarktPhotosHint: 'The CityMarkt listing photos will be included.', authErrors: { - no_ifruit_account: 'Sign in to your iFruit account in Settings first.', + no_ifruit_account: 'Sign in to your Sky Cloud account in Settings first.', invalid_username: 'Use 3–24 lowercase letters, numbers, dots or underscores.', profile_not_found: @@ -2964,7 +2966,7 @@ const defaultLocales: LocaleTree = { citymarkt_not_found: 'This CityMarkt listing is unavailable.', citymarkt_daily_limit: 'You already shared a CityMarkt listing today.', citymarkt_already_shared: 'This listing was already shared.', - not_authenticated: 'Sign in to iFruit first.', + not_authenticated: 'Sign in to Sky Cloud first.', rate_limited: 'Too many requests. Try again shortly.', request_failed: 'The post could not be saved.', default: 'Local Pages is temporarily unavailable.', @@ -3099,7 +3101,7 @@ const defaultLocales: LocaleTree = { today: 'Today', calendars: 'Calendars', calendar: 'Calendar', - calendarName: 'iFruit', + calendarName: 'Sky Cloud', searchPlaceholder: 'Search events', previousMonth: 'Previous month', nextMonth: 'Next month', @@ -3123,9 +3125,9 @@ const defaultLocales: LocaleTree = { noEvents: 'Nothing planned', noEventsBody: 'This day is still free. Add an event whenever you are ready.', - signInTitle: 'Your iFruit calendar', + signInTitle: 'Your Sky Cloud calendar', signInBody: - 'Sign in to iFruit in Settings to sync appointments and receive reminders.', + 'Sign in to Sky Cloud in Settings to sync appointments and receive reminders.', reminderNotification: 'Upcoming: {title}', views: { compact: 'Compact', @@ -3147,7 +3149,7 @@ const defaultLocales: LocaleTree = { invalid_range: 'This calendar period is invalid.', conflict: 'This event changed on another phone. Open it again.', rate_limited: 'Too many changes. Try again shortly.', - not_authenticated: 'Sign in to your iFruit account first.', + not_authenticated: 'Sign in to your Sky Cloud account first.', request_failed: 'Calendar is temporarily unavailable.', default: 'The calendar request failed.', }, @@ -3235,7 +3237,7 @@ const defaultLocales: LocaleTree = { email: 'Email', password: 'Password', confirmPassword: 'Confirm password', - accountEyebrow: 'Your iFruit account', + accountEyebrow: 'Your Sky Cloud account', emailPlaceholder: 'name@ifruit.com', passwordPlaceholder: 'Enter password', passwordWarning: @@ -3255,6 +3257,10 @@ const defaultLocales: LocaleTree = { messagePlaceholder: 'Write a message...', search: 'Search mail', messages: 'messages', + select: 'Select', + selectedCount: '{count} Selected', + deleteSelected: 'Delete Selected', + selectionLimit: 'You can select up to {count} messages at once.', noMessageContent: 'No message content', noMail: 'No Mail', noMailBody: 'Messages in this mailbox will appear here.', @@ -3491,12 +3497,12 @@ const defaultLocales: LocaleTree = { wallpaper: 'Wallpaper', on: 'On', off: 'Off', - accountName: 'iFruit Account', + accountName: 'Sky Cloud', accountDetail: 'Important Data & Cloud', accountLocalDetail: 'Not signed in', - accountCloudDetail: 'Important data syncs through iFruit Cloud', + accountCloudDetail: 'Important data syncs through Sky Cloud', accountLoginBody: - 'Sign in to keep your important data safe. Without an iFruit Account, it will be lost with the phone.', + 'Sign in to keep your important data safe. Without a Sky Cloud account, it will be lost with the phone.', accountInformation: 'Account Information', accountStatus: 'Account Status', accountStatusValue: 'Active', @@ -3564,7 +3570,7 @@ const defaultLocales: LocaleTree = { thisDevice: 'This Phone', removeDevice: 'Remove Device', removeDeviceBody: - 'Enter your iFruit password to remove this device from the account.', + 'Enter your Sky Cloud password to remove this device from the account.', signOut: 'Sign Out', factoryReset: 'Erase All Content and Settings', factoryResetBody: @@ -3573,7 +3579,7 @@ const defaultLocales: LocaleTree = { factoryResetWarning: 'Do not turn off this phone. This takes 60 seconds.', passcode: { description: - 'A passcode protects the contents of this phone. It stays with the device when the SIM or iFruit account changes.', + 'A passcode protects the contents of this phone. It stays with the device when the SIM or Sky Cloud account changes.', status: 'Passcode', codeLength: 'Code Length', sixDigit: '6-Digit Code', @@ -3724,6 +3730,7 @@ const defaultLocales: LocaleTree = { }, Notifications: { clearAll: 'Clear All', + clear: 'Clear', now: 'now', open: 'Open notification', }, diff --git a/sky_phone/config/locales/en.lua b/sky_phone/config/locales/en.lua index d623dc5..89fd77f 100644 --- a/sky_phone/config/locales/en.lua +++ b/sky_phone/config/locales/en.lua @@ -2,7 +2,7 @@ Locales["en"] = { CommandDescription = "Open your phone.", TestData = { CommandDescription = "Create or refresh test content in every data-driven phone app.", - Success = "Test content is ready. Your iFruit login is {email}. Reopen the phone to refresh every app.", + Success = "Test content is ready. Your Sky Cloud login is {email}. Reopen the phone to refresh every app.", Failed = "Test content could not be created. Check the server console for details.", }, FlipTokCommand = { @@ -94,7 +94,7 @@ Locales["en"] = { open = "Open Control Center", play = "Play", previous = "Previous track", quickActions = "Quick actions", timer = "Timer", unmuteRingtone = "Unmute ringtone and notifications", volume = "Volume", wifi = "Wi-Fi", }, - Notifications = { clearAll = "Clear All", now = "now", open = "Open notification" }, + Notifications = { clearAll = "Clear All", clear = "Clear", now = "now", open = "Open notification" }, LockScreen = { label = "Lock Screen", flashlight = "Flashlight", camera = "Camera", swipeUp = "Swipe up to open", passcode = { @@ -265,12 +265,12 @@ Locales["en"] = { }, crewlink = { name = "CrewLink", connecting = "Connecting your crew...", privateNetwork = "Private location network", - signInTitle = "Connect your iFruit Account", signInBody = "CrewLink uses your private iFruit identity to keep groups and roles available across your phones.", openSettings = "Open iFruit Settings", + signInTitle = "Connect your Sky Cloud account", signInBody = "CrewLink uses your private Sky Cloud identity to keep groups and roles available across your phones.", openSettings = "Open Sky Cloud settings", authEyebrow = "Private crew network", authTitle = "Welcome to CrewLink", authBody = "Your iFruit email is linked automatically. Use your CrewLink username to continue.", login = "Log in", register = "Register", ifruitEmail = "iFruit address", gallery = "Gallery", camera = "Camera", backToLogin = "Back to CrewLink login", authErrors = { - no_ifruit_account = "Sign in to your iFruit account in Settings first.", invalid_username = "Use 3-20 letters, numbers, dots, or underscores.", + no_ifruit_account = "Sign in to your Sky Cloud account in Settings first.", invalid_username = "Use 3-20 letters, numbers, dots, or underscores.", profile_not_found = "No CrewLink profile exists for this iFruit email.", profile_exists = "This iFruit email already has a CrewLink profile.", username_taken = "That CrewLink username is already taken.", invalid_profile_image = "Choose a valid photo from this phone.", rate_limited = "Too many attempts. Try again shortly.", request_failed = "CrewLink could not complete the request.", @@ -304,14 +304,14 @@ Locales["en"] = { ["delete-groupDone"] = "Crew deleted.", ["leave-groupDone"] = "You left the crew.", ["remove-memberDone"] = "Member removed.", ["transfer-ownerDone"] = "Ownership transferred.", notifications = { invite = "{actor} invited you to {group}.", member_joined = "{actor} joined {group}.", ping = "{actor} shared '{ping}' with {group}.", role = "Your CrewLink role changed in {group}.", removed = "You were removed from {group}.", default = "Your CrewLink group has an update." }, errors = { - not_authenticated = "Sign in to your iFruit Account first.", profile_required = "Create your CrewLink profile first.", invalid_username = "Use 3-20 letters, numbers, dots, or underscores.", invalid_profile = "Check your profile details.", invalid_profile_image = "Choose a valid photo from this phone.", username_taken = "That CrewLink username is already taken.", + not_authenticated = "Sign in to your Sky Cloud account first.", profile_required = "Create your CrewLink profile first.", invalid_username = "Use 3-20 letters, numbers, dots, or underscores.", invalid_profile = "Check your profile details.", invalid_profile_image = "Choose a valid photo from this phone.", username_taken = "That CrewLink username is already taken.", invalid_group = "Choose a valid group name and signal colour.", group_limit = "You have reached your group limit.", member_limit = "This group has reached its member limit.", group_not_found = "This group is no longer available.", invalid_code = "That invitation code is invalid.", already_member = "You are already a member of this group.", forbidden = "Your current role cannot perform this action.", player_not_nearby = "That player is no longer nearby.", player_unavailable = "That player cannot receive a CrewLink invitation.", invalid_invitation = "This invitation is invalid.", invitation_expired = "This invitation has expired.", invalid_role = "That role cannot be assigned.", owner_must_transfer = "Transfer ownership before leaving this group.", invalid_ping = "Choose a valid ping type, label, and position.", ping_limit = "This crew already has too many active pings.", ping_not_found = "That ping is no longer active.", rate_limited = "Too many CrewLink actions. Try again shortly.", request_failed = "CrewLink is temporarily unavailable.", }, }, flare = { - name = "Flare", signInTitle = "Sign in to Flare", signInBody = "Flare profiles and matches are linked to your private iFruit account.", + name = "Flare", signInTitle = "Sign in to Flare", signInBody = "Flare profiles and matches are linked to your private Sky Cloud account.", createProfile = "Create your profile", welcome = "Find your spark", welcomeBody = "Build a profile and meet people across Los Santos.", photo = "Profile photo", profilePhotos = "Profile photos", profilePhotosBody = "Choose up to six photos from Gallery. Your first photo is shown first.", addPhotos = "Add photos", choosePhotos = "Choose from Gallery", primaryPhoto = "Main", removePhoto = "Remove photo {number}", yourName = "Your name", namePlaceholder = "What should people call you?", age = "Age", bio = "About you", bioPlaceholder = "A short line that starts a conversation...", @@ -349,7 +349,7 @@ Locales["en"] = { createAccount = "Create Profile", logout = "Sign Out", signingOut = "Signing Out...", loginBody = "Sign in to continue with your photos, stories, follows, and saved posts.", registerBody = "Create a private Picstagram login for your photo profile.", - registrationHint = "An iFruit account is required once to create and own a Picstagram profile.", + registrationHint = "A Sky Cloud account is required once to create and own a Picstagram profile.", displayName = "Name", username = "Username", password = "Password", confirmPassword = "Confirm password", passwordsMismatch = "The passwords do not match.", displayNamePlaceholder = "Your name", usernamePlaceholder = "username", @@ -399,7 +399,7 @@ Locales["en"] = { invalid_handle = "Use 3–24 letters, numbers, dots, or underscores.", invalid_display_name = "Enter a display name.", invalid_password = "Password must be 8–72 characters.", invalid_credentials = "Username or password is incorrect.", - already_registered = "This iFruit account already owns a Picstagram profile.", + already_registered = "This Sky Cloud account already owns a Picstagram profile.", handle_taken = "This username is already taken.", post_not_found = "This post is unavailable.", story_not_found = "This story is unavailable.", profile_not_found = "This profile is unavailable.", request_not_found = "This follow request is no longer open.", profile_unavailable = "This profile is unavailable.", @@ -407,7 +407,7 @@ Locales["en"] = { invalid_report = "Choose a valid report reason.", invalid_search = "Enter a valid search.", invalid_cursor = "The feed changed. Refresh and try again.", invalid_status = "This action is not available.", not_authorized = "You are not allowed to do that.", report_not_found = "This report is no longer open.", - rate_limited = "Too many actions. Try again shortly.", not_authenticated = "Sign in to iFruit first.", + rate_limited = "Too many actions. Try again shortly.", not_authenticated = "Sign in to Sky Cloud first.", picstagram_not_authenticated = "Sign in to Picstagram first.", request_failed = "The request failed.", default = "Picstagram could not complete the request." }, @@ -422,15 +422,15 @@ Locales["en"] = { email = "iFruit address", emailPlaceholder = "yourname", password = "Password", passwordPlaceholder = "6–64 characters", confirmPassword = "Confirm password", confirmPasswordPlaceholder = "Enter it again", showPassword = "Show password", hidePassword = "Hide password", loginAction = "Continue to Feather", registerAction = "Create profile", noAccount = "New to Feather?", haveAccount = "Already registered?", - registerNow = "Create a profile", loginNow = "Log in", authTrust = "This Feather session is separate from your other apps and linked to your iFruit email.", - profileStep = "Step 2 of 2", accountConnected = "iFruit account connected", + registerNow = "Create a profile", loginNow = "Log in", authTrust = "Your Feather profile is linked to your Sky Cloud account through your iFruit email.", + profileStep = "Step 2 of 2", accountConnected = "Sky Cloud account connected", authErrors = { - no_ifruit_account = "Sign in to your iFruit account in Settings first.", invalid_handle = "Use 3-30 letters, numbers or underscores.", invalid_username = "That username does not match your Feather profile.", + no_ifruit_account = "Sign in to your Sky Cloud account in Settings first.", invalid_handle = "Use 3-30 letters, numbers or underscores.", invalid_username = "That username does not match your Feather profile.", profile_not_found = "No Feather profile exists for this iFruit email.", already_registered = "This iFruit email already has a Feather profile.", handle_taken = "That Feather username is already taken.", invalid_media = "Choose a valid photo from this phone.", rate_limited = "Too many attempts. Try again in a minute.", default = "Feather could not complete the request. Please try again.", }, - welcome = "Find your voice", welcomeBody = "Join the live conversation in Los Santos. Your Feather profile stays linked to your iFruit account.", + welcome = "Find your voice", welcomeBody = "Join the live conversation in Los Santos. Your Feather profile stays linked to your Sky Cloud account.", createProfile = "Create Feather profile", profileDetailsHint = "Choose how people will recognize you.", displayName = "Display name", displayNamePlaceholder = "Your name", handle = "Username", handlePlaceholder = "your_username", handleHint = "3-30 letters, numbers or underscores", bio = "Bio", bioPlaceholder = "What should people know about you?", start = "Join Feather", chooseAvatar = "Choose profile photo", changeAvatar = "Change photo", newPost = "New feather", reply = "Reply", replyingTo = "Replying to @{handle}", quote = "Quote", post = "Post", posting = "Posting...", @@ -446,7 +446,7 @@ Locales["en"] = { reasons = { spam = "Spam", harassment = "Harassment", dangerous = "Dangerous content", illegal = "Illegal content", other = "Other" }, noActivity = "No activity yet", activityBody = "Likes, replies and new followers will appear here.", activityKinds = { like = "liked your feather", reply = "replied to your feather", follow = "followed you", quote = "quoted your feather" }, - errors = { accountRequired = "Sign in to iFruit in Settings first.", invalidHandle = "Use 3–30 letters, numbers or underscores.", handleTaken = "That handle is already taken.", invalidPost = "Write something or attach a photo.", generic = "Something went wrong. Please try again." }, + errors = { accountRequired = "Sign in to Sky Cloud in Settings first.", invalidHandle = "Use 3–30 letters, numbers or underscores.", handleTaken = "That handle is already taken.", invalidPost = "Write something or attach a photo.", generic = "Something went wrong. Please try again." }, notifications = { default = "You have new activity.", like = "{actor} liked your feather.", reply = "{actor} replied to your feather.", follow = "{actor} followed you.", quote = "{actor} quoted your feather." }, }, fliptok = { @@ -470,17 +470,17 @@ Locales["en"] = { loginBody = "Sign in to continue with your videos, follows, and saved posts.", registerBody = "Create a private FlipTok login for this profile.", password = "Password", confirmPassword = "Confirm password", passwordsMismatch = "The passwords do not match.", displayNamePlaceholder = "Your name", usernamePlaceholder = "username", passwordPlaceholder = "At least 8 characters", confirmPasswordPlaceholder = "Enter password again", - registrationHint = "An iFruit account is required once to create and own a FlipTok profile.", + registrationHint = "A Sky Cloud account is required once to create and own a FlipTok profile.", accountDetails = "Account details", profileDetails = "Profile details", account = "Account", signOutTitle = "Sign out of FlipTok?", signOutBody = "Your profile and videos stay online. This phone will return to the FlipTok sign-in screen.", signingOut = "Signing Out...", accountTypes = { person = "Person", business = "Business", organization = "Organization", media = "Media", event = "Event" }, activityKinds = { like = "liked your video", comment = "commented on your video", follow = "started following you", verified = "verification changed" }, notifications = { like = "{actor} liked your video.", comment = "{actor} commented on your video.", follow = "{actor} started following you.", verified = "Your FlipTok account is now verified.", default = "You have new FlipTok activity." }, - errors = { invalid_video = "Check the video details.", invalid_media = "Choose a video from this phone.", invalid_comment = "Enter a valid comment.", comments_disabled = "Comments are disabled.", invalid_profile = "Check your profile details.", invalid_handle = "Use 3–24 letters, numbers, dots, or underscores.", invalid_display_name = "Enter a display name.", invalid_password = "Password must be 8–72 characters.", invalid_credentials = "Username or password is incorrect.", already_registered = "This iFruit account already owns a registered FlipTok profile.", handle_taken = "This username is already taken.", video_not_found = "This video is unavailable.", blocked = "This account is blocked.", not_authorized = "You do not have moderation access.", report_not_found = "This report is no longer open.", rate_limited = "Too many actions. Try again shortly.", not_authenticated = "Sign in to iFruit first.", default = "FlipTok could not complete the request." }, + errors = { invalid_video = "Check the video details.", invalid_media = "Choose a video from this phone.", invalid_comment = "Enter a valid comment.", comments_disabled = "Comments are disabled.", invalid_profile = "Check your profile details.", invalid_handle = "Use 3–24 letters, numbers, dots, or underscores.", invalid_display_name = "Enter a display name.", invalid_password = "Password must be 8–72 characters.", invalid_credentials = "Username or password is incorrect.", already_registered = "This Sky Cloud account already owns a registered FlipTok profile.", handle_taken = "This username is already taken.", video_not_found = "This video is unavailable.", blocked = "This account is blocked.", not_authorized = "You do not have moderation access.", report_not_found = "This report is no longer open.", rate_limited = "Too many actions. Try again shortly.", not_authenticated = "Sign in to Sky Cloud first.", default = "FlipTok could not complete the request." }, }, darkchat = { name = "DarkChat", newMessage = "New DarkChat message from {sender}", privateNotification = "New DarkChat message", - signInBody = "DarkChat identities are linked to your private iFruit account.", signInHint = "Sign in through Settings to continue.", + signInBody = "DarkChat identities are linked to your private Sky Cloud account.", signInHint = "Sign in through Settings to continue.", security = "Security", privateNetwork = "Private invitation-only network", noResults = "No Results", noResultsBody = "Try another alias or Dark-ID.", noChats = "No Private Chats", noChatsBody = "Connect with a Dark-ID or invitation code. There is no public search.", newChat = "New Chat", connectPrivately = "Connect privately", newChatBody = "Enter an exact Dark-ID or invitation code. Unknown identities require confirmation.", darkIdOrInvite = "Dark-ID or invitation code", continue = "Continue", contacts = "DarkChat Contacts", shareIdentity = "Tap to share your private identity", @@ -496,7 +496,7 @@ Locales["en"] = { reportUser = "Report User", reportSpam = "Spam", reportHarassment = "Harassment", reportThreats = "Threats", reportIllegal = "Illegal content", reportOther = "Other", reportDetails = "Optional details", submitReport = "Submit Report", reported = "Report submitted", microphoneUnavailable = "The microphone is unavailable.", recordingTooLarge = "The voice message is too large.", errors = { - not_authenticated = "Sign in to your iFruit account first.", invalid_dark_id = "Enter a valid Dark-ID or invitation code.", profile_not_found = "This private identity was not found.", self_chat = "You cannot message your own identity.", conversation_not_found = "This conversation is unavailable.", blocked = "Messages are blocked in this conversation.", invalid_message = "Enter a valid message.", invalid_gif = "This GIF is invalid.", invalid_voice = "This voice message is invalid.", invalid_attachment = "This photo or video is unavailable.", invalid_profile = "Check your alias and privacy settings.", rate_limited = "Too many requests. Try again shortly.", gif_provider_unconfigured = "GIF search is not configured.", gif_provider_unauthorized = "The GIF provider key is invalid.", gif_provider_rate_limited = "GIF search is busy. Try again shortly.", gif_provider_failed = "GIFs are temporarily unavailable.", default = "DarkChat could not complete the request.", + not_authenticated = "Sign in to your Sky Cloud account first.", invalid_dark_id = "Enter a valid Dark-ID or invitation code.", profile_not_found = "This private identity was not found.", self_chat = "You cannot message your own identity.", conversation_not_found = "This conversation is unavailable.", blocked = "Messages are blocked in this conversation.", invalid_message = "Enter a valid message.", invalid_gif = "This GIF is invalid.", invalid_voice = "This voice message is invalid.", invalid_attachment = "This photo or video is unavailable.", invalid_profile = "Check your alias and privacy settings.", rate_limited = "Too many requests. Try again shortly.", gif_provider_unconfigured = "GIF search is not configured.", gif_provider_unauthorized = "The GIF provider key is invalid.", gif_provider_rate_limited = "GIF search is busy. Try again shortly.", gif_provider_failed = "GIFs are temporarily unavailable.", default = "DarkChat could not complete the request.", }, }, messages = { @@ -1110,14 +1110,14 @@ Locales["en"] = { }, }, house = { - name = "House", subtitle = "Homes and access", myHomes = "My Homes", + name = "House", subtitle = "Manage homes and access", myHomes = "Your Homes", properties = "Properties", owned = "Owned", shared = "Shared with you", - locked = "Locked", unlocked = "Unlocked", owner = "Owner", keyholder = "Key holder", + locked = "Locked", unlocked = "Unlocked", lockDoor = "Lock Door", unlockDoor = "Unlock Door", owner = "Owner", keyholder = "Key holder", openDetails = "Open property details", tryAgain = "Try Again", refresh = "Refresh", offline = "House is offline", offlineBody = "Start a supported housing resource or review Config.Housing.", - unavailable = "Homes unavailable", empty = "No Homes", emptyBody = "Owned homes and homes shared with you will appear here.", + unavailable = "Homes unavailable", empty = "No homes yet", emptyBody = "Homes you own or can access will appear here automatically.", provider = "Housing data · {system}", access = "Access", status = "Status", - actions = "Controls", setWaypoint = "Directions", viewCamera = "View Camera", + actions = "Quick Actions", setWaypoint = "Get Directions", viewCamera = "View Camera", garage = "Garage", garageEnabled = "Enabled", garageDisabled = "Unavailable", storedVehicles = "{count} stored", camera = "Camera", cameraAvailable = "Ready", cameraUnavailable = "Unavailable", keys = "Keys", manageKeys = "Manage Keys", addKey = "Add Key", revokeKey = "Revoke", @@ -1250,7 +1250,7 @@ Locales["en"] = { }, }, calendar = { - name = "Calendar", today = "Today", calendars = "Calendars", calendar = "Calendar", calendarName = "iFruit", + name = "Calendar", today = "Today", calendars = "Calendars", calendar = "Calendar", calendarName = "Sky Cloud", searchPlaceholder = "Search events", previousMonth = "Previous month", nextMonth = "Next month", eyebrow = "Your time. Clearly planned.", schedule = "Schedule", event = "Event", appointment = "Appointment", newEvent = "New event", editEvent = "Edit event", deleteEvent = "Delete event", details = "Event details", @@ -1258,8 +1258,8 @@ Locales["en"] = { reminder = "Reminder", reminderNotification = "Upcoming: {title}", note = "Note", notePlaceholder = "Add details, an address or anything to remember...", noEvents = "Nothing planned", noEventsBody = "This day is still free. Add an event whenever you are ready.", - signInTitle = "Your iFruit calendar", - signInBody = "Sign in to iFruit in Settings to sync appointments and receive reminders.", + signInTitle = "Your Sky Cloud calendar", + signInBody = "Sign in to Sky Cloud in Settings to sync appointments and receive reminders.", views = { compact = "Compact", stacked = "Stacked", details = "Details", list = "List" }, reminders = { none = "No reminder", atStart = "At start time", tenMinutes = "10 minutes before", @@ -1270,7 +1270,7 @@ Locales["en"] = { invalid_range = "This calendar period is invalid.", conflict = "This event changed on another phone. Open it again.", rate_limited = "Too many changes. Try again shortly.", - not_authenticated = "Sign in to your iFruit account first.", + not_authenticated = "Sign in to your Sky Cloud account first.", request_failed = "Calendar is temporarily unavailable.", default = "The calendar request failed.", }, }, @@ -1298,12 +1298,14 @@ Locales["en"] = { name = "Mail", login = "Sign In", register = "Create Account", registerLink = "Register", loginTitle = "iFruit Mail", loginBody = "Sign in to use your shared iFruit mailbox.", registerBody = "Choose your new @ifruit.com address.", localPart = "Email address", email = "Email", password = "Password", confirmPassword = "Confirm password", - accountEyebrow = "Your iFruit account", emailPlaceholder = "name@ifruit.com", passwordPlaceholder = "Enter password", + accountEyebrow = "Your Sky Cloud account", emailPlaceholder = "name@ifruit.com", passwordPlaceholder = "Enter password", passwordWarning = "Use an in-character password. Do not reuse a real-world password.", mailboxes = "Mailboxes", inbox = "Inbox", sent = "Sent", drafts = "Drafts", trash = "Trash", compose = "New Message", recipients = "To", recipientHint = "Separate up to 10 addresses with commas.", recipientPlaceholder = "name@ifruit.com", subject = "Subject", subjectPlaceholder = "What's this about?", body = "Message", messagePlaceholder = "Write a message...", search = "Search mail", messages = "messages", + select = "Select", selectedCount = "{count} Selected", deleteSelected = "Delete Selected", + selectionLimit = "You can select up to {count} messages at once.", noMessageContent = "No message content", noMail = "No Mail", noMailBody = "Messages in this mailbox will appear here.", noResults = "No Results", noResultsBody = "Try a different search.", untitled = "(no subject)", loadMore = "Load More", @@ -1349,12 +1351,12 @@ Locales["en"] = { noListingsBody = "Try another search or category.", noDistrict = "No district", free = "Free", negotiablePrice = "${price} negotiable", money = "${price}", hoursAgo = "{count}h ago", daysAgo = "{count}d ago", photos = "photos", activeListings = "active listings", - signInTitle = "Sign in to iFruit", signInBody = "Log in to your CityMarkt profile to sell, save or message.", + signInTitle = "Sign in to Sky Cloud", signInBody = "Log in to your CityMarkt profile to sell, save or message.", authEyebrow = "CityMarkt account", authTitle = "Welcome to CityMarkt", authBody = "Your iFruit email is linked automatically. Use your CityMarkt username to continue.", login = "Login", register = "Register", authUsername = "Username", authErrors = { - no_ifruit_account = "Connect an iFruit account in Settings first.", + no_ifruit_account = "Connect a Sky Cloud account in Settings first.", invalid_username = "Enter the username of your CityMarkt profile.", profile_not_found = "No CityMarkt profile exists for this iFruit email.", profile_exists = "A CityMarkt profile already exists. Use Login instead.", @@ -1367,7 +1369,7 @@ Locales["en"] = { cancel = "Cancel", profileSaved = "Your profile was saved.", chooseGallery = "Gallery", takePhoto = "Camera", removeProfilePhoto = "Remove photo", phone = "Phone", contactSeller = "Contact seller", messagePlaceholder = "Hi, is this still available?", - signInToMessage = "Sign in to your iFruit account to send a message.", + signInToMessage = "Sign in to your Sky Cloud account to send a message.", edit = "Edit", makeActive = "Make active", markSold = "Mark sold", remove = "Remove", createListing = "Create listing", editListing = "Edit listing", save = "Save", step = "Step {current} of {total}", next = "Next", previous = "Back", publish = "Publish", addPhotos = "Add photos", addPhotosBody = "Choose up to six photos. The first becomes the cover.", @@ -1397,7 +1399,7 @@ Locales["en"] = { offer_not_allowed = "You cannot make an offer right now.", offer_not_actionable = "This offer can no longer be changed.", offer_conflict = "The offer changed. Please try again.", blocked = "Messages are blocked between these accounts.", already_reported = "You already reported this listing.", - rate_limited = "Too many requests. Try again shortly.", not_authenticated = "Sign in to your iFruit account first.", + rate_limited = "Too many requests. Try again shortly.", not_authenticated = "Sign in to your Sky Cloud account first.", invalid_profile = "Enter a display name between 2 and 40 characters.", invalid_profile_image = "Choose a valid photo from this phone.", profile_required = "Create your CityMarkt profile first.", @@ -1413,11 +1415,11 @@ Locales["en"] = { categories = { recommendation = "Recommended", wanted = "Wanted", service = "Service", event = "Event", place = "Place", community = "Community", citymarkt = "CityMarkt" }, discover = "Discover", create = "Post", profile = "Profile", post = "Post", posts = "posts", noPosts = "Nothing here yet", noPostsBody = "Be the first to share something with the city.", noPhoto = "No photo attached", - signInTitle = "Your Local Pages profile", signInBody = "Sign in to iFruit in Settings to publish and save posts.", + signInTitle = "Your Local Pages profile", signInBody = "Sign in to Sky Cloud in Settings to publish and save posts.", authEyebrow = "Local Pages account", authWelcome = "Welcome to Local Pages", authBody = "Your iFruit email is linked automatically. Use your Local Pages username to continue.", login = "Sign in", register = "Register", - loginTitle = "Continue with iFruit", loginBody = "Your posts, saved items and profile stay linked to your account.", - registerTitle = "Create an iFruit account", registerBody = "Choose your new iFruit address. Your Local Pages profile comes next.", + loginTitle = "Continue with Sky Cloud", loginBody = "Your posts, saved items and profile stay linked to your account.", + registerTitle = "Create your Local Pages profile", registerBody = "Choose a username and optional profile photo. Your iFruit email stays linked.", authEmail = "iFruit address", authEmailPlaceholder = "your.name", authPassword = "Password", authPasswordPlaceholder = "At least 6 characters", authConfirmPassword = "Confirm password", authConfirmPlaceholder = "Enter the password again", showPassword = "Show password", hidePassword = "Hide password", @@ -1436,13 +1438,13 @@ Locales["en"] = { cityMarktAccountMissing = "Local Pages profile required", cityMarktAccountHint = "Create a Local Pages profile before sharing", cityMarktComposeTitle = "Share CityMarkt listing", cityMarktComposeNavTitle = "Share listing", cityMarktComposeHint = "Review the listing and publish it when you are ready.", cityMarktPhotosHint = "The CityMarkt listing photos will be included.", authErrors = { - no_ifruit_account = "Sign in to your iFruit account in Settings first.", invalid_username = "Use 3-24 lowercase letters, numbers, dots or underscores.", + no_ifruit_account = "Sign in to your Sky Cloud account in Settings first.", invalid_username = "Use 3-24 lowercase letters, numbers, dots or underscores.", profile_not_found = "No Local Pages profile exists for this iFruit email.", profile_exists = "This iFruit email already has a Local Pages profile.", invalid_profile = "Check your Local Pages username.", invalid_profile_image = "Choose a valid photo from this phone.", profile_handle_taken = "This Local Pages username is already taken.", rate_limited = "Too many attempts. Try again shortly.", default = "Local Pages could not complete the request.", }, - errors = { profile_required = "Create your Local Pages profile first.", invalid_profile = "Check your username and bio.", invalid_profile_image = "Choose a valid photo from this phone.", profile_handle_taken = "This username is already taken.", invalid_post = "Add a title and a little more detail.", invalid_images = "Choose valid photos from this phone.", invalid_request = "This action is not valid.", post_not_found = "This post is no longer available.", citymarkt_not_found = "This CityMarkt listing is unavailable.", citymarkt_daily_limit = "You already shared a CityMarkt listing today.", citymarkt_already_shared = "This listing was already shared.", not_authenticated = "Sign in to iFruit first.", rate_limited = "Too many requests. Try again shortly.", request_failed = "The post could not be saved.", default = "Local Pages is temporarily unavailable." }, + errors = { profile_required = "Create your Local Pages profile first.", invalid_profile = "Check your username and bio.", invalid_profile_image = "Choose a valid photo from this phone.", profile_handle_taken = "This username is already taken.", invalid_post = "Add a title and a little more detail.", invalid_images = "Choose valid photos from this phone.", invalid_request = "This action is not valid.", post_not_found = "This post is no longer available.", citymarkt_not_found = "This CityMarkt listing is unavailable.", citymarkt_daily_limit = "You already shared a CityMarkt listing today.", citymarkt_already_shared = "This listing was already shared.", not_authenticated = "Sign in to Sky Cloud first.", rate_limited = "Too many requests. Try again shortly.", request_failed = "The post could not be saved.", default = "Local Pages is temporarily unavailable." }, }, map = { name = "Map", controls = "Map controls", currentLocation = "Current Location", @@ -1592,9 +1594,9 @@ Locales["en"] = { }, settings = { name = "Settings", searchPlaceholder = "Search", airplaneMode = "Airplane Mode", streamerMode = "Streamer Mode", - wallpaper = "Wallpaper", on = "On", off = "Off", accountName = "iFruit Account", + wallpaper = "Wallpaper", on = "On", off = "Off", accountName = "Sky Cloud", accountDetail = "Important Data & Cloud", accountLocalDetail = "Not signed in", - accountCloudDetail = "Important data syncs through iFruit Cloud", accountLoginBody = "Sign in to keep your important data safe. Without an iFruit Account, it will be lost with the phone.", + accountCloudDetail = "Important data syncs through Sky Cloud", accountLoginBody = "Sign in to keep your important data safe. Without a Sky Cloud account, it will be lost with the phone.", accountInformation = "Account Information", accountStatus = "Account Status", accountStatusValue = "Active", accountStorage = "Cloud Storage", accountStorageValue = "On Device", accountPurchases = "Media & Purchases", accountPurchasesValue = "Available", notifications = "Notifications", sounds = "Sounds & Haptics", @@ -1616,11 +1618,11 @@ Locales["en"] = { imei = "IMEI", linkedDevices = "Linked Devices", thisDevice = "This Phone", removeDevice = "Remove Device", simCard = "SIM Card", simNumber = "Phone Number", simType = "SIM Type", registeredSim = "Registered", anonymousSim = "Anonymous", noSim = "No SIM", ejectSim = "Eject SIM", ejectSimBody = "Return this SIM card to your inventory?", - removeDeviceBody = "Enter your iFruit password to remove this device from the account.", signOut = "Sign Out", + removeDeviceBody = "Enter your Sky Cloud password to remove this device from the account.", signOut = "Sign Out", factoryReset = "Erase All Content and Settings", factoryResetBody = "This removes the account and all local data from this phone. Cloud data and the IMEI remain.", factoryResetProgress = "Erasing iFruit Phone", factoryResetWarning = "Do not turn off this phone. This takes 60 seconds.", passcode = { - description = "A passcode protects the contents of this phone. It stays with the device when the SIM or iFruit account changes.", + description = "A passcode protects the contents of this phone. It stays with the device when the SIM or Sky Cloud account changes.", status = "Passcode", codeLength = "Code Length", sixDigit = "6-Digit Code", fourDigit = "4-Digit Code", turnOn = "Turn Passcode On", turnOff = "Turn Passcode Off", change = "Change Passcode", enterNew = "Enter New Passcode", confirmNew = "Verify New Passcode", enterCurrent = "Enter Current Passcode", diff --git a/sky_phone/source/server/db_migrate.lua b/sky_phone/source/server/db_migrate.lua index d479688..723c7ae 100644 --- a/sky_phone/source/server/db_migrate.lua +++ b/sky_phone/source/server/db_migrate.lua @@ -12,7 +12,7 @@ end if account_tables.sky_phone_mail_accounts and not account_tables.sky_phone_accounts then Bridge.Database.Query("RENAME TABLE `sky_phone_mail_accounts` TO `sky_phone_accounts`", {}) elseif account_tables.sky_phone_mail_accounts and account_tables.sky_phone_accounts then - error("[sky_phone] Both legacy and current iFruit account tables exist; refusing an ambiguous migration.") + error("[sky_phone] Both legacy and current Sky Cloud account tables exist; refusing an ambiguous migration.") end local schema = { diff --git a/sky_phone/source/server/testdata.lua b/sky_phone/source/server/testdata.lua index 49864b7..990d9e2 100644 --- a/sky_phone/source/server/testdata.lua +++ b/sky_phone/source/server/testdata.lua @@ -869,7 +869,7 @@ local function seed_for_source(source) ) account = rows[1] if not account then - error("[sky_phone] Test data found a device with a missing iFruit account.") + error("[sky_phone] Test data found a device with a missing Sky Cloud account.") end account.id = tonumber(account.id) else