feat(frontend): add multi-language support (en, zh-Hans, zh-Hant, ja)

This commit is contained in:
2026-05-25 11:49:53 +08:00
parent 1539e495e6
commit 261b1ab169
20 changed files with 1955 additions and 139 deletions

View File

@@ -0,0 +1,70 @@
{
"@@locale": "en",
"settings": "Settings",
"networkConfiguration": "Network Configuration",
"backendServerUrl": "Backend Server URL",
"saveNetworkSettings": "Save Network Settings",
"serverUrlUpdated": "Server URL Updated",
"themeCustomization": "Theme Customization",
"appearanceMode": "Appearance Mode",
"system": "System",
"light": "Light",
"dark": "Dark",
"accentColor": "Accent Color",
"explore": "Explore",
"livePreviewThumbnails": "Live Preview Thumbnails",
"livePreviewThumbnailsDesc": "Show cached snapshot covers for live rooms when available.",
"security": "Security",
"oldPassword": "Old Password",
"newPassword": "New Password",
"changePassword": "Change Password",
"logout": "Logout",
"confirmLogout": "Confirm Logout",
"confirmLogoutDesc": "Are you sure you want to log out now?",
"cancel": "Cancel",
"language": "Language",
"selectLanguage": "Select Language",
"english": "English",
"simplifiedChinese": "简体中文",
"traditionalChinese": "繁體中文",
"japanese": "日本語",
"console": "Console",
"failedToLoadRooms": "Failed to load rooms",
"goLive": "Go Live",
"noActiveRooms": "No active rooms. Be the first!",
"hostId": "Host ID",
"username": "Username",
"password": "Password",
"fillAllFields": "Please fill in all fields",
"networkError": "Network Error: Could not connect to server",
"loginFailed": "Login Failed",
"login": "LOGIN",
"dontHaveAccount": "Don't have an account? Create one",
"createAccount": "Create Account",
"joinHightube": "Join Hightube",
"desiredUsername": "Desired Username",
"register": "REGISTER",
"alreadyHaveAccount": "Already have an account? Login here",
"accountCreated": "Account created! Please login.",
"playbackResolution": "Playback Resolution",
"availableNow": "Available now",
"waitingForTranscoding": "Waiting for backend transcoding output",
"sendMessage": "Send a message...",
"liveChat": "Live Chat",
"refresh": "Refresh",
"volume": "Volume",
"danmakuOn": "Danmaku On",
"danmakuOff": "Danmaku Off",
"fullscreen": "Fullscreen",
"exitFullscreen": "Exit Fullscreen",
"resolution": "Resolution",
"playbackOptionsDesc": "Select an available transcoded stream.",
"sourceOnlyDesc": "Only the source stream is available right now.",
"myStreamConsole": "My Stream Console",
"noRoomInfo": "No room info found.",
"roomTitle": "Room Title",
"rtmpServerUrl": "RTMP Server URL",
"streamKey": "Stream Key (Keep Secret!)",
"copiedToClipboard": "Copied to clipboard",
"failedToFetchRoomInfo": "Failed to fetch room info"
}

View File

