···11+---
22+title: Internationalization
33+updated: 2026-05-07
44+---
55+66+## Summary
77+88+Lazurite uses Flutter `gen_l10n` with ARB files and `intl` for user-facing UI
99+strings. The v1 implementation is English-only, follows the system locale, and
1010+establishes the app-local localization architecture needed for future real
1111+translations.
1212+1313+## Current State
1414+1515+V1 localizes the foundation and first user-facing surface:
1616+1717+- App bootstrap localization delegates and supported locales
1818+- App shell navigation, drawer, common buttons, dialogs, and error states
1919+- Auth/login copy, saved account actions, and legal links
2020+- Settings sections, common settings rows, provider dialogs, and troubleshooting
2121+- Search tabs, common search placeholders, post filters, and starter-pack API
2222+ unavailable messaging
2323+2424+Text intentionally not localized in v1:
2525+2626+- User-generated post/profile/list/feed content
2727+- Handles, DIDs, AT URIs, URLs, record JSON, and log lines
2828+- Server/API error details and externally localized moderation label values
2929+- Remaining feature surfaces listed in `docs/tasks/internationalization.md`
3030+3131+## Architecture
3232+3333+Localization source lives in `lib/core/l10n/intl_en.arb`. `l10n.yaml` configures
3434+Flutter generation:
3535+3636+- `arb-dir: lib/core/l10n`
3737+- `template-arb-file: intl_en.arb`
3838+- `output-localization-file: app_localizations.dart`
3939+- `nullable-getter: false`
4040+- `use-escaping: true`
4141+- `required-resource-attributes: true`
4242+4343+Generated localization Dart files are checked in because Lazurite imports
4444+`package:lazurite/core/l10n/app_localizations.dart` directly. Widgets should use
4545+`context.l10n` from `package:lazurite/core/l10n/l10n.dart` when they already
4646+have a `BuildContext`; app bootstrap can import `AppLocalizations` directly.
4747+4848+`MaterialApp.router` owns locale resolution through Flutter's default system
4949+locale behavior. V1 does not add a persisted language setting or runtime picker.
5050+5151+## Key Naming Rules
5252+5353+- Prefer semantic keys over copy-shaped keys: `labelSettings`, not
5454+ `settingsText`.
5555+- Use prefixes consistently:
5656+ - `button*` for button labels
5757+ - `label*` for short labels, titles, tabs, and tooltips
5858+ - `message*` for explanatory body text and helper text
5959+ - `dialog*` for dialog-specific title/body copy
6060+ - `error*` and `validation*` for failure copy
6161+ - `format*` for parameterized messages
6262+- Every ARB resource must include metadata because
6363+ `required-resource-attributes` is enabled.
6464+- Parameterized strings must use ARB placeholders with `type` and an example.
6565+6666+## Formatting Policy
6767+6868+Use `intl` for locale-sensitive dates and numbers. Context-free helpers in
6969+`shared/utils/format_utils.dart` should accept an optional locale or use
7070+`Intl.getCurrentLocale()` when no `BuildContext` is available.
7171+7272+Do not localize protocol constants, database keys, enum storage values, route
7373+paths, asset paths, or provider keys.
7474+7575+## Testing Policy
7676+7777+Widget tests covering full localized screens should pump a `MaterialApp` or
7878+`MaterialApp.router` with:
7979+8080+- `localizationsDelegates: AppLocalizations.localizationsDelegates`
8181+- `supportedLocales: AppLocalizations.supportedLocales`
8282+8383+The `context.l10n` helper falls back to English for very small widget tests that
8484+intentionally use a bare `MaterialApp`. Tests for English copy should keep
8585+asserting visible English strings for now. When additional locales are added,
8686+add locale-specific widget tests for key flows and locale-sensitive formatting
8787+helpers.
8888+8989+## Known Limitations
9090+9191+- English is the only supported locale in v1.
9292+- There is no in-app language picker.
9393+- Some feature-specific strings remain hard-coded and are tracked as follow-up
9494+ milestones.
9595+- Plural, gender, and select messages are only introduced where v1 needs them;
9696+ future translation work should revisit social-copy grammar in feed/profile
9797+ surfaces.
+40
docs/tasks/internationalization.md
···11+# Internationalization Milestones
22+33+## M0 - Foundation and English ARB
44+55+- [x] Add `flutter_localizations`, `intl`, `flutter.generate`, and `l10n.yaml`
66+- [x] Add canonical `lib/core/l10n/intl_en.arb`
77+- [x] Generate and track `AppLocalizations` Dart files
88+- [x] Wire `MaterialApp.router` delegates and supported locales
99+- [x] Add `context.l10n` helper for Lazurite widgets
1010+1111+## M1 - Core, Shared, Auth, Settings, Search
1212+1313+- [x] Localize app shell navigation, drawer labels, and common menu copy
1414+- [x] Localize shared confirmation/error/moderation overlay copy
1515+- [x] Localize login, saved account actions, and legal links
1616+- [x] Localize settings sections, provider dialogs, and troubleshooting actions
1717+- [x] Localize primary search tabs, placeholders, filters, and unavailable states
1818+- [x] Add focused widget/localization tests for migrated surfaces
1919+2020+## M2 - Remaining Feature Surfaces
2121+2222+- [ ] Localize feed cards, post menus, post actions, saved posts, and trending
2323+- [ ] Localize compose flow, media alt text editors, draft/schedule states, and validation
2424+- [ ] Localize profile screens, profile actions, reports, follows, lists, and starter packs
2525+- [ ] Localize messages, notifications, alerts, and account switching sheets
2626+- [ ] Localize moderation settings/detail screens and logs/devtools user-facing labels
2727+2828+## M3 - Locale QA and Secondary-Locale Strategy
2929+3030+- [ ] Add a pseudo-locale or generated QA locale for layout stress testing
3131+- [ ] Audit hard-coded visible strings after M2
3232+- [ ] Add locale-aware golden/widget coverage for dense layouts
3333+- [ ] Decide first real non-English locale and translation ownership
3434+3535+## M4 - User-Facing Language Selection
3636+3737+- [ ] Add persisted language preference only after multiple real locales exist
3838+- [ ] Add settings UI for system/default language and supported overrides
3939+- [ ] Add tests for locale override persistence and app rebuild behavior
4040+- [ ] Document translator workflow and release checklist
+7-3
justfile
···1111lint:
1212 flutter analyze
13131414+# Generate Flutter localization files from ARB sources
1515+l10n:
1616+ flutter gen-l10n
1717+1418# Install pinned ObjectBox runtime library for local development
1519objectbox-setup:
1620 bash scripts/objectbox_runtime.sh install
···4448splash: generate-splash-assets generate-native-splash
45494650# Run code gen
4747-gen: generate format
5151+gen: generate l10n format
48524949-# Run format, lint, and test
5050-check: format lint test
5353+# Run localization generation, format, lint, and test
5454+check: l10n format lint test
51555256find-comments:
5357 rg -n --pcre2 '^\s*//(?![!/])' -g '*.dart' -g '!*.g.dart' -g '!*.freezed.dart'
···11+import 'dart:async';
22+33+import 'package:flutter/foundation.dart';
44+import 'package:flutter/widgets.dart';
55+import 'package:flutter_localizations/flutter_localizations.dart';
66+import 'package:intl/intl.dart' as intl;
77+88+import 'app_localizations_en.dart';
99+1010+// ignore_for_file: type=lint
1111+1212+/// Callers can lookup localized strings with an instance of AppLocalizations
1313+/// returned by `AppLocalizations.of(context)`.
1414+///
1515+/// Applications need to include `AppLocalizations.delegate()` in their app's
1616+/// `localizationDelegates` list, and the locales they support in the app's
1717+/// `supportedLocales` list. For example:
1818+///
1919+/// ```dart
2020+/// import 'l10n/app_localizations.dart';
2121+///
2222+/// return MaterialApp(
2323+/// localizationsDelegates: AppLocalizations.localizationsDelegates,
2424+/// supportedLocales: AppLocalizations.supportedLocales,
2525+/// home: MyApplicationHome(),
2626+/// );
2727+/// ```
2828+///
2929+/// ## Update pubspec.yaml
3030+///
3131+/// Please make sure to update your pubspec.yaml to include the following
3232+/// packages:
3333+///
3434+/// ```yaml
3535+/// dependencies:
3636+/// # Internationalization support.
3737+/// flutter_localizations:
3838+/// sdk: flutter
3939+/// intl: any # Use the pinned version from flutter_localizations
4040+///
4141+/// # Rest of dependencies
4242+/// ```
4343+///
4444+/// ## iOS Applications
4545+///
4646+/// iOS applications define key application metadata, including supported
4747+/// locales, in an Info.plist file that is built into the application bundle.
4848+/// To configure the locales supported by your app, you’ll need to edit this
4949+/// file.
5050+///
5151+/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file.
5252+/// Then, in the Project Navigator, open the Info.plist file under the Runner
5353+/// project’s Runner folder.
5454+///
5555+/// Next, select the Information Property List item, select Add Item from the
5656+/// Editor menu, then select Localizations from the pop-up menu.
5757+///
5858+/// Select and expand the newly-created Localizations item then, for each
5959+/// locale your application supports, add a new item and select the locale
6060+/// you wish to add from the pop-up menu in the Value field. This list should
6161+/// be consistent with the languages listed in the AppLocalizations.supportedLocales
6262+/// property.
6363+abstract class AppLocalizations {
6464+ AppLocalizations(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString());
6565+6666+ final String localeName;
6767+6868+ static AppLocalizations of(BuildContext context) {
6969+ return Localizations.of<AppLocalizations>(context, AppLocalizations)!;
7070+ }
7171+7272+ static const LocalizationsDelegate<AppLocalizations> delegate = _AppLocalizationsDelegate();
7373+7474+ /// A list of this localizations delegate along with the default localizations
7575+ /// delegates.
7676+ ///
7777+ /// Returns a list of localizations delegates containing this delegate along with
7878+ /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate,
7979+ /// and GlobalWidgetsLocalizations.delegate.
8080+ ///
8181+ /// Additional delegates can be added by appending to this list in
8282+ /// MaterialApp. This list does not have to be used at all if a custom list
8383+ /// of delegates is preferred or required.
8484+ static const List<LocalizationsDelegate<dynamic>> localizationsDelegates = <LocalizationsDelegate<dynamic>>[
8585+ delegate,
8686+ GlobalMaterialLocalizations.delegate,
8787+ GlobalCupertinoLocalizations.delegate,
8888+ GlobalWidgetsLocalizations.delegate,
8989+ ];
9090+9191+ /// A list of this localizations delegate's supported locales.
9292+ static const List<Locale> supportedLocales = <Locale>[Locale('en')];
9393+9494+ /// Application title
9595+ ///
9696+ /// In en, this message translates to:
9797+ /// **'Lazurite'**
9898+ String get appTitle;
9999+100100+ /// Button label to apply a setting and restart app services
101101+ ///
102102+ /// In en, this message translates to:
103103+ /// **'Apply and Restart'**
104104+ String get buttonApplyAndRestart;
105105+106106+ /// Cancel button label
107107+ ///
108108+ /// In en, this message translates to:
109109+ /// **'Cancel'**
110110+ String get buttonCancel;
111111+112112+ /// Button label to clear local cache
113113+ ///
114114+ /// In en, this message translates to:
115115+ /// **'Clear Cache'**
116116+ String get buttonClearCache;
117117+118118+ /// Continue button label
119119+ ///
120120+ /// In en, this message translates to:
121121+ /// **'Continue'**
122122+ String get buttonContinue;
123123+124124+ /// Remove button label
125125+ ///
126126+ /// In en, this message translates to:
127127+ /// **'Remove'**
128128+ String get buttonRemove;
129129+130130+ /// Apply button label
131131+ ///
132132+ /// In en, this message translates to:
133133+ /// **'Apply'**
134134+ String get buttonApply;
135135+136136+ /// Clear button label
137137+ ///
138138+ /// In en, this message translates to:
139139+ /// **'Clear'**
140140+ String get buttonClear;
141141+142142+ /// Clear all filters button label
143143+ ///
144144+ /// In en, this message translates to:
145145+ /// **'Clear all'**
146146+ String get buttonClearAll;
147147+148148+ /// Open button label
149149+ ///
150150+ /// In en, this message translates to:
151151+ /// **'Open'**
152152+ String get buttonOpen;
153153+154154+ /// Button label to clear local sign-in data
155155+ ///
156156+ /// In en, this message translates to:
157157+ /// **'Reset Sign-In Data'**
158158+ String get buttonResetSignInData;
159159+160160+ /// Retry button label
161161+ ///
162162+ /// In en, this message translates to:
163163+ /// **'Retry'**
164164+ String get buttonRetry;
165165+166166+ /// Sign in button label
167167+ ///
168168+ /// In en, this message translates to:
169169+ /// **'Sign In'**
170170+ String get buttonSignIn;
171171+172172+ /// Button label to reveal moderated content
173173+ ///
174174+ /// In en, this message translates to:
175175+ /// **'Show content'**
176176+ String get buttonShowContent;
177177+178178+ /// Try again button label
179179+ ///
180180+ /// In en, this message translates to:
181181+ /// **'Try again'**
182182+ String get buttonTryAgain;
183183+184184+ /// Label for a value that has never happened
185185+ ///
186186+ /// In en, this message translates to:
187187+ /// **'Never'**
188188+ String get commonNever;
189189+190190+ /// Label for no value
191191+ ///
192192+ /// In en, this message translates to:
193193+ /// **'None'**
194194+ String get commonNone;
195195+196196+ /// Label for a health check that has not run
197197+ ///
198198+ /// In en, this message translates to:
199199+ /// **'Not checked yet'**
200200+ String get commonNotCheckedYet;
201201+202202+ /// Disabled option label
203203+ ///
204204+ /// In en, this message translates to:
205205+ /// **'Off'**
206206+ String get commonOff;
207207+208208+ /// Confirmation dialog body before clearing local cache
209209+ ///
210210+ /// In en, this message translates to:
211211+ /// **'This removes cached posts, profiles, images, feeds, threads, label data, and local semantic search data.\n\nAccounts, settings, drafts, bookmarks, and likes are kept.'**
212212+ String get dialogClearCacheContent;
213213+214214+ /// Confirmation dialog title before clearing local cache
215215+ ///
216216+ /// In en, this message translates to:
217217+ /// **'Clear cache?'**
218218+ String get dialogClearCacheTitle;
219219+220220+ /// Confirmation dialog body before removing a saved account from this device
221221+ ///
222222+ /// In en, this message translates to:
223223+ /// **'Remove @{handle} from this device?'**
224224+ String dialogRemoveAccountContent(String handle);
225225+226226+ /// Confirmation dialog title before removing a saved account
227227+ ///
228228+ /// In en, this message translates to:
229229+ /// **'Remove Account'**
230230+ String get dialogRemoveAccountTitle;
231231+232232+ /// Confirmation dialog body before clearing local sign-in data
233233+ ///
234234+ /// In en, this message translates to:
235235+ /// **'Use this only when troubleshooting sign-in or account switching.\n\nThis clears all local account sessions on this device and sends you back to sign in. It does not delete your Bluesky account or posts.'**
236236+ String get dialogResetSignInDataContent;
237237+238238+ /// Confirmation dialog title before clearing local sign-in data
239239+ ///
240240+ /// In en, this message translates to:
241241+ /// **'Reset sign-in data?'**
242242+ String get dialogResetSignInDataTitle;
243243+244244+ /// Confirmation dialog body before switching AppView provider
245245+ ///
246246+ /// In en, this message translates to:
247247+ /// **'Apply and restart now to rebuild network services.\n\nYou will stay signed in and no local data will be deleted.\n\nModeration labels, ranking, and trending results can differ between providers.'**
248248+ String get dialogSwitchAppViewProviderContent;
249249+250250+ /// Confirmation dialog title before switching AppView provider
251251+ ///
252252+ /// In en, this message translates to:
253253+ /// **'Switch AppView provider?'**
254254+ String get dialogSwitchAppViewProviderTitle;
255255+256256+ /// Snackbar message when persisting selected provider fails
257257+ ///
258258+ /// In en, this message translates to:
259259+ /// **'Failed to save provider selection: {error}'**
260260+ String errorFailedToSaveProviderSelection(Object error);
261261+262262+ /// Snackbar message when cache clearing fails
263263+ ///
264264+ /// In en, this message translates to:
265265+ /// **'Failed to clear cache: {error}'**
266266+ String errorFailedToClearCache(Object error);
267267+268268+ /// Generic error state title
269269+ ///
270270+ /// In en, this message translates to:
271271+ /// **'Something went wrong'**
272272+ String get errorGenericTitle;
273273+274274+ /// Snackbar message when a saved account cannot be removed
275275+ ///
276276+ /// In en, this message translates to:
277277+ /// **'Unable to remove account right now.'**
278278+ String get errorUnableToRemoveAccount;
279279+280280+ /// Tooltip for removing a saved account
281281+ ///
282282+ /// In en, this message translates to:
283283+ /// **'Remove account'**
284284+ String get labelRemoveAccount;
285285+286286+ /// Settings account row subtitle when multiple accounts are available
287287+ ///
288288+ /// In en, this message translates to:
289289+ /// **'{count, plural, =1{1 account - tap to switch} other{{count} accounts - tap to switch}}'**
290290+ String formatAccountsTapToSwitch(int count);
291291+292292+ /// Settings subtitle for selected AppView provider
293293+ ///
294294+ /// In en, this message translates to:
295295+ /// **'{provider} selected. Switching providers performs a soft restart.'**
296296+ String formatAppViewProviderSelected(String provider);
297297+298298+ /// Settings subtitle showing the count of subscribed custom moderation labelers
299299+ ///
300300+ /// In en, this message translates to:
301301+ /// **'{count, plural, =0{No custom labelers subscribed} =1{1 custom labeler subscribed} other{{count} custom labelers subscribed}}'**
302302+ String formatContentModerationCustomLabelers(int count);
303303+304304+ /// Thread auto-collapse depth setting option
305305+ ///
306306+ /// In en, this message translates to:
307307+ /// **'Depth {depth}'**
308308+ String formatDepth(int depth);
309309+310310+ /// About page or settings label
311311+ ///
312312+ /// In en, this message translates to:
313313+ /// **'About'**
314314+ String get labelAbout;
315315+316316+ /// Account settings section label
317317+ ///
318318+ /// In en, this message translates to:
319319+ /// **'Account'**
320320+ String get labelAccount;
321321+322322+ /// Settings section for account maintenance actions
323323+ ///
324324+ /// In en, this message translates to:
325325+ /// **'Account Maintenance'**
326326+ String get labelAccountMaintenance;
327327+328328+ /// Provider diagnostics label for active provider
329329+ ///
330330+ /// In en, this message translates to:
331331+ /// **'Active Provider'**
332332+ String get labelActiveProvider;
333333+334334+ /// Adult content setting label
335335+ ///
336336+ /// In en, this message translates to:
337337+ /// **'Adult Content'**
338338+ String get labelAdultContent;
339339+340340+ /// Advanced settings section label
341341+ ///
342342+ /// In en, this message translates to:
343343+ /// **'Advanced'**
344344+ String get labelAdvanced;
345345+346346+ /// Bottom navigation alerts label
347347+ ///
348348+ /// In en, this message translates to:
349349+ /// **'ALERTS'**
350350+ String get labelAlerts;
351351+352352+ /// Animations settings label
353353+ ///
354354+ /// In en, this message translates to:
355355+ /// **'Animations'**
356356+ String get labelAnimations;
357357+358358+ /// Appearance settings section label
359359+ ///
360360+ /// In en, this message translates to:
361361+ /// **'Appearance'**
362362+ String get labelAppearance;
363363+364364+ /// Debug app password field label
365365+ ///
366366+ /// In en, this message translates to:
367367+ /// **'App Password'**
368368+ String get labelAppPassword;
369369+370370+ /// Debug app password login card title
371371+ ///
372372+ /// In en, this message translates to:
373373+ /// **'App Password Login'**
374374+ String get labelAppPasswordLogin;
375375+376376+ /// AppView provider settings label
377377+ ///
378378+ /// In en, this message translates to:
379379+ /// **'AppView Provider'**
380380+ String get labelAppViewProvider;
381381+382382+ /// AT Protocol explorer settings/menu label
383383+ ///
384384+ /// In en, this message translates to:
385385+ /// **'AT Explorer'**
386386+ String get labelAtExplorer;
387387+388388+ /// Settings section title for AT Protocol connection details
389389+ ///
390390+ /// In en, this message translates to:
391391+ /// **'AT Protocol Connection'**
392392+ String get labelAtProtocolConnection;
393393+394394+ /// Menu item for follow audit feature
395395+ ///
396396+ /// In en, this message translates to:
397397+ /// **'Audit Follows'**
398398+ String get labelAuditFollows;
399399+400400+ /// Back tooltip label
401401+ ///
402402+ /// In en, this message translates to:
403403+ /// **'Back'**
404404+ String get labelBack;
405405+406406+ /// Settings item for bookmarked and liked posts
407407+ ///
408408+ /// In en, this message translates to:
409409+ /// **'Bookmarks & Likes'**
410410+ String get labelBookmarksAndLikes;
411411+412412+ /// Snackbar message after clearing cache
413413+ ///
414414+ /// In en, this message translates to:
415415+ /// **'Cache cleared'**
416416+ String get labelCacheCleared;
417417+418418+ /// Login provider selection label
419419+ ///
420420+ /// In en, this message translates to:
421421+ /// **'Choose your portal'**
422422+ String get labelChooseYourPortal;
423423+424424+ /// Settings item for follow audit feature
425425+ ///
426426+ /// In en, this message translates to:
427427+ /// **'Clean Follows'**
428428+ String get labelCleanFollows;
429429+430430+ /// Settings item for clearing cache
431431+ ///
432432+ /// In en, this message translates to:
433433+ /// **'Clear Cache'**
434434+ String get labelClearCache;
435435+436436+ /// Community provider option label
437437+ ///
438438+ /// In en, this message translates to:
439439+ /// **'Community'**
440440+ String get labelCommunity;
441441+442442+ /// Constellation URL setting label
443443+ ///
444444+ /// In en, this message translates to:
445445+ /// **'Constellation URL'**
446446+ String get labelConstellationUrl;
447447+448448+ /// Content moderation settings label
449449+ ///
450450+ /// In en, this message translates to:
451451+ /// **'Content Moderation'**
452452+ String get labelContentModeration;
453453+454454+ /// Semantic label for continuing sign in
455455+ ///
456456+ /// In en, this message translates to:
457457+ /// **'Continue sign in'**
458458+ String get labelContinueSignIn;
459459+460460+ /// Crash reporting setting label
461461+ ///
462462+ /// In en, this message translates to:
463463+ /// **'Crash Reporting'**
464464+ String get labelCrashReporting;
465465+466466+ /// Developer setting to trigger a test crash
467467+ ///
468468+ /// In en, this message translates to:
469469+ /// **'Crashlytics Test Crash'**
470470+ String get labelCrashlyticsTestCrash;
471471+472472+ /// Cross-provider fallback setting label
473473+ ///
474474+ /// In en, this message translates to:
475475+ /// **'Cross-Provider Fallback'**
476476+ String get labelCrossProviderFallback;
477477+478478+ /// Destructive settings section label
479479+ ///
480480+ /// In en, this message translates to:
481481+ /// **'Danger Zone'**
482482+ String get labelDangerZone;
483483+484484+ /// Dark theme option label
485485+ ///
486486+ /// In en, this message translates to:
487487+ /// **'Dark'**
488488+ String get labelDark;
489489+490490+ /// Debug section label
491491+ ///
492492+ /// In en, this message translates to:
493493+ /// **'Debug'**
494494+ String get labelDebug;
495495+496496+ /// Developer settings section label
497497+ ///
498498+ /// In en, this message translates to:
499499+ /// **'Developer'**
500500+ String get labelDeveloper;
501501+502502+ /// Feed layout setting label
503503+ ///
504504+ /// In en, this message translates to:
505505+ /// **'Feed Layout'**
506506+ String get labelFeedLayout;
507507+508508+ /// Feeds menu/settings label
509509+ ///
510510+ /// In en, this message translates to:
511511+ /// **'Feeds'**
512512+ String get labelFeeds;
513513+514514+ /// Developer setting to force the next XRPC request to return Unauthorized
515515+ ///
516516+ /// In en, this message translates to:
517517+ /// **'Force Next XRPC 401'**
518518+ String get labelForceNextXrpc401;
519519+520520+ /// Developer setting to simulate offline mode
521521+ ///
522522+ /// In en, this message translates to:
523523+ /// **'Go Offline'**
524524+ String get labelGoOffline;
525525+526526+ /// Fallback account display name when no user is signed in
527527+ ///
528528+ /// In en, this message translates to:
529529+ /// **'Guest'**
530530+ String get labelGuest;
531531+532532+ /// Provider diagnostics health label
533533+ ///
534534+ /// In en, this message translates to:
535535+ /// **'Health'**
536536+ String get labelHealth;
537537+538538+ /// Handle field label
539539+ ///
540540+ /// In en, this message translates to:
541541+ /// **'Handle'**
542542+ String get labelHandle;
543543+544544+ /// Hide button label
545545+ ///
546546+ /// In en, this message translates to:
547547+ /// **'Hide'**
548548+ String get labelHide;
549549+550550+ /// Bottom navigation home label
551551+ ///
552552+ /// In en, this message translates to:
553553+ /// **'HOME'**
554554+ String get labelHome;
555555+556556+ /// Provider diagnostics last error label
557557+ ///
558558+ /// In en, this message translates to:
559559+ /// **'Last Error'**
560560+ String get labelLastError;
561561+562562+ /// Provider diagnostics last fallback label
563563+ ///
564564+ /// In en, this message translates to:
565565+ /// **'Last Fallback'**
566566+ String get labelLastFallback;
567567+568568+ /// Provider diagnostics last health check label
569569+ ///
570570+ /// In en, this message translates to:
571571+ /// **'Last Health Check'**
572572+ String get labelLastHealthCheck;
573573+574574+ /// Layout settings section label
575575+ ///
576576+ /// In en, this message translates to:
577577+ /// **'Layout'**
578578+ String get labelLayout;
579579+580580+ /// Light theme option label
581581+ ///
582582+ /// In en, this message translates to:
583583+ /// **'Light'**
584584+ String get labelLight;
585585+586586+ /// Log out button or menu label
587587+ ///
588588+ /// In en, this message translates to:
589589+ /// **'Log Out'**
590590+ String get labelLogOut;
591591+592592+ /// Logs settings label
593593+ ///
594594+ /// In en, this message translates to:
595595+ /// **'Logs'**
596596+ String get labelLogs;
597597+598598+ /// Messages menu label
599599+ ///
600600+ /// In en, this message translates to:
601601+ /// **'Messages'**
602602+ String get labelMessages;
603603+604604+ /// Moderation settings section label
605605+ ///
606606+ /// In en, this message translates to:
607607+ /// **'Moderation'**
608608+ String get labelModeration;
609609+610610+ /// Navigation menu section label
611611+ ///
612612+ /// In en, this message translates to:
613613+ /// **'Navigation'**
614614+ String get labelNavigation;
615615+616616+ /// New post menu label
617617+ ///
618618+ /// In en, this message translates to:
619619+ /// **'New Post'**
620620+ String get labelNewPost;
621621+622622+ /// Notifications menu label
623623+ ///
624624+ /// In en, this message translates to:
625625+ /// **'Notifications'**
626626+ String get labelNotifications;
627627+628628+ /// Tooltip for opening the navigation menu
629629+ ///
630630+ /// In en, this message translates to:
631631+ /// **'Open menu'**
632632+ String get labelOpenMenu;
633633+634634+ /// Privacy policy link label
635635+ ///
636636+ /// In en, this message translates to:
637637+ /// **'Privacy Policy'**
638638+ String get labelPrivacyPolicy;
639639+640640+ /// Bottom navigation profile label
641641+ ///
642642+ /// In en, this message translates to:
643643+ /// **'PROFILE'**
644644+ String get labelProfile;
645645+646646+ /// Settings section for provider diagnostics
647647+ ///
648648+ /// In en, this message translates to:
649649+ /// **'Provider Diagnostics'**
650650+ String get labelProviderDiagnostics;
651651+652652+ /// Settings item for refreshing provider health
653653+ ///
654654+ /// In en, this message translates to:
655655+ /// **'Refresh Provider Health'**
656656+ String get labelRefreshProviderHealth;
657657+658658+ /// Settings item for resetting local sign-in data
659659+ ///
660660+ /// In en, this message translates to:
661661+ /// **'Reset Sign-In Data'**
662662+ String get labelResetSignInData;
663663+664664+ /// Login screen subtitle
665665+ ///
666666+ /// In en, this message translates to:
667667+ /// **'Roam the ATmosphere'**
668668+ String get labelRoamTheAtmosphere;
669669+670670+ /// Search menu/settings label
671671+ ///
672672+ /// In en, this message translates to:
673673+ /// **'Search'**
674674+ String get labelSearch;
675675+676676+ /// Title for posts-only search mode
677677+ ///
678678+ /// In en, this message translates to:
679679+ /// **'Search Posts'**
680680+ String get labelSearchPosts;
681681+682682+ /// Button and dialog title for jumping directly to a profile
683683+ ///
684684+ /// In en, this message translates to:
685685+ /// **'Jump to profile'**
686686+ String get labelJumpToProfile;
687687+688688+ /// Posts tab label
689689+ ///
690690+ /// In en, this message translates to:
691691+ /// **'Posts'**
692692+ String get labelPosts;
693693+694694+ /// People tab label
695695+ ///
696696+ /// In en, this message translates to:
697697+ /// **'People'**
698698+ String get labelPeople;
699699+700700+ /// Starter packs tab label
701701+ ///
702702+ /// In en, this message translates to:
703703+ /// **'Starter Packs'**
704704+ String get labelStarterPacks;
705705+706706+ /// Sort control label
707707+ ///
708708+ /// In en, this message translates to:
709709+ /// **'Sort by'**
710710+ String get labelSortBy;
711711+712712+ /// Top sort option label
713713+ ///
714714+ /// In en, this message translates to:
715715+ /// **'Top'**
716716+ String get labelTop;
717717+718718+ /// Latest sort option label
719719+ ///
720720+ /// In en, this message translates to:
721721+ /// **'Latest'**
722722+ String get labelLatest;
723723+724724+ /// Search filters button label
725725+ ///
726726+ /// In en, this message translates to:
727727+ /// **'Filters'**
728728+ String get labelFilters;
729729+730730+ /// Post filters sheet title
731731+ ///
732732+ /// In en, this message translates to:
733733+ /// **'Post filters'**
734734+ String get labelPostFilters;
735735+736736+ /// Mentions filter label
737737+ ///
738738+ /// In en, this message translates to:
739739+ /// **'Mentions'**
740740+ String get labelMentions;
741741+742742+ /// Author filter label
743743+ ///
744744+ /// In en, this message translates to:
745745+ /// **'Author'**
746746+ String get labelAuthor;
747747+748748+ /// Fixed author filter label
749749+ ///
750750+ /// In en, this message translates to:
751751+ /// **'Author (fixed)'**
752752+ String get labelAuthorFixed;
753753+754754+ /// Language filter label
755755+ ///
756756+ /// In en, this message translates to:
757757+ /// **'Language'**
758758+ String get labelLanguage;
759759+760760+ /// Domain filter label
761761+ ///
762762+ /// In en, this message translates to:
763763+ /// **'Domain'**
764764+ String get labelDomain;
765765+766766+ /// URL filter label
767767+ ///
768768+ /// In en, this message translates to:
769769+ /// **'URL'**
770770+ String get labelUrl;
771771+772772+ /// Tags filter label
773773+ ///
774774+ /// In en, this message translates to:
775775+ /// **'Tags'**
776776+ String get labelTags;
777777+778778+ /// Since date filter label
779779+ ///
780780+ /// In en, this message translates to:
781781+ /// **'Since'**
782782+ String get labelSince;
783783+784784+ /// Until date filter label
785785+ ///
786786+ /// In en, this message translates to:
787787+ /// **'Until'**
788788+ String get labelUntil;
789789+790790+ /// Button label to clear since date filter
791791+ ///
792792+ /// In en, this message translates to:
793793+ /// **'Clear since'**
794794+ String get labelClearSince;
795795+796796+ /// Button label to clear until date filter
797797+ ///
798798+ /// In en, this message translates to:
799799+ /// **'Clear until'**
800800+ String get labelClearUntil;
801801+802802+ /// Saved accounts section label on login screen
803803+ ///
804804+ /// In en, this message translates to:
805805+ /// **'Saved accounts'**
806806+ String get labelSavedAccounts;
807807+808808+ /// Bottom navigation search label
809809+ ///
810810+ /// In en, this message translates to:
811811+ /// **'SEARCH'**
812812+ String get labelSearchNav;
813813+814814+ /// Semantic search settings label
815815+ ///
816816+ /// In en, this message translates to:
817817+ /// **'Semantic Search'**
818818+ String get labelSemanticSearch;
819819+820820+ /// Settings page title or tooltip
821821+ ///
822822+ /// In en, this message translates to:
823823+ /// **'Settings'**
824824+ String get labelSettings;
825825+826826+ /// Show button label
827827+ ///
828828+ /// In en, this message translates to:
829829+ /// **'Show'**
830830+ String get labelShow;
831831+832832+ /// Fallback account handle text when sign in is required
833833+ ///
834834+ /// In en, this message translates to:
835835+ /// **'Sign in required'**
836836+ String get labelSignInRequired;
837837+838838+ /// Slingshot identity fallback setting label
839839+ ///
840840+ /// In en, this message translates to:
841841+ /// **'Slingshot Identity Fallback'**
842842+ String get labelSlingshotIdentityFallback;
843843+844844+ /// Tooltip while sign in is starting
845845+ ///
846846+ /// In en, this message translates to:
847847+ /// **'Starting sign in'**
848848+ String get labelStartingSignIn;
849849+850850+ /// System theme option label
851851+ ///
852852+ /// In en, this message translates to:
853853+ /// **'System'**
854854+ String get labelSystem;
855855+856856+ /// Terms of service link label
857857+ ///
858858+ /// In en, this message translates to:
859859+ /// **'Terms of Service'**
860860+ String get labelTermsOfService;
861861+862862+ /// Theme subsection label in settings
863863+ ///
864864+ /// In en, this message translates to:
865865+ /// **'THEME'**
866866+ String get labelTheme;
867867+868868+ /// Thread auto-collapse setting label
869869+ ///
870870+ /// In en, this message translates to:
871871+ /// **'Thread Auto-Collapse'**
872872+ String get labelThreadAutoCollapse;
873873+874874+ /// Troubleshooting settings section label
875875+ ///
876876+ /// In en, this message translates to:
877877+ /// **'Troubleshooting'**
878878+ String get labelTroubleshooting;
879879+880880+ /// Typeahead provider settings label
881881+ ///
882882+ /// In en, this message translates to:
883883+ /// **'Typeahead Provider'**
884884+ String get labelTypeaheadProvider;
885885+886886+ /// Video upload limits settings label
887887+ ///
888888+ /// In en, this message translates to:
889889+ /// **'Video Upload Limits'**
890890+ String get labelVideoUploadLimits;
891891+892892+ /// Debug app password help text
893893+ ///
894894+ /// In en, this message translates to:
895895+ /// **'Can be generated via Bluesky\'\'s App Passwords section at bsky.app.'**
896896+ String get messageAppPasswordGeneratedViaBluesky;
897897+898898+ /// Snackbar message after arming debug unauthorized response
899899+ ///
900900+ /// In en, this message translates to:
901901+ /// **'Armed: next XRPC request will return debug 401 Unauthorized'**
902902+ String get messageAppViewDebug401Armed;
903903+904904+ /// Settings subtitle for Bluesky typeahead provider
905905+ ///
906906+ /// In en, this message translates to:
907907+ /// **'Bluesky official endpoint selected.'**
908908+ String get messageBlueskyEndpointSelected;
909909+910910+ /// Settings subtitle for bookmarks and likes
911911+ ///
912912+ /// In en, this message translates to:
913913+ /// **'View your bookmarked and liked posts'**
914914+ String get messageBookmarksAndLikesSubtitle;
915915+916916+ /// Login screen provider selection helper text
917917+ ///
918918+ /// In en, this message translates to:
919919+ /// **'Choose the AppView provider used for sign in and public reads.'**
920920+ String get messageChooseProviderSubtitle;
921921+922922+ /// Settings subtitle for clean follows
923923+ ///
924924+ /// In en, this message translates to:
925925+ /// **'Audit and unfollow problematic accounts in bulk'**
926926+ String get messageCleanFollowsSubtitle;
927927+928928+ /// Settings subtitle for clearing cache
929929+ ///
930930+ /// In en, this message translates to:
931931+ /// **'Remove cached posts, profiles, images, feeds, threads, and semantic search data'**
932932+ String get messageClearCacheSubtitle;
933933+934934+ /// Settings subtitle for community typeahead provider
935935+ ///
936936+ /// In en, this message translates to:
937937+ /// **'Community (waow.tech) selected. Third-party service.'**
938938+ String get messageCommunityTypeaheadSelected;
939939+940940+ /// Settings subtitle for content moderation
941941+ ///
942942+ /// In en, this message translates to:
943943+ /// **'Manage labelers and visibility rules'**
944944+ String get messageContentModerationSubtitle;
945945+946946+ /// Settings subtitle when adult content preference is enabled
947947+ ///
948948+ /// In en, this message translates to:
949949+ /// **'18+ labels can be configured'**
950950+ String get messageAdultContentEnabled;
951951+952952+ /// Settings subtitle when adult content preference is disabled
953953+ ///
954954+ /// In en, this message translates to:
955955+ /// **'Required before 18+ labels can be configured'**
956956+ String get messageAdultContentRequired;
957957+958958+ /// Settings subtitle when crash reporting is disabled
959959+ ///
960960+ /// In en, this message translates to:
961961+ /// **'Disabled. Crash and error reports are not sent.'**
962962+ String get messageCrashReportingDisabled;
963963+964964+ /// Settings subtitle when crash reporting is enabled
965965+ ///
966966+ /// In en, this message translates to:
967967+ /// **'Enabled. Crash and error reports are sent to improve stability.'**
968968+ String get messageCrashReportingEnabled;
969969+970970+ /// Developer setting subtitle for test crash
971971+ ///
972972+ /// In en, this message translates to:
973973+ /// **'Intentionally crash to validate Crashlytics reports'**
974974+ String get messageCrashlyticsTestCrashSubtitle;
975975+976976+ /// Settings subtitle for cross-provider fallback
977977+ ///
978978+ /// In en, this message translates to:
979979+ /// **'Retry public reads on the alternate AppView when transient errors occur'**
980980+ String get messageCrossProviderFallbackSubtitle;
981981+982982+ /// Developer setting subtitle for simulated offline
983983+ ///
984984+ /// In en, this message translates to:
985985+ /// **'Turn off online connectivity'**
986986+ String get messageDeveloperGoOfflineSubtitle;
987987+988988+ /// Feed layout card option
989989+ ///
990990+ /// In en, this message translates to:
991991+ /// **'Card'**
992992+ String get messageFeedLayoutCard;
993993+994994+ /// Loading message while saved accounts load
995995+ ///
996996+ /// In en, this message translates to:
997997+ /// **'Loading saved accounts...'**
998998+ String get messageLoadingSavedAccounts;
999999+10001000+ /// Feed layout compact option
10011001+ ///
10021002+ /// In en, this message translates to:
10031003+ /// **'Compact'**
10041004+ String get messageFeedLayoutCompact;
10051005+10061006+ /// Settings subtitle for feeds
10071007+ ///
10081008+ /// In en, this message translates to:
10091009+ /// **'Manage pinned and saved feeds'**
10101010+ String get messageFeedsSubtitle;
10111011+10121012+ /// Developer setting subtitle for forced 401
10131013+ ///
10141014+ /// In en, this message translates to:
10151015+ /// **'Debug-only: next network request returns Unauthorized to test token refresh'**
10161016+ String get messageForceNextXrpc401Subtitle;
10171017+10181018+ /// Settings subtitle for semantic search management
10191019+ ///
10201020+ /// In en, this message translates to:
10211021+ /// **'Manage semantic search from Bookmarks & Likes -> Search'**
10221022+ String get messageManageSemanticSearchSubtitle;
10231023+10241024+ /// Moderation overlay description when content cannot be revealed
10251025+ ///
10261026+ /// In en, this message translates to:
10271027+ /// **'Hidden by your moderation settings and cannot be revealed here.'**
10281028+ String get messageModeratedContentCannotReveal;
10291029+10301030+ /// Moderation overlay description when content can be revealed
10311031+ ///
10321032+ /// In en, this message translates to:
10331033+ /// **'Hidden by your moderation settings. You can reveal it for this view.'**
10341034+ String get messageModeratedContentCanReveal;
10351035+10361036+ /// Settings subtitle for provider diagnostics
10371037+ ///
10381038+ /// In en, this message translates to:
10391039+ /// **'Moderation/ranking can differ by provider. Verify health and recent fallback state.'**
10401040+ String get messageProviderDiagnosticsSubtitle;
10411041+10421042+ /// Settings subtitle for refreshing provider health
10431043+ ///
10441044+ /// In en, this message translates to:
10451045+ /// **'Probe public AppView endpoints now'**
10461046+ String get messageRefreshProviderHealthSubtitle;
10471047+10481048+ /// Settings subtitle for resetting sign-in data
10491049+ ///
10501050+ /// In en, this message translates to:
10511051+ /// **'Troubleshoot OAuth or account-switching issues by clearing local sessions on this device'**
10521052+ String get messageResetSignInDataSubtitle;
10531053+10541054+ /// Generic search subtitle
10551055+ ///
10561056+ /// In en, this message translates to:
10571057+ /// **'Search'**
10581058+ String get messageSearchSubtitle;
10591059+10601060+ /// Confirmation dialog body before clearing search history
10611061+ ///
10621062+ /// In en, this message translates to:
10631063+ /// **'This will delete all your recent searches.'**
10641064+ String get messageClearSearchHistoryContent;
10651065+10661066+ /// Confirmation dialog title before clearing search history
10671067+ ///
10681068+ /// In en, this message translates to:
10691069+ /// **'Clear search history?'**
10701070+ String get messageClearSearchHistoryTitle;
10711071+10721072+ /// Hint shown in jump to profile dialog
10731073+ ///
10741074+ /// In en, this message translates to:
10751075+ /// **'Start typing to search handles.'**
10761076+ String get messageStartTypingToSearchHandles;
10771077+10781078+ /// Helper text when starter pack search is disabled
10791079+ ///
10801080+ /// In en, this message translates to:
10811081+ /// **'Starter pack search is not available in the API yet.'**
10821082+ String get messageStarterPackSearchApiUnavailable;
10831083+10841084+ /// Starter pack search unavailable state title
10851085+ ///
10861086+ /// In en, this message translates to:
10871087+ /// **'Starter Pack Search Is Unavailable'**
10881088+ String get messageStarterPackSearchUnavailableTitle;
10891089+10901090+ /// Starter pack search unavailable state body
10911091+ ///
10921092+ /// In en, this message translates to:
10931093+ /// **'(Starter Pack Search is not yet implemented in the BlueSky API)'**
10941094+ String get messageStarterPackSearchUnavailableBody;
10951095+10961096+ /// Button label to open upstream API issue
10971097+ ///
10981098+ /// In en, this message translates to:
10991099+ /// **'Track API progress'**
11001100+ String get messageTrackApiProgress;
11011101+11021102+ /// Snackbar message when opening upstream issue link fails
11031103+ ///
11041104+ /// In en, this message translates to:
11051105+ /// **'Could not open issue link.'**
11061106+ String get messageCouldNotOpenIssueLink;
11071107+11081108+ /// Search posts field placeholder
11091109+ ///
11101110+ /// In en, this message translates to:
11111111+ /// **'Search posts'**
11121112+ String get messageSearchPostsPlaceholder;
11131113+11141114+ /// Search placeholder in profile posts-only mode
11151115+ ///
11161116+ /// In en, this message translates to:
11171117+ /// **'Search this profile\'\'s posts'**
11181118+ String get messageSearchThisProfilesPostsPlaceholder;
11191119+11201120+ /// Search people field placeholder
11211121+ ///
11221122+ /// In en, this message translates to:
11231123+ /// **'Search people'**
11241124+ String get messageSearchPeoplePlaceholder;
11251125+11261126+ /// Search feeds field placeholder
11271127+ ///
11281128+ /// In en, this message translates to:
11291129+ /// **'Search feeds'**
11301130+ String get messageSearchFeedsPlaceholder;
11311131+11321132+ /// Starter pack search field placeholder
11331133+ ///
11341134+ /// In en, this message translates to:
11351135+ /// **'Starter pack search unavailable'**
11361136+ String get messageStarterPackSearchUnavailablePlaceholder;
11371137+11381138+ /// Settings subtitle for Slingshot identity fallback
11391139+ ///
11401140+ /// In en, this message translates to:
11411141+ /// **'If handle lookup fails, use Slingshot to find your DID and PDS so sign-in can continue'**
11421142+ String get messageSlingshotIdentityFallbackSubtitle;
11431143+11441144+ /// Settings subtitle for thread auto-collapse
11451145+ ///
11461146+ /// In en, this message translates to:
11471147+ /// **'Collapse reply branches deeper than the selected level'**
11481148+ String get messageThreadAutoCollapseSubtitle;
11491149+11501150+ /// Settings subtitle for animations
11511151+ ///
11521152+ /// In en, this message translates to:
11531153+ /// **'Turn off non-essential motion effects'**
11541154+ String get messageTurnOffNonEssentialMotion;
11551155+11561156+ /// Settings subtitle for video upload limits
11571157+ ///
11581158+ /// In en, this message translates to:
11591159+ /// **'Check your daily video quota'**
11601160+ String get messageVideoUploadLimitsSubtitle;
11611161+11621162+ /// Placeholder for app password field
11631163+ ///
11641164+ /// In en, this message translates to:
11651165+ /// **'xxxx-xxxx-xxxx-xxxx'**
11661166+ String get placeholderAppPassword;
11671167+11681168+ /// Placeholder for handle or DID sign-in field
11691169+ ///
11701170+ /// In en, this message translates to:
11711171+ /// **'username.bsky.social or did:plc:...'**
11721172+ String get placeholderHandleOrDid;
11731173+11741174+ /// Label for handle or DID sign-in field
11751175+ ///
11761176+ /// In en, this message translates to:
11771177+ /// **'Handle or DID'**
11781178+ String get promptHandleOrDid;
11791179+11801180+ /// Validation error for missing app password
11811181+ ///
11821182+ /// In en, this message translates to:
11831183+ /// **'Enter your app password'**
11841184+ String get validationEnterAppPassword;
11851185+}
11861186+11871187+class _AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> {
11881188+ const _AppLocalizationsDelegate();
11891189+11901190+ @override
11911191+ Future<AppLocalizations> load(Locale locale) {
11921192+ return SynchronousFuture<AppLocalizations>(lookupAppLocalizations(locale));
11931193+ }
11941194+11951195+ @override
11961196+ bool isSupported(Locale locale) => <String>['en'].contains(locale.languageCode);
11971197+11981198+ @override
11991199+ bool shouldReload(_AppLocalizationsDelegate old) => false;
12001200+}
12011201+12021202+AppLocalizations lookupAppLocalizations(Locale locale) {
12031203+ // Lookup logic when only language code is specified.
12041204+ switch (locale.languageCode) {
12051205+ case 'en':
12061206+ return AppLocalizationsEn();
12071207+ }
12081208+12091209+ throw FlutterError(
12101210+ 'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely '
12111211+ 'an issue with the localizations generation tool. Please file an issue '
12121212+ 'on GitHub with a reproducible sample app and the gen-l10n configuration '
12131213+ 'that was used.',
12141214+ );
12151215+}
+594
lib/core/l10n/app_localizations_en.dart
···11+// ignore: unused_import
22+import 'package:intl/intl.dart' as intl;
33+import 'app_localizations.dart';
44+55+// ignore_for_file: type=lint
66+77+/// The translations for English (`en`).
88+class AppLocalizationsEn extends AppLocalizations {
99+ AppLocalizationsEn([String locale = 'en']) : super(locale);
1010+1111+ @override
1212+ String get appTitle => 'Lazurite';
1313+1414+ @override
1515+ String get buttonApplyAndRestart => 'Apply and Restart';
1616+1717+ @override
1818+ String get buttonCancel => 'Cancel';
1919+2020+ @override
2121+ String get buttonClearCache => 'Clear Cache';
2222+2323+ @override
2424+ String get buttonContinue => 'Continue';
2525+2626+ @override
2727+ String get buttonRemove => 'Remove';
2828+2929+ @override
3030+ String get buttonApply => 'Apply';
3131+3232+ @override
3333+ String get buttonClear => 'Clear';
3434+3535+ @override
3636+ String get buttonClearAll => 'Clear all';
3737+3838+ @override
3939+ String get buttonOpen => 'Open';
4040+4141+ @override
4242+ String get buttonResetSignInData => 'Reset Sign-In Data';
4343+4444+ @override
4545+ String get buttonRetry => 'Retry';
4646+4747+ @override
4848+ String get buttonSignIn => 'Sign In';
4949+5050+ @override
5151+ String get buttonShowContent => 'Show content';
5252+5353+ @override
5454+ String get buttonTryAgain => 'Try again';
5555+5656+ @override
5757+ String get commonNever => 'Never';
5858+5959+ @override
6060+ String get commonNone => 'None';
6161+6262+ @override
6363+ String get commonNotCheckedYet => 'Not checked yet';
6464+6565+ @override
6666+ String get commonOff => 'Off';
6767+6868+ @override
6969+ String get dialogClearCacheContent =>
7070+ 'This removes cached posts, profiles, images, feeds, threads, label data, and local semantic search data.\n\nAccounts, settings, drafts, bookmarks, and likes are kept.';
7171+7272+ @override
7373+ String get dialogClearCacheTitle => 'Clear cache?';
7474+7575+ @override
7676+ String dialogRemoveAccountContent(String handle) {
7777+ return 'Remove @$handle from this device?';
7878+ }
7979+8080+ @override
8181+ String get dialogRemoveAccountTitle => 'Remove Account';
8282+8383+ @override
8484+ String get dialogResetSignInDataContent =>
8585+ 'Use this only when troubleshooting sign-in or account switching.\n\nThis clears all local account sessions on this device and sends you back to sign in. It does not delete your Bluesky account or posts.';
8686+8787+ @override
8888+ String get dialogResetSignInDataTitle => 'Reset sign-in data?';
8989+9090+ @override
9191+ String get dialogSwitchAppViewProviderContent =>
9292+ 'Apply and restart now to rebuild network services.\n\nYou will stay signed in and no local data will be deleted.\n\nModeration labels, ranking, and trending results can differ between providers.';
9393+9494+ @override
9595+ String get dialogSwitchAppViewProviderTitle => 'Switch AppView provider?';
9696+9797+ @override
9898+ String errorFailedToSaveProviderSelection(Object error) {
9999+ return 'Failed to save provider selection: $error';
100100+ }
101101+102102+ @override
103103+ String errorFailedToClearCache(Object error) {
104104+ return 'Failed to clear cache: $error';
105105+ }
106106+107107+ @override
108108+ String get errorGenericTitle => 'Something went wrong';
109109+110110+ @override
111111+ String get errorUnableToRemoveAccount => 'Unable to remove account right now.';
112112+113113+ @override
114114+ String get labelRemoveAccount => 'Remove account';
115115+116116+ @override
117117+ String formatAccountsTapToSwitch(int count) {
118118+ String _temp0 = intl.Intl.pluralLogic(
119119+ count,
120120+ locale: localeName,
121121+ other: '$count accounts - tap to switch',
122122+ one: '1 account - tap to switch',
123123+ );
124124+ return '$_temp0';
125125+ }
126126+127127+ @override
128128+ String formatAppViewProviderSelected(String provider) {
129129+ return '$provider selected. Switching providers performs a soft restart.';
130130+ }
131131+132132+ @override
133133+ String formatContentModerationCustomLabelers(int count) {
134134+ String _temp0 = intl.Intl.pluralLogic(
135135+ count,
136136+ locale: localeName,
137137+ other: '$count custom labelers subscribed',
138138+ one: '1 custom labeler subscribed',
139139+ zero: 'No custom labelers subscribed',
140140+ );
141141+ return '$_temp0';
142142+ }
143143+144144+ @override
145145+ String formatDepth(int depth) {
146146+ return 'Depth $depth';
147147+ }
148148+149149+ @override
150150+ String get labelAbout => 'About';
151151+152152+ @override
153153+ String get labelAccount => 'Account';
154154+155155+ @override
156156+ String get labelAccountMaintenance => 'Account Maintenance';
157157+158158+ @override
159159+ String get labelActiveProvider => 'Active Provider';
160160+161161+ @override
162162+ String get labelAdultContent => 'Adult Content';
163163+164164+ @override
165165+ String get labelAdvanced => 'Advanced';
166166+167167+ @override
168168+ String get labelAlerts => 'ALERTS';
169169+170170+ @override
171171+ String get labelAnimations => 'Animations';
172172+173173+ @override
174174+ String get labelAppearance => 'Appearance';
175175+176176+ @override
177177+ String get labelAppPassword => 'App Password';
178178+179179+ @override
180180+ String get labelAppPasswordLogin => 'App Password Login';
181181+182182+ @override
183183+ String get labelAppViewProvider => 'AppView Provider';
184184+185185+ @override
186186+ String get labelAtExplorer => 'AT Explorer';
187187+188188+ @override
189189+ String get labelAtProtocolConnection => 'AT Protocol Connection';
190190+191191+ @override
192192+ String get labelAuditFollows => 'Audit Follows';
193193+194194+ @override
195195+ String get labelBack => 'Back';
196196+197197+ @override
198198+ String get labelBookmarksAndLikes => 'Bookmarks & Likes';
199199+200200+ @override
201201+ String get labelCacheCleared => 'Cache cleared';
202202+203203+ @override
204204+ String get labelChooseYourPortal => 'Choose your portal';
205205+206206+ @override
207207+ String get labelCleanFollows => 'Clean Follows';
208208+209209+ @override
210210+ String get labelClearCache => 'Clear Cache';
211211+212212+ @override
213213+ String get labelCommunity => 'Community';
214214+215215+ @override
216216+ String get labelConstellationUrl => 'Constellation URL';
217217+218218+ @override
219219+ String get labelContentModeration => 'Content Moderation';
220220+221221+ @override
222222+ String get labelContinueSignIn => 'Continue sign in';
223223+224224+ @override
225225+ String get labelCrashReporting => 'Crash Reporting';
226226+227227+ @override
228228+ String get labelCrashlyticsTestCrash => 'Crashlytics Test Crash';
229229+230230+ @override
231231+ String get labelCrossProviderFallback => 'Cross-Provider Fallback';
232232+233233+ @override
234234+ String get labelDangerZone => 'Danger Zone';
235235+236236+ @override
237237+ String get labelDark => 'Dark';
238238+239239+ @override
240240+ String get labelDebug => 'Debug';
241241+242242+ @override
243243+ String get labelDeveloper => 'Developer';
244244+245245+ @override
246246+ String get labelFeedLayout => 'Feed Layout';
247247+248248+ @override
249249+ String get labelFeeds => 'Feeds';
250250+251251+ @override
252252+ String get labelForceNextXrpc401 => 'Force Next XRPC 401';
253253+254254+ @override
255255+ String get labelGoOffline => 'Go Offline';
256256+257257+ @override
258258+ String get labelGuest => 'Guest';
259259+260260+ @override
261261+ String get labelHealth => 'Health';
262262+263263+ @override
264264+ String get labelHandle => 'Handle';
265265+266266+ @override
267267+ String get labelHide => 'Hide';
268268+269269+ @override
270270+ String get labelHome => 'HOME';
271271+272272+ @override
273273+ String get labelLastError => 'Last Error';
274274+275275+ @override
276276+ String get labelLastFallback => 'Last Fallback';
277277+278278+ @override
279279+ String get labelLastHealthCheck => 'Last Health Check';
280280+281281+ @override
282282+ String get labelLayout => 'Layout';
283283+284284+ @override
285285+ String get labelLight => 'Light';
286286+287287+ @override
288288+ String get labelLogOut => 'Log Out';
289289+290290+ @override
291291+ String get labelLogs => 'Logs';
292292+293293+ @override
294294+ String get labelMessages => 'Messages';
295295+296296+ @override
297297+ String get labelModeration => 'Moderation';
298298+299299+ @override
300300+ String get labelNavigation => 'Navigation';
301301+302302+ @override
303303+ String get labelNewPost => 'New Post';
304304+305305+ @override
306306+ String get labelNotifications => 'Notifications';
307307+308308+ @override
309309+ String get labelOpenMenu => 'Open menu';
310310+311311+ @override
312312+ String get labelPrivacyPolicy => 'Privacy Policy';
313313+314314+ @override
315315+ String get labelProfile => 'PROFILE';
316316+317317+ @override
318318+ String get labelProviderDiagnostics => 'Provider Diagnostics';
319319+320320+ @override
321321+ String get labelRefreshProviderHealth => 'Refresh Provider Health';
322322+323323+ @override
324324+ String get labelResetSignInData => 'Reset Sign-In Data';
325325+326326+ @override
327327+ String get labelRoamTheAtmosphere => 'Roam the ATmosphere';
328328+329329+ @override
330330+ String get labelSearch => 'Search';
331331+332332+ @override
333333+ String get labelSearchPosts => 'Search Posts';
334334+335335+ @override
336336+ String get labelJumpToProfile => 'Jump to profile';
337337+338338+ @override
339339+ String get labelPosts => 'Posts';
340340+341341+ @override
342342+ String get labelPeople => 'People';
343343+344344+ @override
345345+ String get labelStarterPacks => 'Starter Packs';
346346+347347+ @override
348348+ String get labelSortBy => 'Sort by';
349349+350350+ @override
351351+ String get labelTop => 'Top';
352352+353353+ @override
354354+ String get labelLatest => 'Latest';
355355+356356+ @override
357357+ String get labelFilters => 'Filters';
358358+359359+ @override
360360+ String get labelPostFilters => 'Post filters';
361361+362362+ @override
363363+ String get labelMentions => 'Mentions';
364364+365365+ @override
366366+ String get labelAuthor => 'Author';
367367+368368+ @override
369369+ String get labelAuthorFixed => 'Author (fixed)';
370370+371371+ @override
372372+ String get labelLanguage => 'Language';
373373+374374+ @override
375375+ String get labelDomain => 'Domain';
376376+377377+ @override
378378+ String get labelUrl => 'URL';
379379+380380+ @override
381381+ String get labelTags => 'Tags';
382382+383383+ @override
384384+ String get labelSince => 'Since';
385385+386386+ @override
387387+ String get labelUntil => 'Until';
388388+389389+ @override
390390+ String get labelClearSince => 'Clear since';
391391+392392+ @override
393393+ String get labelClearUntil => 'Clear until';
394394+395395+ @override
396396+ String get labelSavedAccounts => 'Saved accounts';
397397+398398+ @override
399399+ String get labelSearchNav => 'SEARCH';
400400+401401+ @override
402402+ String get labelSemanticSearch => 'Semantic Search';
403403+404404+ @override
405405+ String get labelSettings => 'Settings';
406406+407407+ @override
408408+ String get labelShow => 'Show';
409409+410410+ @override
411411+ String get labelSignInRequired => 'Sign in required';
412412+413413+ @override
414414+ String get labelSlingshotIdentityFallback => 'Slingshot Identity Fallback';
415415+416416+ @override
417417+ String get labelStartingSignIn => 'Starting sign in';
418418+419419+ @override
420420+ String get labelSystem => 'System';
421421+422422+ @override
423423+ String get labelTermsOfService => 'Terms of Service';
424424+425425+ @override
426426+ String get labelTheme => 'THEME';
427427+428428+ @override
429429+ String get labelThreadAutoCollapse => 'Thread Auto-Collapse';
430430+431431+ @override
432432+ String get labelTroubleshooting => 'Troubleshooting';
433433+434434+ @override
435435+ String get labelTypeaheadProvider => 'Typeahead Provider';
436436+437437+ @override
438438+ String get labelVideoUploadLimits => 'Video Upload Limits';
439439+440440+ @override
441441+ String get messageAppPasswordGeneratedViaBluesky =>
442442+ 'Can be generated via Bluesky\'s App Passwords section at bsky.app.';
443443+444444+ @override
445445+ String get messageAppViewDebug401Armed => 'Armed: next XRPC request will return debug 401 Unauthorized';
446446+447447+ @override
448448+ String get messageBlueskyEndpointSelected => 'Bluesky official endpoint selected.';
449449+450450+ @override
451451+ String get messageBookmarksAndLikesSubtitle => 'View your bookmarked and liked posts';
452452+453453+ @override
454454+ String get messageChooseProviderSubtitle => 'Choose the AppView provider used for sign in and public reads.';
455455+456456+ @override
457457+ String get messageCleanFollowsSubtitle => 'Audit and unfollow problematic accounts in bulk';
458458+459459+ @override
460460+ String get messageClearCacheSubtitle =>
461461+ 'Remove cached posts, profiles, images, feeds, threads, and semantic search data';
462462+463463+ @override
464464+ String get messageCommunityTypeaheadSelected => 'Community (waow.tech) selected. Third-party service.';
465465+466466+ @override
467467+ String get messageContentModerationSubtitle => 'Manage labelers and visibility rules';
468468+469469+ @override
470470+ String get messageAdultContentEnabled => '18+ labels can be configured';
471471+472472+ @override
473473+ String get messageAdultContentRequired => 'Required before 18+ labels can be configured';
474474+475475+ @override
476476+ String get messageCrashReportingDisabled => 'Disabled. Crash and error reports are not sent.';
477477+478478+ @override
479479+ String get messageCrashReportingEnabled => 'Enabled. Crash and error reports are sent to improve stability.';
480480+481481+ @override
482482+ String get messageCrashlyticsTestCrashSubtitle => 'Intentionally crash to validate Crashlytics reports';
483483+484484+ @override
485485+ String get messageCrossProviderFallbackSubtitle =>
486486+ 'Retry public reads on the alternate AppView when transient errors occur';
487487+488488+ @override
489489+ String get messageDeveloperGoOfflineSubtitle => 'Turn off online connectivity';
490490+491491+ @override
492492+ String get messageFeedLayoutCard => 'Card';
493493+494494+ @override
495495+ String get messageLoadingSavedAccounts => 'Loading saved accounts...';
496496+497497+ @override
498498+ String get messageFeedLayoutCompact => 'Compact';
499499+500500+ @override
501501+ String get messageFeedsSubtitle => 'Manage pinned and saved feeds';
502502+503503+ @override
504504+ String get messageForceNextXrpc401Subtitle =>
505505+ 'Debug-only: next network request returns Unauthorized to test token refresh';
506506+507507+ @override
508508+ String get messageManageSemanticSearchSubtitle => 'Manage semantic search from Bookmarks & Likes -> Search';
509509+510510+ @override
511511+ String get messageModeratedContentCannotReveal => 'Hidden by your moderation settings and cannot be revealed here.';
512512+513513+ @override
514514+ String get messageModeratedContentCanReveal => 'Hidden by your moderation settings. You can reveal it for this view.';
515515+516516+ @override
517517+ String get messageProviderDiagnosticsSubtitle =>
518518+ 'Moderation/ranking can differ by provider. Verify health and recent fallback state.';
519519+520520+ @override
521521+ String get messageRefreshProviderHealthSubtitle => 'Probe public AppView endpoints now';
522522+523523+ @override
524524+ String get messageResetSignInDataSubtitle =>
525525+ 'Troubleshoot OAuth or account-switching issues by clearing local sessions on this device';
526526+527527+ @override
528528+ String get messageSearchSubtitle => 'Search';
529529+530530+ @override
531531+ String get messageClearSearchHistoryContent => 'This will delete all your recent searches.';
532532+533533+ @override
534534+ String get messageClearSearchHistoryTitle => 'Clear search history?';
535535+536536+ @override
537537+ String get messageStartTypingToSearchHandles => 'Start typing to search handles.';
538538+539539+ @override
540540+ String get messageStarterPackSearchApiUnavailable => 'Starter pack search is not available in the API yet.';
541541+542542+ @override
543543+ String get messageStarterPackSearchUnavailableTitle => 'Starter Pack Search Is Unavailable';
544544+545545+ @override
546546+ String get messageStarterPackSearchUnavailableBody =>
547547+ '(Starter Pack Search is not yet implemented in the BlueSky API)';
548548+549549+ @override
550550+ String get messageTrackApiProgress => 'Track API progress';
551551+552552+ @override
553553+ String get messageCouldNotOpenIssueLink => 'Could not open issue link.';
554554+555555+ @override
556556+ String get messageSearchPostsPlaceholder => 'Search posts';
557557+558558+ @override
559559+ String get messageSearchThisProfilesPostsPlaceholder => 'Search this profile\'s posts';
560560+561561+ @override
562562+ String get messageSearchPeoplePlaceholder => 'Search people';
563563+564564+ @override
565565+ String get messageSearchFeedsPlaceholder => 'Search feeds';
566566+567567+ @override
568568+ String get messageStarterPackSearchUnavailablePlaceholder => 'Starter pack search unavailable';
569569+570570+ @override
571571+ String get messageSlingshotIdentityFallbackSubtitle =>
572572+ 'If handle lookup fails, use Slingshot to find your DID and PDS so sign-in can continue';
573573+574574+ @override
575575+ String get messageThreadAutoCollapseSubtitle => 'Collapse reply branches deeper than the selected level';
576576+577577+ @override
578578+ String get messageTurnOffNonEssentialMotion => 'Turn off non-essential motion effects';
579579+580580+ @override
581581+ String get messageVideoUploadLimitsSubtitle => 'Check your daily video quota';
582582+583583+ @override
584584+ String get placeholderAppPassword => 'xxxx-xxxx-xxxx-xxxx';
585585+586586+ @override
587587+ String get placeholderHandleOrDid => 'username.bsky.social or did:plc:...';
588588+589589+ @override
590590+ String get promptHandleOrDid => 'Handle or DID';
591591+592592+ @override
593593+ String get validationEnterAppPassword => 'Enter your app password';
594594+}
+776
lib/core/l10n/intl_en.arb
···11+{
22+ "@@locale": "en",
33+ "@@context": "Lazurite English localization strings",
44+ "appTitle": "Lazurite",
55+ "@appTitle": {
66+ "description": "Application title"
77+ },
88+ "buttonApplyAndRestart": "Apply and Restart",
99+ "@buttonApplyAndRestart": {
1010+ "description": "Button label to apply a setting and restart app services"
1111+ },
1212+ "buttonCancel": "Cancel",
1313+ "@buttonCancel": {
1414+ "description": "Cancel button label"
1515+ },
1616+ "buttonClearCache": "Clear Cache",
1717+ "@buttonClearCache": {
1818+ "description": "Button label to clear local cache"
1919+ },
2020+ "buttonContinue": "Continue",
2121+ "@buttonContinue": {
2222+ "description": "Continue button label"
2323+ },
2424+ "buttonRemove": "Remove",
2525+ "@buttonRemove": {
2626+ "description": "Remove button label"
2727+ },
2828+ "buttonApply": "Apply",
2929+ "@buttonApply": {
3030+ "description": "Apply button label"
3131+ },
3232+ "buttonClear": "Clear",
3333+ "@buttonClear": {
3434+ "description": "Clear button label"
3535+ },
3636+ "buttonClearAll": "Clear all",
3737+ "@buttonClearAll": {
3838+ "description": "Clear all filters button label"
3939+ },
4040+ "buttonOpen": "Open",
4141+ "@buttonOpen": {
4242+ "description": "Open button label"
4343+ },
4444+ "buttonResetSignInData": "Reset Sign-In Data",
4545+ "@buttonResetSignInData": {
4646+ "description": "Button label to clear local sign-in data"
4747+ },
4848+ "buttonRetry": "Retry",
4949+ "@buttonRetry": {
5050+ "description": "Retry button label"
5151+ },
5252+ "buttonSignIn": "Sign In",
5353+ "@buttonSignIn": {
5454+ "description": "Sign in button label"
5555+ },
5656+ "buttonShowContent": "Show content",
5757+ "@buttonShowContent": {
5858+ "description": "Button label to reveal moderated content"
5959+ },
6060+ "buttonTryAgain": "Try again",
6161+ "@buttonTryAgain": {
6262+ "description": "Try again button label"
6363+ },
6464+ "commonNever": "Never",
6565+ "@commonNever": {
6666+ "description": "Label for a value that has never happened"
6767+ },
6868+ "commonNone": "None",
6969+ "@commonNone": {
7070+ "description": "Label for no value"
7171+ },
7272+ "commonNotCheckedYet": "Not checked yet",
7373+ "@commonNotCheckedYet": {
7474+ "description": "Label for a health check that has not run"
7575+ },
7676+ "commonOff": "Off",
7777+ "@commonOff": {
7878+ "description": "Disabled option label"
7979+ },
8080+ "dialogClearCacheContent": "This removes cached posts, profiles, images, feeds, threads, label data, and local semantic search data.\n\nAccounts, settings, drafts, bookmarks, and likes are kept.",
8181+ "@dialogClearCacheContent": {
8282+ "description": "Confirmation dialog body before clearing local cache"
8383+ },
8484+ "dialogClearCacheTitle": "Clear cache?",
8585+ "@dialogClearCacheTitle": {
8686+ "description": "Confirmation dialog title before clearing local cache"
8787+ },
8888+ "dialogRemoveAccountContent": "Remove @{handle} from this device?",
8989+ "@dialogRemoveAccountContent": {
9090+ "description": "Confirmation dialog body before removing a saved account from this device",
9191+ "placeholders": {
9292+ "handle": {
9393+ "type": "String",
9494+ "example": "alice.bsky.social"
9595+ }
9696+ }
9797+ },
9898+ "dialogRemoveAccountTitle": "Remove Account",
9999+ "@dialogRemoveAccountTitle": {
100100+ "description": "Confirmation dialog title before removing a saved account"
101101+ },
102102+ "dialogResetSignInDataContent": "Use this only when troubleshooting sign-in or account switching.\n\nThis clears all local account sessions on this device and sends you back to sign in. It does not delete your Bluesky account or posts.",
103103+ "@dialogResetSignInDataContent": {
104104+ "description": "Confirmation dialog body before clearing local sign-in data"
105105+ },
106106+ "dialogResetSignInDataTitle": "Reset sign-in data?",
107107+ "@dialogResetSignInDataTitle": {
108108+ "description": "Confirmation dialog title before clearing local sign-in data"
109109+ },
110110+ "dialogSwitchAppViewProviderContent": "Apply and restart now to rebuild network services.\n\nYou will stay signed in and no local data will be deleted.\n\nModeration labels, ranking, and trending results can differ between providers.",
111111+ "@dialogSwitchAppViewProviderContent": {
112112+ "description": "Confirmation dialog body before switching AppView provider"
113113+ },
114114+ "dialogSwitchAppViewProviderTitle": "Switch AppView provider?",
115115+ "@dialogSwitchAppViewProviderTitle": {
116116+ "description": "Confirmation dialog title before switching AppView provider"
117117+ },
118118+ "errorFailedToSaveProviderSelection": "Failed to save provider selection: {error}",
119119+ "@errorFailedToSaveProviderSelection": {
120120+ "description": "Snackbar message when persisting selected provider fails",
121121+ "placeholders": {
122122+ "error": {
123123+ "type": "Object",
124124+ "example": "database unavailable"
125125+ }
126126+ }
127127+ },
128128+ "errorFailedToClearCache": "Failed to clear cache: {error}",
129129+ "@errorFailedToClearCache": {
130130+ "description": "Snackbar message when cache clearing fails",
131131+ "placeholders": {
132132+ "error": {
133133+ "type": "Object",
134134+ "example": "permission denied"
135135+ }
136136+ }
137137+ },
138138+ "errorGenericTitle": "Something went wrong",
139139+ "@errorGenericTitle": {
140140+ "description": "Generic error state title"
141141+ },
142142+ "errorUnableToRemoveAccount": "Unable to remove account right now.",
143143+ "@errorUnableToRemoveAccount": {
144144+ "description": "Snackbar message when a saved account cannot be removed"
145145+ },
146146+ "labelRemoveAccount": "Remove account",
147147+ "@labelRemoveAccount": {
148148+ "description": "Tooltip for removing a saved account"
149149+ },
150150+ "formatAccountsTapToSwitch": "{count, plural, =1{1 account - tap to switch} other{{count} accounts - tap to switch}}",
151151+ "@formatAccountsTapToSwitch": {
152152+ "description": "Settings account row subtitle when multiple accounts are available",
153153+ "placeholders": {
154154+ "count": {
155155+ "type": "int",
156156+ "example": "2"
157157+ }
158158+ }
159159+ },
160160+ "formatAppViewProviderSelected": "{provider} selected. Switching providers performs a soft restart.",
161161+ "@formatAppViewProviderSelected": {
162162+ "description": "Settings subtitle for selected AppView provider",
163163+ "placeholders": {
164164+ "provider": {
165165+ "type": "String",
166166+ "example": "Bluesky"
167167+ }
168168+ }
169169+ },
170170+ "formatContentModerationCustomLabelers": "{count, plural, =0{No custom labelers subscribed} =1{1 custom labeler subscribed} other{{count} custom labelers subscribed}}",
171171+ "@formatContentModerationCustomLabelers": {
172172+ "description": "Settings subtitle showing the count of subscribed custom moderation labelers",
173173+ "placeholders": {
174174+ "count": {
175175+ "type": "int",
176176+ "example": "2"
177177+ }
178178+ }
179179+ },
180180+ "formatDepth": "Depth {depth}",
181181+ "@formatDepth": {
182182+ "description": "Thread auto-collapse depth setting option",
183183+ "placeholders": {
184184+ "depth": {
185185+ "type": "int",
186186+ "example": "3"
187187+ }
188188+ }
189189+ },
190190+ "labelAbout": "About",
191191+ "@labelAbout": {
192192+ "description": "About page or settings label"
193193+ },
194194+ "labelAccount": "Account",
195195+ "@labelAccount": {
196196+ "description": "Account settings section label"
197197+ },
198198+ "labelAccountMaintenance": "Account Maintenance",
199199+ "@labelAccountMaintenance": {
200200+ "description": "Settings section for account maintenance actions"
201201+ },
202202+ "labelActiveProvider": "Active Provider",
203203+ "@labelActiveProvider": {
204204+ "description": "Provider diagnostics label for active provider"
205205+ },
206206+ "labelAdultContent": "Adult Content",
207207+ "@labelAdultContent": {
208208+ "description": "Adult content setting label"
209209+ },
210210+ "labelAdvanced": "Advanced",
211211+ "@labelAdvanced": {
212212+ "description": "Advanced settings section label"
213213+ },
214214+ "labelAlerts": "ALERTS",
215215+ "@labelAlerts": {
216216+ "description": "Bottom navigation alerts label"
217217+ },
218218+ "labelAnimations": "Animations",
219219+ "@labelAnimations": {
220220+ "description": "Animations settings label"
221221+ },
222222+ "labelAppearance": "Appearance",
223223+ "@labelAppearance": {
224224+ "description": "Appearance settings section label"
225225+ },
226226+ "labelAppPassword": "App Password",
227227+ "@labelAppPassword": {
228228+ "description": "Debug app password field label"
229229+ },
230230+ "labelAppPasswordLogin": "App Password Login",
231231+ "@labelAppPasswordLogin": {
232232+ "description": "Debug app password login card title"
233233+ },
234234+ "labelAppViewProvider": "AppView Provider",
235235+ "@labelAppViewProvider": {
236236+ "description": "AppView provider settings label"
237237+ },
238238+ "labelAtExplorer": "AT Explorer",
239239+ "@labelAtExplorer": {
240240+ "description": "AT Protocol explorer settings/menu label"
241241+ },
242242+ "labelAtProtocolConnection": "AT Protocol Connection",
243243+ "@labelAtProtocolConnection": {
244244+ "description": "Settings section title for AT Protocol connection details"
245245+ },
246246+ "labelAuditFollows": "Audit Follows",
247247+ "@labelAuditFollows": {
248248+ "description": "Menu item for follow audit feature"
249249+ },
250250+ "labelBack": "Back",
251251+ "@labelBack": {
252252+ "description": "Back tooltip label"
253253+ },
254254+ "labelBookmarksAndLikes": "Bookmarks & Likes",
255255+ "@labelBookmarksAndLikes": {
256256+ "description": "Settings item for bookmarked and liked posts"
257257+ },
258258+ "labelCacheCleared": "Cache cleared",
259259+ "@labelCacheCleared": {
260260+ "description": "Snackbar message after clearing cache"
261261+ },
262262+ "labelChooseYourPortal": "Choose your portal",
263263+ "@labelChooseYourPortal": {
264264+ "description": "Login provider selection label"
265265+ },
266266+ "labelCleanFollows": "Clean Follows",
267267+ "@labelCleanFollows": {
268268+ "description": "Settings item for follow audit feature"
269269+ },
270270+ "labelClearCache": "Clear Cache",
271271+ "@labelClearCache": {
272272+ "description": "Settings item for clearing cache"
273273+ },
274274+ "labelCommunity": "Community",
275275+ "@labelCommunity": {
276276+ "description": "Community provider option label"
277277+ },
278278+ "labelConstellationUrl": "Constellation URL",
279279+ "@labelConstellationUrl": {
280280+ "description": "Constellation URL setting label"
281281+ },
282282+ "labelContentModeration": "Content Moderation",
283283+ "@labelContentModeration": {
284284+ "description": "Content moderation settings label"
285285+ },
286286+ "labelContinueSignIn": "Continue sign in",
287287+ "@labelContinueSignIn": {
288288+ "description": "Semantic label for continuing sign in"
289289+ },
290290+ "labelCrashReporting": "Crash Reporting",
291291+ "@labelCrashReporting": {
292292+ "description": "Crash reporting setting label"
293293+ },
294294+ "labelCrashlyticsTestCrash": "Crashlytics Test Crash",
295295+ "@labelCrashlyticsTestCrash": {
296296+ "description": "Developer setting to trigger a test crash"
297297+ },
298298+ "labelCrossProviderFallback": "Cross-Provider Fallback",
299299+ "@labelCrossProviderFallback": {
300300+ "description": "Cross-provider fallback setting label"
301301+ },
302302+ "labelDangerZone": "Danger Zone",
303303+ "@labelDangerZone": {
304304+ "description": "Destructive settings section label"
305305+ },
306306+ "labelDark": "Dark",
307307+ "@labelDark": {
308308+ "description": "Dark theme option label"
309309+ },
310310+ "labelDebug": "Debug",
311311+ "@labelDebug": {
312312+ "description": "Debug section label"
313313+ },
314314+ "labelDeveloper": "Developer",
315315+ "@labelDeveloper": {
316316+ "description": "Developer settings section label"
317317+ },
318318+ "labelFeedLayout": "Feed Layout",
319319+ "@labelFeedLayout": {
320320+ "description": "Feed layout setting label"
321321+ },
322322+ "labelFeeds": "Feeds",
323323+ "@labelFeeds": {
324324+ "description": "Feeds menu/settings label"
325325+ },
326326+ "labelForceNextXrpc401": "Force Next XRPC 401",
327327+ "@labelForceNextXrpc401": {
328328+ "description": "Developer setting to force the next XRPC request to return Unauthorized"
329329+ },
330330+ "labelGoOffline": "Go Offline",
331331+ "@labelGoOffline": {
332332+ "description": "Developer setting to simulate offline mode"
333333+ },
334334+ "labelGuest": "Guest",
335335+ "@labelGuest": {
336336+ "description": "Fallback account display name when no user is signed in"
337337+ },
338338+ "labelHealth": "Health",
339339+ "@labelHealth": {
340340+ "description": "Provider diagnostics health label"
341341+ },
342342+ "labelHandle": "Handle",
343343+ "@labelHandle": {
344344+ "description": "Handle field label"
345345+ },
346346+ "labelHide": "Hide",
347347+ "@labelHide": {
348348+ "description": "Hide button label"
349349+ },
350350+ "labelHome": "HOME",
351351+ "@labelHome": {
352352+ "description": "Bottom navigation home label"
353353+ },
354354+ "labelLastError": "Last Error",
355355+ "@labelLastError": {
356356+ "description": "Provider diagnostics last error label"
357357+ },
358358+ "labelLastFallback": "Last Fallback",
359359+ "@labelLastFallback": {
360360+ "description": "Provider diagnostics last fallback label"
361361+ },
362362+ "labelLastHealthCheck": "Last Health Check",
363363+ "@labelLastHealthCheck": {
364364+ "description": "Provider diagnostics last health check label"
365365+ },
366366+ "labelLayout": "Layout",
367367+ "@labelLayout": {
368368+ "description": "Layout settings section label"
369369+ },
370370+ "labelLight": "Light",
371371+ "@labelLight": {
372372+ "description": "Light theme option label"
373373+ },
374374+ "labelLogOut": "Log Out",
375375+ "@labelLogOut": {
376376+ "description": "Log out button or menu label"
377377+ },
378378+ "labelLogs": "Logs",
379379+ "@labelLogs": {
380380+ "description": "Logs settings label"
381381+ },
382382+ "labelMessages": "Messages",
383383+ "@labelMessages": {
384384+ "description": "Messages menu label"
385385+ },
386386+ "labelModeration": "Moderation",
387387+ "@labelModeration": {
388388+ "description": "Moderation settings section label"
389389+ },
390390+ "labelNavigation": "Navigation",
391391+ "@labelNavigation": {
392392+ "description": "Navigation menu section label"
393393+ },
394394+ "labelNewPost": "New Post",
395395+ "@labelNewPost": {
396396+ "description": "New post menu label"
397397+ },
398398+ "labelNotifications": "Notifications",
399399+ "@labelNotifications": {
400400+ "description": "Notifications menu label"
401401+ },
402402+ "labelOpenMenu": "Open menu",
403403+ "@labelOpenMenu": {
404404+ "description": "Tooltip for opening the navigation menu"
405405+ },
406406+ "labelPrivacyPolicy": "Privacy Policy",
407407+ "@labelPrivacyPolicy": {
408408+ "description": "Privacy policy link label"
409409+ },
410410+ "labelProfile": "PROFILE",
411411+ "@labelProfile": {
412412+ "description": "Bottom navigation profile label"
413413+ },
414414+ "labelProviderDiagnostics": "Provider Diagnostics",
415415+ "@labelProviderDiagnostics": {
416416+ "description": "Settings section for provider diagnostics"
417417+ },
418418+ "labelRefreshProviderHealth": "Refresh Provider Health",
419419+ "@labelRefreshProviderHealth": {
420420+ "description": "Settings item for refreshing provider health"
421421+ },
422422+ "labelResetSignInData": "Reset Sign-In Data",
423423+ "@labelResetSignInData": {
424424+ "description": "Settings item for resetting local sign-in data"
425425+ },
426426+ "labelRoamTheAtmosphere": "Roam the ATmosphere",
427427+ "@labelRoamTheAtmosphere": {
428428+ "description": "Login screen subtitle"
429429+ },
430430+ "labelSearch": "Search",
431431+ "@labelSearch": {
432432+ "description": "Search menu/settings label"
433433+ },
434434+ "labelSearchPosts": "Search Posts",
435435+ "@labelSearchPosts": {
436436+ "description": "Title for posts-only search mode"
437437+ },
438438+ "labelJumpToProfile": "Jump to profile",
439439+ "@labelJumpToProfile": {
440440+ "description": "Button and dialog title for jumping directly to a profile"
441441+ },
442442+ "labelPosts": "Posts",
443443+ "@labelPosts": {
444444+ "description": "Posts tab label"
445445+ },
446446+ "labelPeople": "People",
447447+ "@labelPeople": {
448448+ "description": "People tab label"
449449+ },
450450+ "labelStarterPacks": "Starter Packs",
451451+ "@labelStarterPacks": {
452452+ "description": "Starter packs tab label"
453453+ },
454454+ "labelSortBy": "Sort by",
455455+ "@labelSortBy": {
456456+ "description": "Sort control label"
457457+ },
458458+ "labelTop": "Top",
459459+ "@labelTop": {
460460+ "description": "Top sort option label"
461461+ },
462462+ "labelLatest": "Latest",
463463+ "@labelLatest": {
464464+ "description": "Latest sort option label"
465465+ },
466466+ "labelFilters": "Filters",
467467+ "@labelFilters": {
468468+ "description": "Search filters button label"
469469+ },
470470+ "labelPostFilters": "Post filters",
471471+ "@labelPostFilters": {
472472+ "description": "Post filters sheet title"
473473+ },
474474+ "labelMentions": "Mentions",
475475+ "@labelMentions": {
476476+ "description": "Mentions filter label"
477477+ },
478478+ "labelAuthor": "Author",
479479+ "@labelAuthor": {
480480+ "description": "Author filter label"
481481+ },
482482+ "labelAuthorFixed": "Author (fixed)",
483483+ "@labelAuthorFixed": {
484484+ "description": "Fixed author filter label"
485485+ },
486486+ "labelLanguage": "Language",
487487+ "@labelLanguage": {
488488+ "description": "Language filter label"
489489+ },
490490+ "labelDomain": "Domain",
491491+ "@labelDomain": {
492492+ "description": "Domain filter label"
493493+ },
494494+ "labelUrl": "URL",
495495+ "@labelUrl": {
496496+ "description": "URL filter label"
497497+ },
498498+ "labelTags": "Tags",
499499+ "@labelTags": {
500500+ "description": "Tags filter label"
501501+ },
502502+ "labelSince": "Since",
503503+ "@labelSince": {
504504+ "description": "Since date filter label"
505505+ },
506506+ "labelUntil": "Until",
507507+ "@labelUntil": {
508508+ "description": "Until date filter label"
509509+ },
510510+ "labelClearSince": "Clear since",
511511+ "@labelClearSince": {
512512+ "description": "Button label to clear since date filter"
513513+ },
514514+ "labelClearUntil": "Clear until",
515515+ "@labelClearUntil": {
516516+ "description": "Button label to clear until date filter"
517517+ },
518518+ "labelSavedAccounts": "Saved accounts",
519519+ "@labelSavedAccounts": {
520520+ "description": "Saved accounts section label on login screen"
521521+ },
522522+ "labelSearchNav": "SEARCH",
523523+ "@labelSearchNav": {
524524+ "description": "Bottom navigation search label"
525525+ },
526526+ "labelSemanticSearch": "Semantic Search",
527527+ "@labelSemanticSearch": {
528528+ "description": "Semantic search settings label"
529529+ },
530530+ "labelSettings": "Settings",
531531+ "@labelSettings": {
532532+ "description": "Settings page title or tooltip"
533533+ },
534534+ "labelShow": "Show",
535535+ "@labelShow": {
536536+ "description": "Show button label"
537537+ },
538538+ "labelSignInRequired": "Sign in required",
539539+ "@labelSignInRequired": {
540540+ "description": "Fallback account handle text when sign in is required"
541541+ },
542542+ "labelSlingshotIdentityFallback": "Slingshot Identity Fallback",
543543+ "@labelSlingshotIdentityFallback": {
544544+ "description": "Slingshot identity fallback setting label"
545545+ },
546546+ "labelStartingSignIn": "Starting sign in",
547547+ "@labelStartingSignIn": {
548548+ "description": "Tooltip while sign in is starting"
549549+ },
550550+ "labelSystem": "System",
551551+ "@labelSystem": {
552552+ "description": "System theme option label"
553553+ },
554554+ "labelTermsOfService": "Terms of Service",
555555+ "@labelTermsOfService": {
556556+ "description": "Terms of service link label"
557557+ },
558558+ "labelTheme": "THEME",
559559+ "@labelTheme": {
560560+ "description": "Theme subsection label in settings"
561561+ },
562562+ "labelThreadAutoCollapse": "Thread Auto-Collapse",
563563+ "@labelThreadAutoCollapse": {
564564+ "description": "Thread auto-collapse setting label"
565565+ },
566566+ "labelTroubleshooting": "Troubleshooting",
567567+ "@labelTroubleshooting": {
568568+ "description": "Troubleshooting settings section label"
569569+ },
570570+ "labelTypeaheadProvider": "Typeahead Provider",
571571+ "@labelTypeaheadProvider": {
572572+ "description": "Typeahead provider settings label"
573573+ },
574574+ "labelVideoUploadLimits": "Video Upload Limits",
575575+ "@labelVideoUploadLimits": {
576576+ "description": "Video upload limits settings label"
577577+ },
578578+ "messageAppPasswordGeneratedViaBluesky": "Can be generated via Bluesky''s App Passwords section at bsky.app.",
579579+ "@messageAppPasswordGeneratedViaBluesky": {
580580+ "description": "Debug app password help text"
581581+ },
582582+ "messageAppViewDebug401Armed": "Armed: next XRPC request will return debug 401 Unauthorized",
583583+ "@messageAppViewDebug401Armed": {
584584+ "description": "Snackbar message after arming debug unauthorized response"
585585+ },
586586+ "messageBlueskyEndpointSelected": "Bluesky official endpoint selected.",
587587+ "@messageBlueskyEndpointSelected": {
588588+ "description": "Settings subtitle for Bluesky typeahead provider"
589589+ },
590590+ "messageBookmarksAndLikesSubtitle": "View your bookmarked and liked posts",
591591+ "@messageBookmarksAndLikesSubtitle": {
592592+ "description": "Settings subtitle for bookmarks and likes"
593593+ },
594594+ "messageChooseProviderSubtitle": "Choose the AppView provider used for sign in and public reads.",
595595+ "@messageChooseProviderSubtitle": {
596596+ "description": "Login screen provider selection helper text"
597597+ },
598598+ "messageCleanFollowsSubtitle": "Audit and unfollow problematic accounts in bulk",
599599+ "@messageCleanFollowsSubtitle": {
600600+ "description": "Settings subtitle for clean follows"
601601+ },
602602+ "messageClearCacheSubtitle": "Remove cached posts, profiles, images, feeds, threads, and semantic search data",
603603+ "@messageClearCacheSubtitle": {
604604+ "description": "Settings subtitle for clearing cache"
605605+ },
606606+ "messageCommunityTypeaheadSelected": "Community (waow.tech) selected. Third-party service.",
607607+ "@messageCommunityTypeaheadSelected": {
608608+ "description": "Settings subtitle for community typeahead provider"
609609+ },
610610+ "messageContentModerationSubtitle": "Manage labelers and visibility rules",
611611+ "@messageContentModerationSubtitle": {
612612+ "description": "Settings subtitle for content moderation"
613613+ },
614614+ "messageAdultContentEnabled": "18+ labels can be configured",
615615+ "@messageAdultContentEnabled": {
616616+ "description": "Settings subtitle when adult content preference is enabled"
617617+ },
618618+ "messageAdultContentRequired": "Required before 18+ labels can be configured",
619619+ "@messageAdultContentRequired": {
620620+ "description": "Settings subtitle when adult content preference is disabled"
621621+ },
622622+ "messageCrashReportingDisabled": "Disabled. Crash and error reports are not sent.",
623623+ "@messageCrashReportingDisabled": {
624624+ "description": "Settings subtitle when crash reporting is disabled"
625625+ },
626626+ "messageCrashReportingEnabled": "Enabled. Crash and error reports are sent to improve stability.",
627627+ "@messageCrashReportingEnabled": {
628628+ "description": "Settings subtitle when crash reporting is enabled"
629629+ },
630630+ "messageCrashlyticsTestCrashSubtitle": "Intentionally crash to validate Crashlytics reports",
631631+ "@messageCrashlyticsTestCrashSubtitle": {
632632+ "description": "Developer setting subtitle for test crash"
633633+ },
634634+ "messageCrossProviderFallbackSubtitle": "Retry public reads on the alternate AppView when transient errors occur",
635635+ "@messageCrossProviderFallbackSubtitle": {
636636+ "description": "Settings subtitle for cross-provider fallback"
637637+ },
638638+ "messageDeveloperGoOfflineSubtitle": "Turn off online connectivity",
639639+ "@messageDeveloperGoOfflineSubtitle": {
640640+ "description": "Developer setting subtitle for simulated offline"
641641+ },
642642+ "messageFeedLayoutCard": "Card",
643643+ "@messageFeedLayoutCard": {
644644+ "description": "Feed layout card option"
645645+ },
646646+ "messageLoadingSavedAccounts": "Loading saved accounts...",
647647+ "@messageLoadingSavedAccounts": {
648648+ "description": "Loading message while saved accounts load"
649649+ },
650650+ "messageFeedLayoutCompact": "Compact",
651651+ "@messageFeedLayoutCompact": {
652652+ "description": "Feed layout compact option"
653653+ },
654654+ "messageFeedsSubtitle": "Manage pinned and saved feeds",
655655+ "@messageFeedsSubtitle": {
656656+ "description": "Settings subtitle for feeds"
657657+ },
658658+ "messageForceNextXrpc401Subtitle": "Debug-only: next network request returns Unauthorized to test token refresh",
659659+ "@messageForceNextXrpc401Subtitle": {
660660+ "description": "Developer setting subtitle for forced 401"
661661+ },
662662+ "messageManageSemanticSearchSubtitle": "Manage semantic search from Bookmarks & Likes -> Search",
663663+ "@messageManageSemanticSearchSubtitle": {
664664+ "description": "Settings subtitle for semantic search management"
665665+ },
666666+667667+ "messageModeratedContentCannotReveal": "Hidden by your moderation settings and cannot be revealed here.",
668668+ "@messageModeratedContentCannotReveal": {
669669+ "description": "Moderation overlay description when content cannot be revealed"
670670+ },
671671+672672+ "messageModeratedContentCanReveal": "Hidden by your moderation settings. You can reveal it for this view.",
673673+ "@messageModeratedContentCanReveal": {
674674+ "description": "Moderation overlay description when content can be revealed"
675675+ },
676676+ "messageProviderDiagnosticsSubtitle": "Moderation/ranking can differ by provider. Verify health and recent fallback state.",
677677+ "@messageProviderDiagnosticsSubtitle": {
678678+ "description": "Settings subtitle for provider diagnostics"
679679+ },
680680+ "messageRefreshProviderHealthSubtitle": "Probe public AppView endpoints now",
681681+ "@messageRefreshProviderHealthSubtitle": {
682682+ "description": "Settings subtitle for refreshing provider health"
683683+ },
684684+ "messageResetSignInDataSubtitle": "Troubleshoot OAuth or account-switching issues by clearing local sessions on this device",
685685+ "@messageResetSignInDataSubtitle": {
686686+ "description": "Settings subtitle for resetting sign-in data"
687687+ },
688688+ "messageSearchSubtitle": "Search",
689689+ "@messageSearchSubtitle": {
690690+ "description": "Generic search subtitle"
691691+ },
692692+ "messageClearSearchHistoryContent": "This will delete all your recent searches.",
693693+ "@messageClearSearchHistoryContent": {
694694+ "description": "Confirmation dialog body before clearing search history"
695695+ },
696696+ "messageClearSearchHistoryTitle": "Clear search history?",
697697+ "@messageClearSearchHistoryTitle": {
698698+ "description": "Confirmation dialog title before clearing search history"
699699+ },
700700+ "messageStartTypingToSearchHandles": "Start typing to search handles.",
701701+ "@messageStartTypingToSearchHandles": {
702702+ "description": "Hint shown in jump to profile dialog"
703703+ },
704704+ "messageStarterPackSearchApiUnavailable": "Starter pack search is not available in the API yet.",
705705+ "@messageStarterPackSearchApiUnavailable": {
706706+ "description": "Helper text when starter pack search is disabled"
707707+ },
708708+ "messageStarterPackSearchUnavailableTitle": "Starter Pack Search Is Unavailable",
709709+ "@messageStarterPackSearchUnavailableTitle": {
710710+ "description": "Starter pack search unavailable state title"
711711+ },
712712+ "messageStarterPackSearchUnavailableBody": "(Starter Pack Search is not yet implemented in the BlueSky API)",
713713+ "@messageStarterPackSearchUnavailableBody": {
714714+ "description": "Starter pack search unavailable state body"
715715+ },
716716+ "messageTrackApiProgress": "Track API progress",
717717+ "@messageTrackApiProgress": {
718718+ "description": "Button label to open upstream API issue"
719719+ },
720720+ "messageCouldNotOpenIssueLink": "Could not open issue link.",
721721+ "@messageCouldNotOpenIssueLink": {
722722+ "description": "Snackbar message when opening upstream issue link fails"
723723+ },
724724+ "messageSearchPostsPlaceholder": "Search posts",
725725+ "@messageSearchPostsPlaceholder": {
726726+ "description": "Search posts field placeholder"
727727+ },
728728+ "messageSearchThisProfilesPostsPlaceholder": "Search this profile''s posts",
729729+ "@messageSearchThisProfilesPostsPlaceholder": {
730730+ "description": "Search placeholder in profile posts-only mode"
731731+ },
732732+ "messageSearchPeoplePlaceholder": "Search people",
733733+ "@messageSearchPeoplePlaceholder": {
734734+ "description": "Search people field placeholder"
735735+ },
736736+ "messageSearchFeedsPlaceholder": "Search feeds",
737737+ "@messageSearchFeedsPlaceholder": {
738738+ "description": "Search feeds field placeholder"
739739+ },
740740+ "messageStarterPackSearchUnavailablePlaceholder": "Starter pack search unavailable",
741741+ "@messageStarterPackSearchUnavailablePlaceholder": {
742742+ "description": "Starter pack search field placeholder"
743743+ },
744744+ "messageSlingshotIdentityFallbackSubtitle": "If handle lookup fails, use Slingshot to find your DID and PDS so sign-in can continue",
745745+ "@messageSlingshotIdentityFallbackSubtitle": {
746746+ "description": "Settings subtitle for Slingshot identity fallback"
747747+ },
748748+ "messageThreadAutoCollapseSubtitle": "Collapse reply branches deeper than the selected level",
749749+ "@messageThreadAutoCollapseSubtitle": {
750750+ "description": "Settings subtitle for thread auto-collapse"
751751+ },
752752+ "messageTurnOffNonEssentialMotion": "Turn off non-essential motion effects",
753753+ "@messageTurnOffNonEssentialMotion": {
754754+ "description": "Settings subtitle for animations"
755755+ },
756756+ "messageVideoUploadLimitsSubtitle": "Check your daily video quota",
757757+ "@messageVideoUploadLimitsSubtitle": {
758758+ "description": "Settings subtitle for video upload limits"
759759+ },
760760+ "placeholderAppPassword": "xxxx-xxxx-xxxx-xxxx",
761761+ "@placeholderAppPassword": {
762762+ "description": "Placeholder for app password field"
763763+ },
764764+ "placeholderHandleOrDid": "username.bsky.social or did:plc:...",
765765+ "@placeholderHandleOrDid": {
766766+ "description": "Placeholder for handle or DID sign-in field"
767767+ },
768768+ "promptHandleOrDid": "Handle or DID",
769769+ "@promptHandleOrDid": {
770770+ "description": "Label for handle or DID sign-in field"
771771+ },
772772+ "validationEnterAppPassword": "Enter your app password",
773773+ "@validationEnterAppPassword": {
774774+ "description": "Validation error for missing app password"
775775+ }
776776+}