Files
ReelShort/lib/l10n/app_localizations.dart
T
Vicky 61454e36b1 feat(client): 改名为 FruitShorts 并新增 id-ID 印尼语文案(1-3 + 1-4 合并)
为什么:a) 应用对外名称要统一成 FruitShorts(产品名,nontonki 是原型代号);
b) 首发市场是印尼,界面必须有印尼语;c) 归档要求"新增 id-ID 与改名合并生成一次 l10n,别分两次"。

改名:
- pubspec name: nontonki → fruitshorts(Dart 包名),description 同步;28 个文件的 package: 导入前缀替换
- Android android:label、iOS CFBundleDisplayName/CFBundleName → FruitShorts
- 图标资源 assets/icon/nontonki.png → fruitshorts.png(含 pubspec 两处引用)
- README 同步(补印尼语说明,顺带修掉写错的模块名 reelshort-app-api → fruitshorts-app-api)

文案:
- 三份 arb 的 appName → FruitShorts、brandMark → FRUITSHORTS、shareFooter → FruitShorts(不留 demo 标记)
- 新增 lib/l10n/app_id.arb:174 个值键与 en/zh 完全一致,按印尼语习惯翻译(Coin→Koin、Episode→Episode)
- 一次性 flutter gen-l10n 生成 app_localizations_id.dart;id 自动进入 supportedLocales,默认 locale 未改
- 新增 test/config/l10n_id_test.dart:钉住 id 文案、supportedLocales 含 id、品牌文案无 demo 标记、占位符渲染

不动:applicationId / bundle id(lumadrama 遗留,等裁定)、目录名、业务逻辑与页面结构、语言选择页(仍只有 en/zh)

门禁:dart analyze lib test 零告警;flutter test 159 全过(基线 155 + 新增 4);残留扫描 0 命中;
三份 arb 键集一致(174/174/174);真机(iPhone iOS 26.6.1)构建安装启动成功,devicectl 列出显示名 FruitShorts
2026-10-16 10:16:59 +08:00