@@ -0,0 +1,70 @@
{
"@@locale": "ja",
"settings": "設定",
"networkConfiguration": "ネットワーク設定",
"backendServerUrl": "バックエンドサーバーURL",
"saveNetworkSettings": "ネットワーク設定を保存",
"serverUrlUpdated": "サーバーURLが更新されました",
"themeCustomization": "テーマのカスタマイズ",
"appearanceMode": "外観モード",
"system": "システム",
"light": "ライト",
"dark": "ダーク",
"accentColor": "アクセントカラー",
"explore": "探索",
"livePreviewThumbnails": "ライブプレビューサムネイル",
"livePreviewThumbnailsDesc": "利用可能な場合、ライブルームのキャッシュされたスナップショットカバーを表示します。",
"security": "セキュリティ",
"oldPassword": "現在のパスワード",
"newPassword": "新しいパスワード",
"changePassword": "パスワードを変更",
"logout": "ログアウト",
"confirmLogout": "ログアウトの確認",
"confirmLogoutDesc": "今すぐログアウトしてもよろしいですか?",
"cancel": "キャンセル",
"language": "言語",
"selectLanguage": "言語を選択",
"english": "English",
"simplifiedChinese": "简体中文",
"traditionalChinese": "繁體中文",
"japanese": "日本語",
"console": "コンソール",
"failedToLoadRooms": "ルームの読み込みに失敗しました",
"goLive": "ライブ配信を開始",
"noActiveRooms": "配信中のルームはありません。最初の配信者になりましょう!",
"hostId": "配信者 ID",
"username": "ユーザー名",
"password": "パスワード",
"fillAllFields": "すべての項目を入力してください",
"networkError": "ネットワークエラー:サーバーに接続できませんでした",
"loginFailed": "ログインに失敗しました",
"login": "ログイン",
"dontHaveAccount": "アカウントをお持ちでないですか?新規登録",
"createAccount": "アカウント作成",
"joinHightube": "Hightube に参加",
"desiredUsername": "ユーザー名",
"register": "登録",
"alreadyHaveAccount": "既にアカウントをお持ちですか?ログイン",
"accountCreated": "アカウントが作成されました!ログインしてください。",
"playbackResolution": "再生解像度",
"availableNow": "利用可能",
"waitingForTranscoding": "バックエンドのトランスコード出力を待機中",
"sendMessage": "メッセージを送信...",
"liveChat": "ライブチャット",
"refresh": "更新",
"volume": "音量",
"danmakuOn": "弾幕オン",
"danmakuOff": "弾幕オフ",
"fullscreen": "全画面",
"exitFullscreen": "全画面終了",
"resolution": "解像度",
"playbackOptionsDesc": "利用可能なトランスコード済みストリームを選択します。",
"sourceOnlyDesc": "現在、ソースストリームのみが利用可能です。",
"myStreamConsole": "配信コンソール",
"noRoomInfo": "ルーム情報が見つかりません。",
"roomTitle": "ルームタイトル",
"rtmpServerUrl": "RTMP サーバー URL",
"streamKey": "ストリームキー (秘密にしてください!)",
"copiedToClipboard": "クリップボードにコピーしました",
"failedToFetchRoomInfo": "ルーム情報の取得に失敗しました"
}

View File

@@ -0,0 +1,553 @@
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_ja.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, youll need to edit this
/// file.
///
/// First, open your projects ios/Runner.xcworkspace Xcode workspace file.
/// Then, in the Project Navigator, open the Info.plist file under the Runner
/// projects 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('ja'),
Locale('zh'),
Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hant'),
];
/// No description provided for @settings.
///
/// In en, this message translates to:
/// **'Settings'**
String get settings;
/// No description provided for @networkConfiguration.
///
/// In en, this message translates to:
/// **'Network Configuration'**
String get networkConfiguration;
/// No description provided for @backendServerUrl.
///
/// In en, this message translates to:
/// **'Backend Server URL'**
String get backendServerUrl;
/// No description provided for @saveNetworkSettings.
///
/// In en, this message translates to:
/// **'Save Network Settings'**
String get saveNetworkSettings;
/// No description provided for @serverUrlUpdated.
///
/// In en, this message translates to:
/// **'Server URL Updated'**
String get serverUrlUpdated;
/// No description provided for @themeCustomization.
///
/// In en, this message translates to:
/// **'Theme Customization'**
String get themeCustomization;
/// No description provided for @appearanceMode.
///
/// In en, this message translates to:
/// **'Appearance Mode'**
String get appearanceMode;
/// No description provided for @system.
///
/// In en, this message translates to:
/// **'System'**
String get system;
/// No description provided for @light.
///
/// In en, this message translates to:
/// **'Light'**
String get light;
/// No description provided for @dark.
///
/// In en, this message translates to:
/// **'Dark'**
String get dark;
/// No description provided for @accentColor.
///
/// In en, this message translates to:
/// **'Accent Color'**
String get accentColor;
/// No description provided for @explore.
///
/// In en, this message translates to:
/// **'Explore'**
String get explore;
/// No description provided for @livePreviewThumbnails.
///
/// In en, this message translates to:
/// **'Live Preview Thumbnails'**
String get livePreviewThumbnails;
/// No description provided for @livePreviewThumbnailsDesc.
///
/// In en, this message translates to:
/// **'Show cached snapshot covers for live rooms when available.'**
String get livePreviewThumbnailsDesc;
/// No description provided for @security.
///
/// In en, this message translates to:
/// **'Security'**
String get security;
/// No description provided for @oldPassword.
///
/// In en, this message translates to:
/// **'Old Password'**
String get oldPassword;
/// No description provided for @newPassword.
///
/// In en, this message translates to:
/// **'New Password'**
String get newPassword;
/// No description provided for @changePassword.
///
/// In en, this message translates to:
/// **'Change Password'**
String get changePassword;
/// No description provided for @logout.
///
/// In en, this message translates to:
/// **'Logout'**
String get logout;
/// No description provided for @confirmLogout.
///
/// In en, this message translates to:
/// **'Confirm Logout'**
String get confirmLogout;
/// No description provided for @confirmLogoutDesc.
///
/// In en, this message translates to:
/// **'Are you sure you want to log out now?'**
String get confirmLogoutDesc;
/// No description provided for @cancel.
///
/// In en, this message translates to:
/// **'Cancel'**
String get cancel;
/// No description provided for @language.
///
/// In en, this message translates to:
/// **'Language'**
String get language;
/// No description provided for @selectLanguage.
///
/// In en, this message translates to:
/// **'Select Language'**
String get selectLanguage;
/// 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 @traditionalChinese.
///
/// In en, this message translates to:
/// **'繁體中文'**
String get traditionalChinese;
/// No description provided for @japanese.
///
/// In en, this message translates to:
/// **'日本語'**
String get japanese;
/// No description provided for @console.
///
/// In en, this message translates to:
/// **'Console'**
String get console;
/// No description provided for @failedToLoadRooms.
///
/// In en, this message translates to:
/// **'Failed to load rooms'**
String get failedToLoadRooms;
/// No description provided for @goLive.
///
/// In en, this message translates to:
/// **'Go Live'**
String get goLive;
/// No description provided for @noActiveRooms.
///
/// In en, this message translates to:
/// **'No active rooms. Be the first!'**
String get noActiveRooms;
/// No description provided for @hostId.
///
/// In en, this message translates to:
/// **'Host ID'**
String get hostId;
/// No description provided for @username.
///
/// In en, this message translates to:
/// **'Username'**
String get username;
/// No description provided for @password.
///
/// In en, this message translates to:
/// **'Password'**
String get password;
/// No description provided for @fillAllFields.
///
/// In en, this message translates to:
/// **'Please fill in all fields'**
String get fillAllFields;
/// No description provided for @networkError.
///
/// In en, this message translates to:
/// **'Network Error: Could not connect to server'**
String get networkError;
/// No description provided for @loginFailed.
///
/// In en, this message translates to:
/// **'Login Failed'**
String get loginFailed;
/// No description provided for @login.
///
/// In en, this message translates to:
/// **'LOGIN'**
String get login;
/// No description provided for @dontHaveAccount.
///
/// In en, this message translates to:
/// **'Don\'t have an account? Create one'**
String get dontHaveAccount;
/// No description provided for @createAccount.
///
/// In en, this message translates to:
/// **'Create Account'**
String get createAccount;
/// No description provided for @joinHightube.
///
/// In en, this message translates to:
/// **'Join Hightube'**
String get joinHightube;
/// No description provided for @desiredUsername.
///
/// In en, this message translates to:
/// **'Desired Username'**
String get desiredUsername;
/// No description provided for @register.
///
/// In en, this message translates to:
/// **'REGISTER'**
String get register;
/// No description provided for @alreadyHaveAccount.
///
/// In en, this message translates to:
/// **'Already have an account? Login here'**
String get alreadyHaveAccount;
/// No description provided for @accountCreated.
///
/// In en, this message translates to:
/// **'Account created! Please login.'**
String get accountCreated;
/// No description provided for @playbackResolution.
///
/// In en, this message translates to:
/// **'Playback Resolution'**
String get playbackResolution;
/// No description provided for @availableNow.
///
/// In en, this message translates to:
/// **'Available now'**
String get availableNow;
/// No description provided for @waitingForTranscoding.
///
/// In en, this message translates to:
/// **'Waiting for backend transcoding output'**
String get waitingForTranscoding;
/// No description provided for @sendMessage.
///
/// In en, this message translates to:
/// **'Send a message...'**
String get sendMessage;
/// No description provided for @liveChat.
///
/// In en, this message translates to:
/// **'Live Chat'**
String get liveChat;
/// No description provided for @refresh.
///
/// In en, this message translates to:
/// **'Refresh'**
String get refresh;
/// No description provided for @volume.
///
/// In en, this message translates to:
/// **'Volume'**
String get volume;
/// No description provided for @danmakuOn.
///
/// In en, this message translates to:
/// **'Danmaku On'**
String get danmakuOn;
/// No description provided for @danmakuOff.
///
/// In en, this message translates to:
/// **'Danmaku Off'**
String get danmakuOff;
/// No description provided for @fullscreen.
///
/// In en, this message translates to:
/// **'Fullscreen'**
String get fullscreen;
/// No description provided for @exitFullscreen.
///
/// In en, this message translates to:
/// **'Exit Fullscreen'**
String get exitFullscreen;
/// No description provided for @resolution.
///
/// In en, this message translates to:
/// **'Resolution'**
String get resolution;
/// No description provided for @playbackOptionsDesc.
///
/// In en, this message translates to:
/// **'Select an available transcoded stream.'**
String get playbackOptionsDesc;
/// No description provided for @sourceOnlyDesc.
///
/// In en, this message translates to:
/// **'Only the source stream is available right now.'**
String get sourceOnlyDesc;
/// No description provided for @myStreamConsole.
///
/// In en, this message translates to:
/// **'My Stream Console'**
String get myStreamConsole;
/// No description provided for @noRoomInfo.
///
/// In en, this message translates to:
/// **'No room info found.'**
String get noRoomInfo;
/// No description provided for @roomTitle.
///
/// In en, this message translates to:
/// **'Room Title'**
String get roomTitle;
/// No description provided for @rtmpServerUrl.
///
/// In en, this message translates to:
/// **'RTMP Server URL'**
String get rtmpServerUrl;
/// No description provided for @streamKey.
///
/// In en, this message translates to:
/// **'Stream Key (Keep Secret!)'**
String get streamKey;
/// No description provided for @copiedToClipboard.
///
/// In en, this message translates to:
/// **'Copied to clipboard'**
String get copiedToClipboard;
/// No description provided for @failedToFetchRoomInfo.
///
/// In en, this message translates to:
/// **'Failed to fetch room info'**
String get failedToFetchRoomInfo;
}
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', 'ja', 'zh'].contains(locale.languageCode);
@override
bool shouldReload(_AppLocalizationsDelegate old) => false;
}
AppLocalizations lookupAppLocalizations(Locale locale) {
// Lookup logic when language+script codes are specified.
switch (locale.languageCode) {
case 'zh':
{
switch (locale.scriptCode) {
case 'Hant':
return AppLocalizationsZhHant();
}
break;
}
}
// Lookup logic when only language code is specified.
switch (locale.languageCode) {
case 'en':
return AppLocalizationsEn();
case 'ja':
return AppLocalizationsJa();
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.',
);
}