1183 lines
31 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:intl/intl.dart' as intl;
import 'app_localizations_en.dart';
import 'app_localizations_id.dart';
import 'app_localizations_zh.dart';
// ignore_for_file: type=lint
/// Callers can lookup localized strings with an instance of AppLocalizations
/// returned by `AppLocalizations.of(context)`.
///
/// Applications need to include `AppLocalizations.delegate()` in their app's
/// `localizationDelegates` list, and the locales they support in the app's
/// `supportedLocales` list. For example:
///
/// ```dart
/// import 'l10n/app_localizations.dart';
///
/// return MaterialApp(
/// localizationsDelegates: AppLocalizations.localizationsDelegates,
/// supportedLocales: AppLocalizations.supportedLocales,
/// home: MyApplicationHome(),
/// );
/// ```
///
/// ## Update pubspec.yaml
///
/// Please make sure to update your pubspec.yaml to include the following
/// packages:
///
/// ```yaml
/// dependencies:
/// # Internationalization support.
/// flutter_localizations:
/// sdk: flutter
/// intl: any # Use the pinned version from flutter_localizations
///
/// # Rest of dependencies
/// ```
///
/// ## iOS Applications
///
/// iOS applications define key application metadata, including supported
/// locales, in an Info.plist file that is built into the application bundle.
/// To configure the locales supported by your app, you’ll need to edit this
/// file.
///
/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file.
/// Then, in the Project Navigator, open the Info.plist file under the Runner
/// project’s Runner folder.
///
/// Next, select the Information Property List item, select Add Item from the
/// Editor menu, then select Localizations from the pop-up menu.
///
/// Select and expand the newly-created Localizations item then, for each
/// locale your application supports, add a new item and select the locale
/// you wish to add from the pop-up menu in the Value field. This list should
/// be consistent with the languages listed in the AppLocalizations.supportedLocales
/// property.
abstract class AppLocalizations {
AppLocalizations(String locale)
: localeName = intl.Intl.canonicalizedLocale(locale.toString());
final String localeName;
static AppLocalizations? of(BuildContext context) {
return Localizations.of<AppLocalizations>(context, AppLocalizations);
}
static const LocalizationsDelegate<AppLocalizations> delegate =
_AppLocalizationsDelegate();
/// A list of this localizations delegate along with the default localizations
/// delegates.
///
/// Returns a list of localizations delegates containing this delegate along with
/// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate,
/// and GlobalWidgetsLocalizations.delegate.
///
/// Additional delegates can be added by appending to this list in
/// MaterialApp. This list does not have to be used at all if a custom list
/// of delegates is preferred or required.
static const List<LocalizationsDelegate<dynamic>> localizationsDelegates =
<LocalizationsDelegate<dynamic>>[
delegate,
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
];
/// A list of this localizations delegate's supported locales.
static const List<Locale> supportedLocales = <Locale>[
Locale('en'),
Locale('id'),
Locale('zh'),
];
/// No description provided for @appName.
///
/// In en, this message translates to:
/// **'FruitShorts'**
String get appName;
/// No description provided for @demo.
///
/// In en, this message translates to:
/// **'DEMO'**
String get demo;
/// No description provided for @homeHeadline.
///
/// In en, this message translates to:
/// **'Watch now'**
String get homeHeadline;
/// No description provided for @homeSubtitle.
///
/// In en, this message translates to:
/// **'Free short drama preview.'**
String get homeSubtitle;
/// No description provided for @mediaNotice.
///
/// In en, this message translates to:
/// **'User-provided local demo video · Free preview'**
String get mediaNotice;
/// No description provided for @featuredDemo.
///
/// In en, this message translates to:
/// **'FEATURED · TECHNICAL DEMO'**
String get featuredDemo;
/// No description provided for @demoTitle.
///
/// In en, this message translates to:
/// **'The Signal'**
String get demoTitle;
/// No description provided for @demoSynopsis.
///
/// In en, this message translates to:
/// **'A short local video preview. More episodes can be added when media is available.'**
String get demoSynopsis;
/// No description provided for @homeTab.
///
/// In en, this message translates to:
/// **'Home'**
String get homeTab;
/// No description provided for @openQuickMenu.
///
/// In en, this message translates to:
/// **'Open quick menu'**
String get openQuickMenu;
/// No description provided for @quickAccess.
///
/// In en, this message translates to:
/// **'Quick access'**
String get quickAccess;
/// No description provided for @currentSeries.
///
/// In en, this message translates to:
/// **'Current series'**
String get currentSeries;
/// No description provided for @discoverTab.
///
/// In en, this message translates to:
/// **'Discover'**
String get discoverTab;
/// No description provided for @searchDiscover.
///
/// In en, this message translates to:
/// **'Search dramas, actors, genres...'**
String get searchDiscover;
/// No description provided for @featured.
///
/// In en, this message translates to:
/// **'Featured'**
String get featured;
/// No description provided for @suspense.
///
/// In en, this message translates to:
/// **'Suspense'**
String get suspense;
/// No description provided for @romance.
///
/// In en, this message translates to:
/// **'Romance'**
String get romance;
/// No description provided for @actionGenre.
///
/// In en, this message translates to:
/// **'Action'**
String get actionGenre;
/// No description provided for @filter.
///
/// In en, this message translates to:
/// **'Filter'**
String get filter;
/// No description provided for @topCharts.
///
/// In en, this message translates to:
/// **'Top Charts'**
String get topCharts;
/// No description provided for @newReleases.
///
/// In en, this message translates to:
/// **'New Releases'**
String get newReleases;
/// No description provided for @trendingMicroDramas.
///
/// In en, this message translates to:
/// **'Trending Micro-Dramas'**
String get trendingMicroDramas;
/// No description provided for @seeAll.
///
/// In en, this message translates to:
/// **'See All'**
String get seeAll;
/// No description provided for @artworkOnly.
///
/// In en, this message translates to:
/// **'Artwork'**
String get artworkOnly;
/// No description provided for @artworkOnlyNotice.
///
/// In en, this message translates to:
/// **'This is a visual catalog item. No video is available yet.'**
String get artworkOnlyNotice;
/// No description provided for @videoPending.
///
/// In en, this message translates to:
/// **'Video pending'**
String get videoPending;
/// No description provided for @watchNow.
///
/// In en, this message translates to:
/// **'Watch free'**
String get watchNow;
/// No description provided for @noSearchResults.
///
/// In en, this message translates to:
/// **'No matching dramas.'**
String get noSearchResults;
/// No description provided for @demoCatalogNotice.
///
/// In en, this message translates to:
/// **'Three demo dramas share the same local video.'**
String get demoCatalogNotice;
/// No description provided for @myTab.
///
/// In en, this message translates to:
/// **'My'**
String get myTab;
/// No description provided for @localViewer.
///
/// In en, this message translates to:
/// **'Local Viewer'**
String get localViewer;
/// No description provided for @localDemoProfile.
///
/// In en, this message translates to:
/// **'Local demo profile'**
String get localDemoProfile;
/// No description provided for @continueWatching.
///
/// In en, this message translates to:
/// **'Continue Watching'**
String get continueWatching;
/// No description provided for @watchedPercent.
///
/// In en, this message translates to:
/// **'Watched {percent}%'**
String watchedPercent(int percent);
/// No description provided for @resume.
///
/// In en, this message translates to:
/// **'Resume'**
String get resume;
/// No description provided for @history.
///
/// In en, this message translates to:
/// **'History'**
String get history;
/// No description provided for @watchlist.
///
/// In en, this message translates to:
/// **'Watchlist'**
String get watchlist;
/// No description provided for @likedTab.
///
/// In en, this message translates to:
/// **'Liked'**
String get likedTab;
/// No description provided for @all.
///
/// In en, this message translates to:
/// **'All'**
String get all;
/// No description provided for @inProgress.
///
/// In en, this message translates to:
/// **'In Progress'**
String get inProgress;
/// No description provided for @completed.
///
/// In en, this message translates to:
/// **'Completed'**
String get completed;
/// No description provided for @noSavedShows.
///
/// In en, this message translates to:
/// **'No shows here yet.'**
String get noSavedShows;
/// No description provided for @preferences.
///
/// In en, this message translates to:
/// **'Preferences'**
String get preferences;
/// No description provided for @appLanguage.
///
/// In en, this message translates to:
/// **'App Language'**
String get appLanguage;
/// No description provided for @followingTab.
///
/// In en, this message translates to:
/// **'Following'**
String get followingTab;
/// No description provided for @animatedTab.
///
/// In en, this message translates to:
/// **'Animated'**
String get animatedTab;
/// No description provided for @recommendedTab.
///
/// In en, this message translates to:
/// **'Recommended'**
String get recommendedTab;
/// No description provided for @noCategoryDramas.
///
/// In en, this message translates to:
/// **'No dramas in this category yet.'**
String get noCategoryDramas;
/// No description provided for @trendingTab.
///
/// In en, this message translates to:
/// **'Trending'**
String get trendingTab;
/// No description provided for @liveActionTab.
///
/// In en, this message translates to:
/// **'Live Action'**
String get liveActionTab;
/// No description provided for @search.
///
/// In en, this message translates to:
/// **'Search'**
String get search;
/// No description provided for @free.
///
/// In en, this message translates to:
/// **'Free'**
String get free;
/// No description provided for @mute.
///
/// In en, this message translates to:
/// **'Mute'**
String get mute;
/// No description provided for @unmute.
///
/// In en, this message translates to:
/// **'Unmute'**
String get unmute;
/// No description provided for @like.
///
/// In en, this message translates to:
/// **'Like'**
String get like;
/// No description provided for @save.
///
/// In en, this message translates to:
/// **'Save'**
String get save;
/// No description provided for @comments.
///
/// In en, this message translates to:
/// **'Comments'**
String get comments;
/// No description provided for @share.
///
/// In en, this message translates to:
/// **'Share'**
String get share;
/// No description provided for @localOnlyComments.
///
/// In en, this message translates to:
/// **'Only visible on this device'**
String get localOnlyComments;
/// No description provided for @noComments.
///
/// In en, this message translates to:
/// **'No comments yet.'**
String get noComments;
/// No description provided for @writeComment.
///
/// In en, this message translates to:
/// **'Write a comment'**
String get writeComment;
/// No description provided for @postComment.
///
/// In en, this message translates to:
/// **'Post'**
String get postComment;
/// No description provided for @shareFailed.
///
/// In en, this message translates to:
/// **'Could not open the share sheet.'**
String get shareFailed;
/// No description provided for @nowPlaying.
///
/// In en, this message translates to:
/// **'Playing now'**
String get nowPlaying;
/// No description provided for @watchFullscreen.
///
/// In en, this message translates to:
/// **'Watch in landscape'**
String get watchFullscreen;
/// No description provided for @exitFullscreen.
///
/// In en, this message translates to:
/// **'Exit fullscreen'**
String get exitFullscreen;
/// No description provided for @pictureInPicture.
///
/// In en, this message translates to:
/// **'Picture in picture'**
String get pictureInPicture;
/// No description provided for @pipUnavailable.
///
/// In en, this message translates to:
/// **'Picture in picture is unavailable on this device'**
String get pipUnavailable;
/// No description provided for @originalTag.
///
/// In en, this message translates to:
/// **'Original'**
String get originalTag;
/// No description provided for @dramaTag.
///
/// In en, this message translates to:
/// **'Short drama'**
String get dramaTag;
/// No description provided for @episodeLabel.
///
/// In en, this message translates to:
/// **'Episode {number}'**
String episodeLabel(int number);
/// No description provided for @exploreSeries.
///
/// In en, this message translates to:
/// **'Explore series'**
String get exploreSeries;
/// No description provided for @episodeCount.
///
/// In en, this message translates to:
/// **'{count} EPISODES'**
String episodeCount(int count);
/// No description provided for @technicalDemoCount.
///
/// In en, this message translates to:
/// **'FREE PREVIEW · {count} EPISODES'**
String technicalDemoCount(int count);
/// No description provided for @episodes.
///
/// In en, this message translates to:
/// **'Episodes'**
String get episodes;
/// No description provided for @watchEpisodeOne.
///
/// In en, this message translates to:
/// **'Watch episode 1'**
String get watchEpisodeOne;
/// No description provided for @continueEpisode.
///
/// In en, this message translates to:
/// **'Continue episode {number}'**
String continueEpisode(int number);
/// No description provided for @freeTestMedia.
///
/// In en, this message translates to:
/// **'Same demo clip · free'**
String get freeTestMedia;
/// No description provided for @lockedStoreUnavailable.
///
/// In en, this message translates to:
/// **'Locked · store unavailable'**
String get lockedStoreUnavailable;
/// No description provided for @freeTestClip.
///
/// In en, this message translates to:
/// **'Free test clip'**
String get freeTestClip;
/// No description provided for @locked.
///
/// In en, this message translates to:
/// **'Locked'**
String get locked;
/// No description provided for @freeSamplesNotice.
///
/// In en, this message translates to:
/// **'Two free samples · store setup pending'**
String get freeSamplesNotice;
/// No description provided for @demoTestMedia.
///
/// In en, this message translates to:
/// **'FREE · SAME DEMO CLIP'**
String get demoTestMedia;
/// No description provided for @episodeProgress.
///
/// In en, this message translates to:
/// **'EPISODE {number} / {total}'**
String episodeProgress(int number, int total);
/// No description provided for @testVideoNotice.
///
/// In en, this message translates to:
/// **'Self-generated technical test video'**
String get testVideoNotice;
/// No description provided for @lockedTitle.
///
/// In en, this message translates to:
/// **'Episode {number} is locked'**
String lockedTitle(int number);
/// No description provided for @lockedBody.
///
/// In en, this message translates to:
/// **'Unlocking will be available after store and verification setup. This demo does not process payments.'**
String get lockedBody;
/// No description provided for @playbackError.
///
/// In en, this message translates to:
/// **'This clip could not be played.'**
String get playbackError;
/// No description provided for @catalogError.
///
/// In en, this message translates to:
/// **'The catalog could not be loaded.'**
String get catalogError;
/// No description provided for @detailError.
///
/// In en, this message translates to:
/// **'The episode list could not be loaded.'**
String get detailError;
/// No description provided for @noMediaNotice.
///
/// In en, this message translates to:
/// **'This episode has no playable media yet.'**
String get noMediaNotice;
/// No description provided for @noStories.
///
/// In en, this message translates to:
/// **'No stories available yet.'**
String get noStories;
/// No description provided for @retry.
///
/// In en, this message translates to:
/// **'Retry'**
String get retry;
/// No description provided for @backToSeries.
///
/// In en, this message translates to:
/// **'Back to series'**
String get backToSeries;
/// No description provided for @nextEpisode.
///
/// In en, this message translates to:
/// **'Next episode'**
String get nextEpisode;
/// No description provided for @pause.
///
/// In en, this message translates to:
/// **'Pause'**
String get pause;
/// No description provided for @play.
///
/// In en, this message translates to:
/// **'Play'**
String get play;
/// No description provided for @seekVideo.
///
/// In en, this message translates to:
/// **'Seek video'**
String get seekVideo;
/// No description provided for @seekFailed.
///
/// In en, this message translates to:
/// **'Could not change playback position.'**
String get seekFailed;
/// No description provided for @captions.
///
/// In en, this message translates to:
/// **'Captions'**
String get captions;
/// No description provided for @captionsOff.
///
/// In en, this message translates to:
/// **'Captions off'**
String get captionsOff;
/// No description provided for @englishCaptions.
///
/// In en, this message translates to:
/// **'English captions'**
String get englishCaptions;
/// No description provided for @chineseCaptions.
///
/// In en, this message translates to:
/// **'Chinese captions'**
String get chineseCaptions;
/// No description provided for @language.
///
/// In en, this message translates to:
/// **'Language'**
String get language;
/// No description provided for @systemLanguage.
///
/// In en, this message translates to:
/// **'System'**
String get systemLanguage;
/// No description provided for @english.
///
/// In en, this message translates to:
/// **'English'**
String get english;
/// No description provided for @simplifiedChinese.
///
/// In en, this message translates to:
/// **'简体中文'**
String get simplifiedChinese;
/// No description provided for @episodeOneTitle.
///
/// In en, this message translates to:
/// **'First Light'**
String get episodeOneTitle;
/// No description provided for @episodeTwoTitle.
///
/// In en, this message translates to:
/// **'A New Frequency'**
String get episodeTwoTitle;
/// No description provided for @episodeThreeTitle.
///
/// In en, this message translates to:
/// **'Crossing Over'**
String get episodeThreeTitle;
/// No description provided for @episodeFourTitle.
///
/// In en, this message translates to:
/// **'After the Echo'**
String get episodeFourTitle;
/// No description provided for @dramaSignalTitle.
///
/// In en, this message translates to:
/// **'The Signal'**
String get dramaSignalTitle;
/// No description provided for @dramaSignalSynopsis.
///
/// In en, this message translates to:
/// **'A demo series for vertical playback. Every episode reuses one local clip.'**
String get dramaSignalSynopsis;
/// No description provided for @dramaCityTitle.
///
/// In en, this message translates to:
/// **'City Lights & Velvet Nights'**
String get dramaCityTitle;
/// No description provided for @dramaCitySynopsis.
///
/// In en, this message translates to:
/// **'A demo romance series. The same local video is used to try switching and resume.'**
String get dramaCitySynopsis;
/// No description provided for @dramaVengeanceTitle.
///
/// In en, this message translates to:
/// **'Vengeance Rising'**
String get dramaVengeanceTitle;
/// No description provided for @dramaVengeanceSynopsis.
///
/// In en, this message translates to:
/// **'A demo action series. The same local video is used to try switching and resume.'**
String get dramaVengeanceSynopsis;
/// No description provided for @dramaEchoesTitle.
///
/// In en, this message translates to:
/// **'Echoes of Fate'**
String get dramaEchoesTitle;
/// No description provided for @genreSuspenseMystery.
///
/// In en, this message translates to:
/// **'Suspense · Mystery'**
String get genreSuspenseMystery;
/// No description provided for @genreUrbanRomance.
///
/// In en, this message translates to:
/// **'Urban Romance'**
String get genreUrbanRomance;
/// No description provided for @genreActionThriller.
///
/// In en, this message translates to:
/// **'Action · Thriller'**
String get genreActionThriller;
/// No description provided for @genreDramaMystery.
///
/// In en, this message translates to:
/// **'Drama · Mystery'**
String get genreDramaMystery;
/// No description provided for @continueWatchingHeading.
///
/// In en, this message translates to:
/// **'CONTINUE WATCHING'**
String get continueWatchingHeading;
/// No description provided for @preferencesHeading.
///
/// In en, this message translates to:
/// **'PREFERENCES'**
String get preferencesHeading;
/// No description provided for @brandMark.
///
/// In en, this message translates to:
/// **'FRUITSHORTS'**
String get brandMark;
/// No description provided for @shareFooter.
///
/// In en, this message translates to:
/// **'FruitShorts'**
String get shareFooter;
/// No description provided for @shortsTab.
///
/// In en, this message translates to:
/// **'Shorts'**
String get shortsTab;
/// No description provided for @myListTab.
///
/// In en, this message translates to:
/// **'My List'**
String get myListTab;
/// No description provided for @watchFull.
///
/// In en, this message translates to:
/// **'Watch Full'**
String get watchFull;
/// No description provided for @swipeForNext.
///
/// In en, this message translates to:
/// **'Swipe up for next'**
String get swipeForNext;
/// No description provided for @clearScreen.
///
/// In en, this message translates to:
/// **'Clear screen'**
String get clearScreen;
/// No description provided for @exitClearScreen.
///
/// In en, this message translates to:
/// **'Exit clear screen'**
String get exitClearScreen;
/// No description provided for @logIn.
///
/// In en, this message translates to:
/// **'Log in'**
String get logIn;
/// No description provided for @logInHint.
///
/// In en, this message translates to:
/// **'Keep your coins and list'**
String get logInHint;
/// No description provided for @rewards.
///
/// In en, this message translates to:
/// **'Rewards'**
String get rewards;
/// No description provided for @forYou.
///
/// In en, this message translates to:
/// **'For You'**
String get forYou;
/// No description provided for @hot.
///
/// In en, this message translates to:
/// **'Hot'**
String get hot;
/// No description provided for @newest.
///
/// In en, this message translates to:
/// **'New'**
String get newest;
/// No description provided for @favorite.
///
/// In en, this message translates to:
/// **'Favorite'**
String get favorite;
/// No description provided for @myAccount.
///
/// In en, this message translates to:
/// **'My account'**
String get myAccount;
/// No description provided for @coins.
///
/// In en, this message translates to:
/// **'Coins'**
String get coins;
/// No description provided for @topUpWallet.
///
/// In en, this message translates to:
/// **'Top Up Wallet'**
String get topUpWallet;
/// No description provided for @vipMembership.
///
/// In en, this message translates to:
/// **'VIP Membership'**
String get vipMembership;
/// No description provided for @notActive.
///
/// In en, this message translates to:
/// **'Not Active'**
String get notActive;
/// No description provided for @joinVip.
///
/// In en, this message translates to:
/// **'Join VIP'**
String get joinVip;
/// No description provided for @earnRewards.
///
/// In en, this message translates to:
/// **'Earn Rewards'**
String get earnRewards;
/// No description provided for @freeBonus.
///
/// In en, this message translates to:
/// **'Get Free Bonus'**
String get freeBonus;
/// No description provided for @watchHistory.
///
/// In en, this message translates to:
/// **'Watch History'**
String get watchHistory;
/// No description provided for @settings.
///
/// In en, this message translates to:
/// **'Settings'**
String get settings;
/// No description provided for @signOut.
///
/// In en, this message translates to:
/// **'Sign Out'**
String get signOut;
/// No description provided for @mockUserName.
///
/// In en, this message translates to:
/// **'Vicky sheng'**
String get mockUserName;
/// No description provided for @mockUserId.
///
/// In en, this message translates to:
/// **'ID: M1CZWVYE'**
String get mockUserId;
/// No description provided for @mockNotice.
///
/// In en, this message translates to:
/// **'Sample data only.'**
String get mockNotice;
/// No description provided for @topBadge.
///
/// In en, this message translates to:
/// **'TOP 1'**
String get topBadge;
/// No description provided for @signIn.
///
/// In en, this message translates to:
/// **'Sign In'**
String get signIn;
/// No description provided for @signUp.
///
/// In en, this message translates to:
/// **'Sign Up'**
String get signUp;
/// No description provided for @authSignInTitle.
///
/// In en, this message translates to:
/// **'Welcome back'**
String get authSignInTitle;
/// No description provided for @authSignUpTitle.
///
/// In en, this message translates to:
/// **'Create your account'**
String get authSignUpTitle;
/// No description provided for @authSubtitle.
///
/// In en, this message translates to:
/// **'Sign in with your email and password.'**
String get authSubtitle;
/// No description provided for @authEmailLabel.
///
/// In en, this message translates to:
/// **'Email'**
String get authEmailLabel;
/// No description provided for @authPasswordLabel.
///
/// In en, this message translates to:
/// **'Password'**
String get authPasswordLabel;
/// No description provided for @authPasswordHint.
///
/// In en, this message translates to:
/// **'At least 8 characters, letters and numbers'**
String get authPasswordHint;
/// No description provided for @authEmailRequired.
///
/// In en, this message translates to:
/// **'Enter your email'**
String get authEmailRequired;
/// No description provided for @authEmailInvalid.
///
/// In en, this message translates to:
/// **'That email doesn\'t look right'**
String get authEmailInvalid;
/// No description provided for @authPasswordRequired.
///
/// In en, this message translates to:
/// **'Enter your password'**
String get authPasswordRequired;
/// No description provided for @authPasswordLength.
///
/// In en, this message translates to:
/// **'Password must be 8-64 characters'**
String get authPasswordLength;
/// No description provided for @authPasswordWeak.
///
/// In en, this message translates to:
/// **'Password needs both letters and numbers'**
String get authPasswordWeak;
/// No description provided for @authNetworkError.
///
/// In en, this message translates to:
/// **'Network error, please try again'**
String get authNetworkError;
/// No description provided for @authSwitchToSignUp.
///
/// In en, this message translates to:
/// **'New here? Create an account'**
String get authSwitchToSignUp;
/// No description provided for @authSwitchToSignIn.
///
/// In en, this message translates to:
/// **'Already have an account? Sign in'**
String get authSwitchToSignIn;
/// No description provided for @authGateTitle.
///
/// In en, this message translates to:
/// **'Sign in to continue'**
String get authGateTitle;
/// No description provided for @authGateMessage.
///
/// In en, this message translates to:
/// **'Favorites and comments need an account.'**
String get authGateMessage;
/// No description provided for @authGateAction.
///
/// In en, this message translates to:
/// **'Sign In'**
String get authGateAction;
/// No description provided for @cancel.
///
/// In en, this message translates to:
/// **'Not now'**
String get cancel;
}
class _AppLocalizationsDelegate
extends LocalizationsDelegate<AppLocalizations> {
const _AppLocalizationsDelegate();
@override
Future<AppLocalizations> load(Locale locale) {
return SynchronousFuture<AppLocalizations>(lookupAppLocalizations(locale));
}
@override
bool isSupported(Locale locale) =>
<String>['en', 'id', 'zh'].contains(locale.languageCode);
@override
bool shouldReload(_AppLocalizationsDelegate old) => false;
}
AppLocalizations lookupAppLocalizations(Locale locale) {
// Lookup logic when only language code is specified.
switch (locale.languageCode) {
case 'en':
return AppLocalizationsEn();
case 'id':
return AppLocalizationsId();
case 'zh':
return AppLocalizationsZh();
}
throw FlutterError(
'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely '
'an issue with the localizations generation tool. Please file an issue '
'on GitHub with a reproducible sample app and the gen-l10n configuration '
'that was used.',
);
}