View File

@@ -0,0 +1,212 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for English (`en`).
class AppLocalizationsEn extends AppLocalizations {
AppLocalizationsEn([String locale = 'en']) : super(locale);
@override
String get settings => 'Settings';
@override
String get networkConfiguration => 'Network Configuration';
@override
String get backendServerUrl => 'Backend Server URL';
@override
String get saveNetworkSettings => 'Save Network Settings';
@override
String get serverUrlUpdated => 'Server URL Updated';
@override
String get themeCustomization => 'Theme Customization';
@override
String get appearanceMode => 'Appearance Mode';
@override
String get system => 'System';
@override
String get light => 'Light';
@override
String get dark => 'Dark';
@override
String get accentColor => 'Accent Color';
@override
String get explore => 'Explore';
@override
String get livePreviewThumbnails => 'Live Preview Thumbnails';
@override
String get livePreviewThumbnailsDesc =>
'Show cached snapshot covers for live rooms when available.';
@override
String get security => 'Security';
@override
String get oldPassword => 'Old Password';
@override
String get newPassword => 'New Password';
@override
String get changePassword => 'Change Password';
@override
String get logout => 'Logout';
@override
String get confirmLogout => 'Confirm Logout';
@override
String get confirmLogoutDesc => 'Are you sure you want to log out now?';
@override
String get cancel => 'Cancel';
@override
String get language => 'Language';
@override
String get selectLanguage => 'Select Language';
@override
String get english => 'English';
@override
String get simplifiedChinese => '简体中文';
@override
String get traditionalChinese => '繁體中文';
@override
String get japanese => '日本語';
@override
String get console => 'Console';
@override
String get failedToLoadRooms => 'Failed to load rooms';
@override
String get goLive => 'Go Live';
@override
String get noActiveRooms => 'No active rooms. Be the first!';
@override
String get hostId => 'Host ID';
@override
String get username => 'Username';
@override
String get password => 'Password';
@override
String get fillAllFields => 'Please fill in all fields';
@override
String get networkError => 'Network Error: Could not connect to server';
@override
String get loginFailed => 'Login Failed';
@override
String get login => 'LOGIN';
@override
String get dontHaveAccount => 'Don\'t have an account? Create one';
@override
String get createAccount => 'Create Account';
@override
String get joinHightube => 'Join Hightube';
@override
String get desiredUsername => 'Desired Username';
@override
String get register => 'REGISTER';
@override
String get alreadyHaveAccount => 'Already have an account? Login here';
@override
String get accountCreated => 'Account created! Please login.';
@override
String get playbackResolution => 'Playback Resolution';
@override
String get availableNow => 'Available now';
@override
String get waitingForTranscoding => 'Waiting for backend transcoding output';
@override
String get sendMessage => 'Send a message...';
@override
String get liveChat => 'Live Chat';
@override
String get refresh => 'Refresh';
@override
String get volume => 'Volume';
@override
String get danmakuOn => 'Danmaku On';
@override
String get danmakuOff => 'Danmaku Off';
@override
String get fullscreen => 'Fullscreen';
@override
String get exitFullscreen => 'Exit Fullscreen';
@override
String get resolution => 'Resolution';
@override
String get playbackOptionsDesc => 'Select an available transcoded stream.';
@override
String get sourceOnlyDesc => 'Only the source stream is available right now.';
@override
String get myStreamConsole => 'My Stream Console';
@override
String get noRoomInfo => 'No room info found.';
@override
String get roomTitle => 'Room Title';
@override
String get rtmpServerUrl => 'RTMP Server URL';
@override
String get streamKey => 'Stream Key (Keep Secret!)';
@override
String get copiedToClipboard => 'Copied to clipboard';
@override
String get failedToFetchRoomInfo => 'Failed to fetch room info';
}

View File

@@ -0,0 +1,212 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Japanese (`ja`).
class AppLocalizationsJa extends AppLocalizations {
AppLocalizationsJa([String locale = 'ja']) : super(locale);
@override
String get settings => '設定';
@override
String get networkConfiguration => 'ネットワーク設定';
@override
String get backendServerUrl => 'バックエンドサーバーURL';
@override
String get saveNetworkSettings => 'ネットワーク設定を保存';
@override
String get serverUrlUpdated => 'サーバーURLが更新されました';
@override
String get themeCustomization => 'テーマのカスタマイズ';
@override
String get appearanceMode => '外観モード';
@override
String get system => 'システム';
@override
String get light => 'ライト';
@override
String get dark => 'ダーク';
@override
String get accentColor => 'アクセントカラー';
@override
String get explore => '探索';
@override
String get livePreviewThumbnails => 'ライブプレビューサムネイル';
@override
String get livePreviewThumbnailsDesc =>
'利用可能な場合、ライブルームのキャッシュされたスナップショットカバーを表示します。';
@override
String get security => 'セキュリティ';
@override
String get oldPassword => '現在のパスワード';
@override
String get newPassword => '新しいパスワード';
@override
String get changePassword => 'パスワードを変更';
@override
String get logout => 'ログアウト';
@override
String get confirmLogout => 'ログアウトの確認';
@override
String get confirmLogoutDesc => '今すぐログアウトしてもよろしいですか?';
@override
String get cancel => 'キャンセル';
@override
String get language => '言語';
@override
String get selectLanguage => '言語を選択';
@override
String get english => 'English';
@override
String get simplifiedChinese => '简体中文';
@override
String get traditionalChinese => '繁體中文';
@override
String get japanese => '日本語';
@override
String get console => 'コンソール';
@override
String get failedToLoadRooms => 'ルームの読み込みに失敗しました';
@override
String get goLive => 'ライブ配信を開始';
@override
String get noActiveRooms => '配信中のルームはありません。最初の配信者になりましょう!';
@override
String get hostId => '配信者 ID';
@override
String get username => 'ユーザー名';
@override
String get password => 'パスワード';
@override
String get fillAllFields => 'すべての項目を入力してください';
@override
String get networkError => 'ネットワークエラー:サーバーに接続できませんでした';
@override
String get loginFailed => 'ログインに失敗しました';
@override
String get login => 'ログイン';
@override
String get dontHaveAccount => 'アカウントをお持ちでないですか?新規登録';
@override
String get createAccount => 'アカウント作成';
@override
String get joinHightube => 'Hightube に参加';
@override
String get desiredUsername => 'ユーザー名';
@override
String get register => '登録';
@override
String get alreadyHaveAccount => '既にアカウントをお持ちですか?ログイン';
@override
String get accountCreated => 'アカウントが作成されました!ログインしてください。';
@override
String get playbackResolution => '再生解像度';
@override
String get availableNow => '利用可能';
@override
String get waitingForTranscoding => 'バックエンドのトランスコード出力を待機中';
@override
String get sendMessage => 'メッセージを送信...';
@override
String get liveChat => 'ライブチャット';
@override
String get refresh => '更新';
@override
String get volume => '音量';
@override
String get danmakuOn => '弾幕オン';
@override
String get danmakuOff => '弾幕オフ';
@override
String get fullscreen => '全画面';
@override
String get exitFullscreen => '全画面終了';
@override
String get resolution => '解像度';
@override
String get playbackOptionsDesc => '利用可能なトランスコード済みストリームを選択します。';
@override
String get sourceOnlyDesc => '現在、ソースストリームのみが利用可能です。';
@override
String get myStreamConsole => '配信コンソール';
@override
String get noRoomInfo => 'ルーム情報が見つかりません。';
@override
String get roomTitle => 'ルームタイトル';
@override
String get rtmpServerUrl => 'RTMP サーバー URL';
@override
String get streamKey => 'ストリームキー (秘密にしてください!)';
@override
String get copiedToClipboard => 'クリップボードにコピーしました';
@override
String get failedToFetchRoomInfo => 'ルーム情報の取得に失敗しました';
}

View File

@@ -0,0 +1,417 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Chinese (`zh`).
class AppLocalizationsZh extends AppLocalizations {
AppLocalizationsZh([String locale = 'zh']) : super(locale);
@override
String get settings => '设置';
@override
String get networkConfiguration => '网络配置';
@override
String get backendServerUrl => '后端服务器地址';
@override
String get saveNetworkSettings => '保存网络设置';
@override
String get serverUrlUpdated => '服务器地址已更新';
@override
String get themeCustomization => '主题自定义';
@override
String get appearanceMode => '外观模式';
@override
String get system => '系统';
@override
String get light => '浅色';
@override
String get dark => '深色';
@override
String get accentColor => '强调色';
@override
String get explore => '探索';
@override
String get livePreviewThumbnails => '直播预览图';
@override
String get livePreviewThumbnailsDesc => '在可用时显示直播房间的缓存快照封面。';
@override
String get security => '安全';
@override
String get oldPassword => '旧密码';
@override
String get newPassword => '新密码';
@override
String get changePassword => '修改密码';
@override
String get logout => '退出登录';
@override
String get confirmLogout => '确认退出';
@override
String get confirmLogoutDesc => '您确定现在要退出登录吗?';
@override
String get cancel => '取消';
@override
String get language => '语言';
@override
String get selectLanguage => '选择语言';
@override
String get english => 'English';
@override
String get simplifiedChinese => '简体中文';
@override
String get traditionalChinese => '繁體中文';
@override
String get japanese => '日本語';
@override
String get console => '控制台';
@override
String get failedToLoadRooms => '加载房间失败';
@override
String get goLive => '开始直播';
@override
String get noActiveRooms => '暂无直播房间。快来开播吧!';
@override
String get hostId => '主播 ID';
@override
String get username => '用户名';
@override
String get password => '密码';
@override
String get fillAllFields => '请填写所有字段';
@override
String get networkError => '网络错误:无法连接到服务器';
@override
String get loginFailed => '登录失败';
@override
String get login => '登录';
@override
String get dontHaveAccount => '没有账号?立即注册';
@override
String get createAccount => '创建账号';
@override
String get joinHightube => '加入 Hightube';
@override
String get desiredUsername => '用户名';
@override
String get register => '注册';
@override
String get alreadyHaveAccount => '已有账号?立即登录';
@override
String get accountCreated => '账号创建成功!请登录。';
@override
String get playbackResolution => '播放分辨率';
@override
String get availableNow => '当前可用';
@override
String get waitingForTranscoding => '正在等待后端转码输出';
@override
String get sendMessage => '发送消息...';
@override
String get liveChat => '实时聊天';
@override
String get refresh => '刷新';
@override
String get volume => '音量';
@override
String get danmakuOn => '弹幕开启';
@override
String get danmakuOff => '弹幕关闭';
@override
String get fullscreen => '全屏';
@override
String get exitFullscreen => '退出全屏';
@override
String get resolution => '分辨率';
@override
String get playbackOptionsDesc => '选择可用的转码流。';
@override
String get sourceOnlyDesc => '目前仅源流可用。';
@override
String get myStreamConsole => '我的直播控制台';
@override
String get noRoomInfo => '未找到房间信息。';
@override
String get roomTitle => '房间标题';
@override
String get rtmpServerUrl => 'RTMP 服务器地址';
@override
String get streamKey => '推流码 (请务必保密!)';
@override
String get copiedToClipboard => '已复制到剪贴板';
@override
String get failedToFetchRoomInfo => '获取房间信息失败';
}
/// The translations for Chinese, using the Han script (`zh_Hant`).
class AppLocalizationsZhHant extends AppLocalizationsZh {
AppLocalizationsZhHant() : super('zh_Hant');
@override
String get settings => '設定';
@override
String get networkConfiguration => '網路設定';
@override
String get backendServerUrl => '後端伺服器地址';
@override
String get saveNetworkSettings => '儲存網路設定';
@override
String get serverUrlUpdated => '伺服器地址已更新';
@override
String get themeCustomization => '主題自訂';
@override
String get appearanceMode => '外觀模式';
@override
String get system => '系統';
@override
String get light => '淺色';
@override
String get dark => '深色';
@override
String get accentColor => '強調色';
@override
String get explore => '探索';
@override
String get livePreviewThumbnails => '直播預覽圖';
@override
String get livePreviewThumbnailsDesc => '在可用時顯示直播房間的快取快照封面。';
@override
String get security => '安全';
@override
String get oldPassword => '舊密碼';
@override
String get newPassword => '新密碼';
@override
String get changePassword => '修改密碼';
@override
String get logout => '登出';
@override
String get confirmLogout => '確認登出';
@override
String get confirmLogoutDesc => '您確定現在要登出嗎?';
@override
String get cancel => '取消';
@override
String get language => '語言';
@override
String get selectLanguage => '選擇語言';
@override
String get english => 'English';
@override
String get simplifiedChinese => '简体中文';
@override
String get traditionalChinese => '繁體中文';
@override
String get japanese => '日本語';
@override
String get console => '控制台';
@override
String get failedToLoadRooms => '載入房間失敗';
@override
String get goLive => '開始直播';
@override
String get noActiveRooms => '暫無直播房間。快來開播吧!';
@override
String get hostId => '主播 ID';
@override
String get username => '用戶名';
@override
String get password => '密碼';
@override
String get fillAllFields => '請填寫所有欄位';
@override
String get networkError => '網路錯誤:無法連接到伺服器';
@override
String get loginFailed => '登錄失敗';
@override
String get login => '登錄';
@override
String get dontHaveAccount => '沒有帳號?立即註冊';
@override
String get createAccount => '建立帳號';
@override
String get joinHightube => '加入 Hightube';
@override
String get desiredUsername => '用戶名';
@override
String get register => '註冊';
@override
String get alreadyHaveAccount => '已有帳號?立即登錄';
@override
String get accountCreated => '帳號建立成功!請登錄。';
@override
String get playbackResolution => '播放解析度';
@override
String get availableNow => '目前可用';
@override
String get waitingForTranscoding => '正在等待後端轉碼輸出';
@override
String get sendMessage => '發送訊息...';
@override
String get liveChat => '即時聊天';
@override
String get refresh => '重新整理';
@override
String get volume => '音量';
@override
String get danmakuOn => '彈幕開啟';
@override
String get danmakuOff => '彈幕關閉';
@override
String get fullscreen => '全屏';
@override
String get exitFullscreen => '退出全屏';
@override
String get resolution => '解析度';
@override
String get playbackOptionsDesc => '選擇可用的轉碼流。';
@override
String get sourceOnlyDesc => '目前僅源流可用。';
@override
String get myStreamConsole => '我的直播控制台';
@override
String get noRoomInfo => '未找到房間資訊。';
@override
String get roomTitle => '房間標題';
@override
String get rtmpServerUrl => 'RTMP 伺服器地址';
@override
String get streamKey => '推流碼 (請務必保密!)';
@override
String get copiedToClipboard => '已複製到剪貼板';
@override
String get failedToFetchRoomInfo => '獲取房間資訊失敗';
}

View File

@@ -0,0 +1,70 @@
{
"@@locale": "zh",
"settings": "设置",
"networkConfiguration": "网络配置",
"backendServerUrl": "后端服务器地址",
"saveNetworkSettings": "保存网络设置",
"serverUrlUpdated": "服务器地址已更新",
"themeCustomization": "主题自定义",
"appearanceMode": "外观模式",
"system": "系统",
"light": "浅色",
"dark": "深色",
"accentColor": "强调色",
"explore": "探索",
"livePreviewThumbnails": "直播预览图",
"livePreviewThumbnailsDesc": "在可用时显示直播房间的缓存快照封面。",
"security": "安全",
"oldPassword": "旧密码",
"newPassword": "新密码",
"changePassword": "修改密码",
"logout": "退出登录",
"confirmLogout": "确认退出",
"confirmLogoutDesc": "您确定现在要退出登录吗?",
"cancel": "取消",
"language": "语言",
"selectLanguage": "选择语言",
"english": "English",
"simplifiedChinese": "简体中文",
"traditionalChinese": "繁體中文",
"japanese": "日本語",
"console": "控制台",
"failedToLoadRooms": "加载房间失败",
"goLive": "开始直播",
"noActiveRooms": "暂无直播房间。快来开播吧!",
"hostId": "主播 ID",
"username": "用户名",
"password": "密码",
"fillAllFields": "请填写所有字段",
"networkError": "网络错误:无法连接到服务器",
"loginFailed": "登录失败",
"login": "登录",
"dontHaveAccount": "没有账号?立即注册",
"createAccount": "创建账号",
"joinHightube": "加入 Hightube",
"desiredUsername": "用户名",
"register": "注册",
"alreadyHaveAccount": "已有账号?立即登录",
"accountCreated": "账号创建成功!请登录。",
"playbackResolution": "播放分辨率",
"availableNow": "当前可用",
"waitingForTranscoding": "正在等待后端转码输出",
"sendMessage": "发送消息...",
"liveChat": "实时聊天",
"refresh": "刷新",
"volume": "音量",
"danmakuOn": "弹幕开启",
"danmakuOff": "弹幕关闭",
"fullscreen": "全屏",
"exitFullscreen": "退出全屏",
"resolution": "分辨率",
"playbackOptionsDesc": "选择可用的转码流。",
"sourceOnlyDesc": "目前仅源流可用。",
"myStreamConsole": "我的直播控制台",
"noRoomInfo": "未找到房间信息。",
"roomTitle": "房间标题",
"rtmpServerUrl": "RTMP 服务器地址",
"streamKey": "推流码 (请务必保密!)",
"copiedToClipboard": "已复制到剪贴板",
"failedToFetchRoomInfo": "获取房间信息失败"
}

View File

@@ -0,0 +1,70 @@
{
"@@locale": "zh_Hant",
"settings": "設定",
"networkConfiguration": "網路設定",
"backendServerUrl": "後端伺服器地址",
"saveNetworkSettings": "儲存網路設定",
"serverUrlUpdated": "伺服器地址已更新",
"themeCustomization": "主題自訂",
"appearanceMode": "外觀模式",
"system": "系統",
"light": "淺色",
"dark": "深色",
"accentColor": "強調色",
"explore": "探索",
"livePreviewThumbnails": "直播預覽圖",
"livePreviewThumbnailsDesc": "在可用時顯示直播房間的快取快照封面。",
"security": "安全",
"oldPassword": "舊密碼",
"newPassword": "新密碼",
"changePassword": "修改密碼",
"logout": "登出",
"confirmLogout": "確認登出",
"confirmLogoutDesc": "您確定現在要登出嗎?",
"cancel": "取消",
"language": "語言",
"selectLanguage": "選擇語言",
"english": "English",
"simplifiedChinese": "简体中文",
"traditionalChinese": "繁體中文",
"japanese": "日本語",
"console": "控制台",
"failedToLoadRooms": "載入房間失敗",
"goLive": "開始直播",
"noActiveRooms": "暫無直播房間。快來開播吧!",
"hostId": "主播 ID",
"username": "用戶名",
"password": "密碼",
"fillAllFields": "請填寫所有欄位",
"networkError": "網路錯誤:無法連接到伺服器",
"loginFailed": "登錄失敗",
"login": "登錄",
"dontHaveAccount": "沒有帳號?立即註冊",
"createAccount": "建立帳號",
"joinHightube": "加入 Hightube",
"desiredUsername": "用戶名",
"register": "註冊",
"alreadyHaveAccount": "已有帳號?立即登錄",
"accountCreated": "帳號建立成功!請登錄。",
"playbackResolution": "播放解析度",
"availableNow": "目前可用",
"waitingForTranscoding": "正在等待後端轉碼輸出",
"sendMessage": "發送訊息...",
"liveChat": "即時聊天",
"refresh": "重新整理",
"volume": "音量",
"danmakuOn": "彈幕開啟",
"danmakuOff": "彈幕關閉",
"fullscreen": "全屏",
"exitFullscreen": "退出全屏",
"resolution": "解析度",
"playbackOptionsDesc": "選擇可用的轉碼流。",
"sourceOnlyDesc": "目前僅源流可用。",
"myStreamConsole": "我的直播控制台",
"noRoomInfo": "未找到房間資訊。",
"roomTitle": "房間標題",
"rtmpServerUrl": "RTMP 伺服器地址",
"streamKey": "推流碼 (請務必保密!)",
"copiedToClipboard": "已複製到剪貼板",
"failedToFetchRoomInfo": "獲取房間資訊失敗"
}