From db454bce27543245adf482fbfd615b9e79a32a10 Mon Sep 17 00:00:00 2001 From: Dae Euhwa Date: Wed, 24 Jun 2026 01:44:02 -0500 Subject: [PATCH 01/12] Add Japanese translations New values-ja/ resource directory with all string categories translated. --- app/src/main/res/values-ja/strings.xml | 128 ++++ .../main/res/values-ja/strings_changelogs.xml | 9 + .../res/values-ja/strings_cloud_services.xml | 226 ++++++ .../main/res/values-ja/strings_equalizer.xml | 57 ++ .../res/values-ja/strings_home_screen.xml | 276 ++++++++ .../main/res/values-ja/strings_library.xml | 558 +++++++++++++++ app/src/main/res/values-ja/strings_player.xml | 195 ++++++ .../main/res/values-ja/strings_screens.xml | 244 +++++++ .../main/res/values-ja/strings_settings.xml | 641 ++++++++++++++++++ app/src/main/res/values-ja/strings_widget.xml | 17 + 10 files changed, 2351 insertions(+) create mode 100644 app/src/main/res/values-ja/strings.xml create mode 100644 app/src/main/res/values-ja/strings_changelogs.xml create mode 100644 app/src/main/res/values-ja/strings_cloud_services.xml create mode 100644 app/src/main/res/values-ja/strings_equalizer.xml create mode 100644 app/src/main/res/values-ja/strings_home_screen.xml create mode 100644 app/src/main/res/values-ja/strings_library.xml create mode 100644 app/src/main/res/values-ja/strings_player.xml create mode 100644 app/src/main/res/values-ja/strings_screens.xml create mode 100644 app/src/main/res/values-ja/strings_settings.xml create mode 100644 app/src/main/res/values-ja/strings_widget.xml diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml new file mode 100644 index 000000000..5dedb3c73 --- /dev/null +++ b/app/src/main/res/values-ja/strings.xml @@ -0,0 +1,128 @@ + + + PixelPlayer + 音楽プレイヤー + アプリ名の変更について + 商標上の理由により、アプリ名を PixelPlay から PixelPlayer に変更しました。引き続きお楽しみください! + 今後表示しない + + + ホーム + 検索 + ライブラリ + + + 特別な権限が必要です + 曲のメタデータ(.mp3 ファイル)を編集するには、PixelPlayer にすべてのファイルへの特別なアクセス権限が必要です。これにより、トラックのタグを直接変更できます。メタデータ編集を有効にするには、次の画面でこの権限を許可してください。 + 権限を許可 + + + すぐに再生 + このオーディオファイルを開けませんでした。 + フルプレイヤーを開く + + + シャッフル + すべての曲をシャッフル + すべてシャッフル + 最後のプレイリスト + 開けるプレイリストがありません + + + Play ストアを開く + ベータを続ける + Play ストアのリンクは GitHub の設定から有効化されます。 + PixelPlayer が Google Play で公開されました + リリース更新は Google Play の安定版チャンネルをご利用ください。ベータビルドも引き続き提供されます。 + PixelPlayer + リリースのお知らせ + 近日公開 + + + PixelPlayer をご利用いただきありがとうございます! + ハイスコア %1$d + 閉じる + スコア + レベル %1$d + ライフ + レベルクリア! + ゲームオーバー + スコア: %1$d + もう一度? + 次のレベル + ゲームを再起動 + タップして再起動 + ランダムに音楽を再生 + ブロック崩し + ハイスコア %1$d + プレイ + ドラッグしてパドルを動かす + + + プレイヤーを閉じる + 再生操作を処理中… + 再生エラー: %1$s + + + 戻る + OK + キャンセル + 閉じる + エラー + 検索 + 検索をクリア + すべて + 確認 + 保存しました! + 選択済み + %1$d%% + アーティスト + すべて選択 + クリア + 不明なエラー + + + 保存 + 完了 + リセット + 適用 + シャッフル + コピー + 共有 + 元に戻す + インポート + 削除 + エクスポート + 結合 + 名前を変更 + 作成 + 歌詞 + 設定 + アルバムアート + プレイリスト + 不明なトラック + 不明なアーティスト + 不明なアルバム + 閉じる + 追加 + 削除 + 再生 + 前のトラック + 次のトラック + お気に入り + 一時停止 + リピート + オプション + シャッフル再生 + %1$s のその他のオプション + メニューを展開 + 次へ + 完了 + デフォルトに戻す + すべてエクスポート + すべて結合 + すべて共有 + アルバムを再生 + アルバムをシャッフル再生 + %1$s のアルバムアート + diff --git a/app/src/main/res/values-ja/strings_changelogs.xml b/app/src/main/res/values-ja/strings_changelogs.xml new file mode 100644 index 000000000..85544d5ba --- /dev/null +++ b/app/src/main/res/values-ja/strings_changelogs.xml @@ -0,0 +1,9 @@ + + + 変更履歴 + GitHub で見る + 改善 + 修正 + 新機能 + 追加 + diff --git a/app/src/main/res/values-ja/strings_cloud_services.xml b/app/src/main/res/values-ja/strings_cloud_services.xml new file mode 100644 index 000000000..a2e5bac75 --- /dev/null +++ b/app/src/main/res/values-ja/strings_cloud_services.xml @@ -0,0 +1,226 @@ + + + + Telegram ログイン + 番号を編集中です。再送すると前のコードが無効になります。 + 処理中… + Telegram を初期化中… + ログアウト中… + セッションを閉じています… + セッションが閉じました。続けるにはログインを再度開いてください。 + 安全な Telegram セッションを準備中… + Telegram からの応答を待機中… + Telegram に接続 + Telegram に接続してチャンネルやチャットから音楽をストリーミングします。 + 電話番号 + Telegram の番号を入力してください。後で戻って編集することもできます。 + 電話番号 + 81 + 09012345678 + コードを送信 + 確認コード + Telegram からのコードを入力してください。番号が間違っている場合は戻って修正してください。 + コード + 12345 + 電話番号を編集 + コードを再送 + コードを確認 + 二段階認証パスワード + Telegram のパスワードを入力してください。番号を修正するために戻ることもできます。 + パスワード + パスワードを確認 + しばらくお待ちください… + + + Telegram チャンネル + チャンネルを追加 + Telegram パブリックチャンネル + 同期中 + 今すぐ同期 + トピックを折りたたむ + トピックを表示 + チャンネルオプション + トピック + チャンネルを同期中 + Telegram から曲を更新中 + このチャンネルから最新の曲を取得 + チャンネルを削除 + 同期を停止してキャッシュされた曲を削除 + チャンネルを削除しますか? + %1$s の同期が停止し、このチャンネルのキャッシュされた曲がすべて削除されます。 + 削除 + 同期済みチャンネルがありません + Telegram のパブリックチャンネルを追加して\n音楽ライブラリを同期しましょう + チャンネルを追加 + 未同期 + %1$s に同期 + + + チャンネルを追加 + 音楽を同期する Telegram パブリックチャンネルを検索 + \@チャンネル名またはリンク + 検索中… + チャンネルを検索 + パブリックチャンネルのユーザー名またはリンクを入力して\nオーディオファイルを同期してください + + + %d 曲 + + + %d トピック + + + + Subsonic + Navidrome、Airsonic などの Subsonic 互換サーバーを管理します。 + + + 同期をタップして Jellyfin のプレイリストを取得してください + Jellyfin サーバーの接続を管理します。 + + + 音楽フォルダ + + をタップして Drive フォルダを追加 + フォルダがまだ追加されていません + %1$d フォルダが同期済み + フォルダを追加 + + + プレイリストの種類を選択 + 同期するプレイリストを選択: + すべてのプレイリスト + 作成 & お気に入り + 作成したプレイリスト + お気に入りのプレイリスト + + + %1$d プレイリストが同期済み + プレイリスト + 同期 + まだプレイリストが同期されていません + 同期をタップしてプレイリストを取得してください + クイックアクション + ライブラリを同期 + 切断 + %1$d 曲 + + + 同期中 + ライブラリを同期中… + プレイリストを取得中… + プレイリストを同期中: %1$s + ローカルライブラリを更新中… + 同期完了 + アルバムリストを取得中… + %1$s から曲を取得中… + %1$d 曲をデータベースに保存中… + ライブラリに曲が見つかりません + ライブラリ同期完了 + 同期中… + エラー: %1$s + + + 同期 + すべて同期 + ログアウト + すべてのプレイリストを同期 + ユーザーアバター + + + インターネット接続がありません + このコンテンツにはインターネット接続が必要です。ネットワーク設定を確認して再試行してください。 + オフラインです + このコンテンツにアクセスするにはインターネット接続を確認して再試行してください。 + + + 接続 + 接続中… + サーバー URL とアカウントの認証情報を入力してください。 + 接続詳細 + パスワードを非表示 + パスワード + パスワードを入力 + http:// を入力 + サーバー URL + パスワードを表示 + Telegram + ユーザー名 + admin + ようこそ、%1$s! + + + Navidrome、Gonic、Airsonic などの Subsonic 互換サーバーに対応 + Navidrome、Airsonic、Gonic、Ampache などの Subsonic API 互換サーバーをサポートします。 + サーバーが対応している場合はアプリパスワードも使用できます。 + https:// を入力 + セルフホスト型音楽サーバーに接続 + Navidrome + サーバーの完全な https:// ベースアドレスを使用してください。 + https://music.example.com + Subsonic または Navidrome のアカウント名です。 + Subsonic / Navidrome + Subsonic + + + Jellyfin サーバー URL とアカウントの認証情報を入力してください。 + 音楽ライブラリをストリーミングするために Jellyfin サーバーに接続します + Jellyfin サーバーに接続します。ローカルネットワークアクセスには HTTP と HTTPS の両方がサポートされています。 + Jellyfin + Jellyfin アカウントのパスワード。 + Jellyfin メディアサーバーに接続 + Jellyfin + ポートを含む Jellyfin サーバーの完全な URL。 + http://192.168.1.100:8096 + Jellyfin アカウントのユーザー名。 + + + Google Drive から直接音楽ファイルをストリーミング + Google Drive に接続 + Google Drive に接続しました! + 「PixelPlayer Music」を作成 + ここに音楽用の新しいフォルダを作成 + フォルダがありません + フォルダを開く + 音楽ソースとして使用するフォルダを選択または作成 + 音楽フォルダを選択 + Google Drive をセットアップ中… + Google でサインイン + Google Drive + 使用 + + + セッション Cookie を読み取れませんでした。 + 完了 + 終了 + Cookie が見つかりません。先にログインしてください。 + ページの読み込みに時間がかかっています。更新するか別のネットワークをお試しください。 + + + 保存中… + 残る + ページの読み込みがタイムアウトしました。進捗を失わずに再試行できます。 + Web で戻る + 後で戻れます。閉じると現在のページの状態は破棄されます。 + Web で進む + 更新 + 再試行 + ホームを開く + WebView の読み込みに失敗しました。 + + + NetEase の Cookie を読み取れませんでした: %1$s + NetEase のログインを終了しますか? + NetEase の読み込み中に HTTP %1$d エラーが発生しました。 + まだログインが検出されていません。完了を押す前に NetEase のログインを完了してください。 + NetEase Music にログイン + セキュリティについて: パスワードは NetEase のウェブページにのみ入力されます。PixelPlayer はライブラリを同期するためにセッション Cookie(MUSIC_U)を保存します。 + NetEase Music + + + QQ Music の Cookie を読み取れませんでした: %1$s + QQ Music のログインを終了しますか? + QQ Music の読み込み中に HTTP %1$d エラーが発生しました。 + まだログインが検出されていません。完了を押す前に QQ Music のログインを完了してください。 + QQ Music にログイン + セキュリティについて: パスワードは QQ Music のウェブページにのみ入力されます。PixelPlayer はライブラリを同期するためにセッション Cookie を保存します。 + QQ Music + diff --git a/app/src/main/res/values-ja/strings_equalizer.xml b/app/src/main/res/values-ja/strings_equalizer.xml new file mode 100644 index 000000000..3c36811ad --- /dev/null +++ b/app/src/main/res/values-ja/strings_equalizer.xml @@ -0,0 +1,57 @@ + + + + 名前を入力してください + 名前を変更 + + + 表示モードを変更 + イコライザーを無効化 + イコライザーを有効化 + 編集 + プリセットを編集 + カスタムプリセット + プリセット + 更新 + バスブースト + バーチャライザー + ラウドネス + 非対応 + この端末では非対応 + 音量 + 周波数特性 + Hz + バス + ローミッド + ハイミッド + トレブル + バス / ロー + ミッド / ハイ + ページ %1$d + 時間をリセット + 新規保存 + + + 保存済みプリセット + カスタムプリセットがまだ保存されていません。 + ピンを外す + ピン留め + 名前を変更 + 削除 + + + カスタムプリセットを保存 + カスタムイコライザープリセットの名前を入力してください。 + プリセット名 + プリセット名を変更 + + + プリセットを管理 + ドラッグして並び替え • 目のアイコンで表示/非表示を切り替え + 並び替え + プリセットをリセット + デフォルトのプリセット順と表示状態に戻します。続けますか? + デフォルトに戻す + 表示 + 非表示 + diff --git a/app/src/main/res/values-ja/strings_home_screen.xml b/app/src/main/res/values-ja/strings_home_screen.xml new file mode 100644 index 000000000..ac2021f3e --- /dev/null +++ b/app/src/main/res/values-ja/strings_home_screen.xml @@ -0,0 +1,276 @@ + + + + β + ベータ + クラウドストリーミング + 変更履歴 + クラウドストリーミング + クラウドアカウントから音楽をストリーミング + + + Beta 0.7.0 + β + PixelPlayer 0.7.0-beta へようこそ + バグ、クラッシュ、または試験的な機能が含まれている可能性があるベータビルドを使用しています。問題を報告して改善にご協力ください。 + 期待されること + バグ、クラッシュ、または未完成の機能が予期せず発生することがあります。 + 一部の機能は予告なく変更または削除される場合があります。 + ベータビルドはリリース版より不安定な場合があります。 + 既知の問題を報告する前に必ず最新版を確認してください。 + テスト中にベータビルドが変更、破損、または改善される可能性があること。 + GitHub Issue のショートカット + まず検索してから、バグ、クラッシュ、要望、質問に対する集中したレポートを作成してください。 + 既存の Issue を開く + Issue またはクラッシュを報告 + 再現手順、期待される結果、実際の結果、デバイス/OS の詳細を共有してください。 + 報告方法 + 新しい Issue を開く前の簡単なチェックリスト。 + Issue を開く前に + 重複を避けるために既存のオープンおよびクローズ済みの Issue を検索してください。 + 最新の PixelPlayer バージョンに更新して問題が引き続き発生することを確認してください。 + アプリを再起動して問題が続くことを確認してください。 + 再現を試みて正確な手順を書き留めてください。 + Issue の種類は? + バグ報告: 何かが正しく動作しない。 + 機能リクエスト: 新機能や改善の追加。 + 質問: Discussions が有効な場合はそちらを使用するか、question ラベルで Issue を開いてください。 + バグ報告 + 何かが正しく動作しないまたはクラッシュする場合にこれらのフィールドをコピーしてください。 + バグ報告 + 概要: + 期待される動作: + 現在の動作: + 再現手順: 1. 2. 3. + 頻度は? 常時 / 時々 / まれに。 + スクリーンショット / 動画: あれば。 + ログ / スタックトレース: あれば。 + 環境 + PixelPlayer バージョン: + インストール元: GitHub リリース、デバッグビルド、ナイトリービルドなど。 + Android バージョン: + 端末モデル: + 補足情報: SD カードの使用、特別な設定、権限など。 + 機能リクエスト + 新機能や改善を要望する場合にこれらのフィールドをコピーしてください。 + 問題の説明: 解決しようとしている問題は何ですか? + 提案する解決策: どのように機能すればよいですか? + 検討した代替案: 他のアプローチはありますか? + 範囲: どの画面やフローが影響を受けますか? + 利用可能であればモックアップや参考画像。 + タイトル、プライバシー、範囲 + 報告をトリアージしやすく安全に共有できるようにします。 + 良い Issue タイトルの例 + イコライザー: プリセットタブを切り替えるとインジケーターがずれる + 検索: 空のクエリで履歴リストが表示されない + 機能: 「最近追加された」プレイリストの並び替えオプションを追加 + 避けるべきこと + 「動かない」のような一般的な報告。 + 1 つの Issue に複数の無関係な問題を含める。 + プライベートデータが含まれた未編集のログやスクリーンショット。 + プライバシーについて + ログ、スクリーンショット、動画を投稿する前に個人情報やプライベートな情報を削除してください。 + ナイトリービルド + ナイトリーとリリースの違い、および破損した場合に含めるべき情報。 + ナイトリービルドは最新のコミットから生成され、未完成の変更、一時的なバグ、またはリグレッションが含まれる場合があります。公式リリースよりも試験的です。 + 利用可能な場合はリポジトリの GitHub Actions ワークフローアーティファクトからアクセスできます。 + ナイトリーの問題を報告する + ナイトリービルドで問題を報告する場合は、公式リリースではなくナイトリービルドで発生したことを必ず記載してください。可能であればビルド日、ワークフロー実行名または番号、コミット SHA を含めてください。また同じ問題が最新の公式リリースでも発生するか確認してください。 + Beta 0.5.0 アップグレード + クリーンインストール推奨 + beta 0.5.0 からのアップデートの場合、このアップデートでは古いキャッシュ状態ではなく新しいライブラリデータが必要な場合があります。 + メタデータやライブラリエントリがおかしい場合 + 曲のメタデータが間違っている、アーティストやアルバムが一致しない、または重複しているように見えるエントリは通常クリーンインストールで解決します。 + 今後表示しない + 了解 + + + 問題が発生しました + 前回のセッション中にアプリがクラッシュしました。クラッシュレポートを共有して修正にご協力ください。 + 日時: %1$s + エラー: + スタックトレース(プレビュー): + クラッシュログ + クラッシュログをクリップボードにコピーしました + PixelPlayer クラッシュレポート + クラッシュレポートを共有 + + + DJ ミキサー + + + あなたの\nミックス + まだ表示するデータがありません + PixelPlayer が曲を見つけるかソースを同期するとミックスがここに表示されます。 + 更新 + + + デイリーミックス + 履歴に基づく + デイリーミックスをすべて確認 + デイリーミックス + + + デイリーミックス + + %1$d 曲 • %2$s + + 再生する + AI プレイリストジェネレーター + + + デイリーミックスの作られ方 + デイリーミックスはお気に入りのよく再生される曲から作られます。好みのアーティストやジャンルのトラックも追加されるので新しい音楽を発見できます。 + 今日何を聴きたいか AI に伝えましょう + コストを抑えるため少量のサンプルを使用します + 更新中… + デイリーミックスを更新 + + + 完璧にキュレーション + デイリーミックス + あなたのソニックジャーニーの準備ができました + AI プレイリストジェネレーター + 雰囲気、ムード、アクティビティを説明して、ライブラリから AI に完璧なプレイリストをキュレーションさせましょう。 + プレイリストのサイズ + 最小曲数 + 最大曲数 + 例: チルな夜の雰囲気、アップビートなワークアウトエネルギー… + タップして再試行 + ソニックジャーニーが完成しました! + 再生準備完了 + 生成中… + プレイリストを生成 + + + 最近再生した曲 + + + 最近再生した曲 + 最新を再生 + %1$s に最近の再生はありません + 範囲を変更するか、タイムラインを埋めるためにもっと曲を再生してください。 + 最近再生した曲 + 今日 + 昨日 + + + リスニング統計 + 総再生回数 + 1 日平均 + トップトラック + %1$s • %2$d 回 + + + リスニング統計 + リスニング統計を更新 + 今日 + 今週 + 今月 + 今年 + 全期間 + リスニング + 再生 + リスニングタイムライン + リスニング時間 + 選択した範囲でのリスニングの合計。 + 再生回数 + セグメントごとに完了したセッション数。 + 平均セッション + 各セグメントの平均リスニング時間。 + 4 時間ごとに分割して日々のリズムを確認できます。 + 日別バーで週ごとの習慣を比較しやすくします。 + 週別バーで月のトレンドを確認できます。 + 月別バーで年間の季節性を確認できます。 + 年別バーで全履歴を要約します。 + まだリスニングデータがありません + 再生を始めてリスニングタイムラインを構築しましょう + 日々のリズム + 週のリズム + 月のリズム + 年間一覧 + 全期間の推移 + 4 時間ごとのセグメントでグループ化 + 曜日でグループ化 + 月の週でグループ化 + 月でグループ化 + 年でグループ化 + ピークセグメント + %1$d 回 + + トップカテゴリ + ジャンル、アーティスト、アルバム、曲ごとのリスニングを比較します。 + ジャンル + アーティスト + アルバム + + ジャンル別リスニング + アーティスト別リスニング + アルバム別リスニング + 曲別リスニング + %1$d 回 • %2$d アーティスト + %1$d 回 • %2$d トラック + まだカテゴリデータがありません + 再生を始めてリスニングのハイライトを確認しましょう + リスニング習慣 + まだ習慣データがありません + あなたのことをより知ったらリスニング習慣を表示します。 + 総セッション数 + 平均セッション + 最長セッション + セッション/日 + 最もアクティブな日 + まだ再生履歴がありません + ピークタイムラインスロット + トップアーティスト + トップアーティストがいません + 聴き続けるとお気に入りのアーティストがここに表示されます。 + \? + %1$d. %2$s + トップアルバム + トップアルバムがありません + よく聴くアルバムがここに表示されます。 + %1$d. %2$s + トラック集中度 + トップトラック全体でリスニング時間がどのように分散しているか。 + まだ集中度データがありません + より多くのトラックを再生してリスニングの集中度を確認しましょう。 + トップ 1 + トップ 2-3 + その他 + %1$d%% + リスニング集中度 + トップ 3 トラックがリスニング時間の %1$d%% を占めています。 + 平均再生回数/トラック + ユニークトラック + トップ 3 シェア + この期間のトラック + 選択した期間で最も再生されたトラック。 + トップトラックがありません + お気に入りを聴き続けるとここでハイライトされます。 + トラックを折りたたむ + すべてのトラックを表示 + + + %1$d 時間 %2$02d 分 + %1$d 分 + %1$d 時間 %2$02d 分 + %1$d 時間 + %1$d 分 + %1$d 秒 + %1$d 時間 %2$02d 分 + %1$d 時間 + %1$d 分 + %1$d 秒 + なし + たった今 + 1 日前 + %1$d 日前 + 1 時間前 + %1$d 時間前 + 1 分前 + %1$d 分前 + %1$d 曲 + %1$d 曲 + 第 %1$d 週 + diff --git a/app/src/main/res/values-ja/strings_library.xml b/app/src/main/res/values-ja/strings_library.xml new file mode 100644 index 000000000..4c7c2d6ca --- /dev/null +++ b/app/src/main/res/values-ja/strings_library.xml @@ -0,0 +1,558 @@ + + + + ライブラリ + ライブラリタブ + 任意のタブへ直接ジャンプするか、順序を変更できます。 + タブを並び替え + + + + アルバム + アーティスト + プレイリスト + フォルダ + お気に入り + + + プレイリストを作成しました + 先に AI プロバイダーの API キーを設定してください + 先に Gemini API キーを設定してください + キューに追加しました + 次に再生 + + + Watch への転送 + 設定 + 編集 + タブを並び替え + メニューを展開 + + + 選択できるアルバムは最大 %1$d 枚です + フォルダ + フォルダ + + + 並び替え + 表示 + プレイリスト表示 + グリッド + リスト + 内部ストレージ + SD カード + SD カードは現在利用できません。 + クラウド + Telegram クラウドチャンネル + トピック表示 + チャンネル + トピック + 両方 + クラウド + クラウドのみ + + + AI でメタデータを生成中… + + + 曲の読み込みエラー + アルバムの読み込みエラー + アーティストの読み込みエラー + 再試行 + + + ライブラリに曲が見つかりませんでした。 + 端末に音楽がある場合は、設定からライブラリを再スキャンしてみてください。 + 曲が見つかりません + + + 新規 + 新しいプレイリストを作成 + M3U プレイリストをインポート + 現在の曲を探す + すべての曲 + クラウド + ローカル + 並び替えオプション + + + すべて + 選択解除 + その他のオプション + + + 音楽ファイルをスキャン中… + ファイルを処理中… + %2$d 件中 %1$d 件 + ライブラリを同期中… + 同期完了 + 待機中… + ライブラリを同期中… + アルバムアートキャッシュをクリア中… + クラウドソースを同期中… + 歌詞をスキャン中… + + + 曲がまだありません + 音楽を端末に追加するか、クラウドソースを同期して再生を始めましょう。 + ローカルの曲が見つかりません + 別のソースフィルターを試すか、端末のライブラリを再スキャンしてください。 + クラウドの曲が見つかりません + Telegram や NetEase の曲を同期するか、ローカルソースに切り替えてください。 + アルバムがありません + ライブラリにトラックがグループ化されるとアルバムが表示されます。 + ローカルアルバムが見つかりません + ローカルアルバムを作成するにはローカルの曲が必要です。 + クラウドアルバムが見つかりません + アルバムデータを持つクラウドの曲は同期後にここに表示されます。 + アーティストがいません + いずれかのソースから曲がインデックスされるとアーティストが表示されます。 + ローカルアーティストが見つかりません + ローカルの曲にアーティストのメタデータがありません。 + クラウドアーティストが見つかりません + リモートの曲が同期されるとクラウドアーティストが表示されます。 + お気に入りの曲がまだありません + 再生中にハートアイコンをタップして曲を保存しましょう。 + お気に入りのローカル曲がありません + ソースフィルターを切り替えるか、端末の曲をお気に入りに追加してください。 + お気に入りのクラウド曲がありません + Telegram や NetEase のトラックをお気に入りに追加するとここに表示されます。 + フォルダが見つかりません + 音楽が入った内部ストレージのフォルダがここに表示されます。 + プレイリストがまだありません + 最初のプレイリストを作成してライブラリを整理しましょう。 + + + 曲のメタデータを編集 + 再生 + 曲を再生 + すべて再生 + すべて再生 + お気に入りに追加 + すべてお気に入りに追加 + お気に入りから削除 + すべてお気に入りから削除 + 曲ファイルを共有するアプリを選択 + 曲ファイルを共有 + すべてを ZIP で共有 + 曲を共有できませんでした: %1$s + キューに追加 + キューに追加 + 次に再生 + キューで次に再生 + プレイリストに追加 + 削除 + すべて削除 + Watch を確認中 + 転送中 %1$d%% + Watch に転送中 + 転送中 + Watch に送る + Watch が利用できません + 曲を Watch に送る + Watch が利用できません + サウンドとして設定 + サウンドとして設定 + この曲をシステムサウンドとして使う方法を選択 + この曲を使う場所 + PixelPlayer がこのサウンドをインストールする場所を選択してください。 + 着信音 + 電話の着信 + 通知音 + メッセージとアプリの通知 + アラーム音 + 時計のアラーム + サウンドの変更を確認 + 「%1$s」を %2$s に設定しますか? + サウンドを設定 + 「%1$s」を %2$s に設定しました + 着信音 + 通知音 + アラーム音 + 「システム設定の変更」を有効にしてから PixelPlayer に戻ると自動で完了します。 + 「システム設定の変更」が有効になっていません。 + 「%1$s」を着信音に設定しました + 着信音にはローカルの曲のみ使用できます。 + この音声ファイルを着信音用に準備できませんでした。 + 着信音を設定できませんでした: %1$s + オプション + オプション + 情報 + 情報 + 再生時間 + ジャンル + アルバム + アーティスト + 曲の情報 + プロバイダー + ファイル + %1$d 曲 + 選択中 + %1$d プレイリスト + %1$d アルバム + 選択中 + 上限: %1$d アルバム + キューへの追加と再生は選択順序に従います。 + %1$d ジャンル + 選択中 + 選択したジャンル内のすべての曲に対して一括操作を実行します。 + + + デフォルト順 + タイトル(A〜Z) + タイトル(Z〜A) + アーティスト + アーティスト(Z〜A) + アルバム + アルバム(Z〜A) + 追加日 + 追加日(古い順) + 再生時間 + 再生時間(短い順) + リリース年 + リリース年(古い順) + 曲数が少ない順 + 曲数が多い順 + 名前(A〜Z) + 名前(Z〜A) + 曲数(多い順) + 曲数(少ない順) + 作成日 + 作成日(古い順) + お気に入り追加日 + お気に入り追加日(古い順) + サブフォルダが少ない順 + サブフォルダが多い順 + + + タイトル + アーティスト + アルバム + 追加日 + 再生時間 + リリース年 + 曲数 + 名前 + 曲数 + 作成日 + お気に入り追加日 + サブフォルダ数 + + + ソース + 順序 + 降順 + 昇順 + 元の順序 + タップして昇順に切り替え + タップして降順に切り替え + この並び替えは元の順序を維持します + スイッチがオン + + + ライブラリタブを並び替え + 順序をリセット + タブの順序をデフォルトに戻しますか? + タブを並び替え中… + ドラッグハンドル + + + アーティストを選択 + 1 アーティスト + %1$d アーティスト + メインアーティスト + アーティストページ + + + 転送をキャンセル + %1$s / %2$s + スマートフォンから Watch への音楽転送の進捗をリアルタイムで表示します + Watch への転送 + Watch に送信中 + キャンセル済み + 転送をキャンセルしました + 転送が完了しました + 完了 + 失敗 + 転送に失敗しました + 複数の転送が進行中 + %1$s • %2$s + 準備中 + Watch への転送を準備中 + 転送を準備中… + Watch に %1$d 曲を送信中 + Watch に送信中 + 転送を開始中… + 開始中 + 転送中 + %1$d 件の転送 + + + 曲を編集 + 情報を表示 + 曲のメタデータを編集中 + 曲のメタデータを編集すると、ライブラリでの表示や整理に影響することがあります。変更は永続的で、元に戻せない場合があります。 + 了解 + 情報 + カバーアート + 正方形の画像を選択して調整し、アプリ全体でカバーアートが美しく表示されるようにしましょう。 + カバーアートを変更 + カバーアートを削除 + タイトル + アーティスト + アルバム + アルバムアーティスト + ジャンル + 作曲者 + トラック番号 + ディスク番号 + ReplayGain トラック(dB) + ReplayGain アルバム(dB) + -6.50 + -8.20 + 新しいカバーアートのプレビュー + 現在の曲のカバーアート + カバーアートを調整 + ピンチとドラッグで最適なフレーミングを見つけてください。 + カバーアートを適用 + 選択した画像を読み込めませんでした + lrclib.net で歌詞を検索 + + + %d 曲を編集 + 変更したフィールドのみ更新されます。空白のフィールドは既存の値が保持されます。 + (複数の値) + (任意 — スキップする場合は空白のまま) + %d 曲を更新しました + %2$d 曲中 %1$d 曲を更新しました。一部のファイルは編集できませんでした。 + 曲の更新に失敗しました + カバーアートの一括変更 + 選択した %d 曲すべてのカバーアートが置き換えられます + すべてにカバーアートを設定 + すべてのカバーアートを削除 + (複数の異なるカバー) + + + プレイリストを閉じました + + + プレイリストを作成 + 作成方法を選択してください。 + 手動 + アートワーク・アイコン・形状をデザインし、曲を自分で選びます。 + AI で作成 + 高度なコントロールでキュレーションされたプレイリストを生成します。 + 設定で Gemini API キーを設定する必要があります。 + API キーを設定 + + + AI プレイリストラボ + リセット + 生成中… + 生成 + 意図 + プレイリスト名(任意) + このプレイリストの雰囲気は? + 例:夕暮れのドライブにウォームなシンセ + 方向性 + ムード + アクティビティ + 年代 + キュレーション + エネルギー + 曲の強度とテンポを調整します。1 = 穏やか/スロー、5 = ハイエネルギー/ファスト。 + ディスカバリー + 選曲の馴染み度を調整します。1 = 最もよく聴くお気に入り、5 = あまり聴いていないレアな曲。 + 最小曲数 + 最大曲数 + フィルター + 優先するジャンル(任意) + 例:シンセウェーブ、インディーポップ + 避けるジャンル(任意) + 例:メタル、ハードトラップ + 優先言語(任意) + 例:日本語、英語、インストゥルメンタル + お気に入りを優先 + 不適切な歌詞を除外 + プロンプトのプレビュー + 好みを追加すると最終プロンプトがここに表示されます。 + 精密なキュレーション + ムード・アクティビティ・制約・深さを定義します。 + AI はローカルライブラリの曲のみを使用します。 + AI への指示を少なくとも 1 つ追加してください。 + 有効な曲数の範囲を設定してください。 + %1$d/5 + カスタム… + カスタム値を入力 + カスタム値を入力してください + + + すべての年代 + コアリクエスト: %1$s。 + ムード目標: %1$s。 + アクティビティ: %1$s。 + 年代: %1$s。 + 優先ジャンル: %1$s。 + 避けるジャンル: %1$s。 + 優先言語: %1$s。 + エネルギーレベル目標: %1$d/5。 + ディスカバリー目標: %1$d/5(1 = 馴染みあり、5 = レアな掘り出し物)。 + 可能な限りお気に入りに近い曲を優先する。 + 代替曲がある場合は不適切な歌詞を避ける。 + スムーズなトランジションを維持し、同じアーティストが連続しないようにする。 + + チル + エネルギッシュ + ハッピー + ダーク + ロマンティック + メランコリック + + + ワークアウト + 集中 + ロードトリップ + パーティー + 勉強 + 深夜 + + + @string/playlist_creation_ai_era_any + 70年代 + 80年代 + 90年代 + 2000年代 + 2010年代 + 2020年代 + + + + プレイリストがまだ作成されていません。 + 「新しいプレイリスト」ボタンをタップして始めましょう。 + 新しいプレイリスト + プレイリスト名 + マイプレイリスト + + + %1$d 曲を追加先… + プレイリストを選択 + プレイリストを検索… + プレイリストに曲を追加しました + プレイリストを作成して曲を追加しました + 内部ストレージ + + + 曲を追加 + 選択した曲を追加 + 追加 + 曲を検索またはフィルター… + お気に入り + 曲の読み込みに失敗しました + さらに読み込む + + + プレイリストを結合 + 結合後のプレイリスト名を入力してください: + 結合プレイリスト + 選択した %1$d 件のプレイリストを 1 つに結合します。 + + + 再生できる有効な曲が見つかりませんでした + 現在のリストに曲が見つかりません + 曲を見つけられませんでした + ライブラリに曲が見つかりません + %1$s の再生が終了しました(トラック終了)。 + トラック + シャッフルする曲がありません。 + 選択したアルバム + 選択したアルバムに再生可能な曲が見つかりませんでした + 選択したジャンルに再生可能な曲が見つかりませんでした + 最初の %1$d アルバムのみキューに追加しました + %1$d アルバムをキューに追加しました(%2$d 曲) + 選択したアルバムをキューに追加できませんでした + すべての曲がすでにお気に入りにあります + お気に入りに曲がありませんでした + ZIP ファイルを作成中… + 共有に失敗しました: %1$s + + %d 曲をキューに追加しました + + + %d 曲が次に再生されます + + + %d 曲をお気に入りに追加しました + + + %d 曲をお気に入りから削除しました + + + + 共有するプレイリストがありません + プレイリストを共有 + 共有に失敗しました: %1$s + エクスポートするプレイリストがありません + エクスポートに失敗しました: %1$s + Music/PixelPlayer Exports + 設定で Gemini API キーを設定してください。 + プレイリストを復元しました + + %d 件のプレイリストを共有中 + + + %2$s に %1$d 件のプレイリストをエクスポートしました + + + + 無効なアルバム ID + アルバム ID が見つかりません + アルバムデータの読み込みエラー: %s + アルバムが見つかりません + + + 無効なアーティスト ID + アーティスト ID が見つかりません + アーティストデータの読み込みエラー: %s + アーティストが見つかりませんでした + + + 再生中の曲は削除できません + %1$d 件のファイルを削除しました(%2$d 件スキップ — 再生中) + %2$d 件中 %1$d 件のファイルを削除しました + ファイルの削除に失敗しました + ファイルを削除しました + ファイルを削除できないか、見つかりません + 削除をキャンセルしました + 曲を削除しますか? + %2$s の「%1$s」\n\nこの曲は端末から完全に削除され、元に戻せません。 + これらの曲は端末から完全に削除され、元に戻せません。 + + %d 件のファイルを削除しました + + + %d 曲を削除しますか? + + + + メタデータを更新しました + %1$d 曲を更新中… + %1$d 曲を正常に更新しました! + %1$d 曲を更新しました。失敗: %2$d 曲 + 歌詞を保存しました + 歌詞の保存に失敗しました + 保存できる歌詞がありません + 権限が拒否されました — ファイルを編集できません + 権限が拒否されました — 歌詞を保存できません + 権限が拒否されました — このファイルを編集できません + + + 設定で選択した AI プロバイダーの有効な API キーを設定してください。 + AI エラー: %s + 選択した AI プロバイダーはアカウントのクレジットまたはクォータが不足しているためリクエストを拒否しました。 + 選択した AI モデルは利用できなくなりました。PixelPlayer がサポート対象のモデルへ自動的に切り替えを試みました。 + AI がプロンプトに合う曲を見つけられませんでした。 + デイリーミックスのアイデアを書いてください + AI でデイリーミックスを更新しました + 更新できませんでした: %s + AI がこのミックスに合う曲を見つけられませんでした + diff --git a/app/src/main/res/values-ja/strings_player.xml b/app/src/main/res/values-ja/strings_player.xml new file mode 100644 index 000000000..eae601ef3 --- /dev/null +++ b/app/src/main/res/values-ja/strings_player.xml @@ -0,0 +1,195 @@ + + + + プレイヤーを閉じる + 再生中 + クラウドストリーム + キャスト + Bluetooth + 本体再生 + 接続中… + キューを開く + + + 接続の準備 + キャスト・Bluetooth オーディオ・スピーカーを同期するために、PixelPlayer が近くのデバイスと現在の Wi‑Fi を確認できるよう許可してください。 + 近くのデバイス + 接続済み Bluetooth オーディオ機器の読み取りと制御に必要です。 + Wi‑Fi 用の位置情報 + Android では、互換性のあるキャストデバイスを検出するために Wi‑Fi ネットワーク(SSID)の共有に位置情報が必要です。 + アクセスを許可 + これらの権限はデバイスの相互接続(キャスト・近くのスピーカーの制御・オーディオ同期)にのみ使用します。 + デバイスを接続 + 近くをスキャン中 + キャストセッション + 接続中 + 接続済み + このスマートフォン + Bluetooth オーディオ + 本体再生 + 再生中 + 一時停止中 + デバイスの音量 + スマートフォンの音量 + %1$d/%2$d + バッテリー残量 + 音量レベル + 切断 + 接続性 + Wi-Fi または Bluetooth をオンにしてください + 接続を更新 + Wi-Fi + オフ + オン + 接続済み + Bluetooth + オフ + オン + 接続済み + 近くのデバイス + デバイスを更新 + 接続済み + 接続中 + 接続可能 + 利用可能 + 接続中... + デバイスを検索中… + テレビやスピーカーの電源が入っており、同じ Wi‑Fi ネットワークに接続されていることを確認してください。 + コントロール + デバイス + + + キャストメディアサーバー + デバイスにキャスト中 + キャストデバイスにメディアを配信中 + %1$s: %2$s + このオーディオフォーマットはキャスト中にシークするとセッションがクラッシュする可能性があるため、一時的に利用できません。 + + + スリープタイマー + タイマー + %1$d 分 + %1$d 分後にタイマーをセットしました。 + 1 回 + + %d 回 + + 再生回数: %1$s + 現在のトラックの終わり + トラックの終わりで再生を停止します。 + スイッチをオン + カスタム時間 + タイマーをキャンセル + トラックの終わり + タイマーをキャンセルしました。 + 再生中の曲がないため、トラック終了タイマーを有効にできません。 + 曲が %1$s から %2$s に変わったため、トラック終了タイマーを無効にしました。 + 前のトラック + 現在のトラック + カスタム時間を設定 + + + 次の曲 + キューはまだ空です。 + + %d 曲待機中 + + キュー + キューは空です。 + 曲を並び替え + シャッフルを切り替え + リピートを切り替え + スリープタイマー + その他の操作 + 現在の曲を探す + キューをクリア + キューをクリア + 現在再生中の曲以外をすべてキューから削除しますか? + プレイリストとして保存 + %1$s のキュー + 現在のキュー + 曲を削除 + 削除しました + プレイリストとして保存 + すべて選択解除 + プレイリスト名 + 含める曲を検索… + 「%1$s」に一致する曲はありません + + %d 曲を選択中 + + %1$s として保存 + プレイリスト名を入力 + プレイリストから削除 + %1$s のその他のオプション + + + 歌詞 + 歌詞を読み込み中… + 同期あり + テキストのみ + 歌詞オプション + −.5 + −.1 + +.1 + +.5 + 0s + %1$+.1f 秒 + + + 歌詞の検索に失敗しました + リモートからの歌詞取得に失敗しました + 接続がタイムアウトしました。インターネット接続を確認してください。 + ネットワークエラー。インターネット接続を確認してください。 + サーバーエラー(コード %d)。しばらくしてから再試行してください。 + + + 歌詞はすでに利用可能です。オンライン取得をスキップしました。 + 埋め込み歌詞が見つかりました。オンライン取得をスキップしました。 + ローカル(.lrc)歌詞が見つかりました。オンライン取得をスキップしました。 + + + 歌詞を保存 + AI で翻訳 + この歌詞にはすでに翻訳があります + この歌詞はすでにこの言語です + API が設定されていません + 歌詞の翻訳が完了しました! + 歌詞を翻訳中... + インポートした歌詞をリセット + 歌詞をリセットしますか? + この曲の歌詞をリセットしてもよろしいですか? + 表示 + 配置 + 左揃え + 中央揃え + 右揃え + コントロール + 同期を調整 + 同期コントロールを非表示 + ローマ字表記を表示 + 翻訳を表示 + 没入モードを一時解除 + 画面をオンに保つ + + + 歌詞を保存 + 保存するバージョンを選択してください: + 同期あり(タイムスタンプ付き) + テキストのみ + + + 歌詞をオンラインで検索しますか? + 歌詞の候補を表示 + 最初の候補を自動適用せず、常に選択画面を開く + 歌詞を検索中… + 歌詞が見つかりませんでした + 歌詞を自動で見つけられませんでした。タイトルやアーティスト名を編集して手動で検索できます。 + 曲名 + アーティスト(任意) + %d 件見つかりました + 同期あり + %1$s • %2$s + 歌詞提供元: + https://lrclib.net/ + diff --git a/app/src/main/res/values-ja/strings_screens.xml b/app/src/main/res/values-ja/strings_screens.xml new file mode 100644 index 000000000..be88a28c0 --- /dev/null +++ b/app/src/main/res/values-ja/strings_screens.xml @@ -0,0 +1,244 @@ + + + + エラー: ジャンル ID がありません + + + 始めましょう! + ステップ %1$d / %2$d + 先に必要な権限を許可してください。 + 必要な権限をすべて許可してください。 + ようこそ + β + ベータ + セットアップを完了しましょう。 + メディアの権限 + 音楽ライブラリを構築するために、PixelPlayer がオーディオファイルへアクセスする必要があります。 + 権限が許可されました + メディア権限を許可 + 通知 + ロック画面や通知シェードから音楽を操作するために通知を有効にします。 + 通知を有効化 + バックアップはありますか? + PixelPlayer のバックアップがある場合は今すぐ復元することでこのデバイスのセットアップの大部分をスキップできます。 + バックアップをインポート + バックアップを確認中 + バックアップパッケージを確認中… + バックアップを復元中 + スキップ / あとで + バックアップを復元 + セットアップを完了する前にインポートする内容を確認してください。 + %2$d モジュール中 %1$d を選択中 + %1$s に作成 + %1$s からのバックアップ + バージョン不明 + 選択を復元 + 復元中 + 除外フォルダ + デフォルトではすべてのフォルダがスキャンされます。ライブラリ構築時に無視する場所を選択してください。 + 無視するフォルダを選択 + 先にストレージの権限を許可してください + アプリのテーマ + ライブラリの探索を始める前に好みの外観を選んでください。 + ダーク + PixelPlayer のデフォルトの Material 3 ダーク外観。 + ライト + アプリ全体のより明るい Material 3 外観。 + システムに合わせる + スマートフォンの現在の外観設定に合わせます。 + おすすめ + 後から 設定 > 外観 > アプリのテーマ で変更できます。 + ライブラリレイアウト + ライブラリのナビゲーション方法を選択してください。 + + コンパクトモード + 最小化されたピルナビゲーションを使用 + 標準のタブ行を使用 + + アルバム + アーティスト + 後から 設定 > 外観 > ライブラリナビゲーション で変更できます。 + アプリナビゲーション + ボトムナビゲーションバーのスタイルを選択してください。 + デフォルトスタイル + 角が丸いフローティングピル + 標準のフル幅バー + コーナー半径をカスタマイズ + 後から 設定 > 外観 > ナビバースタイル で変更できます。 + アラームとリマインダー + 任意ですが、スリープタイマーを使用して PixelPlayer を正確な時刻に停止させたい場合はおすすめです。 + 権限を許可 + バッテリー最適化 + 一部の Android 端末はバックグラウンドアプリを積極的に終了させます。予期しない再生の中断を防ぐために PixelPlayer のバッテリー最適化を無効にしてください。 + 最適化を無効化 + 準備完了! + 音楽を楽しむ準備ができました。 + + + 検索… + 検索 + 検索をクリア + 最近の検索 + すべてクリア + 履歴 + 検索履歴アイテムを削除 + 結果なし + 「%1$s」の検索結果はありません + 見つかりませんでした + 別の検索語またはフィルターを試してください。 + 結果が見つかりませんでした。 + ジャンルで探す + 利用可能なジャンルがありません。 + + + %1$s を再生 + %1$s を折りたたむ + %1$s を展開 + アーティスト画像を編集 + 写真を変更 + デフォルトに戻す + アーティストをシャッフル再生 + + + ディスク %d + %1$s のカバー + %1$s · %2$s + + + プレイリストが見つかりません。 + このプレイリストは空です。 + 「曲を追加」をタップして始めましょう。 + このフォルダに曲はありません。 + 曲を並び替え + その他のオプション + プレイリストのオプション + プレイリストを編集 + プレイリストを削除 + プレイリストを削除しますか? + このプレイリストを本当に削除しますか? + デフォルトトランジションを設定 + プレイリストをエクスポート + %1$s • %2$s + 再生する + 追加 + 曲を追加 + 削除 + 曲を削除 + 並び替え + 曲を並び替え + + + グローバルトランジション + プレイリストルール + 上書きされない限り、すべての再生ソースにこの設定が適用されます。 + この特定のプレイリストのデフォルト動作を設定します。 + アクティブ状態 + グローバルデフォルト + プレイリストデフォルト + グローバルに従う + カスタム上書き + カスタム上書き + 有効にするとこのプレイリストに特定のルールを設定できます。 + グローバルデフォルトを使用 + 変更を保存しました + トランジションスタイル + トラックのブレンド方法 + なし + クロスフェード + トランジションの長さ + %1$d 秒のオーバーラップ + トランジションをリセット + 現在の曲 + 次の曲 + トラックは %1$d 秒間オーバーラップします + 音量カーブ + オーディオのスロープを微調整 + フェードアウト + フェードイン + + + 新しいスマートプレイリスト + 新しいプレイリスト + 曲を追加 + 戻るまたはキャンセル + 次へ + 作成 + プレイリストを編集 + 自動生成コラージュ + 写真を追加 + 画像を選択 + 変更 + 削除 + プレイリスト名 + マイ素敵なミックス + カバーを編集 + カバーアートを調整 + ピンチとドラッグで最適なフレーミングを見つけてください + 手動 + スマート + AI で生成 + スマートルール + デフォルト + 画像 + アイコン + 背景色 + アイコンシンボル + 形状スタイル + 形状パラメーター + コーナー半径 + 滑らかさ + 辺の数 + カーブ + 回転 + スケール + よく再生する曲 + 最も再生されたトラック。 + 最近再生した曲 + 最近聴いた曲。 + 忘れられたお気に入り + しばらく再生していないお気に入りのトラック。 + 新着の宝石 + 再生回数が少ない最近追加されたトラック。 + + + ジャンルに曲を素早く追加 + 並び替えと再生 + シャッフル + 並び替え基準 + アーティスト + アルバム + タイトル + 一般アーティスト + %1$s シャッフル + + + 曲を選択 + ジャンルを選択 + 曲を検索 + 新しいジャンル + カスタムを追加 + カスタムジャンルを追加 + ジャンル名 + アイコンを選択 + ジャンル: %1$s + ジャンルを選択 + 素早く追加 + + + DJ スペース + 読み込み中… + デッキ %1$d + 曲を読み込む + 曲が読み込まれていません + + ステム分離はまだ利用できません。 + 音量 + 速度 + クロスフェーダー + デッキ 1 + デッキ 2 + 曲を選択 + 再生/一時停止 + 曲のカバー + x%1$.2f + diff --git a/app/src/main/res/values-ja/strings_settings.xml b/app/src/main/res/values-ja/strings_settings.xml new file mode 100644 index 000000000..ee41a6b0d --- /dev/null +++ b/app/src/main/res/values-ja/strings_settings.xml @@ -0,0 +1,641 @@ + + + + 音楽管理 + フォルダ管理、ライブラリ更新、解析オプション + 外観 + テーマ、レイアウト、ビジュアルスタイル + 再生 + オーディオ動作、クロスフェード、バックグラウンド再生 + 動作 + ジェスチャー、触覚フィードバック、ナビゲーション動作 + AI 連携(β) + AI プロバイダー、API キー、モデル設定 + バックアップ & 復元 + 個人データのエクスポートと復元 + 開発者オプション + 試験的機能とデバッグ + イコライザー + 音域とプリセットの調整 + デバイス情報 + オーディオ仕様、コーデック、デコーダー情報 + アカウント + Telegram、Google Drive、NetEase などのサービスを管理 + このアプリについて + アプリ情報、バージョン、クレジット + + + オン + オフ + 有効 + 無効 + 開く + すべて選択 + 選択を解除 + 通知を閉じる + + + ライブラリ構造 + 除外ディレクトリ + ここに追加したフォルダはライブラリスキャン時にスキップされます。 + アーティスト + 複数アーティストの解析と整理オプション。 + フィルタリング + 最低曲の長さ + アルバムの最低トラック数 + アルバムアートキャッシュ上限 + 同期とスキャン + ライブラリを更新 + 新しいファイルや変更されたファイルをライブラリ全体からスキャンします。 + フルリスキャン + フルリスキャン実行中 + フルリスキャンを開始しました… + ライブラリ同期が完了しました + データベースを再構築 + データベースを再構築しますか? + 音楽ライブラリを最初から完全に再構築します。インポートした歌詞、お気に入り、カスタムメタデータはすべて失われます。この操作は元に戻せません。 + 再構築 + データベースを再構築中 + データベースを再構築中… + .lrc ファイルを自動スキャン + ライブラリ同期中に、同じフォルダ内の .lrc ファイルを自動でスキャンして割り当てます。 + 歌詞管理 + 歌詞ソースの優先順位 + 歌詞を取得する際に最初に試みるソースを選択します。 + 埋め込みを優先 + オンラインを優先 + ローカル(.lrc)を優先 + インポートした歌詞をリセット + データベースからインポートした歌詞をすべて削除します。 + インポートした歌詞をリセットしますか? + この操作は元に戻せません。 + + + 更新 + デフォルトではすべて許可されています。フォルダをタップするとスキャンから除外されます。 + サブフォルダがありません + 上へ移動 + ルートへ移動 + + + リスキャンが必要です + アーティスト設定が変更されました。ライブラリをリスキャンして適用してください。 + リスキャン + スキャン中… + 複数アーティストの解析 + 文字区切り + 現在: %1$s + 単語区切り + なし + 現在: %1$s + 設定 + タイトルからアーティストを抽出 + 曲タイトルの feat., ft., with を検出 + ライブラリ整理 + アルバムアーティストでグループ化 + コラボアルバムをメインアーティストの下に表示 + 複数アーティスト解析について + + PixelPlayer は文字区切り(/、;、&)と単語区切り(feat.、ft.、vs.、x)を使ってアーティストタグを分割します。単語区切りは大文字小文字を区別しません。 + 「タイトルからアーティストを抽出」は曲タイトルの (feat. アーティスト名) のようなパターンを検出します。 + バックスラッシュ(\)で文字区切りをエスケープできます。 + + + + + \"Artist1/Artist2\" + Artist1, Artist2 + \"Drake feat. Rihanna\" + Drake, Rihanna + \"Marshmello x Bastille\" + Marshmello, Bastille + \"Song (ft. B)\" by A + A, B + \"AC\\DC\" + AC/DC(エスケープ済み) + + + 区切り文字 + 現在の区切り文字 + 区切り文字をタップして削除します。少なくとも 1 つ必要です。 + 新しい区切り文字を追加 + 例: / または ; + 区切り文字を追加 + デフォルトの区切り文字 + 区切り文字をリセットしますか? + カスタム区切り文字をすべてクリアしてデフォルトに戻します。この操作は元に戻せません。 + 区切り文字をデフォルトにリセットしました + 少なくとも 1 つの区切り文字が必要です + 区切り文字を追加しました + すでに存在するか無効な区切り文字です + スペース + + + 単語区切り + 現在の単語区切り + スペースで囲まれているときにアーティスト名を分割するキーワードです。大文字小文字を区別しません。タップして削除。 + 単語区切りが設定されていません + 新しい単語区切りを追加 + 例: feat. または ft. + 単語区切りを追加 + 単語区切りの仕組み + 単語区切りはスペースで囲まれている場合に大文字小文字を区別せずマッチします。\n\n1文字の区切り(例: \"x\")は誤マッチを防ぐために両側にスペースが必要です。\n\n例:\n \"Drake feat. Rihanna\" -> Drake, Rihanna\n \"Marshmello x Bastille\" -> Marshmello, Bastille\n \"A vs. B\" -> A, B + 単語区切りをリセットしますか? + カスタム単語区切りをすべてクリアしてデフォルトキーワードに戻します。この操作は元に戻せません。 + 単語区切りを追加しました + すでに存在するか無効です + 単語区切りをデフォルトにリセットしました + + + 同期を準備中 + MediaStore を読み込み中 + トラックを処理中 + データベースに保存中 + 歌詞ファイルをスキャン中 + アルバムアートキャッシュをクリア中 + クラウドソースを同期中 + 同期を完了中 + %1$s • %2$d%% (%3$d/%4$d) + %1$s… + + + グローバルテーマ + アプリの言語 + アプリ全体で使用する言語を選択します。 + システムのデフォルト + English + Español + Deutsch + Français + Русский + 简体中文 + Bahasa Indonesia + Italiano + 한국어 + Norsk (Bokmål) + Türkçe + 日本語 + アプリのテーマ + ライト、ダーク、またはシステムに合わせるを選択します。 + ライトテーマ + ダークテーマ + システムに合わせる + スムーズコーナーを使用 + 複雑な形状のコーナーを使用して見た目を向上させますが、ローエンド端末ではパフォーマンスに影響する場合があります。 + ブラー効果を無効化 + アプリ全体のブラー効果をオフにしてバッテリーとリソースを節約します。 + スクロールバーを表示 + 音楽リストにスクロールバーを表示してすばやくスクロールできます。 + 再生中 + プレイヤーテーマ + フローティングプレイヤーの外観を選択します。 + アルバムアート + システムダイナミック + プレイヤーのファイル情報を表示 + プレイヤーの進行バーにコーデック、ビットレート、サンプルレートを表示します。 + アルバムアートパレットスタイル + 現在: %1$s。ライブプレビューを開いてスタイルを選択してください。 + カルーセルスタイル + アルバムカルーセルの外観を選択します。 + のぞき込みなし + のぞき込み 1 枚 + ホームコラージュ + コラージュパターン + 「あなたのミックス」コラージュの形状を選択します。 + パターンを自動ローテーション + ホームを訪れるたびにコラージュパターンを切り替えます。 + ナビゲーションバー + ナビバースタイル + ナビゲーションバーの外観を選択します。 + デフォルト + フル幅 + コンパクトモード + アイコンのみ表示してナビバーの高さを縮小します。 + ナビバーのコーナー半径 + ナビゲーションバーのコーナー半径を調整します。 + 歌詞画面 + 没入型歌詞 + コントロールを自動非表示にしてテキストを拡大します。 + 自動非表示の遅延 + コントロールが非表示になるまでの時間。 + 3 秒 + 4 秒 + 5 秒 + 6 秒 + アプリナビゲーション + デフォルトタブ + 起動時のデフォルトタブを選択します。 + ホーム + 検索 + ライブラリ + ライブラリナビゲーション + ライブラリタブ間の移動方法を選択します。 + タブ行(デフォルト) + コンパクトピル & グリッド + + + カラー + パレットスタイル + プレイヤー UI のアルバムカラーを選択します。 + トーナルスポット + バランスが取れた落ち着いた雰囲気。 + ビビッド + 高彩度のアクセント。 + エクスプレッシブ + 大胆な色相シフトとコントラスト。 + フルーツサラダ + 楽しい回転アクセント。 + カラーの精度 + 0 は現在の調整を維持します。高い値ほどアルバムアートの主要色に近くなります。 + 現在 + より正確 + 0 • 現在 + %1$d • 穏やか + %1$d • バランス + %1$d • 正確 + + + コーナー半径を調整 + ナビバーの形状のコーナーをデバイスの物理コーナーに合わせてシームレスな外観にします。 + コーナー半径 + %1$d dp + + + バックグラウンド再生 + 閉じても再生を続ける + オフにすると、アプリを履歴から削除したときに再生が停止します。 + バッテリー最適化 + バッテリー最適化を無効にして再生の中断を防ぎます。 + バッテリー最適化はすでに無効になっています + バッテリー設定を開けませんでした + 音量ノーマライゼーション(ReplayGain) + ReplayGain を有効化 + オーディオファイルの ReplayGain メタデータを使って音量レベルを正規化します。 + ゲインモード + トラック: 曲ごとに正規化。アルバム: アルバム単位で正規化。 + トラック + アルバム + キャスト + キャスト接続/切断時に自動再生 + キャスト接続を切り替えた直後に自動で再生を開始します。 + ヘッドフォン + ヘッドフォン再接続時に再開 + ヘッドフォンを外したために一時停止した場合、再接続すると自動で再開します。 + キューとトランジション + クロスフェード + 曲間のスムーズなトランジションを有効にします。 + クロスフェードの長さ + Hi-Fi モード + 32 ビット float オーディオ出力。端末で再生がカクつく場合は無効にしてください。 + この端末ではサポートされていません(PCM_FLOAT AudioTrack 非対応)。 + シャッフルを保持 + アプリを閉じた後もシャッフル設定を記憶します。 + キュー履歴を表示 + キューに以前再生した曲を表示します。 + + + フォルダ + 戻るジェスチャーでフォルダを操作 + フォルダタブで、システムの戻る操作がライブラリを離れる前にフォルダ階層をさかのぼります。 + プレイヤーのジェスチャー + 背景タップでプレイヤーを閉じる + ぼかした背景をタップするとプレイヤーシートが閉じます。 + 触覚フィードバック + 触覚フィードバック + アプリ全体でバイブレーションフィードバックを有効にします。 + + + AI プロバイダー + プロバイダー + AI プロバイダーを選択してください + セーフトークンモード + ON — 高速 & 低コスト。AI に最小限のデータ(約 1K トークン)を送信します。 + OFF — 深いコンテキスト。より豊かな結果のためにリスニングプロフィール全体(約 8K トークン)を送信します。 + 認証情報 + %1$s API キー + %1$s から取得 + Google AI Studio (aistudio.google.com) + DeepSeek Platform (api.deepseek.com) + Groq Console (console.groq.com) + Mistral AI Platform (console.mistral.ai) + NVIDIA Build (build.nvidia.com) + Moonshot AI Platform (platform.moonshot.cn) + Zhipu AI Open Platform (bigmodel.cn) + OpenAI Platform (platform.openai.com) + モデル選択 + 利用可能なモデルを読み込み中… + モデルの読み込みに失敗しました + AI モデル + モデルを選択してください。 + API キーを入力 + プロンプト動作 + システムプロンプト + AI の動作をカスタマイズします。 + プリセットプロンプト + システムプロンプトを入力… + プロフェッショナルキュレーター + あなたは「Vibe-Engine」という世界トップクラスの音楽キュレーターで、ソニックフローの達人です。シームレスで高品質なリスニング体験を提供することが目標です。和声の相性、論理的な BPM トランジション、馴染みのお気に入りと洗練された発見のバランスを優先してください。 + クリエイティブマーベリック + あなたは「予期しない統一感」を専門とする前衛的な音楽探求者です。非自明なソニックの共通点を見つけることで従来のジャンルの壁を打ち破ることが使命です。レアなディープカット、実験的なテクスチャー、芸術的な新しさを優先しながら、驚きつつも否定できないトランジションロジックを維持してください。 + 厳格な司書 + あなたは精密な音楽データベースアーキテクトです。絶対的なメタデータの精度と厳格なカテゴリ遵守によってロジックを動かします。アルゴリズムによる発見を最小化し、厳格なジャンルの一貫性、エネルギーレベルのマッチング、ユーザーが明確に定義した好みの高精度な取得を最大化してください。 + アトモスフェリックガイド + あなたはアンビエントテクスチャーと低エネルギーフローの達人です。「深い集中」や「静けさ」の状態を促すトラックだけに集中してください。アコースティックな温かさ、ミニマリストのアレンジ、穏やかなトランジションを優先し、高い過渡音や急激なダイナミックの変化を厳しく避けてください。 + ソニックエンスージアスト + あなたはプロダクションの複雑さと演奏に焦点を当てたオーディオファイルアナリストです。高いダイナミックレンジ、複雑なポリリズム、優れたサウンドステージ品質を持つトラックを優先してください。技術的な忠実度とアレンジの細部に注意を払うリスナーを喜ばせるアクティブリスニング作品を選んでください。 + エナジーカタリスト + あなたは高モメンタムのリズムジェネレーターです。強烈なベースライン、パーカッシブな強度、感染力のあるグルーヴを中心哲学とします。高 BPM のクラブ互換性、シンコペーションエネルギー、継続的なリズムの張りを優先して、リスナーの心拍数とモチベーションをピーク状態に保ってください。 + AI 使用レポート + 総消費量 + %1$s トークンを追跡中\nプロンプト: %2$s | 出力: %3$s | 思考: %4$s + ログをクリア + AI アクティビティログ(%1$d 件) + %1$s · %2$s + 表示 + 非表示 + + + バックアップの仕組み + セクションを選んで .pxpl ファイルをエクスポートし、後でインポートして復元します。復元は選択したセクションのみを置き換えます。 + バックアップを作成 + バックアップをエクスポート + セクションが選択されていません。 + すべてのセクションが選択されています。 + %2$d セクション中 %1$d を選択中。 + %1$s .pxpl バックアップファイルを作成します。 + 選択してエクスポート + バックアップを復元 + バックアップをインポート + 選択して復元 + 最近のバックアップを参照または選択します。選択したデータが現在のデータを置き換えます。 + + + バックアップパッケージに含める内容を正確に選択してください。 + .pxpl バックアップファイルを選択して確認します。次のステップで復元するセクションを選択します。 + %2$d セクション中 %1$d を選択中 + %2$d モジュール中 %1$d を選択中 + 最近のバックアップ + 最近のバックアップはありません + 以前にインポートしたバックアップがここに表示されます。 + %1$d エントリー · 現在のデータを置き換えます + .pxpl をエクスポート + 選択を復元 + 転送中… + PixelPlayer_Backup_%1$d.pxpl + バックアップを作成中 + バックアップを復元中 + %1$d%% + %1$s • %2$s + エクスポート中 + インポート中 + 復元中 + 履歴から削除 + 確認中… + ファイルを参照 + ステップ %1$d / %2$d + モジュールを復元 + バックアップの詳細 + 作成日 + アプリバージョン + スキーマ + デバイス + 不明 + · %1$s + %1$d モジュール · v%2$s · スキーマ v%3$d + \? + すべて選択 + 選択をクリア + + + 無効なバックアップ: %1$s + 復元を準備中 + 復元タスクを開始しています。 + バックアップを準備中 + バックアップタスクを開始しています。 + バックアップを正常に復元しました + 一部の未解決の問題がありましたが復元は完了しました。 + 復元を完了できませんでした: %1$s + 復元に失敗しました: %1$s + データを正常にエクスポートしました + エクスポートに失敗しました: %1$s + データを正常に復元しました + 未解決の問題で復元が完了しました。失敗: %1$s + v%1$d + %1$s %2$s + + + 実験的機能 + 試験的 + プレイヤー UI 読み込みの実験とトグル。 + セットアップフローをテスト + テスト用にオンボーディングのセットアップ画面を起動します。 + メンテナンス + デイリーミックスの強制再生成 + デイリーミックスプレイリストをすぐに再作成します。 + デイリーミックスを再生成 + デイリーミックスを再生成しますか? + 現在のミックスを破棄して、最近のリスニング習慣に基づいて新しいミックスを生成します。 + デイリーミックスの再生成を開始しました + 統計の強制再生成 + キャッシュをクリアして再生統計を再計算します。 + 再生成 + 処理中… + 統計を再生成 + 統計を再生成しますか? + 統計キャッシュをクリアして、データベース履歴から強制的に再計算します。 + 統計の再生成を開始しました + アルバムパレットの強制再生成 + すべてのアルバムアートのキャッシュされたパレットバリアントを再構築するか、特定の 1 枚を更新します。 + すべて再生成 + すべてのアルバムパレットを再生成しますか? + キャッシュされたテーマデータをクリアして、%1$d 枚のユニークなアルバムアートのすべてのパレットスタイルを再構築します。 + 再生成中… + アルバムパレットを再生成中… + %1$d 枚のユニークなアルバムアートのキャッシュされたパレットバリアントを再構築中です。大きなライブラリでは時間がかかることがあります。 + %1$d / %2$d 完了 + %1$d 枚のアルバムアートパレットを再生成しました + %2$d 枚中 %1$d 枚のアルバムアートパレットを再生成しました + 曲を選択 + 曲を選択するとキャッシュされたテーマデータをクリアして、アルバムアートからすべてのパレットスタイルを再生成します。 + タイトル、アーティスト、アルバムで検索 + 検索に一致する曲がありません。 + アルバムアートのある曲が見つかりませんでした。 + パレットを再生成中… + %1$s のパレットを再生成しました + %1$s のパレットを再生成できませんでした + 診断 + テストクラッシュを発生させる + クラッシュレポートシステムをテストするためにクラッシュをシミュレートします。 + 開発者オプションからテストクラッシュを発生させました — これはクラッシュレポートシステムをテストするための意図的な操作です + + + 試験的 + プレイヤー UI 読み込みの調整 + アニメーション歌詞(ハイエンド端末向け) + 歌詞にスプリングアニメーションとビジュアル効果を使用します。ローエンド端末ではフレームドロップが発生する場合があります。 + 歌詞のブラー効果 + 非アクティブな歌詞に被写界深度ブラーを適用します。 + ブラー強度 + ブラー効果の強さを調整します。 + %1$.1f倍 + ステップ 1 · 遅延する対象を選択 + すべてを遅延 + シートの背景が完全に展開されるまでプレイヤーのコンテンツ全体を保持します。 + アルバムカルーセル + シートが展開されるまでアルバムアートとカルーセルを遅延します。 + 曲のメタデータ + タイトル、アーティスト、歌詞/キューのアクションを遅延します。 + 進行バー + 展開完了までタイムラインと時刻ラベルを遅延します。 + 再生コントロール + 再生/一時停止、シーク、お気に入りコントロールを遅延します。 + 遅延するコンポーネントがすべてアクティブです。「すべてを遅延」を無効にして各パーツをカスタマイズします。 + ステップ 2 · プレースホルダーの動作を設定 + 遅延項目にプレースホルダーを使用 + コンポーネントが展開を待つ間、軽量なプレースホルダーを描画してレイアウトを安定させます。 + ステップ 3 · プレースホルダーから実コンテンツに切り替えるタイミングを選択 + モードを 1 つ選択してください。閾値モードはスライダーを使用します。ドラッグリリースモードはシートジェスチャーを離すまで待機します。 + トリガーモードを解除するには遅延コンポーネントを少なくとも 1 つ有効にしてください。 + 閾値 + 展開率を使用します。 + ドラッグリリース + ジェスチャーを離した後のみ切り替えます。 + 展開閾値 + 遅延コンポーネントが表示されるまでにシートがどれだけ展開している必要があるか。 + コンテンツは %1$d%% 展開時に表示されます + プレイヤーを閉じるときにも適用 + 折りたたむ際に閉じる閾値を使ってプレースホルダーに戻します。 + 閉じる閾値 + プレースホルダーが再び表示されるまでにどれだけ折りたたまれている必要があるか。 + %1$d%% 折りたたみ後にプレースホルダーが表示されます + ドラッグリリースモードは閾値と閉じる動作をバイパスします。切り替えはシートのドラッグジェスチャーが終了したときのみ発生します。 + プレースホルダーを透明にする + プレースホルダーはレイアウトスペースを保持したまま見えなくなります。 + 画質 + アルバムアートの解像度 + 低(256px)- パフォーマンス重視 + 中(512px)- バランス型 + 高(800px)- 最高品質 + オリジナル - 最大品質 + + + 再生には確認が必要です + 再生の準備ができています + -- + フォーマット + HW デコーダー + ローカル曲 + ローカル音楽ストレージ + 音楽サイズ + %1$d 曲(ローカル) + 利用可能 + %1$s 合計 + 音楽の使用量 + デバイス使用中 + %1$d%% + <1% + %1$d 曲(クラウド) + %1$d ファイルは読み取り不可 + 再生パス + はい + いいえ + サンプルレート + %1$d Hz + %1$d フレーム/バッファ + Hi-Fi PCM Float + 32 ビット float 出力パス + 低レイテンシーサポート + プロオーディオサポート + メモリ + %1$s 中利用可能 + オフロード対応フォーマット + ハードウェアオフロードをサポートする圧縮フォーマットは報告されませんでした。 + 他 %1$d 件 + 検出された出力 + 内蔵出力 + Bluetooth オーディオ + USB オーディオ + 有線オーディオ + デジタル出力 + その他の出力 + Android から出力ルートは報告されませんでした。 + ExoPlayer エンジン + %1$s レンダラー + フォーマット互換性 + %1$d 対応トラック + %1$d 不明なフォーマット + デコーダーが報告されません + ハードウェアデコーダー + ソフトウェアデコーダー + オフロード + ライブラリ内 %1$d 件 + 互換性の確認結果 + 大きな非互換性はありません + インデックスされたトラックはこのデバイスで Android が報告するデコーダーと一致しています。 + %1$d 件のトラックはネイティブデコードできない可能性があります + 確認が必要なフォーマット: %1$s。 + %1$d 件のローカルトラックはリサンプリングされる可能性があります + ライブラリは現在の出力サンプルレートを超える %1$d Hz に達しています。 + %1$d 件のトラックはメタデータが不明です + ライブラリを完全にリスキャンすると MIME、ビットレート、サンプルレートの欠損データを補完できます。 + デバイス情報 + メーカー + モデル + ブランド + デバイス + Android バージョン + SDK バージョン + ハードウェア + パフォーマンスレポート + 再生やスキャンのラグを分類するのに役立つ共有可能な診断レポートを生成します。デバイス、ライブラリ、タイミングデータのみを含み、ファイルパス、タイトル、アーティストは含まれません。 + レポートを生成 + 再生成 + コピー + 共有 + レポートをクリップボードにコピーしました + PixelPlayer パフォーマンスレポート + 高度なパフォーマンス診断 + デフォルトではオフです。ベータのトラブルシューティング用に短いラグタイムラインを記録します。 + %1$s まで有効 + 今ラグをマーク + ラグの瞬間をマークしました + + + 接続済みアカウント + リンクされたプロバイダーを管理して各連携をコントロールします。 + リンク済みサービス + アクティブ + 利用可能 + 近日公開 + 接続済み + 近日公開 + サービスを開く + ログアウト中… + リンク済みアカウントがまだありません + プロバイダーを接続するとこの画面で管理できます。 + %1$s に接続 + %1$s(近日公開) + Google Drive は近日公開予定です。 + 現在この画面を開けません。 + + + このアプリについて + PixelPlayer + コミュニティと共に作られたオープンソースの音楽プレイヤー。 + バージョン v%1$s + オープンソース + コミュニティファースト + Material 3 エクスプレッシブ + 現在コントリビューターが見つかりません。後でもう一度お試しください。 + メンテナー + PixelPlayer の開発者。 + コミュニティスポットライト + 大きな貢献をしたコラボレーターへの感謝。 + オープンソースコントリビューター + GitHub からのライブコントリビューターリスト。 + %1$d 回のコントリビューション + GitHub プロフィールを開く + Telegram を開く + %1$s のアバター + %1$s のアイコン + diff --git a/app/src/main/res/values-ja/strings_widget.xml b/app/src/main/res/values-ja/strings_widget.xml new file mode 100644 index 000000000..c0d6f4787 --- /dev/null +++ b/app/src/main/res/values-ja/strings_widget.xml @@ -0,0 +1,17 @@ + + + サイズに合わせて自動調整するウィジェット + コンパクトなプレイヤーバー + シャッフルとリピートを含むフルコントロール + ミニマリストな正方形プレイヤー + + タップして開く + アルバムアート + アルバムアートのプレースホルダー + + タップして再生 + 曲のタイトル + アーティスト + + 進行バー、%1$d%% + From 7e927c01db6e28b4d4a2337bbe2de9f12e5e7218 Mon Sep 17 00:00:00 2001 From: Dae Euhwa Date: Wed, 24 Jun 2026 01:44:03 -0500 Subject: [PATCH 02/12] Add MultiLangRomanizer functions for Thai, Arabic, Greek, Hebrew, and Vietnamese MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - isThai(): detect Thai script via U+0E00..U+0E7F - isArabic(): detect Arabic script via U+0600..U+06FF - isGreek(): detect Greek script via U+0370..U+03FF - isHebrew(): detect Hebrew script via U+0590..U+05FF - isVietnamese(): detect Vietnamese via Latin Extended Additional block (U+1EA0..U+1EF9) and specific chars (ă, đ, ơ, ư) - romanizeVietnamese(): NFKD-decompose and strip diacritics to plain ASCII --- .../theveloper/pixelplay/utils/LyricsUtils.kt | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/theveloper/pixelplay/utils/LyricsUtils.kt b/app/src/main/java/com/theveloper/pixelplay/utils/LyricsUtils.kt index 3c44e7d59..f1045eb70 100644 --- a/app/src/main/java/com/theveloper/pixelplay/utils/LyricsUtils.kt +++ b/app/src/main/java/com/theveloper/pixelplay/utils/LyricsUtils.kt @@ -48,6 +48,7 @@ import com.theveloper.pixelplay.data.model.SyncedLine import com.theveloper.pixelplay.data.model.SyncedWord import kotlinx.coroutines.flow.Flow +import java.text.Normalizer import java.util.Locale import java.util.regex.Pattern import kotlin.math.PI @@ -119,6 +120,14 @@ object MultiLangRomanizer { fun isPunjabi(text: String) = text.any { it in '\u0A00'..'\u0A7F' } fun isCyrillic(text: String) = text.any { it in '\u0400'..'\u04FF' } fun isChinese(text: String) = text.any { it in '\u4E00'..'\u9FFF' } + fun isThai(text: String) = text.any { it in '\u0E00'..'\u0E7F' } + fun isArabic(text: String) = text.any { it in '\u0600'..'\u06FF' } + fun isGreek(text: String) = text.any { it in '\u0370'..'\u03FF' } + fun isHebrew(text: String) = text.any { it in '\u0590'..'\u05FF' } + fun isVietnamese(text: String): Boolean { + return text.any { it in '\u1EA0'..'\u1EF9' } || + text.any { it in "\u0102\u0103\u0110\u0111\u01A0\u01A1\u01AF\u01B0" } + } fun isScriptThatNeedsRomanization(text: String): Boolean { return text.any { char -> @@ -133,8 +142,8 @@ object MultiLangRomanizer { } } - private fun isRussian(text: String) = text.any { RUSSIAN_CYRILLIC_LETTERS.contains(it.toString()) } && text.all { RUSSIAN_CYRILLIC_LETTERS.contains(it.toString()) || !it.toString().matches("[\\u0400-\\u04FF]".toRegex()) } - private fun isUkrainian(text: String) = text.any { UKRAINIAN_CYRILLIC_LETTERS.contains(it.toString()) || UKRAINIAN_SPECIFIC_CYRILLIC_LETTERS.contains(it.toString()) } && text.all { UKRAINIAN_CYRILLIC_LETTERS.contains(it.toString()) || UKRAINIAN_SPECIFIC_CYRILLIC_LETTERS.contains(it.toString()) || !it.toString().matches("[\\u0400-\\u04FF]".toRegex()) } + internal fun isRussian(text: String) = text.any { RUSSIAN_CYRILLIC_LETTERS.contains(it.toString()) } && text.all { RUSSIAN_CYRILLIC_LETTERS.contains(it.toString()) || !it.toString().matches("[\\u0400-\\u04FF]".toRegex()) } + internal fun isUkrainian(text: String) = text.any { UKRAINIAN_CYRILLIC_LETTERS.contains(it.toString()) || UKRAINIAN_SPECIFIC_CYRILLIC_LETTERS.contains(it.toString()) } && text.all { UKRAINIAN_CYRILLIC_LETTERS.contains(it.toString()) || UKRAINIAN_SPECIFIC_CYRILLIC_LETTERS.contains(it.toString()) || !it.toString().matches("[\\u0400-\\u04FF]".toRegex()) } private fun isSerbian(text: String) = text.any { SERBIAN_CYRILLIC_LETTERS.contains(it.toString()) || SERBIAN_SPECIFIC_CYRILLIC_LETTERS.contains(it.toString()) } && text.all { SERBIAN_CYRILLIC_LETTERS.contains(it.toString()) || SERBIAN_SPECIFIC_CYRILLIC_LETTERS.contains(it.toString()) || !it.toString().matches("[\\u0400-\\u04FF]".toRegex()) } private fun isBulgarian(text: String) = text.any { BULGARIAN_CYRILLIC_LETTERS.contains(it.toString()) } && text.all { BULGARIAN_CYRILLIC_LETTERS.contains(it.toString()) || !it.toString().matches("[\\u0400-\\u04FF]".toRegex()) } private fun isBelarusian(text: String) = text.any { BELARUSIAN_CYRILLIC_LETTERS.contains(it.toString()) || BELARUSIAN_SPECIFIC_CYRILLIC_LETTERS.contains(it.toString()) } && text.all { BELARUSIAN_CYRILLIC_LETTERS.contains(it.toString()) || BELARUSIAN_SPECIFIC_CYRILLIC_LETTERS.contains(it.toString()) || !it.toString().matches("[\\u0400-\\u04FF]".toRegex()) } @@ -547,6 +556,22 @@ object MultiLangRomanizer { } } + fun romanizeVietnamese(text: String): String { + if (text.isEmpty()) return text + val normalized = Normalizer.normalize(text, Normalizer.Form.NFKD) + val sb = StringBuilder(text.length) + for (char in normalized) { + when { + char == '\u0111' -> sb.append('d') + char == '\u0110' -> sb.append('D') + char in '\u0300'..'\u036F' || char in '\uFE20'..'\uFE2F' -> {} + char.code > 0x7E && char in '\u00C0'..'\u024F' -> {} + else -> sb.append(char) + } + } + return sb.toString() + } + private fun processCyrillicWordByWord(text: String, specificMap: Map, isRussian: Boolean = false): String { val romajiBuilder = StringBuilder(text.length) val words = text.split("((?<=\\s|[.,!?;])|(?=\\s|[.,!?;]))".toRegex()).filter { it.isNotEmpty() } From f53d85737bf7d2ad5eee79ae11183af68d98a8e7 Mon Sep 17 00:00:00 2001 From: Dae Euhwa Date: Wed, 24 Jun 2026 01:44:04 -0500 Subject: [PATCH 03/12] Add romanization and language detection for Cyrillic and Vietnamese LyricsRepositoryImpl.kt: - Route Cyrillic text to romanizeCyrillic() before falling through - Route Vietnamese text to romanizeVietnamese() - Include synced lyrics translations in LRC output AiStateHolder.kt: - Detect source language before AI translation using MultiLangRomanizer - Support all newly detected scripts (Thai, Arabic, Greek, Hebrew, Vietnamese) - Prefix translation prompt with detected language for better AI results --- .../data/repository/LyricsRepositoryImpl.kt | 18 ++++++++- .../presentation/viewmodel/AiStateHolder.kt | 40 ++++++++++++++++++- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/theveloper/pixelplay/data/repository/LyricsRepositoryImpl.kt b/app/src/main/java/com/theveloper/pixelplay/data/repository/LyricsRepositoryImpl.kt index 05e357d05..61e1b6982 100644 --- a/app/src/main/java/com/theveloper/pixelplay/data/repository/LyricsRepositoryImpl.kt +++ b/app/src/main/java/com/theveloper/pixelplay/data/repository/LyricsRepositoryImpl.kt @@ -1056,7 +1056,14 @@ class LyricsRepositoryImpl @Inject constructor( val lyricsData = LyricsData( plainLyrics = lyrics.plain?.joinToString("\n"), - syncedLyrics = lyrics.synced?.joinToString("\n") { "[${formatTimestamp(it.time)}]${it.line}" }, + syncedLyrics = lyrics.synced?.joinToString("\n") { line -> + buildString { + append("[${formatTimestamp(line.time)}]${line.line}") + if (!line.translation.isNullOrBlank()) { + append("\n[${formatTimestamp(line.time)}]${line.translation}") + } + } + }, wordByWordLyrics = wordByWordLyrics ) @@ -1247,7 +1254,12 @@ class LyricsRepositoryImpl @Inject constructor( toWordByWordLrc(syncedLyrics) } else { syncedLyrics.joinToString("\n") { line -> - "[${formatTimestamp(line.time)}]${line.line}" + buildString { + append("[${formatTimestamp(line.time)}]${line.line}") + if (!line.translation.isNullOrBlank()) { + append("\n[${formatTimestamp(line.time)}]${line.translation}") + } + } } } } @@ -1710,6 +1722,8 @@ class LyricsRepositoryImpl @Inject constructor( MultiLangRomanizer.isJapanese(text) -> MultiLangRomanizer.romanizeJapanese(text) ?: text MultiLangRomanizer.isChinese(text) -> MultiLangRomanizer.romanizeChinese(text) ?: text MultiLangRomanizer.isKorean(text) -> MultiLangRomanizer.romanizeKorean(text) + MultiLangRomanizer.isCyrillic(text) -> MultiLangRomanizer.romanizeCyrillic(text) ?: text + MultiLangRomanizer.isVietnamese(text) -> MultiLangRomanizer.romanizeVietnamese(text) else -> text } } diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/AiStateHolder.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/AiStateHolder.kt index ad68cea83..8e125a235 100644 --- a/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/AiStateHolder.kt +++ b/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/AiStateHolder.kt @@ -10,6 +10,7 @@ import com.theveloper.pixelplay.data.ai.AiSystemPromptType import com.theveloper.pixelplay.data.ai.provider.AiProviderException import com.theveloper.pixelplay.data.preferences.PlaylistPreferencesRepository import com.theveloper.pixelplay.data.model.Song +import com.theveloper.pixelplay.utils.MultiLangRomanizer import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableStateFlow @@ -17,6 +18,7 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import timber.log.Timber +import java.util.Locale import javax.inject.Inject import javax.inject.Singleton @@ -287,8 +289,14 @@ class AiStateHolder @Inject constructor( suspend fun translateLyrics(lyricsText: String): Result { return try { val targetLanguage = context.resources.configuration.locales[0].displayLanguage + val sourceLanguage = detectLyricsLanguage(lyricsText) + val taskPrefix = if (sourceLanguage != null) { + "Translate these $sourceLanguage song lyrics into $targetLanguage." + } else { + "Translate these song lyrics into $targetLanguage." + } val prompt = """ -Translate song lyrics into $targetLanguage. +$taskPrefix - Preserve ALL timestamps [mm:ss.xx] exactly — never modify, merge, or drop them. @@ -307,7 +315,7 @@ class AiStateHolder @Inject constructor( $lyricsText """.trimIndent() - + val response = aiHandler.generateContent( prompt = prompt, type = AiSystemPromptType.GENERAL, @@ -319,6 +327,34 @@ $lyricsText } } + private val timestampRegex = Regex("\\[\\d{1,2}:\\d{2}(?:[.:]\\d{1,3})?]") + + private fun detectLyricsLanguage(lyricsText: String): String? { + val sample = timestampRegex.replace(lyricsText, "").trim().take(200) + if (sample.isBlank()) return null + + return when { + MultiLangRomanizer.isJapanese(sample) -> "Japanese" + MultiLangRomanizer.isKorean(sample) -> "Korean" + MultiLangRomanizer.isChinese(sample) -> "Chinese" + MultiLangRomanizer.isThai(sample) -> "Thai" + MultiLangRomanizer.isArabic(sample) -> "Arabic" + MultiLangRomanizer.isGreek(sample) -> "Greek" + MultiLangRomanizer.isHebrew(sample) -> "Hebrew" + MultiLangRomanizer.isHindi(sample) -> "Hindi" + MultiLangRomanizer.isPunjabi(sample) -> "Punjabi" + MultiLangRomanizer.isCyrillic(sample) -> { + when { + MultiLangRomanizer.isRussian(sample) -> "Russian" + MultiLangRomanizer.isUkrainian(sample) -> "Ukrainian" + else -> null + } + } + MultiLangRomanizer.isVietnamese(sample) -> "Vietnamese" + else -> null + } + } + fun onCleared() { scope = null allSongsProvider = null From d74f593cb86aa3116f83c8d37bb4d64d997c04cc Mon Sep 17 00:00:00 2001 From: Dae Euhwa Date: Wed, 24 Jun 2026 01:44:04 -0500 Subject: [PATCH 04/12] Fix 21 pre-existing lint errors MissingDefaultResource (14): Create base values/plurals.xml with English defaults for all 14 plural names that only existed in values-ar/ NewApi (3): Annotate BlurEffectCache with @RequiresApi(31); guard ForegroundServiceStartNotAllowedException with SDK_INT >= S check WrongConstant (1): Suppress lint on takePersistableUriPermission flags NonObservableLocale (2): Suppress lint on Locale.getDefault() in composables MissingIntentFilterForMediaSearch (1): Add MEDIA_PLAY_FROM_SEARCH intent-filter to MainActivity for Android Auto voice search support --- app/src/main/AndroidManifest.xml | 4 ++ .../pixelplay/ExternalPlayerActivity.kt | 1 + .../com/theveloper/pixelplay/MainActivity.kt | 4 ++ .../presentation/screens/AiUsageComponents.kt | 1 + .../PlayerControlActionCallback.kt | 6 +- app/src/main/res/values/plurals.xml | 59 +++++++++++++++++++ 6 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/values/plurals.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1afb6f404..46a821a28 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -73,6 +73,10 @@ + + + + diff --git a/app/src/main/java/com/theveloper/pixelplay/ExternalPlayerActivity.kt b/app/src/main/java/com/theveloper/pixelplay/ExternalPlayerActivity.kt index 2d993383d..3ffd21abf 100644 --- a/app/src/main/java/com/theveloper/pixelplay/ExternalPlayerActivity.kt +++ b/app/src/main/java/com/theveloper/pixelplay/ExternalPlayerActivity.kt @@ -117,6 +117,7 @@ class ExternalPlayerActivity : ComponentActivity() { return intent.data } + @Suppress("WrongConstant") private fun persistUriPermissionIfNeeded(intent: Intent, uri: Uri) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { val hasPersistablePermission = intent.flags and Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION != 0 diff --git a/app/src/main/java/com/theveloper/pixelplay/MainActivity.kt b/app/src/main/java/com/theveloper/pixelplay/MainActivity.kt index 503ac7a21..02fa1a248 100644 --- a/app/src/main/java/com/theveloper/pixelplay/MainActivity.kt +++ b/app/src/main/java/com/theveloper/pixelplay/MainActivity.kt @@ -10,6 +10,7 @@ import android.content.Context import android.content.ComponentName import android.content.Intent import android.os.Build +import androidx.annotation.RequiresApi import android.graphics.RenderEffect as AndroidRenderEffect import android.graphics.Shader as AndroidShader import androidx.compose.ui.graphics.asComposeRenderEffect @@ -943,6 +944,7 @@ class MainActivity : ComponentActivity() { val expansionFractionProvider = remember(playerViewModel.playerContentExpansionFraction) { { playerViewModel.playerContentExpansionFraction.value } } + @Suppress("NewApi") val blurEffectCache = remember { BlurEffectCache() } Box( @@ -1152,10 +1154,12 @@ class MainActivity : ComponentActivity() { * blur every animation frame. The radius is quantized at the call site, so this * only rebuilds ~25 times across the whole expand animation instead of 60+/sec. */ +@RequiresApi(Build.VERSION_CODES.S) private class BlurEffectCache { private var lastRadiusPx: Float = Float.NaN private var cached: androidx.compose.ui.graphics.RenderEffect? = null + @RequiresApi(Build.VERSION_CODES.S) fun get(radiusPx: Float): androidx.compose.ui.graphics.RenderEffect? { if (radiusPx <= 0f) { lastRadiusPx = 0f diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/AiUsageComponents.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/AiUsageComponents.kt index 8c9a9b17f..750f992a7 100644 --- a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/AiUsageComponents.kt +++ b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/AiUsageComponents.kt @@ -49,6 +49,7 @@ fun AiUsageDateHeader(date: String) { } @Composable +@Suppress("NonObservableLocale") fun AiUsageLogItem( usage: AiUsageEntity ) { diff --git a/app/src/main/java/com/theveloper/pixelplay/ui/glancewidget/PlayerControlActionCallback.kt b/app/src/main/java/com/theveloper/pixelplay/ui/glancewidget/PlayerControlActionCallback.kt index fcd2a1e47..22fd1aced 100644 --- a/app/src/main/java/com/theveloper/pixelplay/ui/glancewidget/PlayerControlActionCallback.kt +++ b/app/src/main/java/com/theveloper/pixelplay/ui/glancewidget/PlayerControlActionCallback.kt @@ -58,9 +58,11 @@ class PlayerControlActionCallback : ActionCallback { context.startService(serviceIntent) } Timber.tag(TAG).d("Service intent sent for action: $action") - } catch (e: android.app.ForegroundServiceStartNotAllowedException) { - Timber.tag(TAG).w(e, "Cannot start foreground service from background for action $action") } catch (e: Exception) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && e is android.app.ForegroundServiceStartNotAllowedException) { + Timber.tag(TAG).w(e, "Cannot start foreground service from background for action $action") + return + } Timber.tag(TAG).e(e, "Error starting service for action $action: ${e.message}") } } diff --git a/app/src/main/res/values/plurals.xml b/app/src/main/res/values/plurals.xml new file mode 100644 index 000000000..6961e51ce --- /dev/null +++ b/app/src/main/res/values/plurals.xml @@ -0,0 +1,59 @@ + + + + Sharing %d playlist + Sharing %d playlists + + + Exported %1$d playlist to %2$s + Exported %1$d playlists to %2$s + + + %d song added to queue + %d songs added to queue + + + %d song will play next + %d songs will play next + + + %d song added to favorites + %d songs added to favorites + + + %d song removed from favorites + %d songs removed from favorites + + + %d file deleted + %d files deleted + + + Delete %d file? + Delete %d files? + + + %d track selected + %d tracks selected + + + %1$d song • %2$s + %1$d songs • %2$s + + + %d track lined up. + %d tracks lined up. + + + %d song selected + %d songs selected + + + %d song + %d songs + + + %d topic + %d topics + + From 2580e86a7ca93022e34fdc8233b8c640ab05ef99 Mon Sep 17 00:00:00 2001 From: Dae Euhwa Date: Wed, 24 Jun 2026 01:44:05 -0500 Subject: [PATCH 05/12] Add new app languages and update locale configuration - Add JAPANESE, TRADITIONAL_CHINESE, VIETNAMESE to AppLanguage enum - Update locales_config.xml with all supported locales (de, en, es, fr, in, it, ja, ko, nb, ru, tr, vi, zh-CN, zh-TW) - Add German translations for changelogs and settings - Add Korean, Norwegian Bokmal, Russian translations for changelogs and settings - Add Japanese strings_settings.xml update --- .../pixelplay/data/preferences/AppLanguage.kt | 5 ++++- .../main/res/values-de/strings_changelogs.xml | 18 ++++++++++++++++++ .../main/res/values-de/strings_settings.xml | 5 +++++ .../main/res/values-ja/strings_settings.xml | 13 +++++++++++++ .../main/res/values-ko/strings_changelogs.xml | 18 ++++++++++++++++++ .../main/res/values-ko/strings_settings.xml | 5 +++++ .../main/res/values-nb/strings_changelogs.xml | 18 ++++++++++++++++++ .../main/res/values-nb/strings_settings.xml | 5 +++++ .../main/res/values-ru/strings_changelogs.xml | 18 ++++++++++++++++++ .../main/res/values-ru/strings_settings.xml | 5 +++++ app/src/main/res/values/strings_settings.xml | 5 +++++ app/src/main/res/xml/locales_config.xml | 11 +++++++++++ 12 files changed, 125 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/theveloper/pixelplay/data/preferences/AppLanguage.kt b/app/src/main/java/com/theveloper/pixelplay/data/preferences/AppLanguage.kt index 5630700f9..e926bda36 100644 --- a/app/src/main/java/com/theveloper/pixelplay/data/preferences/AppLanguage.kt +++ b/app/src/main/java/com/theveloper/pixelplay/data/preferences/AppLanguage.kt @@ -12,11 +12,14 @@ enum class AppLanguage(val tag: String, @StringRes val labelRes: Int) { FRENCH("fr", R.string.settings_language_french), INDONESIAN("in", R.string.settings_language_indonesian), ITALIAN("it", R.string.settings_language_italian), + JAPANESE("ja", R.string.settings_language_japanese), KOREAN("ko", R.string.settings_language_korean), NORWEGIAN_BOKMAL("nb", R.string.settings_language_norwegian_bokmal), RUSSIAN("ru", R.string.settings_language_russian), SIMPLIFIED_CHINESE("zh-CN", R.string.settings_language_chinese), - TURKISH("tr", R.string.settings_language_turkish); + TRADITIONAL_CHINESE("zh-TW", R.string.settings_language_traditional_chinese), + TURKISH("tr", R.string.settings_language_turkish), + VIETNAMESE("vi", R.string.settings_language_vietnamese); companion object { val supportedLanguageTags: Set = values().map { it.tag }.toSet() diff --git a/app/src/main/res/values-de/strings_changelogs.xml b/app/src/main/res/values-de/strings_changelogs.xml index b5e894776..a0863d12d 100644 --- a/app/src/main/res/values-de/strings_changelogs.xml +++ b/app/src/main/res/values-de/strings_changelogs.xml @@ -129,4 +129,22 @@ Lokalisierung: Spanisch, Französisch, Russisch, Vereinfachtes Chinesisch, Indonesisch, Italienisch + + Google Drive-Integration mit Player-Lebenszyklus-Management. + Batch-Bearbeitung von Song-Metadaten (Tags und Cover-Art). + KI-Übersetzung von Songtexten mit anpassbaren Wear OS-Einstellungen. + Latenzdiagnose-Tool und Mehrfachauswahl auf dem Suchbildschirm. + Arabische & Türkische Unterstützung, mit lokalisierten http-URL-Lokalisierungsoptionen. + + + Drastische Akku-Ersparnis (Audio-Offloading und UI-Polling-Gates). + Optimiertes Queue-Management (schnellere Einfügungen und explizite Indizierung). + Material 3 Expressive Motion-Animationen für Übergangsbildschirme. + Überarbeitete Bibliothekssynchronisierung mittels gedrosseltem Scannen. + + + Behobene Ruckel-/Aussetzer bei der Wiedergabe und Pufferungsprobleme. + Behobene Synchronisation externer Songlöschungen und Metadatenkonsistenz. + Behobene Speicherprobleme, Abstürze und Layout-Fehler auf Wear OS und Telefon. + \ No newline at end of file diff --git a/app/src/main/res/values-de/strings_settings.xml b/app/src/main/res/values-de/strings_settings.xml index e6fcda843..147d337ad 100644 --- a/app/src/main/res/values-de/strings_settings.xml +++ b/app/src/main/res/values-de/strings_settings.xml @@ -7,6 +7,8 @@ Design, Layout und Farben Wiedergabe Audio, Crossfade und Hintergrundwiedergabe + Songtexte + Quellpriorität, immersiver Modus und Importverwaltung Verhalten Gesten, Haptik und Navigation KI-Integration (β) @@ -174,6 +176,9 @@ Koreanisch Norwegisch Bokmål Türkisch + 日本語 + 繁體中文 + Tiếng Việt App-Design Hell, Dunkel oder System-Design – ganz nach Geschmack. Hell diff --git a/app/src/main/res/values-ja/strings_settings.xml b/app/src/main/res/values-ja/strings_settings.xml index ee41a6b0d..6678113cc 100644 --- a/app/src/main/res/values-ja/strings_settings.xml +++ b/app/src/main/res/values-ja/strings_settings.xml @@ -7,6 +7,8 @@ テーマ、レイアウト、ビジュアルスタイル 再生 オーディオ動作、クロスフェード、バックグラウンド再生 + 歌詞 + 優先ソース、没入型歌詞、インポート管理 動作 ジェスチャー、触覚フィードバック、ナビゲーション動作 AI 連携(β) @@ -175,6 +177,8 @@ Norsk (Bokmål) Türkçe 日本語 + 繁體中文 + Tiếng Việt アプリのテーマ ライト、ダーク、またはシステムに合わせるを選択します。 ライトテーマ @@ -268,6 +272,9 @@ バッテリー最適化を無効にして再生の中断を防ぎます。 バッテリー最適化はすでに無効になっています バッテリー設定を開けませんでした + 音量 + 音量ゼロで一時停止 + 音量がゼロのときに再生を一時停止します 音量ノーマライゼーション(ReplayGain) ReplayGain を有効化 オーディオファイルの ReplayGain メタデータを使って音量レベルを正規化します。 @@ -622,6 +629,12 @@ このアプリについて PixelPlayer コミュニティと共に作られたオープンソースの音楽プレイヤー。 + GitHub + ソースコード、リリース、イシュー + Telegram + コミュニティに参加、開発をフォロー + Telegram に参加 + GitHub リポジトリを開く バージョン v%1$s オープンソース コミュニティファースト diff --git a/app/src/main/res/values-ko/strings_changelogs.xml b/app/src/main/res/values-ko/strings_changelogs.xml index acb78fe7b..81b43ec1c 100644 --- a/app/src/main/res/values-ko/strings_changelogs.xml +++ b/app/src/main/res/values-ko/strings_changelogs.xml @@ -129,4 +129,22 @@ 현지화: 스페인어, 프랑스어, 러시아어, 중국어(간체), 인도네시아어, 이탈리아어 + + 플레이어 수명 주기 관리와 함께 Google Drive 통합. + 노래 메타데이터 일괄 편집(태그 및 앨범 아트). + 맞춤형 Wear OS 환경설정과 함께 AI 가사 번역. + 지연 진단 도구 및 검색 화면에서 다중 선택. + 아랍어 및 터키어 지원, 로컬 네트워크 옵션을 위한 지역화된 http URL. + + + 획기적인 배터리 절약(오디오 오프로드 및 UI 폴링 게이트). + 최적화된 대기열 관리(더 빠른 삽입 및 명시적 인덱싱). + 전환 화면을 위한 Material 3 Expressive 모션 애니메이션. + 조절된 스캐닝을 통한 리팩토링된 라이브러리 동기화. + + + 끊김/건너뜀 재생 지연 및 버퍼링 문제 해결. + 외부 노래 삭제 동기화 및 메타데이터 일관성 수정. + Wear OS 및 휴대폰에서 메모리 문제, 충돌 및 레이아웃 결함 수정. + \ No newline at end of file diff --git a/app/src/main/res/values-ko/strings_settings.xml b/app/src/main/res/values-ko/strings_settings.xml index 4b4fe3a87..da2e36e8d 100644 --- a/app/src/main/res/values-ko/strings_settings.xml +++ b/app/src/main/res/values-ko/strings_settings.xml @@ -7,6 +7,8 @@ 테마, 레이아웃 및 시각적 스타일 재생 오디오 동작, 크로스페이드 및 백그라운드 재생 + 가사 + 소스 우선순위, 몰입형 가사 및 가져오기 관리 동작 제스처, 햅틱 및 내비게이션 동작 AI 연동 (β) @@ -174,6 +176,9 @@ 한국어 노르웨이어 (Bokmål) 터키어 + 일본어 + 중국어(번체) + 베트남어 앱 테마 밝은 테마, 어두운 테마 또는 시스템 설정 따르기 중에서 선택하세요. 밝은 테마 diff --git a/app/src/main/res/values-nb/strings_changelogs.xml b/app/src/main/res/values-nb/strings_changelogs.xml index c12abe637..0c8ebb671 100644 --- a/app/src/main/res/values-nb/strings_changelogs.xml +++ b/app/src/main/res/values-nb/strings_changelogs.xml @@ -129,4 +129,22 @@ Lokalisering: Spansk, Fransk, Russisk, Forenklet kinesisk, Indonesisk, Italiensk + + Google Drive-integrasjon med spillerens livssyklusstyring. + Batch-redigering av sangmetadata (tagger og coverkunst). + AI-tekstoversettelse med tilpassbare Wear OS-preferanser. + Forsinkelsesdiagnoseverktøy og flervalg på søkeskjermen. + Arabisk og tyrkisk støtte, med lokaliserte http-URL-alternativer for lokalnettverk. + + + Drastisk batteribesparelse (lydavlasting og UI-avstemningsporter). + Optimalisert køstyring (raskere innsettinger og eksplisitt indeksering). + Material 3 Expressive-bevegelsesanimasjoner for overgangsskjermer. + Omstrukturert biblioteksynkronisering via strupte skanninger. + + + Løst problemer med hakkete/hoppende avspillingsforsinkelser og bufringsproblemer. + Fikset synkronisering av eksterne slettede sanger og metadatakonsistens. + Fikset minneproblemer, krasjer og layoutfeil på Wear OS og telefon. + \ No newline at end of file diff --git a/app/src/main/res/values-nb/strings_settings.xml b/app/src/main/res/values-nb/strings_settings.xml index d8e2abe1f..0295cb20a 100644 --- a/app/src/main/res/values-nb/strings_settings.xml +++ b/app/src/main/res/values-nb/strings_settings.xml @@ -7,6 +7,8 @@ Temaer, layout og visuelle stiler Avspilling Lydatferd, crossfade og bakgrunnsavspilling + Lyrics + Source priority, immersive lyrics, and import management Atferd Gester, haptikk og navigasjonsatferd AI-integrasjon (β) @@ -174,6 +176,9 @@ Koreansk Norsk bokmål Tyrkisk + Japansk + Tradisjonell kinesisk + Vietnamesisk App-tema Bytt mellom lyst, mørkt eller følg systemets utseende. Lyst tema diff --git a/app/src/main/res/values-ru/strings_changelogs.xml b/app/src/main/res/values-ru/strings_changelogs.xml index 1e30b701c..048bcadce 100644 --- a/app/src/main/res/values-ru/strings_changelogs.xml +++ b/app/src/main/res/values-ru/strings_changelogs.xml @@ -129,4 +129,22 @@ Локализация: испанский, французский, русский, упрощённый китайский, индонезийский, итальянский + + Интеграция с Google Drive с управлением жизненным циклом плеера. + Пакетное редактирование метаданных песен (теги и обложки). + Перевод текстов песен с помощью ИИ с настраиваемыми параметрами Wear OS. + Инструмент диагностики задержек и множественный выбор на экране поиска. + Поддержка арабского и турецкого языков, локализованные http URL для локальной сети. + + + Кардинальная экономия заряда батареи (выгрузка аудио и шлюзы опроса UI). + Оптимизированное управление очередью (более быстрая вставка и явная индексация). + Анимация Material 3 Expressive для экранов переходов. + Переработанная синхронизация библиотеки с регулируемым сканированием. + + + Устранены задержки воспроизведения (заикания, пропуски) и проблемы с буферизацией. + Исправлена синхронизация удаления внешних песен и согласованность метаданных. + Исправлены проблемы с памятью, сбои и ошибки макета на Wear OS и телефоне. + \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings_settings.xml b/app/src/main/res/values-ru/strings_settings.xml index c49784964..faceb539a 100644 --- a/app/src/main/res/values-ru/strings_settings.xml +++ b/app/src/main/res/values-ru/strings_settings.xml @@ -7,6 +7,8 @@ Темы, макеты и визуальные стили Воспроизведение Поведение аудио, кроссфейд и фоновое воспроизведение + Тексты песен + Приоритет источника, иммерсивный режим и управление импортом Поведение Жесты, тактильный отклик и навигация Интеграция ИИ (β) @@ -174,6 +176,9 @@ Корейский Норвежский (Bokmål) Турецкий + Японский + Китайский (традиционный) + Вьетнамский Тема приложения Светлая, тёмная тема или настройки системы. Светлая тема diff --git a/app/src/main/res/values/strings_settings.xml b/app/src/main/res/values/strings_settings.xml index ea3602815..b7f5cc4f5 100644 --- a/app/src/main/res/values/strings_settings.xml +++ b/app/src/main/res/values/strings_settings.xml @@ -5,6 +5,8 @@ Manage folders, refresh library, parsing options Appearance Themes, layout, and visual styles + Lyrics + Source priority, immersive lyrics, and import management Playback Audio behavior, crossfade, and background play Behavior @@ -171,9 +173,12 @@ 简体中文 Bahasa Indonesia Italiano + 日本語 Korean Norwegian (Bokmål) + 繁體中文 Türkçe + Tiếng Việt App Theme Switch between light, dark, or follow system appearance. Light Theme diff --git a/app/src/main/res/xml/locales_config.xml b/app/src/main/res/xml/locales_config.xml index 12f03ebe0..6d332ab8d 100644 --- a/app/src/main/res/xml/locales_config.xml +++ b/app/src/main/res/xml/locales_config.xml @@ -1,6 +1,17 @@ + + + + + + + + + + + \ No newline at end of file From 5a900052662e79492c9209b40fc96713ffb1d075 Mon Sep 17 00:00:00 2001 From: Dae Euhwa Date: Wed, 24 Jun 2026 01:44:05 -0500 Subject: [PATCH 06/12] Add LYRICS settings category and restructure settings screens SettingsCategory.kt: - Add LYRICS category with QueueMusic icon between APPEARANCE and PLAYBACK - Move EQUALIZER after PLAYBACK for better grouping - Add DEVICE_CAPABILITIES after DEVELOPER SettingsCategoryScreen.kt: - Extract lyrics management (source priority, reset) into dedicated LYRICS section - Extract lyrics display (immersive mode, auto-hide delay) into LYRICS section - Keep PLAYBACK focused on playback-specific settings only - Suppress NonObservableLocale in AI usage section SettingsScreen.kt: - Add color scheme for LYRICS category FullPlayerContent.kt: - Remove redundant resetLyricsSearchState() call when opening lyrics sheet --- .../components/player/FullPlayerContent.kt | 1 - .../presentation/model/SettingsCategory.kt | 25 ++-- .../screens/SettingsCategoryScreen.kt | 109 +++++++++--------- .../presentation/screens/SettingsScreen.kt | 2 + 4 files changed, 75 insertions(+), 62 deletions(-) diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/components/player/FullPlayerContent.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/components/player/FullPlayerContent.kt index 8a30f6f41..336588bda 100644 --- a/app/src/main/java/com/theveloper/pixelplay/presentation/components/player/FullPlayerContent.kt +++ b/app/src/main/java/com/theveloper/pixelplay/presentation/components/player/FullPlayerContent.kt @@ -378,7 +378,6 @@ fun FullPlayerContent( if (showFetchLyricsDialog) { showFetchLyricsDialog = false showLyricsSheet = true - playerViewModel.resetLyricsSearchState() } } is LyricsSearchUiState.Error -> { diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/model/SettingsCategory.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/model/SettingsCategory.kt index e59c3d7a8..7d827896f 100644 --- a/app/src/main/java/com/theveloper/pixelplay/presentation/model/SettingsCategory.kt +++ b/app/src/main/java/com/theveloper/pixelplay/presentation/model/SettingsCategory.kt @@ -9,6 +9,7 @@ import androidx.compose.material.icons.rounded.Info import androidx.compose.material.icons.rounded.LibraryMusic import androidx.compose.material.icons.rounded.MusicNote import androidx.compose.material.icons.rounded.Palette +import androidx.compose.material.icons.rounded.QueueMusic import androidx.compose.ui.graphics.vector.ImageVector import com.theveloper.pixelplay.R @@ -31,11 +32,23 @@ enum class SettingsCategory( subtitleRes = R.string.settings_category_appearance_subtitle, icon = Icons.Rounded.Palette ), + LYRICS( + id = "lyrics", + titleRes = R.string.settings_category_lyrics_title, + subtitleRes = R.string.settings_category_lyrics_subtitle, + icon = Icons.Rounded.QueueMusic + ), PLAYBACK( id = "playback", titleRes = R.string.settings_category_playback_title, subtitleRes = R.string.settings_category_playback_subtitle, - icon = Icons.Rounded.MusicNote // Using MusicNote again or maybe PlayCircle if available + icon = Icons.Rounded.MusicNote + ), + EQUALIZER( + id = "equalizer", + titleRes = R.string.settings_category_equalizer_title, + subtitleRes = R.string.settings_category_equalizer_subtitle, + icon = Icons.Rounded.GraphicEq ), BEHAVIOR( id = "behavior", @@ -61,17 +74,11 @@ enum class SettingsCategory( subtitleRes = R.string.settings_category_developer_subtitle, icon = Icons.Rounded.DeveloperMode ), - EQUALIZER( - id = "equalizer", - titleRes = R.string.settings_category_equalizer_title, - subtitleRes = R.string.settings_category_equalizer_subtitle, - icon = Icons.Rounded.GraphicEq - ), DEVICE_CAPABILITIES( id = "device_capabilities", titleRes = R.string.settings_category_device_capabilities_title, subtitleRes = R.string.settings_category_device_capabilities_subtitle, - icon = Icons.Rounded.DeveloperBoard // Placeholder, maybe Memory or SettingsInputComponent + icon = Icons.Rounded.DeveloperBoard ), ABOUT( id = "about", @@ -83,4 +90,6 @@ enum class SettingsCategory( companion object { fun fromId(id: String): SettingsCategory? = entries.find { it.id == id } } + + } diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/SettingsCategoryScreen.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/SettingsCategoryScreen.kt index dd1672dbc..bb97e988b 100644 --- a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/SettingsCategoryScreen.kt +++ b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/SettingsCategoryScreen.kt @@ -508,33 +508,6 @@ fun SettingsCategoryScreen( ) } - SettingsSubsection( - title = stringResource(R.string.settings_lyrics_management_section), - addBottomSpace = false - ) { - ThemeSelectorItem( - label = stringResource(R.string.settings_lyrics_source_priority_title), - description = stringResource(R.string.settings_lyrics_source_priority_subtitle), - options = mapOf( - LyricsSourcePreference.EMBEDDED_FIRST.name to stringResource(R.string.settings_lyrics_embedded_first), - LyricsSourcePreference.API_FIRST.name to stringResource(R.string.settings_lyrics_online_first), - LyricsSourcePreference.LOCAL_FIRST.name to stringResource(R.string.settings_lyrics_local_first) - ), - selectedKey = uiState.lyricsSourcePreference.name, - onSelectionChanged = { key -> - settingsViewModel.setLyricsSourcePreference( - LyricsSourcePreference.fromName(key) - ) - }, - leadingIcon = { Icon(painterResource(R.drawable.rounded_lyrics_24), null, tint = MaterialTheme.colorScheme.secondary) } - ) - SettingsItem( - title = stringResource(R.string.settings_reset_imported_lyrics_title), - subtitle = stringResource(R.string.settings_reset_imported_lyrics_subtitle), - leadingIcon = { Icon(Icons.Outlined.ClearAll, null, tint = MaterialTheme.colorScheme.secondary) }, - onClick = { showClearLyricsDialog = true } - ) - } } SettingsCategory.APPEARANCE -> { val useSmoothCorners by settingsViewModel.useSmoothCorners.collectAsStateWithLifecycle() @@ -679,32 +652,6 @@ fun SettingsCategoryScreen( ) } - SettingsSubsection(title = stringResource(R.string.settings_lyrics_screen_section)) { - SwitchSettingItem( - title = stringResource(R.string.settings_immersive_lyrics_title), - subtitle = stringResource(R.string.settings_immersive_lyrics_subtitle), - checked = uiState.immersiveLyricsEnabled, - onCheckedChange = { settingsViewModel.setImmersiveLyricsEnabled(it) }, - leadingIcon = { Icon(painterResource(R.drawable.rounded_lyrics_24), null, tint = MaterialTheme.colorScheme.secondary) } - ) - - if (uiState.immersiveLyricsEnabled) { - ThemeSelectorItem( - label = stringResource(R.string.settings_auto_hide_delay_title), - description = stringResource(R.string.settings_auto_hide_delay_subtitle), - options = mapOf( - "3000" to stringResource(R.string.settings_auto_hide_delay_3s), - "4000" to stringResource(R.string.settings_auto_hide_delay_4s), - "5000" to stringResource(R.string.settings_auto_hide_delay_5s), - "6000" to stringResource(R.string.settings_auto_hide_delay_6s) - ), - selectedKey = uiState.immersiveLyricsTimeout.toString(), - onSelectionChanged = { settingsViewModel.setImmersiveLyricsTimeout(it.toLong()) }, - leadingIcon = { Icon(Icons.Rounded.Timer, null, tint = MaterialTheme.colorScheme.secondary) } - ) - } - } - SettingsSubsection( title = stringResource(R.string.settings_app_navigation_section), addBottomSpace = false @@ -734,6 +681,61 @@ fun SettingsCategoryScreen( ) } } + SettingsCategory.LYRICS -> { + SettingsSubsection( + title = stringResource(R.string.settings_lyrics_management_section), + addBottomSpace = false + ) { + ThemeSelectorItem( + label = stringResource(R.string.settings_lyrics_source_priority_title), + description = stringResource(R.string.settings_lyrics_source_priority_subtitle), + options = mapOf( + LyricsSourcePreference.EMBEDDED_FIRST.name to stringResource(R.string.settings_lyrics_embedded_first), + LyricsSourcePreference.API_FIRST.name to stringResource(R.string.settings_lyrics_online_first), + LyricsSourcePreference.LOCAL_FIRST.name to stringResource(R.string.settings_lyrics_local_first) + ), + selectedKey = uiState.lyricsSourcePreference.name, + onSelectionChanged = { key -> + settingsViewModel.setLyricsSourcePreference( + LyricsSourcePreference.fromName(key) + ) + }, + leadingIcon = { Icon(painterResource(R.drawable.rounded_lyrics_24), null, tint = MaterialTheme.colorScheme.secondary) } + ) + SettingsItem( + title = stringResource(R.string.settings_reset_imported_lyrics_title), + subtitle = stringResource(R.string.settings_reset_imported_lyrics_subtitle), + leadingIcon = { Icon(Icons.Outlined.ClearAll, null, tint = MaterialTheme.colorScheme.secondary) }, + onClick = { showClearLyricsDialog = true } + ) + } + + SettingsSubsection(title = stringResource(R.string.settings_lyrics_screen_section)) { + SwitchSettingItem( + title = stringResource(R.string.settings_immersive_lyrics_title), + subtitle = stringResource(R.string.settings_immersive_lyrics_subtitle), + checked = uiState.immersiveLyricsEnabled, + onCheckedChange = { settingsViewModel.setImmersiveLyricsEnabled(it) }, + leadingIcon = { Icon(painterResource(R.drawable.rounded_lyrics_24), null, tint = MaterialTheme.colorScheme.secondary) } + ) + + if (uiState.immersiveLyricsEnabled) { + ThemeSelectorItem( + label = stringResource(R.string.settings_auto_hide_delay_title), + description = stringResource(R.string.settings_auto_hide_delay_subtitle), + options = mapOf( + "3000" to stringResource(R.string.settings_auto_hide_delay_3s), + "4000" to stringResource(R.string.settings_auto_hide_delay_4s), + "5000" to stringResource(R.string.settings_auto_hide_delay_5s), + "6000" to stringResource(R.string.settings_auto_hide_delay_6s) + ), + selectedKey = uiState.immersiveLyricsTimeout.toString(), + onSelectionChanged = { settingsViewModel.setImmersiveLyricsTimeout(it.toLong()) }, + leadingIcon = { Icon(Icons.Rounded.Timer, null, tint = MaterialTheme.colorScheme.secondary) } + ) + } + } + } SettingsCategory.PLAYBACK -> { SettingsSubsection(title = stringResource(R.string.settings_background_playback_section)) { ThemeSelectorItem( @@ -1269,6 +1271,7 @@ fun SettingsCategoryScreen( .fillMaxWidth() .padding(top = 8.dp, bottom = 8.dp) ) { + @Suppress("NonObservableLocale") val dateFormat = SimpleDateFormat("MMMM d, yyyy", Locale.getDefault()) val groupedUsage = recentAiUsage.groupBy { dateFormat.format(Date(it.timestamp)) diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/SettingsScreen.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/SettingsScreen.kt index fa40ecb26..292d3448e 100644 --- a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/SettingsScreen.kt +++ b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/SettingsScreen.kt @@ -480,6 +480,7 @@ private fun getCategoryColors(category: SettingsCategory, isDark: Boolean): Pair when (category) { SettingsCategory.LIBRARY -> Color(0xFF004A77) to Color(0xFFC2E7FF) SettingsCategory.APPEARANCE -> Color(0xFF7D5260) to Color(0xFFFFD8E4) + SettingsCategory.LYRICS -> Color(0xFF4A1A6E) to Color(0xFFE8D0FF) SettingsCategory.PLAYBACK -> Color(0xFF633B48) to Color(0xFFFFD8EC) SettingsCategory.BEHAVIOR -> Color(0xFF3E4C63) to Color(0xFFD7E3FF) SettingsCategory.AI_INTEGRATION -> Color(0xFF004F58) to Color(0xFF88FAFF) @@ -493,6 +494,7 @@ private fun getCategoryColors(category: SettingsCategory, isDark: Boolean): Pair when (category) { SettingsCategory.LIBRARY -> Color(0xFFD7E3FF) to Color(0xFF005AC1) SettingsCategory.APPEARANCE -> Color(0xFFFFD8E4) to Color(0xFF631835) + SettingsCategory.LYRICS -> Color(0xFFF0E0FF) to Color(0xFF4A1A6E) SettingsCategory.PLAYBACK -> Color(0xFFFFD8EC) to Color(0xFF631B4B) SettingsCategory.BEHAVIOR -> Color(0xFFD7E3FF) to Color(0xFF253347) SettingsCategory.AI_INTEGRATION -> Color(0xFFCCE8EA) to Color(0xFF004F58) From a88c9a11e5b7575c7966867a03359aaaf89736b6 Mon Sep 17 00:00:00 2001 From: Dae Euhwa Date: Wed, 24 Jun 2026 01:44:06 -0500 Subject: [PATCH 07/12] Update CI workflows and build config - Add --no-build-cache to all Gradle build steps for CI reproducibility - Reorder CodeQL workflow steps: pin Kotlin version before Gradle setup - Remove explicit maxHeapSize from app build.gradle.kts - Remove kotlin and ksp version overrides from libs.versions.toml --- .github/workflows/codeql.yml | 17 +++++++---------- .github/workflows/nightly-apk.yml | 2 +- .github/workflows/phone-debug.yml | 2 +- .github/workflows/phone-release.yml | 2 +- .github/workflows/wearos-apk.yml | 2 +- app/build.gradle.kts | 1 - gradle/libs.versions.toml | 6 ------ 7 files changed, 11 insertions(+), 21 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index b2793cfd8..d4bb1bac0 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -29,19 +29,16 @@ jobs: distribution: 'temurin' java-version: '21' - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v6 - with: - cache-provider: 'enhanced' - - name: Pin Kotlin version for CodeQL compatibility run: | - # More robust sed pattern that handles various formats sed -i 's/kotlin = "[^"]*"/kotlin = "2.3.20"/g' gradle/libs.versions.toml - - # Verify the change was made grep 'kotlin = "2.3.20"' gradle/libs.versions.toml - + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v6 + with: + cache-provider: 'enhanced' + - name: Initialize CodeQL uses: github/codeql-action/init@v4 with: @@ -49,7 +46,7 @@ jobs: build-mode: manual - name: Build with Gradle - run: ${{ github.workspace }}/gradlew :app:assembleDebug :wear:assembleDebug --no-daemon + run: ${{ github.workspace }}/gradlew :app:assembleDebug :wear:assembleDebug --no-daemon --no-build-cache - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v4 diff --git a/.github/workflows/nightly-apk.yml b/.github/workflows/nightly-apk.yml index 2c6f7728f..12a85bebe 100644 --- a/.github/workflows/nightly-apk.yml +++ b/.github/workflows/nightly-apk.yml @@ -117,7 +117,7 @@ jobs: echo "keyPassword=994273" >> keystore.properties - name: Build Phone nightly release APKs - run: gradle :app:assembleRelease -Ppixelplay.enableAbiSplits=true + run: gradle :app:assembleRelease -Ppixelplay.enableAbiSplits=true --no-build-cache - name: Verify Phone nightly split APKs run: | diff --git a/.github/workflows/phone-debug.yml b/.github/workflows/phone-debug.yml index 3f7d70fb2..91d799be5 100644 --- a/.github/workflows/phone-debug.yml +++ b/.github/workflows/phone-debug.yml @@ -30,7 +30,7 @@ jobs: uses: gradle/actions/setup-gradle@v6 - name: Build Phone debug APK - run: gradle :app:assembleDebug -Ppixelplay.enableAbiSplits=true + run: gradle :app:assembleDebug -Ppixelplay.enableAbiSplits=true --no-build-cache - name: Verify Phone split APKs run: | diff --git a/.github/workflows/phone-release.yml b/.github/workflows/phone-release.yml index 1c33965a3..14cd88749 100644 --- a/.github/workflows/phone-release.yml +++ b/.github/workflows/phone-release.yml @@ -52,7 +52,7 @@ jobs: echo "keyPassword=994273" >> keystore.properties - name: Build Phone release APK - run: gradle :app:assembleRelease -Ppixelplay.enableAbiSplits=true + run: gradle :app:assembleRelease -Ppixelplay.enableAbiSplits=true --no-build-cache - name: Verify Phone split APKs run: | diff --git a/.github/workflows/wearos-apk.yml b/.github/workflows/wearos-apk.yml index 6e7b53b6d..862829a51 100644 --- a/.github/workflows/wearos-apk.yml +++ b/.github/workflows/wearos-apk.yml @@ -30,7 +30,7 @@ jobs: uses: gradle/actions/setup-gradle@v6 - name: Build Wear OS debug APK - run: gradle :wear:assembleDebug + run: gradle :wear:assembleDebug --no-build-cache - name: Upload Wear OS APK artifact uses: actions/upload-artifact@v7.0.1 diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 04d49b171..dbe91c589 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -280,7 +280,6 @@ dependencies { // UI Utilities & Extra implementation(libs.timber) - implementation(libs.generativeai) implementation(libs.smooth.corner.rect.android.compose) implementation(libs.reorderables) implementation(libs.codeview) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e653436ec..4a104ce63 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,7 +9,6 @@ appcompat = "1.7.1" capturable = "3.0.1" codeview = "1.3.9" coilCompose = "2.7.0" -composeDnd = "0.4.0" composeMaterialIcons = "1.7.8" composeUi = "1.11.3" constraintlayoutCompose = "1.1.1" @@ -46,7 +45,6 @@ paletteKtx = "1.0.0" protobufJavalite = "4.35.1" pytorch_android = "2.1.0" pytorch_android_torchvision = "2.1.0" -reorderable = "0.9.6" reorderables = "3.1.0" paging = "3.5.0" roomCompiler = "2.8.4" @@ -88,7 +86,6 @@ wavySlider = "2.2.0" workRuntimeKtx = "2.11.2" composeTesting = "1.0.0-alpha03" timber = "5.0.1" -generativeai = "0.9.0" mockk = "1.14.11" turbine = "1.2.1" truth = "1.4.5" @@ -162,7 +159,6 @@ androidx-work-runtime-ktx = { module = "androidx.work:work-runtime-ktx", version capturable = { module = "dev.shreyaspatil:capturable", version.ref = "capturable" } codeview = { module = "io.github.amrdeveloper:codeview", version.ref = "codeview" } coil-compose = { module = "io.coil-kt:coil-compose", version.ref = "coilCompose" } -compose-dnd = { module = "com.mohamedrejeb.dnd:compose-dnd", version.ref = "composeDnd" } duktape-android = { module = "com.squareup.duktape:duktape-android", version.ref = "duktapeAndroid" } gson = { module = "com.google.code.gson:gson", version.ref = "gson" } hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hiltAndroid" } @@ -196,7 +192,6 @@ material3 = { module = "androidx.compose.material3:material3", version.ref = "ma protobuf-javalite = { module = "com.google.protobuf:protobuf-javalite", version.ref = "protobufJavalite" } pytorch_android = { module = "org.pytorch:pytorch_android", version.ref = "pytorch_android" } pytorch_android_torchvision = { module = "org.pytorch:pytorch_android_torchvision", version.ref = "pytorch_android_torchvision" } -reorderable = { module = "org.burnoutcrew.composereorderable:reorderable", version.ref = "reorderable" } accompanist-permissions = { module = "com.google.accompanist:accompanist-permissions", version.ref = "accompanist" } smooth-corner-rect-android-compose = { module = "com.github.racra:smooth-corner-rect-android-compose", version.ref = "smoothCornerRectAndroidCompose" } spleeter-android-ios = { module = "com.github.FaceOnLive:Spleeter-Android-iOS", version.ref = "spleeterAndroidIos" } @@ -211,7 +206,6 @@ taglib = { group = "io.github.kyant0", name = "taglib", version.ref = "taglib" } jaudiotagger = { group = "net.jthink", name = "jaudiotagger", version.ref = "jaudiotagger" } vorbisjava-core = { group = "org.gagravarr", name = "vorbis-java-core", version.ref = "vorbisjava" } reorderables = { group = "sh.calvin.reorderable", name = "reorderable", version.ref = "reorderables" } -generativeai = { group = "com.google.ai.client.generativeai", name = "generativeai", version.ref = "generativeai" } retrofit = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit" } converter-gson = { group = "com.squareup.retrofit2", name = "converter-gson", version.ref = "retrofit" } okhttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" } From 4940904a76cd7d6eed53f63c49e74f3bff263fa5 Mon Sep 17 00:00:00 2001 From: Dae Euhwa Date: Wed, 24 Jun 2026 01:44:06 -0500 Subject: [PATCH 08/12] Misc fixes: AI max tokens and lyrics loading priority AiPreferencesRepository.kt: Increase default AI max tokens from 4096 to 8192 LyricsStateHolder.kt: Fix lyrics loading priority - read local file and embedded lyrics before falling back to stored database lyrics --- .../pixelplay/data/preferences/AiPreferencesRepository.kt | 2 +- .../pixelplay/presentation/viewmodel/LyricsStateHolder.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/theveloper/pixelplay/data/preferences/AiPreferencesRepository.kt b/app/src/main/java/com/theveloper/pixelplay/data/preferences/AiPreferencesRepository.kt index 964875d04..32339a44c 100644 --- a/app/src/main/java/com/theveloper/pixelplay/data/preferences/AiPreferencesRepository.kt +++ b/app/src/main/java/com/theveloper/pixelplay/data/preferences/AiPreferencesRepository.kt @@ -152,7 +152,7 @@ class AiPreferencesRepository @Inject constructor( dataStore.data.map { preferences -> preferences[Keys.AI_TOP_K] ?: 64 } val aiMaxTokens: Flow = - dataStore.data.map { preferences -> preferences[Keys.AI_MAX_TOKENS] ?: 4096 } + dataStore.data.map { preferences -> preferences[Keys.AI_MAX_TOKENS] ?: 8192 } val aiPresencePenalty: Flow = dataStore.data.map { preferences -> preferences[Keys.AI_PRESENCE_PENALTY] ?: 0.0f } diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/LyricsStateHolder.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/LyricsStateHolder.kt index 87985fd6e..de7a1a4a2 100644 --- a/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/LyricsStateHolder.kt +++ b/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/LyricsStateHolder.kt @@ -356,9 +356,9 @@ class LyricsStateHolder @Inject constructor( _messageEvents.emit(cb.getString(R.string.lyrics_translate_progress)) val rawLyrics = withContext(Dispatchers.IO) { - currentSong.lyrics?.takeIf { it.isNotBlank() } - ?: readLocalLyricsFile(currentSong) + readLocalLyricsFile(currentSong) ?: readEmbeddedLyricsFromFile(currentSong) + ?: currentSong.lyrics?.takeIf { it.isNotBlank() } ?: musicRepository.getStoredLyrics(currentSong)?.second } From 0f4045bd9c2513dd82e2aae45732f566bd459cc1 Mon Sep 17 00:00:00 2001 From: Dae Euhwa Date: Wed, 24 Jun 2026 01:44:07 -0500 Subject: [PATCH 09/12] Add ServerUrlUtils, Vietnamese/Traditional Chinese translations, and lint baseline - ServerUrlUtils.kt: URL utility for server configuration - values-vi/ and values-zh-rTW/: Vietnamese and Traditional Chinese translation resources - app/lint.xml: Lint baseline configuration file --- app/lint.xml | 20 + .../pixelplay/utils/ServerUrlUtils.kt | 46 ++ app/src/main/res/values-vi/strings.xml | 128 ++++ .../main/res/values-vi/strings_changelogs.xml | 150 ++++ .../res/values-vi/strings_cloud_services.xml | 228 ++++++ .../main/res/values-vi/strings_equalizer.xml | 57 ++ .../res/values-vi/strings_home_screen.xml | 277 ++++++++ .../main/res/values-vi/strings_library.xml | 566 +++++++++++++++ app/src/main/res/values-vi/strings_player.xml | 198 ++++++ .../main/res/values-vi/strings_screens.xml | 244 +++++++ .../main/res/values-vi/strings_settings.xml | 654 ++++++++++++++++++ app/src/main/res/values-vi/strings_widget.xml | 17 + app/src/main/res/values-zh-rTW/strings.xml | 128 ++++ .../res/values-zh-rTW/strings_changelogs.xml | 132 ++++ .../values-zh-rTW/strings_cloud_services.xml | 228 ++++++ .../res/values-zh-rTW/strings_equalizer.xml | 57 ++ .../res/values-zh-rTW/strings_home_screen.xml | 277 ++++++++ .../res/values-zh-rTW/strings_library.xml | 566 +++++++++++++++ .../main/res/values-zh-rTW/strings_player.xml | 198 ++++++ .../res/values-zh-rTW/strings_screens.xml | 244 +++++++ .../res/values-zh-rTW/strings_settings.xml | 652 +++++++++++++++++ .../main/res/values-zh-rTW/strings_widget.xml | 17 + 22 files changed, 5084 insertions(+) create mode 100644 app/lint.xml create mode 100644 app/src/main/java/com/theveloper/pixelplay/utils/ServerUrlUtils.kt create mode 100644 app/src/main/res/values-vi/strings.xml create mode 100644 app/src/main/res/values-vi/strings_changelogs.xml create mode 100644 app/src/main/res/values-vi/strings_cloud_services.xml create mode 100644 app/src/main/res/values-vi/strings_equalizer.xml create mode 100644 app/src/main/res/values-vi/strings_home_screen.xml create mode 100644 app/src/main/res/values-vi/strings_library.xml create mode 100644 app/src/main/res/values-vi/strings_player.xml create mode 100644 app/src/main/res/values-vi/strings_screens.xml create mode 100644 app/src/main/res/values-vi/strings_settings.xml create mode 100644 app/src/main/res/values-vi/strings_widget.xml create mode 100644 app/src/main/res/values-zh-rTW/strings.xml create mode 100644 app/src/main/res/values-zh-rTW/strings_changelogs.xml create mode 100644 app/src/main/res/values-zh-rTW/strings_cloud_services.xml create mode 100644 app/src/main/res/values-zh-rTW/strings_equalizer.xml create mode 100644 app/src/main/res/values-zh-rTW/strings_home_screen.xml create mode 100644 app/src/main/res/values-zh-rTW/strings_library.xml create mode 100644 app/src/main/res/values-zh-rTW/strings_player.xml create mode 100644 app/src/main/res/values-zh-rTW/strings_screens.xml create mode 100644 app/src/main/res/values-zh-rTW/strings_settings.xml create mode 100644 app/src/main/res/values-zh-rTW/strings_widget.xml diff --git a/app/lint.xml b/app/lint.xml new file mode 100644 index 000000000..6fb7e7f3e --- /dev/null +++ b/app/lint.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/com/theveloper/pixelplay/utils/ServerUrlUtils.kt b/app/src/main/java/com/theveloper/pixelplay/utils/ServerUrlUtils.kt new file mode 100644 index 000000000..5ac552e63 --- /dev/null +++ b/app/src/main/java/com/theveloper/pixelplay/utils/ServerUrlUtils.kt @@ -0,0 +1,46 @@ +package com.theveloper.pixelplay.utils + +import com.theveloper.pixelplay.data.stream.CloudStreamSecurity +import okhttp3.HttpUrl +import okhttp3.HttpUrl.Companion.toHttpUrlOrNull + +object ServerUrlUtils { + + data class NormalizedUrl( + val url: HttpUrl, + val original: String, + val validationError: String? = null + ) + + fun normalizeUrlOrNull(raw: String): HttpUrl? { + val trimmed = raw.trim().trimEnd('/') + val withScheme = if (!trimmed.startsWith("http://", ignoreCase = true) && + !trimmed.startsWith("https://", ignoreCase = true) + ) { + "https://$trimmed" + } else { + trimmed + } + return withScheme.toHttpUrlOrNull() + } + + fun normalizeUrlString(raw: String): String = + normalizeUrlOrNull(raw)?.toString()?.trimEnd('/') ?: raw.trim().trimEnd('/') + + fun validateConnectionUrl(parsed: HttpUrl): String? { + if (parsed.username.isNotEmpty() || parsed.password.isNotEmpty()) { + return "Server URL must not contain embedded credentials" + } + return null + } + + fun requireSecureForRemote(parsed: HttpUrl, service: String = "server"): String? { + if (parsed.username.isNotEmpty() || parsed.password.isNotEmpty()) { + return "Server URL must not contain embedded credentials" + } + if (!parsed.isHttps && !CloudStreamSecurity.isLocalOrPrivateHost(parsed.host)) { + return "Use https:// for remote $service servers. HTTP is only allowed for local network addresses." + } + return null + } +} diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml new file mode 100644 index 000000000..2cb4e6d90 --- /dev/null +++ b/app/src/main/res/values-vi/strings.xml @@ -0,0 +1,128 @@ + + + PixelPlayer + Music Player + App Name Change + We have changed our app\'s name from PixelPlay to PixelPlayer due to a trademark-related issue. Keep playing! + Do not show again + + + Home + Search + Library + + + Special Permission Required + To edit song metadata (.mp3 files), PixelPlayer needs special access to all files. This allows us to modify track tags directly. Please grant this permission on the next screen to enable metadata editing. + Grant Permission + + + Quick play + Unable to open that audio file. + Open full player + + + Shuffle + Shuffle all songs + Shuffle All + Last Playlist + No playlist available to open + + + Open Play Store + Continue beta + The Play Store link will be enabled from GitHub config. + PixelPlayer is now available on Google Play + Use the stable channel on Google Play for release updates while we keep beta builds active. + PixelPlayer + Release announcement + Coming soon + + + Thank you for using PixelPlayer! + HIGH %1$d + Close + SCORE + LVL %1$d + LIVES + LEVEL COMPLETE! + GAME OVER + Score: %1$d + Try Again? + Next Level + Restart Game + TAP TO RELAUNCH + Play Random Music + Brick Breaker + HIGH SCORE %1$d + Play + Drag to move the paddle + + + Close player + Processing playback action… + Playback error: %1$s + + + Back + OK + Cancel + Dismiss + Error + Search + Clear search + All + Confirm + Saved! + Selected + %1$d%% + Artist + Select All + Clear + Unknown error + + + Save + Done + Reset + Apply + Shuffle + Copy + Share + Undo + Import + Delete + Export + Merge + Rename + Create + Lyrics + Settings + Album Art + Playlist + Unknown track + Unknown artist + Unknown album + Close + Add + Remove + Play + Previous track + Next track + Favorite + Pause + Repeat + Options + Shuffle Play + More options for %1$s + Expand menu + Next + Finish + Reset defaults + Export all + Merge all + Share all + Play album + Shuffle play album + Album art for %1$s + diff --git a/app/src/main/res/values-vi/strings_changelogs.xml b/app/src/main/res/values-vi/strings_changelogs.xml new file mode 100644 index 000000000..21e875840 --- /dev/null +++ b/app/src/main/res/values-vi/strings_changelogs.xml @@ -0,0 +1,150 @@ + + + Changelog + View on GitHub + Improvements + Fixes + What\'s New + Added + + Chromecast support for casting audio from your device. + In-app changelog to keep you updated on the latest features. + Support for .LRC files, both embedded and external. + Offline lyrics support. + Synchronized lyrics (synced with the song). + New screen to view the full queue. + Reorder and remove songs from the queue. + Mini-player gestures (swipe down to close). + Added more material animations. + New settings to customize the look and feel. + New settings to clear the cache. + + + Complete redesign of the user interface. + Complete redesign of the player. + Performance improvements in the library. + Improved application startup speed. + The AI now provides better results. + + + Fixed various bugs in the tag editor. + Fixed a bug where the playback notification was not clearing. + Fixed several bugs that caused the app to crash. + + + Introduced a richer listening stats hub with deeper insights into your sessions. + Launched a floating quick player to instantly open and preview local files. + Added a folders tab with a tree-style navigator and playlist-ready view. + + + Refined the overall Material 3 UI for a cleaner and more cohesive experience. + Metadata editing now supports cover art change. + Smoothed out animations and transitions across the app for more fluid navigation. + Enhanced the artist screen layout with richer details and polish. + Upgraded DailyMix and YourMix generation with smarter, more diverse selections. + Strengthened the AI playlist generation. + Improved search relevance and presentation for faster discovery. + Expanded support for a broader range of audio file formats. + + + Resolved metadata quirks so song details stay accurate everywhere. + Restored notification shortcuts so they reliably jump back into playback. + + + Major navigation redesign + New file explorer for choosing source directories + New Connectivity and casting functionalities + Seamless continuity between remote devices + Gapless transition between songs + Crossfade control + New Custom Transitions feature (only for playlists) + Keep playing after closed the app + UI Optimizations + Improved stats feature + Redesigned Queue control with more features + Improved different filetypes support for playing and metadata editing + Improved permission controller + Minor bug fixes + + + Material 3 Expressive UI Update + 10-band Equalizer & Effects + New Library Sync Flow + AI Integration (Gemini Models) + M3U Playlist Import/Export + Deezer Artist Artwork Integration + Custom Playlist Covers + Settings Architecture Refactor + Queue & Player Animations + Baseline Profiles & Performance + Better Lyrics System with Sync Offset + + + Casting Stability Improvements + Player Sheet Stability + General Bug Fixes & Cleanup + + + Android Auto support is now available for in-car playback. + Wear OS support is live, including better watch-to-phone playback controls. + Cloud integrations expanded with Telegram, NetEase, QQ Music, and Google Drive improvements. + Recently Played and persistent queue restoration keep your listening session ready. + Backup & Restore v3 and account management tools are now included. + Lyrics got smarter with manual search fallback and storage improvements. + + + Big performance pass across startup, library, queue, and player interactions. + Player, Cast, Lyrics, Artist, and Genre surfaces were redesigned for smoother use. + Navigation and search flows are more reliable, with safer route handling. + Audio playback compatibility improved for more devices and formats. + Multi-selection workflows were expanded across songs, albums, and playlists. + + + Queue and shuffle behavior is now more stable and predictable. + Several background playback and casting edge cases were fixed. + Sleep Timer, Files tab navigation, and album artist crash issues were fixed. + Widget loading and service stability were improved to reduce overheating/memory issues. + General bug fixes and UI polish across the app. + + + Wear OS: Music transfer, local playback, queue sync, and remote control from watch. + AI: Groq AI and OpenRouter (experimental) integration with token optimization. + Cloud: Jellyfin support added. + Lyrics: Synced translation with dedicated toggle, Kugou LRC format support, text alignment customization, and improved remote loading. + UI/UX: Compact navigation bar mode, dynamic themes from album art palette, marquee for long titles, and new sorting options. + Telegram: Native topics support and enhanced display modes. + + + Audio Engine: Complete overhaul with support for more formats (MIDI, ALAC, M4A) and decoder optimization. + Efficiency: Drastic energy consumption reduction, overheating fixes, and background task optimization (SyncWorker). + Database: Massive query optimizations and redesigned cover art cache to prevent data loss. + Startup: Improved loading time via Baseline Profile optimization. + + + Playback: Fixed stuttering in Opus/MP3, ReplayGain errors during crossfades, and startup issues on Samsung decoders. + Stability: Eliminated crashes on startup, artist navigation, and Android 12+ devices. + UI: Fixed cover art flickering, text overflow in non-Latin scripts, and navigation bar/miniplayer behavior. + Security: Hardened credential handling, storage permissions, and media server communication. + + + Localization: Spanish, French, Russian, Simplified Chinese, Indonesian, Italian + + + Google Drive integration with player lifecycle management. + Batch song metadata editing (tags and cover art). + AI lyrics translation with customizable Wear OS preferences. + Lag diagnostic tool and multi-selection on Search screen. + Arabic & Turkish support, with localized http URL local-network options. + + + Drastic battery saving (audio offload and UI polling gates). + Optimized queue management (faster insertions and explicit indexing). + Material 3 Expressive motion animations for transition screens. + Refactored library synchronization via throttled scanning. + + + Resolved stuttering/skipping playback lags and buffering issues. + Fixed external song deletion sync and metadata consistency. + Fixed memory issues, crashes, and layout glitches on Wear OS and phone. + + \ No newline at end of file diff --git a/app/src/main/res/values-vi/strings_cloud_services.xml b/app/src/main/res/values-vi/strings_cloud_services.xml new file mode 100644 index 000000000..df633dab6 --- /dev/null +++ b/app/src/main/res/values-vi/strings_cloud_services.xml @@ -0,0 +1,228 @@ + + + + Telegram Login + You are editing your number. Sending code again will replace the previous one. + Working… + Initializing Telegram… + Logging out… + Closing session… + Session closed. Re-open login to continue. + Preparing secure Telegram session… + Waiting for Telegram response… + Connect Telegram + Connect Telegram to stream music from your channels and chats. + Phone Number + Enter your Telegram number. You can come back and edit it later. + Phone number + 1 + 5551234567 + Send Code + Verification Code + Enter the code from Telegram. If the number is wrong, go back and edit it. + Code + 12345 + Edit phone + Resend code + Verify Code + Two-Step Password + Enter your Telegram password. You can still go back to fix your number. + Password + Verify Password + Please wait… + + + Telegram Channels + Add Channel + Public Telegram channel + Syncing + Sync now + Collapse topics + Show topics + Channel options + Topics + Syncing channel + Updating songs from Telegram + Fetch latest songs from this channel + Remove channel + Stop syncing and remove cached songs + Remove channel? + %1$s will stop syncing and all cached songs from this channel will be removed. + Remove + No Channels Synced + Add public Telegram channels to sync\nyour music library + Add channel + Never synced + Synced %1$s + + + Add Channel + Search for a public Telegram channel to sync its music + \@channelname or link + Searching… + Search for a channel + Enter a public channel username or link\nto sync its audio files + + + %d song + %d songs + + + %d topic + %d topics + + + + Subsonic + Manage Navidrome, Airsonic and other Subsonic-compatible servers. + + + Tap sync to fetch your Jellyfin playlists + Manage your Jellyfin server connection. + + + Music folders + Tap + to add a Drive folder + No folders added yet + %1$d folders synced + Add folder + + + Select playlist type + Choose which playlists to sync: + All playlists + Created & collected + Created playlists + Collected playlists + + + %1$d playlists synced + Playlists + Sync + No playlists synced yet + Tap sync to fetch your playlists + Quick actions + Sync library + Disconnect + %1$d songs + + + Syncing + Syncing library… + Fetching playlists… + Syncing playlist: %1$s + Updating local library… + Sync complete + Fetching album list… + Fetching songs from %1$s… + Saving %1$d songs to database… + No library songs found + Library sync complete + Syncing… + Error: %1$s + + + Sync + Sync all + Log out + Sync all playlists + User avatar + + + No internet connection + This content requires an internet connection. Please check your network settings and try again. + You\'re offline + Please check your internet connection and try again to access this content. + + + Connect + Connecting… + Enter your server URL and account credentials. + Connection details + Hide password + Password + Enter password + Prefill http:// + Server URL + Show password + Telegram + Username + admin + Welcome, %1$s! + + + Compatible with Navidrome, Gonic, Airsonic, and other Subsonic-compatible servers + Supports Navidrome, Airsonic, Gonic, Ampache and other servers compatible with the Subsonic API. + App password also works if your server supports it. + Prefill https:// + Connect to your self-hosted music server + Navidrome + Use the full https:// base address of your server. + https://music.example.com + This is your Subsonic or Navidrome account name. + Subsonic / Navidrome + Subsonic + + + Enter your Jellyfin server URL and account credentials. + Connects to Jellyfin servers for streaming your music library + Connects to Jellyfin servers. Both HTTP and HTTPS are supported for local network access. + Jellyfin + Your Jellyfin account password. + Connect to your Jellyfin media server + Jellyfin + Full URL of your Jellyfin server, including port. + http://192.168.1.100:8096 + Your Jellyfin account username. + + + Stream music files directly from your Google Drive + Connect Google Drive + Google Drive connected! + Create \"PixelPlayer Music\" + Create a new folder here for your music + No folders here + Open folder + Choose or create a folder to use as your music source + Select a music folder + Setting up Google Drive… + Sign in with Google + Google Drive + Use + + + Could not read session cookies. + Done + Exit + No cookies found. Log in first. + Page is taking too long to load. Use refresh or try another network. + + + Saving… + Stay + Page load timed out. You can retry without losing your progress. + Web back + You can come back later. Current page state will be discarded when closing. + Web forward + Refresh + Retry + Open home + WebView load failed. + + + Failed to read NetEase cookies: %1$s + Exit NetEase login? + HTTP %1$d while loading NetEase. + Login not detected yet. Complete NetEase login before pressing Done. + Login to NetEase Music + Security note: your password is entered only in NetEase web pages. PixelPlayer stores session cookies (MUSIC_U) to sync your library. + NetEase Music + + + Failed to read QQ Music cookies: %1$s + Exit QQ Music login? + HTTP %1$d while loading QQ Music. + Login not detected yet. Complete QQ Music login before pressing Done. + Login to QQ Music + Security note: your password is entered only in QQ Music web pages. PixelPlayer stores session cookies to sync your library. + QQ Music + \ No newline at end of file diff --git a/app/src/main/res/values-vi/strings_equalizer.xml b/app/src/main/res/values-vi/strings_equalizer.xml new file mode 100644 index 000000000..c633b7bf6 --- /dev/null +++ b/app/src/main/res/values-vi/strings_equalizer.xml @@ -0,0 +1,57 @@ + + + + Name cannot be empty + Rename + + + Change view mode + Disable equalizer + Enable equalizer + Edit + Edit presets + Custom preset + Presets + Update + Bass Boost + Virtualizer + Loudness + Not supported + Not supported on this device + Volume + Frequency Response + Hz + Bass + Low Mids + High Mids + Treble + Bass / Low + Mid / High + Page %1$d + Reset duration + Save New + + + Saved Presets + No custom presets saved yet. + Unpin + Pin + Rename + Delete + + + Save custom preset + Enter a name for your custom equalizer preset. + Preset name + Rename preset + + + Manage presets + Drag to reorder • Tap the eye to show or hide + Reorder + Reset presets + This will restore the default preset order and visibility. Continue? + Reset to default + Visible + Hidden + diff --git a/app/src/main/res/values-vi/strings_home_screen.xml b/app/src/main/res/values-vi/strings_home_screen.xml new file mode 100644 index 000000000..2a7e3ad80 --- /dev/null +++ b/app/src/main/res/values-vi/strings_home_screen.xml @@ -0,0 +1,277 @@ + + + + β + Beta + Cloud Streaming + Changelog + Cloud Streaming + Stream music from your cloud accounts + + + Beta 0.7.5 + β + Welcome to PixelPlayer 0.7.5-beta + You\'re using a beta build that may contain bugs, crashes, or experimental features. Help us improve by reporting issues. + What to expect + Bugs, crashes, or incomplete features may occur unexpectedly. + Some features may change or be removed without notice. + Beta builds may be more unstable than release versions. + Always check for updates before reporting a known issue. + What beta builds can change, break, or improve while testing. + GitHub issue shortcut + Search first, then open a focused report for bugs, crashes, requests, or questions. + Open existing issues + Report issue or crash + Share steps to reproduce, expected results, actual results, and your device/OS details. + How to report + A quick checklist before opening a new issue. + Before opening an issue + Search existing open and closed issues to avoid duplicates. + Update to the latest PixelPlayer version and confirm the problem still happens. + Restart the app and confirm the problem persists. + Try to reproduce it and write down the exact steps. + Which issue type? + Bug report: Something behaves incorrectly. + Feature request: Add a new feature or improvement. + Question: Use Discussions if enabled, or open an issue with a question label. + Bug report + Copy these fields when something behaves incorrectly or crashes. + Bug Report + Short summary: + Expected behavior: + Current behavior: + Steps to play/reproduce: 1. 2. 3. + How often does it happen? Always / Sometimes / Rarely. + Screenshot / video: if available. + Logs / stack trace: if available. + Environment + PixelPlayer version: + Install source: GitHub Release, debug build, nightly build, etc. + Android version: + Device model: + Extra context: SD card usage, special settings, permissions, etc. + Feature request + Copy these fields when you want a new feature or improvement. + Problem statement: What problem are you trying to solve? + Proposed solution: How should it work? + Alternatives considered: Any other approaches? + Scope: Which screens or flows are affected? + Mockup or reference image if available. + Titles, privacy, and scope + Make the report easy to triage and safe to share. + Good issue titles + Equalizer: Indicator shifts when switching preset tabs + Search: History list does not appear for empty query + Feature: Add \"Recently Added\" playlist sort option + Please avoid + Generic reports like \"It doesn\'t work\". + Multiple unrelated problems in one issue. + Unredacted logs or screenshots with private data. + Privacy note + Before posting logs, screenshots, or videos, remove personal or private information. + Nightly builds + How nightlies differ from releases, and what to include when they break. + Nightly builds are generated from the latest commit and may contain unfinished changes, temporary bugs, or regressions. They are more experimental than official releases. + Access them from the repository\'s GitHub Actions workflow artifacts if available. + Reporting nightly issues + When reporting an issue from a nightly build, always mention that it happened on a nightly build, not on the official release. Include the build date, workflow run name or number, or commit SHA if possible. Also check if the same problem happens on the latest official release. + Beta 0.5.0 upgrade + Clean install recommended + If you\'re coming from beta 0.5.0, this update may need fresh library data instead of older cached state. + If metadata or library entries look wrong + Wrong song metadata, mismatched artists or albums, or duplicate-looking entries usually mean a clean install is the fix. + Don\'t show again + Got it + + + Oops! Something went wrong + The app crashed during your last session. Help us fix this by sharing the crash report. + Date: %1$s + Error: + Stack trace (preview): + Crash log + Crash log copied to clipboard + PixelPlayer crash report + Share crash report + + + DJ Mashup + + + Your\nMix + No data to show yet + Your mix will appear here when PixelPlayer finds songs or syncs a source. + Refresh + + + DAILY MIX + Based on History + Check all of Daily Mix + Daily Mix + + + Daily Mix + + %1$d song • %2$s + %1$d songs • %2$s + + Play it + AI Playlist Generator + + + How your Daily Mix is built + Your Daily Mix is built from your favorite and most-played songs. We also add tracks from artists and genres you like so you can discover new music. + Tell the AI what you want to listen to today + We use a small sample to keep costs low + Updating… + Update Daily Mix + + + Perfectly Curated + Daily Mix + Your sonic journey is ready + AI Playlist Generator + Describe the vibe, mood, or activity and let AI curate the perfect playlist from your library. + Playlist size + Min songs + Max songs + e.g. Chill evening vibes, upbeat workout energy… + Tap to Retry + Sonic journey synthesized! + Ready to Play + Generating… + Generate Playlist + + + Recently Played + + + Recently Played + Play latest + No recent plays in %1$s + Change the range or play more songs to fill this timeline. + Recently Played + Today + Yesterday + + + Listening stats + Total plays + Avg per day + Top track + %1$s • %2$d plays + + + Listening Stats + Refresh listening stats + Today + Week to Date + Month to Date + Year to Date + All Time + Listening + Plays + Listening timeline + Listening time + Total listening captured in the selected range. + Play count + How many sessions you completed per segment. + Avg. session + Average listening length for each segment. + Split into 4-hour windows to reveal your daily rhythm. + Daily bars make week-to-week habits easy to compare. + Weekly bars show how the month is trending. + Monthly bars show seasonality across the year. + Yearly bars summarize your full history. + No listening data yet + Press play to start building your listening timeline + Daily rhythm + Weekly rhythm + Monthly rhythm + Year at a glance + All-time progression + Grouped into 4-hour segments + Grouped by day of week + Grouped by week of month + Grouped by month + Grouped by year + Peak segment + %1$d plays + + Top categories + Compare how you listen across genres, artists, albums, and songs. + Genre + Artist + Album + Song + Listening by genre + Listening by artist + Listening by album + Listening by song + %1$d plays • %2$d artists + %1$d plays • %2$d tracks + No category data yet + Press play to surface your listening highlights + Listening habits + No habits yet + We will surface your listening habits once we know you better. + Total sessions + Avg session + Longest session + Sessions/day + Most active day + No playback yet + Peak timeline slot + Top artists + No top artists + Keep listening and your favorite artists will show up here. + \? + %1$d. %2$s + Top albums + No top albums + Albums you revisit often will appear here. + %1$d. %2$s + Track concentration + How your listening time is distributed across your top tracks. + No concentration data yet + Play more tracks to see how focused your listening is. + Top 1 + Top 2-3 + Others + %1$d%% + Listening concentration + Top 3 tracks account for %1$d%% of your listening time. + Avg plays/track + Unique tracks + Top 3 share + Tracks in this range + Most played tracks for the selected time range. + No top tracks + Listen to your favorites to see them highlighted here. + Collapse tracks + Show all tracks + + + %1$d h %2$02d min + %1$d min + %1$d h %2$02d m + %1$d h + %1$d m + %1$d s + %1$dh %2$02dm + %1$dh + %1$dm + %1$ds + Never + Just now + 1 day ago + %1$d days ago + 1 hour ago + %1$d hours ago + 1 minute ago + %1$d minutes ago + %1$d Song + %1$d Songs + Week %1$d + diff --git a/app/src/main/res/values-vi/strings_library.xml b/app/src/main/res/values-vi/strings_library.xml new file mode 100644 index 000000000..8b7c6c2c6 --- /dev/null +++ b/app/src/main/res/values-vi/strings_library.xml @@ -0,0 +1,566 @@ + + + + Library + Library tabs + Jump directly to any tab or reorder them. + Reorder tabs + + + Songs + Albums + Artists + Playlists + Folders + Liked + + + Playlist created successfully + Set your AI provider API key first + Set your Gemini API key first + Added to queue + Playing next + + + Watch transfer + Settings + Edit + Reorder tabs + Expand menu + + + You can select up to %1$d albums + Folder + Folder + + + Sort by + View + Playlist View + Grid + List + Internal + SD Card + SD card is not available right now. + Cloud + Telegram Cloud Channels + Topics Display + Channels + Topics + Both + Cloud + Cloud Only + + + Generating metadata with AI… + + + Error loading songs + Error loading albums + Error loading artists + Retry + + + No songs found in your library. + Try rescanning your library in settings if you have music on your device. + No songs found + + + New + Create new playlist + Import M3U playlist + Locate current song + All songs + CLOUD + LOCAL + Sort options + + + All + Deselect + More options + + + Scanning music files… + Processing files… + %1$d of %2$d files + Syncing library… + Sync complete + Waiting… + Syncing library… + Cleaning album art cache… + Syncing cloud sources… + Scanning lyrics… + + + No songs yet + Add music to your device or sync a cloud source to start listening. + No local songs found + Try another source filter or rescan your device library. + No cloud songs found + Sync Telegram or NetEase songs, or switch to local source. + No albums available + Albums will appear here as soon as your library has grouped tracks. + No local albums found + Local songs are required to build local album groups. + No cloud albums found + Cloud songs with album data will appear here after sync. + No artists available + Artists are shown after songs are indexed from any source. + No local artists found + No artist metadata is available for local songs right now. + No cloud artists found + Cloud artist entries appear when remote songs are synced. + No liked songs yet + Tap the heart icon while playing a song to save it here. + No liked local songs + Switch source filter or like songs from your device. + No liked cloud songs + Like Telegram or NetEase tracks to see them in this view. + No folders found + Internal storage folders with music will appear here. + No playlists yet + Create your first playlist to organize your library. + + + Edit song metadata + Play + Play song + Play all + Play all + Add to favorites + Add all to favorites + Remove from favorites + Remove all from favorites + Share song file via + Share song file + Share all as ZIP + Could not share song: %1$s + Add to queue + Add to queue + Next + Play next in queue + Add to playlist + Delete + Delete all + Checking watch + Transferring %1$d%% + Transferring to watch + Transfer in progress + Send to watch + Watch unavailable + Send song to watch + Watch unavailable + Set as + Set as sound + Choose how to use this song as a system sound + Use this song as + Choose where PixelPlayer should install this sound. + Phone ringtone + Incoming calls + Notification sound + Messages and app alerts + Alarm sound + Clock alarms + Confirm sound change + Set \"%1$s\" as your %2$s? + Set sound + Set \"%1$s\" as your %2$s + ringtone + notification sound + alarm sound + Enable Modify system settings, then return to PixelPlayer to finish automatically. + Modify system settings was not enabled. + Set \"%1$s\" as your ringtone + Only local songs can be used as ringtones. + Couldn\'t prepare this audio file for ringtone. + Couldn\'t set ringtone: %1$s + Options + OPTIONS + Info + INFO + Duration + Genre + Album + Artist + Song info + Provider + File + %1$d SONGS + selected + %1$d PLAYLISTS + %1$d ALBUMS + selected + Limit: %1$d albums per selection. + Queue + play respects your selection order. + %1$d GENRES + selected + Perform batch operations on all songs within these genres. + + + Default Order + Title (A-Z) + Title (Z-A) + Artist + Artist (Z-A) + Album + Album (Z-A) + Date Added + Date Added (Oldest First) + Duration + Duration (Shortest First) + Release Year + Release Year (Oldest First) + Fewest Songs + Most Songs + Name (A-Z) + Name (Z-A) + Number of Songs (Most) + Number of Songs (Fewest) + Date Created + Date Created (Oldest First) + Date Liked + Date Liked (Oldest First) + Fewest Subfolders + Most Subfolders + + + Title + Artist + Album + Date Added + Duration + Release Year + Song Count + Name + Number of Songs + Date Created + Date Liked + Subfolder Count + + + Source + Order + Descending + Ascending + Original Order + Tap to switch to ascending + Tap to switch to descending + This sort keeps its original order + Switch is on + + + Reorder library tabs + Reset order + Reset tab order to the default? + Reordering tabs… + Drag handle + + + Pick an Artist + 1 artist + %1$d artists + Primary artist + Artist page + + + Cancel transfer + %1$s / %2$s + Shows live progress for phone-to-watch music transfers + Watch transfers + Sending to Watch + Cancelled + Transfer cancelled + Transfer complete + Completed + Failed + Transfer failed + Multiple active transfers + %1$s • %2$s + Preparing + Preparing watch transfer + Preparing transfer… + Sending %1$d songs to watch + Sending to watch + Starting transfer… + Starting + Transferring + %1$d transfers + + + Edit song + Show information + Editing song metadata + Editing a song\'s metadata can affect how it\'s displayed and organized in your library. Changes are permanent and may not be reversible. + Got it + Information + Cover art + Select a square image and fine-tune it so your cover art looks great across the app. + Change cover art + Delete cover art + Title + Artist + Album + Album artist + Genre + Composer + Track number + Disc number + ReplayGain track (dB) + ReplayGain album (dB) + -6.50 + -8.20 + Preview of the new cover art + Current song cover art + Adjust your cover art + Use pinch and drag gestures to find the perfect framing. + Apply cover art + Unable to load the selected image + Search lyrics on lrclib.net + + + Edit %d Songs + Only modified fields will be updated. Leave fields empty to keep existing values. + (Mixed values) + (Optional - leave empty to skip) + Successfully updated %d songs + Updated %1$d of %2$d songs. Some files could not be edited. + Failed to update songs + Batch Cover Art + This will replace the cover art for all %d selected songs + Set Cover Art for All + Remove All Cover Art + (Multiple different covers) + + + Playlist dismissed + + + Create playlist + Choose the creation flow. + Manual + Design artwork, icon, shape and pick songs yourself. + With AI + Generate a curated playlist with advanced controls. + Requires a Gemini API key configured in settings. + Set up API key + + + AI Playlist Lab + Reset + Generating… + Generate + Intent + Playlist name (optional) + What should this playlist feel like? + Example: sunset drive with warm synths + Direction + Mood + Activity + Era + Curation engine + Energy + Controls the intensity and tempo of songs. 1 = calm/slow, 5 = high-energy/fast. + Discovery + Controls how familiar the selections are. 1 = your most played favorites, 5 = rarely played deep cuts. + Min songs + Max songs + Filters + Prioritize genres (optional) + e.g. synthwave, indie pop + Avoid genres (optional) + e.g. metal, hard trap + Preferred language (optional) + e.g. English, Spanish, instrumental + Prioritize favorites + Avoid explicit lyrics + Prompt preview + Your final prompt will appear here once you add preferences. + Curate with precision + Define mood, activity, constraints and depth. + The AI will only use songs from your local library. + Add at least one instruction for AI. + Set a valid song range. + %1$d/5 + Custom… + Enter custom value + Enter your custom value + + + Any era + Core request: %1$s. + Mood target: %1$s. + Activity context: %1$s. + Era focus: %1$s. + Prioritize genres: %1$s. + Avoid genres: %1$s. + Preferred language: %1$s. + Energy level target: %1$d/5. + Discovery target: %1$d/5 where 1 is familiar and 5 is deep cuts. + Prioritize songs closer to listener favorites when possible. + Avoid explicit lyrics whenever alternatives exist. + Keep transitions smooth and avoid repetitive artist clustering. + + Chill + Energetic + Happy + Dark + Romantic + Melancholic + + + Workout + Focus + Road trip + Party + Study + Late night + + + @string/playlist_creation_ai_era_any + 70s + 80s + 90s + 2000s + 2010s + 2020s + + + + No playlist has been created. + Touch the \'New Playlist\' button to start. + New playlist + Playlist name + My playlist + + + Add %1$d songs to… + Select playlists + Search for playlists… + Songs added to playlists + Playlist created and songs added + Internal Storage + + + Add songs + Add selected songs + Add + Search or filter songs… + Liked + Failed to load songs + Load more + + + Merge Playlists + Enter a name for the merged playlist: + Merged Playlist + This will merge %1$d selected playlists into one. + + + No valid songs found to play + Song not found in current list + Could not locate song + No songs found in library + Playback stopped: %1$s finished (End of Track). + Track + No songs to shuffle. + Selected Albums + No playable songs found in selected albums + No playable songs found in selected genres + Only the first %1$d albums were queued + %1$d albums queued (%2$d songs) + Could not queue selected albums + All songs already in favorites + No songs were in favorites + Creating ZIP file… + Failed to share: %1$s + + %d song added to queue + %d songs added to queue + + + %d song will play next + %d songs will play next + + + %d song added to favorites + %d songs added to favorites + + + %d song removed from favorites + %d songs removed from favorites + + + + No playlists to share + Share playlists + Share failed: %1$s + No playlists to export + Export failed: %1$s + Music/PixelPlayer Exports + Please configure your Gemini API key in Settings. + Playlist restored + + Sharing %d playlist + Sharing %d playlists + + + Exported %1$d playlist to %2$s + Exported %1$d playlists to %2$s + + + + Invalid album ID + Album ID not found + Error loading album data: %s + Album not found + + + Invalid artist ID + Artist ID not found + Error loading artist data: %s + Could not find the artist + + + Cannot delete currently playing song + %1$d files deleted (%2$d skipped - playing) + %1$d of %2$d files deleted + Failed to delete files + File deleted + Can\'t delete the file or file not found + Deletion cancelled + Delete song? + \"%1$s\" by %2$s\n\nThis song will be permanently deleted from your device and cannot be recovered. + These songs will be permanently deleted from your device and cannot be recovered. + + %d file deleted + %d files deleted + + + Delete %d song? + Delete %d songs? + + + + Metadata updated successfully + Updating %1$d songs… + Successfully updated %1$d songs! + Updated %1$d songs. Failed: %2$d + Lyrics saved successfully + Failed to save lyrics + No lyrics available to save + Permission denied – cannot edit files + Permission denied – cannot save lyrics + Permission denied – cannot edit this file + + + Please configure a valid API key for the selected AI provider in Settings. + AI Error: %s + The selected AI provider rejected the request because the account has no credits or available quota. + The selected AI model is no longer available. PixelPlayer tried to switch to a supported model automatically. + AI couldn\'t find any songs for your prompt. + Write an idea for your Daily Mix + Daily Mix updated with AI + Could not update: %s + AI couldn\'t find songs for this mix + \ No newline at end of file diff --git a/app/src/main/res/values-vi/strings_player.xml b/app/src/main/res/values-vi/strings_player.xml new file mode 100644 index 000000000..e5a3b7677 --- /dev/null +++ b/app/src/main/res/values-vi/strings_player.xml @@ -0,0 +1,198 @@ + + + + Collapse player + Now Playing + Cloud stream + Cast + Bluetooth + Local playback + Connecting… + Open Queue + + + Get ready to connect + Allow PixelPlayer to see your nearby devices and current Wi‑Fi so we can keep your cast, Bluetooth audio, and speakers in sync. + Nearby devices + Needed to read and control your connected Bluetooth audio gear. + Location for Wi‑Fi + Android requires Location to share the Wi‑Fi network (SSID) you\'re on so we can find compatible cast devices. + Allow access + We only use these permissions for device interconnectivity — casting, controlling nearby speakers, and keeping audio in sync. + Connect device + Scanning nearby + Casting session + Connecting + Connected + This phone + Bluetooth audio + Local playback + Playing + Paused + Device volume + Phone volume + %1$d/%2$d + Battery level + Volume level + Disconnect + Connectivity + Turn on Wi-Fi or Bluetooth + Refresh connections + Wi-Fi + Off + On + Connected + Bluetooth + Off + On + Connected + Nearby devices + Refresh devices + Connected + Connecting + Available to connect + Available + Connecting... + Searching for devices… + Make sure your TV or speaker is on and sharing the same Wi‑Fi network. + Controls + Devices + + + Cast media server + Casting to device + Serving media to Cast device + %1$s: %2$s + Seeking is temporarily unavailable for this audio format on Cast because it can crash the Cast session. + + + Sleep timer + Timer + %1$d minutes + Timer set for %1$d minutes. + 1 time + + %d time + %d times + + Play count: %1$s + End of current track + Playback will stop at end of track. + Switch on + Custom time + Cancel timer + End of track + Timer cancelled. + Cannot enable end of track: no active song. + End of track timer deactivated: song changed from %1$s to %2$s. + Previous track + Current track + Set custom duration + + + Next up + Queue is empty for now. + + 1 track lined up. + %d tracks lined up. + + Queue + Queue is empty. + Reorder song + Toggle shuffle + Toggle repeat + Sleep timer + More actions + Locate current song + Clear queue + Clear queue + Are you sure you want to clear all songs from the queue except the current one? + Save as playlist + %1$s queue + Current queue + Dismiss song + removed + Save as playlist + Deselect all + Playlist name + Search songs to include… + No songs match \"%1$s\" + + %d song selected + %d songs selected + + Save as: %1$s + Enter a playlist name + Remove from playlist + More options for %1$s + + + Lyrics + Loading lyrics… + Synced + Static + Lyrics options + −.5 + −.1 + +.1 + +.5 + 0s + %1$+.1fs + + + Failed to search for lyrics + Failed to fetch lyrics from remote + Connection timed out. Please check your internet connection. + Network error. Please check your internet connection. + Server error (code %d). Please try again later. + + + Lyrics already available. Online fetch skipped. + Embedded lyrics already found. Online fetch skipped. + Local (.lrc) lyrics already found. Online fetch skipped. + + + Save Lyrics + Translate via AI + These lyrics already have a translation + These lyrics are already in this language + API is not configured + Lyrics translated successfully! + Translating lyrics... + Reset imported lyrics + Reset lyrics? + Are you sure you want to reset the lyrics for this song? + Appearance + Alignment + Align lyrics left + Align lyrics center + Align lyrics right + Controls + Adjust sync + Hide sync controls + Show romanization + Show translations + Disable immersive (once) + Keep screen on + + + Save Lyrics + Choose which version to save: + Synced (with timestamps) + Plain (text only) + + + Would you like to search for lyrics online? + Show lyric options + Always open the picker instead of auto-applying the first match + Searching for lyrics… + Lyrics not found + We couldn\'t find lyrics automatically. You can edit the title or artist and try searching manually. + Song Title + Artist (optional) + Found %d match(es) + SYNCED + %1$s • %2$s + Lyrics provided by + https://lrclib.net/ + diff --git a/app/src/main/res/values-vi/strings_screens.xml b/app/src/main/res/values-vi/strings_screens.xml new file mode 100644 index 000000000..90ec1b118 --- /dev/null +++ b/app/src/main/res/values-vi/strings_screens.xml @@ -0,0 +1,244 @@ + + + + Error: Genre ID missing + + + Let\'s Go! + Step %1$d of %2$d + Please grant the required permission first. + Please grant all required permissions. + Welcome to + β + Beta + Let\'s get everything set up for you. + Media Permission + PixelPlayer needs access to your audio files to build your music library. + Permission Granted + Grant Media Permission + Notifications + Enable notifications to control your music from the lock screen and notification shade. + Enable Notifications + Do you have a backup? + If you already have a PixelPlayer backup, restore it now and skip most of the remaining setup on this device. + Import backup + Inspecting backup + Checking backup package… + Restoring backup + Skip / Not now + Restore Backup + Review what you want to import before finishing setup. + %1$d of %2$d modules selected + Created %1$s + Backup from %1$s + Unknown version + Restore selected + Restoring + Excluded folders + All folders are scanned by default. Pick any locations you want to ignore when building your library. + Choose folders to ignore + Grant storage permissions first + App Theme + Pick the look you want before you start exploring your library. + Dark + The default Material 3 dark look for PixelPlayer. + Light + A brighter Material 3 look across the app. + Follow system + Match your phone\'s current appearance setting. + Recommended + You can change this later in Settings > Appearance > App Theme. + Library Layout + Choose your preferred way to navigate your library. + Songs + Compact Mode + Using minimal pill navigation + Using standard tab row + SONGS + ALBUMS + ARTISTS + You can change this later in Settings > Appearance > Library Navigation. + App Navigation + Choose the style of the bottom navigation bar. + Default Style + Floating pill with rounded corners + Standard full-width bar + Customize Corner Radius + You can change this later in Settings > Appearance > Navbar Style. + Alarms & Reminders + Optional, but recommended if you use Sleep Timer and want PixelPlayer to stop playback exactly on time. + Grant Permission + Battery Optimization + Some Android devices aggressively kill background apps. Disable battery optimization for PixelPlayer to prevent unexpected playback interruptions. + Disable Optimization + All Set! + You\'re ready to enjoy your music. + + + Search… + Search + Clear search + Recent searches + Clear all + History + Delete search history item + No results + No results for \"%1$s\" + Nothing found + Try a different search term or check your filters. + No results found. + Browse by genre + No genres available. + + + Play %1$s + Collapse %1$s + Expand %1$s + Edit artist image + Change photo + Reset to default + Shuffle play artist + + + Disc %d + Cover of %1$s + %1$s · %2$s + + + Playlist not found. + This playlist is empty. + Tap on \'Add Songs\' to begin. + This folder doesn\'t contain songs. + Sort Songs + More Options + Playlist options + Edit playlist + Delete playlist + Delete playlist? + Are you sure you want to delete this playlist? + Set default transition + Export Playlist + %1$s • %2$s + Play it + Add + Add songs + Remove + Remove songs + Reorder + Reorder songs + + + Global transitions + Playlist rules + This configuration applies to all playback sources unless overridden. + Configure default behavior for this specific playlist. + Active Status + Global Default + Playlist Default + Following Global + Custom Override + Custom Override + Enable to set specific rules for this playlist. + Using global defaults + Changes saved successfully + Transition Style + How tracks blend together + None + Crossfade + Transition Duration + %1$ds total overlap + Reset Transition + Current Song + Next Song + Tracks will overlap for %1$ds + Volume Curves + Fine tune the audio slope + Fade Out + Fade In + + + New smart playlist + New playlist + Add Songs + Back or Cancel + Next + Create + Edit Playlist + Auto-generated collage + Add Photo + Pick Image + Change + Remove + Playlist Name + My awesome mix + Edit Cover + Adjust your cover art + Use pinch and drag gestures to find the perfect framing + Manual + Smart + Generate with AI + Smart Rule + Default + Image + Icon + Background Color + Icon Symbol + Shape Style + Shape parameters + Corner Radius + Smoothness + Sides + Curve + Rotation + Scale + Top Played + Your most played tracks. + Recently Played + Songs you listened to most recently. + Forgotten Favorites + Favorite tracks you haven\'t played in a while. + New Gems + Recently added tracks with low play counts. + + + Quick Fill Genre + Sort & Play + Shuffle + Sort By + Artist + Album + Title + Generic artist + %1$s Shuffle + + + Select Songs + Choose Genre + Search songs + New Genre + Add Custom + Add Custom Genre + Genre Name + Select Icon + Genre: %1$s + Select a genre + Quick Fill + + + DJ Space + Loading… + Deck %1$d + Load song + No song loaded + + Stem separation is not available yet. + Volume + Speed + Crossfader + Deck 1 + Deck 2 + Select a song + Play/Pause + Song cover + x%1$.2f + diff --git a/app/src/main/res/values-vi/strings_settings.xml b/app/src/main/res/values-vi/strings_settings.xml new file mode 100644 index 000000000..b7f5cc4f5 --- /dev/null +++ b/app/src/main/res/values-vi/strings_settings.xml @@ -0,0 +1,654 @@ + + + + Music Management + Manage folders, refresh library, parsing options + Appearance + Themes, layout, and visual styles + Lyrics + Source priority, immersive lyrics, and import management + Playback + Audio behavior, crossfade, and background play + Behavior + Gestures, haptics, and navigation behavior + AI Integration (β) + AI providers, API keys, and model settings + Backup & Restore + Export and recover your personal app data + Developer Options + Experimental features and debugging + Equalizer + Adjust audio frequencies and presets + Device Capabilities + Audio specs, codecs, and decoder info + Accounts + Manage Telegram, Google Drive, NetEase, and more services + About + App info, version, and credits + + + On + Off + Enabled + Disabled + Open + Select all + Clear selection + Close notice + + + Library Structure + Excluded Directories + Folders here will be skipped when scanning your library. + Artists + Multi-artist parsing and organization options. + Filtering + Minimum Song Duration + Minimum Tracks per Album + Album Art Cache Limit + Sync and Scanning + Refresh Library + Scan entire library for new and modified files. + Full Rescan + Running full rescan + Full rescan started… + Library sync finished + Rebuild Database + Rebuild database? + This will completely rebuild your music library from scratch. All imported lyrics, favorites, and custom metadata will be lost. This action cannot be undone. + Rebuild + Rebuilding database + Rebuilding database… + Auto-scan .lrc files + Automatically scan and assign .lrc files in the same folder during library sync. + Lyrics Management + Lyrics Source Priority + Choose which source to try first when fetching lyrics. + Embedded First + Online First + Local (.lrc) First + Reset Imported Lyrics + Remove all imported lyrics from the database. + Reset imported lyrics? + This action cannot be undone. + + + Refresh + Everything is allowed by default. Tap a folder to mark it as excluded from scans. + No subfolders here + Navigate up + Go to root + + + Rescan Required + Artist settings have changed. Rescan your library to apply. + Rescan + Scanning… + Multi-Artist Parsing + Character Delimiters + Current: %1$s + Word Delimiters + None + Current: %1$s + Configure + Extract Artists from Title + Detect feat., ft., with in song titles + Library Organization + Group by Album Artist + Show collaboration albums under main artist + About Multi-Artist Parsing + + PixelPlayer splits artist tags using character delimiters (/, ;, &) and word delimiters (feat., ft., vs., x). Word delimiters are matched case-insensitively. + \"Extract Artists from Title\" detects patterns like (feat. Artist) in song titles. + Backslash (\) can be used to escape character delimiters. + + Examples + \u2192 + \u266A + \"Artist1/Artist2\" + Artist1, Artist2 + \"Drake feat. Rihanna\" + Drake, Rihanna + \"Marshmello x Bastille\" + Marshmello, Bastille + \"Song (ft. B)\" by A + A, B + \"AC\\DC\" + AC/DC (escaped) + + + Delimiters + Current Delimiters + Tap a delimiter to remove it. At least one delimiter is required. + Add New Delimiter + e.g., / or ; + Add delimiter + Default Delimiters + Reset Delimiters? + This will clear all your custom delimiters and restore the defaults. This action cannot be undone. + Delimiters reset to defaults + At least one delimiter is required + Delimiter added + Delimiter already exists or is invalid + Space + + + Word Delimiters + Current Word Delimiters + These keywords split artist names when surrounded by spaces. Matched case-insensitively. Tap to remove. + No word delimiters configured + Add New Word Delimiter + e.g., feat. or ft. + Add word delimiter + How Word Delimiters Work + Word delimiters are matched case-insensitively with spaces around them.\n\nSingle-character delimiters (like \"x\") require spaces on both sides to avoid false matches.\n\nExamples:\n \"Drake feat. Rihanna\" -> Drake, Rihanna\n \"Marshmello x Bastille\" -> Marshmello, Bastille\n \"A vs. B\" -> A, B + Reset Word Delimiters? + This will clear all your custom word delimiters and restore the default keywords. This action cannot be undone. + Word delimiter added + Already exists or is invalid + Word delimiters reset to defaults + + + Preparing sync + Reading MediaStore + Processing tracks + Saving to database + Scanning lyrics files + Cleaning album art cache + Syncing cloud sources + Completing sync + %1$s • %2$d%% (%3$d/%4$d) + %1$s… + + + Global Theme + App Language + Choose the language used across the app interface. + System default + English + Español + Deutsch + Français + Русский + 简体中文 + Bahasa Indonesia + Italiano + 日本語 + Korean + Norwegian (Bokmål) + 繁體中文 + Türkçe + Tiếng Việt + App Theme + Switch between light, dark, or follow system appearance. + Light Theme + Dark Theme + Follow System + Use Smooth Corners + Use complex shaped corners effectively improving aesthetics but may affect performance on low-end devices + Disable Blur Effects + Turn off blur effects across the app to save battery and resources. + Show Scrollbar + Display lateral scrollbar on music lists for quick scrolling + Now Playing + Player Theme + Choose the appearance for the floating player. + Album Art + System Dynamic + Show player file info + Show codec, bitrate, and sample rate in the player progress section. + Album Art Palette Style + Current: %1$s. Open live preview and choose style. + Carousel Style + Choose the appearance for the album carousel. + No Peek + One Peek + Home Collage + Collage Pattern + Choose the shape arrangement for the Your Mix collage. + Auto-Rotate Patterns + Cycle through collage patterns each time you visit Home. + Navigation Bar + NavBar Style + Choose the appearance for the navigation bar. + Default + Full Width + Compact mode + Show only icons and reduce the navbar height. + NavBar Corner Radius + Adjust the corner radius of the navigation bar. + Lyrics Screen + Immersive Lyrics + Auto-hide controls and enlarge text. + Auto-hide Delay + Time before controls hide. + 3s + 4s + 5s + 6s + App Navigation + Default Tab + Choose the Default launch tab. + Home + Search + Library + Library Navigation + Choose how to move between Library tabs. + Tab row (default) + Compact pill & grid + + + Colors + Palette style + Choose the album colors for the player UI. + Tonal Spot + Balanced and calm. + Vibrant + High saturation accents. + Expressive + Bold hue shifts and contrast. + Fruit Salad + Playful rotated accents. + Color accuracy + 0 keeps the current tuning. Higher values stay closer to the album art\'s dominant hue. + Current + More accurate + 0 • Current + %1$d • Subtle + %1$d • Balanced + %1$d • Precise + + + Adjust Corner Radius + Match the navbar shape\'s corners with your device\'s physical corners for a seamless look. + Corner Radius + %1$d dp + + + Background Playback + Keep playing after closing + If off, removing the app from recents will stop playback. + Battery Optimization + Disable battery optimization to prevent playback interruptions. + Battery optimization is already disabled + Could not open battery settings + Volume Normalization (ReplayGain) + Enable ReplayGain + Normalize volume levels using ReplayGain metadata from audio files. + Gain Mode + Track: normalize each song. Album: normalize per album. + Track + Album + Cast + Auto-play on cast connect/disconnect + Start playing immediately after switching cast connections. + Headphones + Resume when headphones reconnect + If playback paused because headphones were removed, resume automatically when they connect again. + Queue and Transitions + Crossfade + Enable smooth transition between songs. + Crossfade Duration + Hi-Fi Mode + Float 32-bit audio output. Disable if playback stutters on your device. + Not supported on this device (PCM_FLOAT AudioTrack unavailable). + Persistent Shuffle + Remember shuffle setting even after closing the app. + Show queue history + Show previously played songs in the queue. + + + Folders + Back gesture controls folders + In Folders tab, system back navigates folder stack before leaving Library. + Player Gestures + Tap background closes player + Tap the blurred background to close the player sheet. + Haptics + Haptic feedback + Enable vibration feedback across the app. + + + AI Provider + Provider + Choose your AI provider + Safe Token Mode + ON — Fast & cheap. Sends minimal data (~1K tokens) to AI. + OFF — Deep context. Sends full listening profile (~8K tokens) for richer results. + Credentials + %1$s API Key + Get from %1$s + Google AI Studio (aistudio.google.com) + DeepSeek Platform (api.deepseek.com) + Groq Console (console.groq.com) + Mistral AI Platform (console.mistral.ai) + NVIDIA Build (build.nvidia.com) + Moonshot AI Platform (platform.moonshot.cn) + Zhipu AI Open Platform (bigmodel.cn) + OpenAI Platform (platform.openai.com) + Model Selection + Loading available models… + Failed to load models + AI Model + Select a model. + Enter API Key + Prompt Behavior + System Prompt + Customize how the AI behaves. + Preset Prompts + Enter system prompt… + Professional Curator + You are \'Vibe-Engine\', a world-class music curator and master of sonic flow. Your goal is to construct seamless, high-fidelity listening experiences. Prioritize harmonic compatibility, logical BPM transitions, and a sophisticated balance between familiar favorites and tasteful, logic-driven discovery. + Creative Maverick + You are an avant-garde music explorer specializing in \'unexpected cohesion\'. Your mission is to break conventional genre boundaries by identifying non-obvious sonic parallels. Prioritize rare deep cuts, experimental textures, and artistic novelty while maintaining a surprising but undeniable transition logic. + Strict Librarian + You are a surgical music database architect. Your logic is driven by absolute metadata precision and rigid categorical adherence. Minimize algorithmic discovery in favor of strict genre consistency, energy-level matching, and maximizing the retrieval of highly specific user-defined preferences. + Atmospheric Guide + You are a master of ambient textures and low-energy flow. Focus exclusively on tracks that facilitate a \'deep focus\' or \'tranquility\' state. Prioritize acoustic warmth, minimalist arrangements, and gentle transitions, while strictly avoiding high-transient sounds or sudden shifts in dynamic range. + Sonic Enthusiast + You are an audiophile analyst focused on production complexity and instrumentation. Prioritize tracks characterized by high dynamic range, intricate polyrhythms, and superior soundstage quality. Favor active-listening pieces that reward the listener for paying attention to technical fidelity and arrangement detail. + Energy Catalyst + You are a high-momentum rhythm generator. Your philosophy centers on driving basslines, percussive intensity, and infectious grooves. Prioritize high-BPM club compatibility, syncopated energy, and continuous rhythmic tension to keep the listener\'s heart rate and motivation peak-level. + AI Usage Report + Total Consumption + %1$s tokens tracking\nPrompt: %2$s | Output: %3$s | Thought: %4$s + Clear Logs + AI Activity Log (%1$d) + %1$s · %2$s + Show + Hide + + + How backup works + Choose sections, export a .pxpl file, and import it later. Restore only replaces the sections you select. + Create Backup + Export Backup + No sections selected. + All sections selected. + Selected %1$d of %2$d sections. + %1$s Creates a .pxpl backup file. + Select & Export + Restore Backup + Import Backup + Select & Restore + Browse or pick from recent backups. Selected data will replace current data. + + + Choose exactly what you want to include in the backup package. + Select a .pxpl backup file to inspect. You\'ll choose which sections to restore in the next step. + %1$d of %2$d sections selected + %1$d of %2$d modules selected + Recent Backups + No recent backups + Previously imported backups will appear here. + %1$d entries · Will replace current data + Export .pxpl + Restore Selected + Transfer in progress… + PixelPlayer_Backup_%1$d.pxpl + Creating Backup + Restoring Backup + %1$d%% + %1$s • %2$s + Exporting + Importing + Restoring + Remove from history + Inspecting… + Browse for file + Step %1$d of %2$d + Restore Modules + Backup Details + Created + App Version + Schema + Device + Unknown + · %1$s + %1$d modules · v%2$s · schema v%3$d + \? + Select all + Clear selection + + + Invalid backup: %1$s + Preparing restore + Starting restore task. + Preparing backup + Starting backup task. + Backup restored successfully + Restore completed with some unresolved issues. + Restore could not be completed: %1$s + Restore failed: %1$s + Data exported successfully + Export failed: %1$s + Data restored successfully + Restore completed with unresolved issues. Failed: %1$s + v%1$d + %1$s %2$s + + + Experiments + Experimental + Player UI loading experiments and toggles. + Test Setup Flow + Launch the onboarding setup screen for testing. + Maintenance + Force Daily Mix Regeneration + Re-creates the daily mix playlist immediately. + Regenerate Daily Mix + Regenerate Daily Mix? + This will discard the current mix and generate a new one based on recent listening habits. + Daily Mix regeneration started + Force Stats Regeneration + Clears cache and recalculates playback statistics. + Regenerate + Working… + Regenerate Stats + Regenerate Stats? + This will clear the statistics cache and force a recalculation from the database history. + Stats regeneration started + Force Album Palette Regeneration + Rebuild all cached palette variants for every album art, or pick a single one to refresh. + Regenerate All + Regenerate all album palettes? + This will clear cached theme data and rebuild all palette styles for %1$d unique album arts. + Regenerating… + Regenerating album palettes… + Rebuilding cached palette variants for %1$d unique album arts. This can take a while on large libraries. + %1$d of %2$d completed + Regenerated %1$d album art palettes + Regenerated %1$d of %2$d album art palettes + Choose Song + Select a song to clear cached theme data and regenerate all palette styles from the album art. + Search by title, artist, or album + No songs match your search. + No songs with album art were found. + Regenerating palette… + Palette regenerated for %1$s + Could not regenerate palette for %1$s + Diagnostics + Trigger Test Crash + Simulate a crash to test the crash reporting system. + Test crash triggered from Developer Options - This is intentional for testing the crash reporting system + + + Experimental + PlayerUI loading tweaks + Animated Lyrics (High-end devices) + Uses spring animations and visual effects for lyrics. May cause frame drops on low-end devices. + Lyric Blur Effect + Applies a depth-of-field blur to inactive lyrics. + Blur Strength + Adjust the intensity of the blur effect. + %1$.1fx + Step 1 · Choose what to delay + Delay everything + Hold the full player content until the sheet background is fully expanded. + Album carousel + Delay album art and carousel until the sheet is expanded. + Song metadata + Delay title, artist, and lyrics/queue actions. + Progress bar + Delay the timeline and time labels until expansion completes. + Playback controls + Delay play/pause, seek, and favorite controls. + All delayed components are active. Disable \"Delay everything\" to customize each part. + Step 2 · Configure placeholder behavior + Use placeholders for delayed items + Keep layout stable by rendering lightweight placeholders while components wait for expansion. + Step 3 · Choose when placeholders switch to real content + Select one mode. Threshold mode uses sliders; Drag release mode waits until you release the sheet gesture. + Enable at least one delayed component to unlock trigger mode. + Threshold + Uses expansion percentage. + Drag release + Switches only after gesture release. + Expand threshold + How expanded the sheet must be before delayed components become visible. + Content appears at %1$d%% expansion + Also apply on player close + Use close threshold to switch back to placeholders while collapsing. + Close threshold + How much collapse is required before placeholders take over again. + Placeholders appear after %1$d%% collapse + Drag release mode bypasses thresholds and close behavior. The swap happens only when the sheet drag gesture ends. + Make placeholders transparent + Placeholders keep their layout space but become invisible. + Visual Quality + Album Art Resolution + Low (256px) - Better performance + Medium (512px) - Balanced + High (800px) - Best quality + Original - Maximum quality + + + Playback needs review + Ready for playback + -- + Formats + HW decoders + Local songs + Local Music Storage + Music size + %1$d local songs + Available + %1$s total + Music footprint + Device used + %1$d%% + <1% + %1$d cloud songs + %1$d files not readable + Playback Path + Yes + No + Sample Rate + %1$d Hz + %1$d frames per buffer + Hi-Fi PCM Float + 32-bit float output path + Low Latency Support + Pro Audio Support + Memory + available of %1$s + Offload-ready formats + No compressed format reported hardware offload support. + +%1$d more + Detected outputs + Built-in output + Bluetooth audio + USB audio + Wired audio + Digital output + Other output + No output routes were reported by Android. + ExoPlayer Engine + %1$s renderers + Format Compatibility + %1$d supported tracks + %1$d unknown format + No decoder reported + Hardware decoder + Software decoder + Offload + %1$d in library + Compatibility Findings + No major incompatibilities + Your indexed tracks match the decoders Android reports on this device. + %1$d tracks may not decode natively + Formats to review: %1$s. + %1$d local tracks may be resampled + The library reaches %1$d Hz, above the current output sample rate. + %1$d tracks have unknown metadata + A full library rescan can fill missing MIME, bitrate, and sample-rate data. + Device Info + Manufacturer + Model + Brand + Device + Android Version + SDK Version + Hardware + Performance report + Generate a shareable diagnostic report to help us classify playback or scan lag. It contains only device, library, and timing data — no file paths, titles, or artists. + Generate report + Regenerate + Copy + Share + Report copied to clipboard + PixelPlayer performance report + Advanced performance diagnostics + Off by default. Records a short lag timeline for beta troubleshooting. + Active until %1$s + Mark lag now + Lag moment marked + + + Connected Accounts + Manage linked providers and keep each integration under your control. + Linked Services + Active + Available + Soon + Connected + Coming soon + Open Service + Logging out… + No linked accounts yet + Connect a provider to manage it from this screen. + Connect %1$s + %1$s (Coming soon) + Google Drive is coming soon. + Unable to open this screen right now. + + + About + PixelPlayer + Open source music player built with its community. + Version v%1$s + Open source + Community-first + Material 3 expressive + No contributors found right now. Please try again later. + Maintainer + The person behind PixelPlayer. + Community spotlight + Recognition for collaborators with major impact. + Open source contributors + Live contributor list from GitHub. + %1$d contrib. + GitHub + Repository + Telegram + Support + Open GitHub repository + Join Telegram community + Open GitHub profile + Open Telegram + Avatar of %1$s + Icon of %1$s + Volume + Pause when volume reaches zero + Automatically pause playback when the volume is set to 0 + diff --git a/app/src/main/res/values-vi/strings_widget.xml b/app/src/main/res/values-vi/strings_widget.xml new file mode 100644 index 000000000..5dd2eabaf --- /dev/null +++ b/app/src/main/res/values-vi/strings_widget.xml @@ -0,0 +1,17 @@ + + + Responsive widget that adapts to its size + Compact player bar + Full controls with shuffle and repeat + Minimalist square player + + Tap to open + Album art + Album art placeholder + + Tap to play + Song title + Artist + + Progress bar, %1$d percent + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml new file mode 100644 index 000000000..7f38b9115 --- /dev/null +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -0,0 +1,128 @@ + + + PixelPlayer + 音乐播放器 + 應用名稱更改 + 由於商標相關問題,我們將應用名稱從 PixelPlay 更改為 PixelPlayer。請繼續享受音樂! + 不再顯示 + + + 首页 + 搜索 + 音乐库 + + + 需要特殊权限 + 为了编辑歌曲信息(.mp3 文件),PixelPlayer 需要访问所有文件的特殊权限。这将允许我们直接修改曲目标签。请在下一界面授予此权限以开启信息编辑功能。 + 授予权限 + + + 快速播放 + 无法打开该音频文件。 + 打开完整播放器 + + + 随机播放 + 随机播放所有歌曲 + 全部随机播放 + 最近播放列表 + 没有可打开的播放列表 + + + 打开 Play 商店 + 继续使用 Beta 版 + Play 商店链接将通过 GitHub 配置启用。 + PixelPlayer 现已上线 Google Play + 请在 Google Play 上使用稳定版以获取正式更新,同时我们仍会保持 Beta 测试版本的更新。 + PixelPlayer + 发布公告 + 敬请期待 + + + 感谢您使用 PixelPlayer! + 最高分 %1$d + 关闭 + 分数 + 第 %1$d 关 + 生命 + 关卡完成! + 游戏结束 + 分数:%1$d + 再试一次? + 下一关 + 重新开始游戏 + 点击重新启动 + 随机播放音乐 + 打砖块 + 最高分 %1$d + 开始 + 拖动以移动挡板 + + + 关闭播放器 + 正在处理播放操作… + 播放错误:%1$s + + + 返回 + 确定 + 取消 + 关闭 + 错误 + 搜索 + 清除搜索 + 全部 + 确认 + 已保存! + 已选择 + %1$d%% + 艺术家 + 全选 + 清除 + 未知错误 + + + 保存 + 完成 + 重置 + 应用 + 随机播放 + 复制 + 分享 + 撤销 + 导入 + 删除 + 导出 + 合并 + 重命名 + 创建 + 歌词 + 设置 + 专辑封面 + 播放列表 + 未知曲目 + 未知艺术家 + 未知专辑 + 关闭 + 添加 + 移除 + 播放 + 上一首 + 下一首 + 收藏 + 暂停 + 循环播放 + 选项 + 随机播放 + %1$s 的更多选项 + 展开菜单 + 下一步 + 结束 + 恢复默认设置 + 导出全部 + 合并全部 + 分享全部 + 播放专辑 + 随机播放专辑 + %1$s 的专辑封面 + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings_changelogs.xml b/app/src/main/res/values-zh-rTW/strings_changelogs.xml new file mode 100644 index 000000000..b0b82e4a3 --- /dev/null +++ b/app/src/main/res/values-zh-rTW/strings_changelogs.xml @@ -0,0 +1,132 @@ + + + 更新日志 + 在 GitHub 上查看 + 改进 + 修复 + 新功能 + 新增 + + 支持 Chromecast 从您的设备投射音频。 + 应用内更新日志,让您随时了解最新功能。 + 支持嵌入式和外部的 .LRC 歌词文件。 + 支持离线歌词。 + 同步歌词(与歌曲同步)。 + 查看完整队列的新界面。 + 支持在队列中重新排序和移除歌曲。 + 迷你播放器手势(向下滑动关闭)。 + 添加了更多 Material 动画。 + 新增设置项以自定义外观。 + 新增设置项以清除缓存。 + + + 用户界面的全面重新设计。 + 播放器的全面重新设计。 + 媒体库性能改进。 + 提升了应用的启动速度。 + AI 现在能提供更好的结果。 + + + 修复了标签编辑器中的各种错误。 + 修复了播放通知未被清除的错误。 + 修复了导致应用崩溃的几个错误。 + + + 引入了更丰富的听歌统计中心,可深入了解您的播放会话。 + 推出了悬浮快速播放器,可立即打开并预览本地文件。 + 添加了包含树状导航器 and “播放列表就绪”视图的文件夹标签页。 + + + 改进了整体 Material 3 UI,带来更简洁、更连贯的体验。 + 元数据编辑现已支持更改封面。 + 优化了应用内的动画和过渡效果,使导航更加流畅。 + 增强了艺术家界面的布局,细节更丰富且更精美。 + 升级了 DailyMix 和 YourMix 的生成,选择更加智能且多样化。 + 强化了 AI 播放列表的生成能力。 + 改进了搜索相关性和展示方式,以便更快地发现内容。 + 扩大了对更多音频文件格式的支持。 + + + 解决了元数据异常问题,确保各处的歌曲详情保持准确。 + 恢复了通知快捷操作,以便可靠地跳转回播放界面。 + + + 导航栏重大重新设计 + 用于选择源目录的全新文件管理器 + 全新的连接与投屏功能 + 远程设备之间的无缝流转 + 歌曲间无缝过渡 + 淡入淡出控制 + 全新的自定义过渡功能(仅限播放列表) + 关闭应用后继续播放 + UI 优化 + 统计功能改进 + 重新设计并增加了更多功能的队列控制 + 改进了对不同文件格式的播放和元数据编辑支持 + 改进的权限控制器 + 修复了一些小错误 + + + Material 3 Expressive UI 全面升级 + 10 段均衡器与音效 + 全新的媒体库同步流程 + AI 集成(Gemini 模型) + M3U 播放列表导入/导出 + 集成 Deezer 艺术家封面 + 自定义播放列表封面 + 设置架构重构 + 队列与播放器动画 + 基线配置文件 (Baseline Profiles) 与性能优化 + 具有同步偏移调整功能的更佳歌词系统 + + + 投屏稳定性改进 + 播放面板稳定性 + 常规错误修复与代码清理 + + + 现已支持 Android Auto 车载播放。 + 已支持 Wear OS,包括更完善的手表对手机播放控制。 + 扩展了云端集成,改进了对 Telegram、网易云音乐、QQ 音乐和 Google Drive 的支持。 + “最近播放”和持久化队列恢复功能,让您的听歌会话随时就绪。 + 现已包含备份与恢复 v3 以及账号管理工具。 + 歌词功能更加智能,增加了手动搜索备用方案和存储优化。 + + + 大幅优化了启动、媒体库、队列和播放器交互的性能。 + 重新设计了播放器、投屏、歌词、艺术家和流派界面,带来更流畅的体验。 + 导航和搜索流程更加可靠,路由处理更加安全。 + 提升了音频播放在更多设备 and 格式上的兼容性。 + 扩展了歌曲、专辑和播放列表的多选操作流程。 + + + 队列和随机播放行为现已更加稳定且符合预期。 + 修复了几个后台播放和投屏的边缘情况。 + 修复了睡眠定时器、文件标签页导航以及导致专辑艺术家崩溃的问题。 + 改善了小组件加载和服务稳定性,减少了设备发热/内存问题。 + 全局的常规错误修复和界面细节打磨。 + + + Wear OS:支持音乐传输、本地播放、队列同步以及从手表进行远程控制。 + AI:集成了 Groq AI 和 OpenRouter(实验性),并进行了 Token 优化。 + 云端:新增了 Jellyfin 支持。 + 歌词:带有专属开关的同步翻译,支持酷狗 LRC 格式,自定义文本对齐方式,以及改进了远程加载。 + UI/UX:紧凑的导航栏模式,从专辑封面提取调色板的动态主题,长标题跑马灯效果,以及全新的排序选项。 + Telegram:原生话题 (Topics) 支持和增强的显示模式。 + + + 音频引擎:全面重构,支持更多格式(MIDI、ALAC、M4A)并进行了解码器优化。 + 效率:大幅降低能耗,修复设备发热问题,以及后台任务优化 (SyncWorker)。 + 数据库:大规模的查询优化,并重新设计了封面缓存以防止数据丢失。 + 启动:通过基线配置文件 (Baseline Profile) 优化了加载时间。 + + + 播放:修复了 Opus/MP3 的卡顿、淡入淡出期间的 ReplayGain 错误,以及三星解码器上的启动问题。 + 稳定性:消除了启动、艺术家导航和 Android 12+ 设备上的崩溃问题。 + UI:修复了封面闪烁、非拉丁语系文本溢出,以及导航栏/迷你播放器的行为问题。 + 安全性:强化了凭证处理、存储权限以及与媒体服务器的通信安全性。 + + + 本地化:西班牙语、法语、俄语、简体中文、印度尼西亚语、意大利语 + + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings_cloud_services.xml b/app/src/main/res/values-zh-rTW/strings_cloud_services.xml new file mode 100644 index 000000000..13dd260f7 --- /dev/null +++ b/app/src/main/res/values-zh-rTW/strings_cloud_services.xml @@ -0,0 +1,228 @@ + + + + 登录 Telegram + 您正在修改号码。再次发送验证码将替换上一个。 + 处理中… + 正在初始化 Telegram… + 正在登出… + 正在关闭会话… + 会话已关闭。请重新打开登录界面以继续。 + 正在准备安全的 Telegram 会话… + 正在等待 Telegram 响应… + 连接 Telegram + 连接 Telegram 即可流式播放您频道和聊天中的音乐。 + 手机号码 + 请输入您的 Telegram 手机号码。您稍后可以返回并进行修改。 + 手机号码 + 86 + 13800138000 + 发送验证码 + 验证码 + 请输入来自 Telegram 的验证码。如果号码有误,请返回并修改。 + 验证码 + 12345 + 修改手机号 + 重新发送验证码 + 验证验证码 + 两步验证密码 + 请输入您的 Telegram 密码。您仍然可以返回以修改手机号码。 + 密码 + 验证密码 + 请稍候… + + + Telegram 频道 + 添加频道 + 公开的 Telegram 频道 + 正在同步 + 立即同步 + 收起话题 + 显示话题 + 频道选项 + 话题 + 正在同步频道 + 正在从 Telegram 更新歌曲 + 从此频道获取最新歌曲 + 移除频道 + 停止同步并移除已缓存的歌曲 + 是否移除频道? + %1$s 将停止同步,并且从此频道缓存的所有歌曲都将被移除。 + 移除 + 未同步任何频道 + 添加公开的 Telegram 频道\n以同步您的音乐库 + 添加频道 + 从未同步 + 上次同步于 %1$s + + + 添加频道 + 搜索一个公开的 Telegram 频道以同步其音乐 + \@channelname 或链接 + 正在搜索… + 搜索频道 + 输入公开频道的用户名或链接\n以同步其音频文件 + + + %d 首歌曲 + %d 首歌曲 + + + %d 个话题 + %d 个话题 + + + + Subsonic + 管理 Navidrome、Airsonic 以及其他兼容 Subsonic 的服务器。 + + + 点击同步以获取您的 Jellyfin 播放列表 + 管理您的 Jellyfin 服务器连接。 + + + 音乐文件夹 + 点击 + 添加 Drive 文件夹 + 暂未添加文件夹 + 已同步 %1$d 个文件夹 + 添加文件夹 + + + 选择播放列表类型 + 选择要同步的播放列表: + 所有播放列表 + 自建与收藏 + 自建播放列表 + 收藏播放列表 + + + 已同步 %1$d 个播放列表 + 播放列表 + 同步 + 暂未同步任何播放列表 + 点击同步以获取您的播放列表 + 快捷操作 + 同步媒体库 + 断开连接 + %1$d 首歌曲 + + + 正在同步 + 正在同步媒体库… + 正在获取播放列表… + 正在同步播放列表:%1$s + 正在更新本地媒体库… + 同步完成 + 正在获取专辑列表… + 正在从 %1$s 获取歌曲… + 正在将 %1$d 首歌曲保存到数据库… + 未找到媒体库歌曲 + 媒体库同步完成 + 正在同步… + 错误:%1$s + + + 同步 + 全部同步 + 登出 + 同步所有播放列表 + 用户头像 + + + 无网络连接 + 此内容需要网络连接。请检查您的网络设置并重试。 + 您已离线 + 请检查您的网络连接并重试以访问此内容。 + + + 连接 + 正在连接… + 输入您的服务器地址和账户凭据。 + 连接详情 + 隐藏密码 + 密码 + 输入密码 + 预填 http:// + 服务器 URL + 显示密码 + Telegram + 用户名 + admin + 欢迎您,%1$s! + + + 兼容 Navidrome、Gonic、Airsonic 以及其他兼容 Subsonic 的服务器 + 支持 Navidrome、Airsonic、Gonic、Ampache 以及其他兼容 Subsonic API 的服务器。 + 如果您的服务器支持,应用密码同样有效。 + 预填 https:// + 连接到您的自托管音乐服务器 + Navidrome + 请使用您服务器的完整 https:// 基础地址。 + https://music.example.com + 这是您的 Subsonic 或 Navidrome 账户名称。 + Subsonic / Navidrome + Subsonic + + + 输入您的 Jellyfin 服务器 URL 和账户凭据。 + 连接到 Jellyfin 服务器以串流播放您的媒体库 + 连接到 Jellyfin 服务器。支持使用 HTTP 和 HTTPS 进行本地网络访问。 + Jellyfin + 您的 Jellyfin 账户密码。 + 连接到您的 Jellyfin 媒体服务器 + Jellyfin + 您的 Jellyfin 服务器完整 URL,包含端口。 + http://192.168.1.100:8096 + 您的 Jellyfin 账户用户名。 + + + 直接从您的 Google Drive 串流音乐文件 + 连接 Google Drive + Google Drive 已连接! + 创建 \"PixelPlayer Music\" + 在这里为您的音乐创建一个新文件夹 + 这里没有文件夹 + 打开文件夹 + 选择或创建一个文件夹作为您的音乐源 + 选择一个音乐文件夹 + 正在设置 Google Drive… + 使用 Google 账号登录 + Google Drive + 使用 + + + 无法读取会话 Cookie。 + 完成 + 退出 + 未找到 Cookie。请先登录。 + 页面加载时间过长。请刷新或尝试其他网络。 + + + 正在保存… + 停留 + 页面加载超时。您可以重试,进度不会丢失。 + 网页后退 + 您可以稍后返回。关闭时将丢弃当前页面状态。 + 网页前进 + 刷新 + 重试 + 打开主页 + WebView 加载失败。 + + + 读取网易云音乐 Cookie 失败:%1$s + 退出网易云音乐登录? + 加载网易云音乐时出现 HTTP %1$d。 + 尚未检测到登录。请在点击完成前完成网易云音乐的登录。 + 登录网易云音乐 + 安全提示:您的密码仅在网易云音乐网页中输入。PixelPlayer 仅存储会话 Cookie (MUSIC_U) 以同步您的媒体库。 + 网易云音乐 + + + 读取 QQ 音乐 Cookie 失败:%1$s + 退出 QQ 音乐登录? + 加载 QQ 音乐时出现 HTTP %1$d。 + 尚未检测到登录。请在点击完成前完成 QQ 音乐的登录。 + 登录 QQ 音乐 + 安全提示:您的密码仅在 QQ 音乐网页中输入。PixelPlayer 仅存储会话 Cookie 以同步您的媒体库。 + QQ 音乐 + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings_equalizer.xml b/app/src/main/res/values-zh-rTW/strings_equalizer.xml new file mode 100644 index 000000000..f1e662c93 --- /dev/null +++ b/app/src/main/res/values-zh-rTW/strings_equalizer.xml @@ -0,0 +1,57 @@ + + + + 名称不能为空 + 重命名 + + + 更改视图模式 + 禁用均衡器 + 启用均衡器 + 编辑 + 编辑预设 + 自定义预设 + 预设 + 更新 + 低音增强 + 虚拟音效 + 响度 + 不支持 + 此设备不支持 + 音量 + 频率响应 + Hz + 低音 + 中低音 + 中高音 + 高音 + 低音 / 低频 + 中音 / 高频 + 第 %1$d 页 + 重置持续时间 + 保存为新预设 + + + 已保存的预设 + 暂未保存自定义预设。 + 取消固定 + 固定 + 重命名 + 删除 + + + 保存自定义预设 + 为您的自定义均衡器预设输入一个名称。 + 预设名称 + 重命名预设 + + + 管理预设 + 拖动以重新排序 • 点击眼睛图标显示或隐藏 + 重新排序 + 重置预设 + 这将恢复默认的预设顺序和可见性。是否继续? + 恢复默认 + 可见 + 隐藏 + diff --git a/app/src/main/res/values-zh-rTW/strings_home_screen.xml b/app/src/main/res/values-zh-rTW/strings_home_screen.xml new file mode 100644 index 000000000..46a70f806 --- /dev/null +++ b/app/src/main/res/values-zh-rTW/strings_home_screen.xml @@ -0,0 +1,277 @@ + + + + β + Beta + 云端串流 + 更新日志 + 云端串流 + 从您的云端账户串流音乐 + + + Beta 0.7.5 + β + 欢迎使用 PixelPlayer 0.7.5-beta + 您正在使用的是可能包含错误、崩溃或实验性功能的测试版本。请报告问题以帮助我们改进。 + 预期情况 + 可能会意外出现错误、崩溃或未完成的功能。 + 某些功能可能会在不另行通知的情况下更改或移除。 + 测试版可能比正式发布版本更不稳定。 + 在报告已知问题之前,请务必先检查更新。 + 测试版在测试期间可能会更改、损坏或改进的内容。 + GitHub Issue 快捷入口 + 请先搜索,然后针对错误、崩溃、请求或问题开启一个明确的报告。 + 浏览现有的 Issue + 报告问题或崩溃 + 分享复现步骤、预期结果、实际结果以及您的设备/操作系统详细信息。 + 如何报告 + 开启新 Issue 前的快速检查清单。 + 开启 Issue 前 + 搜索现有已开启和已关闭的 Issue,以避免重复提交。 + 更新至 PixelPlayer 最新版本并确认问题是否仍然存在。 + 重启应用并确认问题是否仍然存在。 + 尝试复现它并写下确切的步骤。 + 哪种问题类型? + 错误报告:某些功能表现异常。 + 功能请求:添加新功能或改进。 + 提问:如果已启用,请使用 Discussions(讨论),或开启一个带有问题标签的 Issue。 + 错误报告 + 当某些功能表现异常或崩溃时,请复制这些字段。 + 错误报告 + 简要概述: + 预期行为: + 当前行为: + 播放/复现步骤:1. 2. 3. + 发生的频率如何?总是 / 有时 / 很少。 + 截图/视频:如果有。 + 日志/堆栈跟踪:如果有。 + 环境 + PixelPlayer 版本: + 安装来源:GitHub Release、debug 构建、Nightly 构建等。 + Android 版本: + 设备型号: + 额外信息:SD 卡使用情况、特殊设置、权限等。 + 功能请求 + 当您希望添加新功能或改进时,请复制这些字段。 + 问题描述:您想解决什么问题? + 建议方案:它应该如何工作? + 考虑过的替代方案:是否有其他方法? + 影响范围:哪些界面或流程会受影响? + 样图或参考图片(如果有)。 + 标题、隐私和范围 + 使报告易于分类且安全共享。 + 好的 Issue 标题示例 + 均衡器:切换预设选项卡时指示器偏移 + 搜索:查询为空时历史记录列表不显示 + 功能:添加“最近添加”播放列表排序选项 + 请避免 + 诸如“它不起作用”之类的通用报告。 + 在一个 Issue 中包含多个不相关的问题。 + 包含私人数据的未经打码处理的日志或截图。 + 隐私声明 + 在发布日志、截图或视频之前,请删除个人或私人信息。 + Nightly 构建版本 + Nightly 版本与正式版有何不同,以及出错时应提供哪些信息。 + Nightly 版本是从最新提交 (commit) 生成的,可能包含未完成的更改、临时错误或回归。它们比正式发布版本更具实验性。 + 如果可用,可从仓库的 GitHub Actions 工作流产物 (artifacts) 中获取。 + 报告 Nightly 问题 + 在报告 Nightly 版本的问题时,请务必说明该问题发生于 Nightly 版本,而非正式发布版本。请尽可能提供构建日期、工作流运行名称或编号,或者提交 SHA。并请检查最新的正式版本中是否会出现相同问题。 + Beta 0.5.0 升级 + 建议全新安装 + 如果您从 Beta 0.5.0 升级,此更新可能需要全新的媒体库数据,而不是旧的缓存状态。 + 如果元数据或媒体库条目看起来有误 + 歌曲元数据错误、艺术家或专辑不匹配,或出现类似重复的条目,通常意味着只需全新安装即可解决。 + 不再显示 + 知道了 + + + 糟糕!出错了 + 应用在您上次使用时崩溃了。请分享崩溃报告以帮助我们修复此问题。 + 日期:%1$s + 错误: + 堆栈跟踪(预览): + 崩溃日志 + 崩溃日志已复制到剪贴板 + PixelPlayer 崩溃报告 + 分享崩溃报告 + + + DJ 混音 + + + 你的\n推荐 + 暂无数据 + 当 PixelPlayer 发现歌曲或同步数据源时,您的推荐将显示在此处。 + 刷新 + + + DAILY MIX + 基于听歌历史 + 查看全部 Daily Mix + Daily Mix + + + Daily Mix + + %1$d 首歌曲 • %2$s + %1$d 首歌曲 • %2$s + + 播放 + AI 播放列表生成器 + + + 您的 Daily Mix 是如何生成的 + 您的 Daily Mix 由您最喜爱和播放次数最多的歌曲组成。我们还会添加您喜欢的艺术家和流派的曲目,让您发现新音乐。 + 告诉 AI 您今天想听什么 + 我们使用小样本以保持较低的成本 + 正在更新… + 更新 Daily Mix + + + 完美精选 + Daily Mix + 您的声音之旅已就绪 + AI 播放列表生成器 + 描述您的氛围、心情或活动,让 AI 从您的媒体库中精心挑选完美的播放列表。 + 播放列表大小 + 最少歌曲数 + 最多歌曲数 + 例如:轻松的夜晚氛围,欢快的健身音乐… + 点击重试 + 声音之旅合成完毕! + 准备播放 + 正在生成… + 生成播放列表 + + + 最近播放 + + + 最近播放 + 播放最新 + 在 %1$s 内无最近播放记录 + 更改时间范围或播放更多歌曲以填充此时间轴。 + 最近播放 + 今天 + 昨天 + + + 听歌统计 + 总播放量 + 日均播放 + 最爱曲目 + %1$s • %2$d 次播放 + + + 听歌统计 + 刷新听歌统计 + 今天 + 本周至今 + 本月至今 + 本年至今 + 全部时间 + 听歌时长 + 播放次数 + 听歌时间轴 + 听歌时长 + 所选时间范围内的总听歌时长。 + 播放次数 + 您在每个时间段内完成的会话次数。 + 平均会话 + 每个时间段的平均听歌时长。 + 划分为 4 小时的时间段,揭示您的日常节奏。 + 每日柱状图,方便比较每周习惯。 + 每周柱状图,显示本月趋势。 + 每月柱状图,显示全年的季节性变化。 + 每年柱状图,总结您的完整听歌历史。 + 暂无听歌数据 + 点击播放开始建立您的听歌时间轴 + 每日节奏 + 每周节奏 + 每月节奏 + 全年概览 + 历年进展 + 按 4 小时分段分组 + 按星期几分组 + 按月内周次分组 + 按月分组 + 按年份分组 + 高峰时段 + %1$d 次播放 + + 热门类别 + 比较您在各个流派、艺术家、专辑和歌曲中的听歌偏好。 + 流派 + 艺术家 + 专辑 + 歌曲 + 按流派统计 + 按艺术家统计 + 按专辑统计 + 按歌曲统计 + %1$d 次播放 • %2$d 位艺术家 + %1$d 次播放 • %2$d 首曲目 + 暂无类别数据 + 点击播放,您的听歌亮点将在这里浮现 + 听歌习惯 + 暂无习惯数据 + 当我们更了解您时,就会在这里展示您的听歌习惯。 + 总会话数 + 平均会话时长 + 最长会话 + 会话数/天 + 最活跃的一天 + 暂无播放 + 时间轴最高峰 + 热门艺术家 + 暂无热门艺术家 + 继续听歌,您最喜爱的艺术家将出现在这里。 + \? + %1$d. %2$s + 热门专辑 + 暂无热门专辑 + 您经常回顾的专辑将出现在这里。 + %1$d. %2$s + 曲目集中度 + 您的听歌时间在最爱曲目中的分布情况。 + 暂无集中度数据 + 播放更多曲目即可了解您听歌的专一程度。 + Top 1 + Top 2-3 + 其他 + %1$d%% + 听歌集中度 + 排名前 3 的曲目占据了您 %1$d%% 的听歌时间。 + 平均播放/曲目 + 去重曲目数 + Top 3 占比 + 此范围内的曲目 + 选定时间范围内播放次数最多的曲目。 + 暂无热门曲目 + 听您喜欢的歌,它们将会在这里高亮显示。 + 收起曲目 + 显示所有曲目 + + + %1$d 小时 %2$02d 分钟 + %1$d 分钟 + %1$d 小时 %2$02d 分 + %1$d 小时 + %1$d 分 + %1$d 秒 + %1$d小时%2$02d分 + %1$d小时 + %1$d分 + %1$d秒 + 从未 + 刚刚 + 1 天前 + %1$d 天前 + 1 小时前 + %1$d 小时前 + 1 分钟前 + %1$d 分钟前 + %1$d 首歌曲 + %1$d 首歌曲 + 第 %1$d 周 + diff --git a/app/src/main/res/values-zh-rTW/strings_library.xml b/app/src/main/res/values-zh-rTW/strings_library.xml new file mode 100644 index 000000000..fbe7fe995 --- /dev/null +++ b/app/src/main/res/values-zh-rTW/strings_library.xml @@ -0,0 +1,566 @@ + + + + 音乐库 + 媒体库选项卡 + 直接跳转到任意选项卡或对它们进行重新排序。 + 重新排序选项卡 + + + 歌曲 + 专辑 + 艺术家 + 播放列表 + 文件夹 + 已收藏 + + + 播放列表创建成功 + 请先设置您的 AI 提供商 API 密钥 + 请先设置您的 Gemini API 密钥 + 已添加到队列 + 下一首播放 + + + 手表传输 + 设置 + 编辑 + 重新排序选项卡 + 展开菜单 + + + 您最多可以选择 %1$d 张专辑 + 文件夹 + 文件夹 + + + 排序方式 + 视图 + 播放列表视图 + 网格 + 列表 + 内部存储 + SD 卡 + SD 卡目前不可用。 + 云端 + Telegram 云端频道 + 话题显示 (Topics) + 频道 + 话题 + 全部 + 云端 + 仅云端 + + + 正在使用 AI 生成元数据… + + + 加载歌曲时出错 + 加载专辑时出错 + 加载艺术家时出错 + 重试 + + + 在您的媒体库中未找到歌曲。 + 如果您设备上有音乐,请尝试在设置中重新扫描媒体库。 + 未找到歌曲 + + + 新建 + 创建新播放列表 + 导入 M3U 播放列表 + 定位当前歌曲 + 所有歌曲 + 云端 + 本地 + 排序选项 + + + 全选 + 取消选择 + 更多选项 + + + 正在扫描音乐文件… + 正在处理文件… + 第 %1$d 个,共 %2$d 个文件 + 正在同步媒体库… + 同步完成 + 等待中… + 正在同步媒体库… + 正在清理专辑封面缓存… + 正在同步云端数据源… + 正在扫描歌词… + + + 暂无歌曲 + 将音乐添加到您的设备或同步云端数据源以开始收听。 + 未找到本地歌曲 + 尝试其他数据源过滤或重新扫描您的设备媒体库。 + 未找到云端歌曲 + 同步 Telegram 或网易云音乐歌曲,或切换到本地源。 + 暂无专辑 + 一旦您的媒体库对曲目进行分组,专辑就会显示在这里。 + 未找到本地专辑 + 需要本地歌曲才能构建本地专辑组。 + 未找到云端专辑 + 同步后,带有专辑数据的云端歌曲将显示在这里。 + 暂无艺术家 + 从任何来源为歌曲建立索引后,将显示艺术家。 + 未找到本地艺术家 + 目前没有本地歌曲的艺术家元数据可用。 + 未找到云端艺术家 + 同步远程歌曲时会显示云端艺术家条目。 + 暂无收藏歌曲 + 在播放歌曲时点击心形图标将其保存在这里。 + 无本地收藏歌曲 + 切换数据源过滤或收藏您设备中的歌曲。 + 无云端收藏歌曲 + 收藏 Telegram 或网易云音乐的曲目,即可在此视图中看到它们。 + 未找到文件夹 + 包含音乐的内部存储文件夹将显示在这里。 + 暂无播放列表 + 创建您的第一个播放列表来整理您的媒体库。 + + + 编辑歌曲元数据 + 播放 + 播放歌曲 + 全部播放 + 全部播放 + 添加到收藏 + 全部添加到收藏 + 取消收藏 + 全部取消收藏 + 分享歌曲文件 + 分享歌曲文件 + 作为 ZIP 全部打包分享 + 无法分享歌曲:%1$s + 添加到队列 + 添加到队列 + 下一首播放 + 在队列中下一首播放 + 添加到播放列表 + 删除 + 全部删除 + 正在检查手表 + 正在传输 %1$d%% + 正在传至手表 + 传输进行中 + 发送至手表 + 手表不可用 + 将歌曲发送至手表 + 手表不可用 + 设为 + 设为声音 + 选择如何将此歌曲用作系统声音 + 将此歌曲用作 + 选择 PixelPlayer 应在哪里安装此声音。 + 手机铃声 + 来电 + 通知音 + 消息和应用提醒 + 闹钟音 + 时钟闹钟 + 确认更改声音 + 将“%1$s”设为您的 %2$s? + 设置声音 + 已将“%1$s”设为您的 %2$s + 铃声 + 通知音 + 闹钟音 + 启用“修改系统设置”,然后返回 PixelPlayer 自动完成。 + 未启用“修改系统设置”。 + 已将“%1$s”设为您的铃声 + 只有本地歌曲才能设为铃声。 + 无法将此音频文件准备为铃声。 + 无法设置铃声:%1$s + 选项 + 选项 + 信息 + 信息 + 时长 + 流派 + 专辑 + 艺术家 + 歌曲信息 + 提供商 + 文件 + %1$d 首歌曲 + 已选择 + %1$d 个播放列表 + %1$d 张专辑 + 已选择 + 限制:每次选择最多 %1$d 张专辑。 + 加入队列及播放将遵循您的选择顺序。 + %1$d 个流派 + 已选择 + 对这些流派中的所有歌曲进行批量操作。 + + + 默认顺序 + 标题 (A-Z) + 标题 (Z-A) + 艺术家 + 艺术家 (Z-A) + 专辑 + 专辑 (Z-A) + 添加时间 + 添加时间 (最早优先) + 时长 + 时长 (最短优先) + 发行年份 + 发行年份 (最早优先) + 歌曲最少 + 歌曲最多 + 名称 (A-Z) + 名称 (Z-A) + 歌曲数量 (最多) + 歌曲数量 (最少) + 创建时间 + 创建时间 (最早优先) + 收藏时间 + 收藏时间 (最早优先) + 子文件夹最少 + 子文件夹最多 + + + 标题 + 艺术家 + 专辑 + 添加时间 + 时长 + 发行年份 + 歌曲数量 + 名称 + 歌曲数量 + 创建时间 + 收藏时间 + 子文件夹数量 + + + 来源 + 顺序 + 降序 + 升序 + 原始顺序 + 点击切换为升序 + 点击切换为降序 + 此排序保持其原始顺序 + 开关已开启 + + + 重新排序媒体库选项卡 + 重置顺序 + 将选项卡顺序重置为默认? + 正在重新排序选项卡… + 拖动手柄 + + + 选择一位艺术家 + 1 位艺术家 + %1$d 位艺术家 + 主要艺术家 + 艺术家主页 + + + 取消传输 + %1$s / %2$s + 显示手机到手表音乐传输的实时进度 + 手表传输 + 正在发送至手表 + 已取消 + 传输已取消 + 传输完成 + 已完成 + 失败 + 传输失败 + 有多个活动中的传输 + %1$s • %2$s + 正在准备 + 正在准备手表传输 + 正在准备传输… + 正在将 %1$d 首歌曲发送至手表 + 正在发送至手表 + 正在开始传输… + 正在开始 + 正在传输 + %1$d 个传输任务 + + + 编辑歌曲 + 显示信息 + 正在编辑歌曲元数据 + 编辑歌曲元数据可能会影响其在媒体库中的显示和整理方式。更改是永久性的,且可能无法撤销。 + 知道了 + 信息 + 封面 + 选择一张正方形图片并进行微调,让您的封面在整个应用中看起来更棒。 + 更改封面 + 删除封面 + 标题 + 艺术家 + 专辑 + 专辑艺术家 + 流派 + 作曲 + 曲目编号 + 唱片编号 + 音量标准化-曲目增益 (dB) + 音量标准化-专辑增益 (dB) + -6.50 + -8.20 + 新封面预览 + 当前歌曲封面 + 调整您的封面 + 使用双指缩放和拖动手势找到完美的构图。 + 应用封面 + 无法加载选定的图片 + 在 lrclib.net 搜索歌词 + + + 批量编辑 %d 首歌曲 + 仅会更新已修改的字段。将字段留空则保持现有值。 + (混合值) + (可选 - 留空则跳过) + 成功更新 %d 首歌曲 + 已更新 %1$d 首(共 %2$d 首)歌曲。某些文件无法编辑。 + 更新歌曲失败 + 批量更换封面 + 这将替换所有 %d 首选定歌曲的封面 + 为所有选定歌曲设置封面 + 移除所有封面 + (多个不同的封面) + + + 已忽略播放列表 + + + 创建播放列表 + 选择创建方式。 + 手动 + 自己设计封面、图标、形状并挑选歌曲。 + 使用 AI + 使用高级控制生成精选的播放列表。 + 需要在设置中配置 Gemini API 密钥。 + 设置 API 密钥 + + + AI 播放列表实验室 + 重置 + 正在生成… + 生成 + 意图 + 播放列表名称(可选) + 这个播放列表应该带来什么感觉? + 示例:伴随温暖合成器音乐的日落驾驶 + 方向 + 情绪 + 活动 + 时代 + 精选引擎 + 能量 + 控制歌曲的强度和节奏。1 = 平静/缓慢,5 = 高能量/快节奏。 + 探索度 + 控制所选歌曲的熟悉程度。1 = 你最常听的最爱,5 = 很少播放的冷门曲目。 + 最少歌曲数 + 最多歌曲数 + 过滤 + 优先考虑的流派(可选) + 例如:合成器波 (synthwave)、独立流行 (indie pop) + 避免的流派(可选) + 例如:金属 (metal)、硬核陷阱 (hard trap) + 首选语言(可选) + 例如:英语,西班牙语,纯音乐 (instrumental) + 优先考虑已收藏的最爱 + 避免露骨歌词 (Explicit) + 提示词预览 + 当您添加偏好设置后,最终的提示词将显示在这里。 + 精准策展 + 定义情绪、活动、约束和深度。 + AI 将仅使用您本地媒体库中的歌曲。 + 至少为 AI 添加一项指令。 + 请设置有效的歌曲数量范围。 + %1$d/5 + 自定义… + 输入自定义值 + 输入您的自定义值 + + + 任何时代 + 核心请求:%1$s。 + 情绪目标:%1$s。 + 活动背景:%1$s。 + 时代焦点:%1$s。 + 优先考虑的流派:%1$s。 + 避免的流派:%1$s。 + 首选语言:%1$s。 + 能量等级目标:%1$d/5。 + 探索度目标:%1$d/5(1 代表熟悉,5 代表冷门曲目)。 + 可能的话,优先选择更接近听众最爱的歌曲。 + 只要有替代选择,尽量避免露骨歌词。 + 保持平滑的过渡,避免重复聚集同一艺术家。 + + 放松 + 活力 + 快乐 + 暗黑 + 浪漫 + 忧郁 + + + 健身 + 专注 + 公路旅行 + 派对 + 学习 + 深夜 + + + @string/playlist_creation_ai_era_any + 70年代 + 80年代 + 90年代 + 2000年代 + 2010年代 + 2020年代 + + + + 尚未创建播放列表。 + 点击“新建播放列表”按钮开始。 + 新建播放列表 + 播放列表名称 + 我的播放列表 + + + 添加 %1$d 首歌曲到… + 选择播放列表 + 搜索播放列表… + 已将歌曲添加到播放列表 + 播放列表已创建并已添加歌曲 + 内部存储 + + + 添加歌曲 + 添加所选歌曲 + 添加 + 搜索或过滤歌曲… + 已收藏 + 加载歌曲失败 + 加载更多 + + + 合并播放列表 + 为合并后的播放列表输入名称: + 合并的播放列表 + 这将把 %1$d 个选定的播放列表合并为一个。 + + + 未找到可播放的有效歌曲 + 在当前列表中未找到歌曲 + 无法定位歌曲 + 在媒体库中未找到歌曲 + 播放停止:%1$s 已结束(曲目结束)。 + 曲目 + 没有可供随机播放的歌曲。 + 选定的专辑 + 在选定的专辑中未找到可播放的歌曲 + 在选定的流派中未找到可播放的歌曲 + 仅前 %1$d 张专辑已加入队列 + 已将 %1$d 张专辑加入队列(共 %2$d 首歌曲) + 无法将选定的专辑加入队列 + 所有歌曲均已在收藏中 + 没有被收藏的歌曲 + 正在创建 ZIP 文件… + 分享失败:%1$s + + 添加了 %d 首歌曲到队列 + 添加了 %d 首歌曲到队列 + + + %d 首歌曲将作为下一首播放 + %d 首歌曲将作为下一首播放 + + + 添加了 %d 首歌曲到收藏 + 添加了 %d 首歌曲到收藏 + + + 从收藏中移除了 %d 首歌曲 + 从收藏中移除了 %d 首歌曲 + + + + 没有可分享的播放列表 + 分享播放列表 + 分享失败:%1$s + 没有可导出的播放列表 + 导出失败:%1$s + Music/PixelPlayer Exports + 请在设置中配置您的 Gemini API 密钥。 + 播放列表已恢复 + + 正在分享 %d 个播放列表 + 正在分享 %d 个播放列表 + + + 已导出 %1$d 个播放列表到 %2$s + 已导出 %1$d 个播放列表到 %2$s + + + + 无效的专辑 ID + 未找到专辑 ID + 加载专辑数据出错:%s + 未找到专辑 + + + 无效的艺术家 ID + 未找到艺术家 ID + 加载艺术家数据出错:%s + 找不到该艺术家 + + + 无法删除当前正在播放的歌曲 + 删除了 %1$d 个文件(跳过了 %2$d 个 - 正在播放) + 删除了 %1$d 个(共 %2$d 个)文件 + 删除文件失败 + 文件已删除 + 无法删除文件或找不到文件 + 删除已取消 + 删除歌曲? + “%1$s” - %2$s\n\n此歌曲将从您的设备中永久删除,且无法恢复。 + 这些歌曲将从您的设备中永久删除,且无法恢复。 + + 删除了 %d 个文件 + 删除了 %d 个文件 + + + 删除 %d 首歌曲? + 删除 %d 首歌曲? + + + + 元数据更新成功 + 正在更新 %1$d 首歌曲… + 已成功更新 %1$d 首歌曲! + 更新了 %1$d 首歌曲。失败:%2$d 首 + 歌词保存成功 + 保存歌词失败 + 没有可保存的歌词 + 权限被拒绝 – 无法编辑文件 + 权限被拒绝 – 无法保存歌词 + 权限被拒绝 – 无法编辑此文件 + + + 请在设置中为选定的 AI 提供商配置有效的 API 密钥。 + AI 错误:%s + 所选 AI 提供商拒绝了请求,原因是账户没有积分或可用配额不足。 + 所选 AI 模型不再可用。PixelPlayer 尝试自动切换到支持的模型。 + AI 无法根据您的提示找到任何歌曲。 + 写下一个 Daily Mix 的灵感 + 已使用 AI 更新 Daily Mix + 无法更新:%s + AI 无法为此合集找到歌曲 + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings_player.xml b/app/src/main/res/values-zh-rTW/strings_player.xml new file mode 100644 index 000000000..73811e2fb --- /dev/null +++ b/app/src/main/res/values-zh-rTW/strings_player.xml @@ -0,0 +1,198 @@ + + + + 收起播放器 + 正在播放 + 云端串流 + 投屏 + 蓝牙 + 本地播放 + 正在连接… + 打开队列 + + + 准备连接 + 允许 PixelPlayer 查看您附近的设备和当前 Wi-Fi,以便我们保持您的投屏、蓝牙音频和扬声器同步。 + 附近设备 + 需要此权限来读取和控制您连接的蓝牙音频设备。 + 用于 Wi-Fi 的位置信息 + Android 需要位置信息才能共享您当前所连接的 Wi-Fi 网络 (SSID),以便我们找到兼容的投屏设备。 + 允许访问 + 我们仅将这些权限用于设备互连——投屏、控制附近扬声器以及保持音频同步。 + 连接设备 + 正在扫描附近 + 投屏会话 + 正在连接 + 已连接 + 本机 + 蓝牙音频 + 本地播放 + 正在播放 + 已暂停 + 设备音量 + 手机音量 + %1$d/%2$d + 电量 + 音量 + 断开连接 + 连接性 + 开启 Wi-Fi 或蓝牙 + 刷新连接 + Wi-Fi + + + 已连接 + 蓝牙 + + + 已连接 + 附近设备 + 刷新设备 + 已连接 + 正在连接 + 可连接 + 可用 + 正在连接... + 正在搜索设备… + 请确保您的电视或扬声器已开启,并连接到同一 Wi-Fi 网络。 + 控制 + 设备 + + + 投屏媒体服务器 + 正在投屏至设备 + 正在向投屏设备提供媒体 + %1$s: %2$s + 投屏时暂不支持对此音频格式进行进度调节,这可能会导致投屏会话崩溃。 + + + 睡眠定时器 + 定时器 + %1$d 分钟 + 定时器已设为 %1$d 分钟。 + 1 次 + + %d 次 + %d 次 + + 播放次数:%1$s + 当前曲目结束时 + 播放将在曲目结束时停止。 + 开启 + 自定义时间 + 取消定时器 + 曲目结束 + 定时器已取消。 + 无法启用“曲目结束时停止”:没有正在播放的歌曲。 + “曲目结束”定时器已停用:歌曲已从 %1$s 切换到 %2$s。 + 上一首曲目 + 当前曲目 + 设置自定义时长 + + + 接下来播放 + 队列当前为空。 + + 1 首曲目在列。 + %d 首曲目在列。 + + 队列 + 队列为空。 + 重新排序歌曲 + 切换随机播放 + 切换循环播放 + 睡眠定时器 + 更多操作 + 定位当前歌曲 + 清空队列 + 清空队列 + 您确定要清空队列中除当前正在播放之外的所有歌曲吗? + 保存为播放列表 + %1$s 队列 + 当前队列 + 移除歌曲 + 已移除 + 保存为播放列表 + 取消全选 + 播放列表名称 + 搜索要包含的歌曲… + 没有与 \"%1$s\" 匹配的歌曲 + + 已选择 %d 首歌曲 + 已选择 %d 首歌曲 + + 保存为:%1$s + 输入播放列表名称 + 从播放列表中移除 + %1$s 的更多选项 + + + 歌词 + 正在加载歌词… + 逐字同步 + 静态 + 歌词选项 + −.5 + −.1 + +.1 + +.5 + 0s + %1$+.1fs + + + 搜索歌词失败 + 无法从远程获取歌词 + 连接超时。请检查您的网络连接。 + 网络错误。请检查您的网络连接。 + 服务器错误(代码 %d)。请稍后再试。 + + + 歌词已可用,跳过在线获取。 + 已找到内嵌歌词,跳过在线获取。 + 已找到本地 (.lrc) 歌词,跳过在线获取。 + + + 保存歌词 + 使用 AI 翻译 + 此歌词已有翻译 + 此歌词已经是该语言 + 未配置 API + 歌词翻译成功! + 正在翻译歌词... + 重置已导入的歌词 + 重置歌词? + 您确定要重置此歌曲的歌词吗? + 外观 + 对齐方式 + 歌词左对齐 + 歌词居中 + 歌词右对齐 + 控制 + 调整同步 + 隐藏同步控制 + 显示罗马音 + 显示翻译 + 禁用沉浸模式(一次) + 保持屏幕常亮 + + + 保存歌词 + 选择要保存的版本: + 同步版(带时间戳) + 纯文本(仅文本) + + + 您想在网上搜索歌词吗? + 显示歌词选项 + 始终打开选择器,而不是自动应用第一个匹配项 + 正在搜索歌词… + 未找到歌词 + 我们无法自动找到歌词。您可以编辑标题或艺术家名称并尝试手动搜索。 + 歌曲标题 + 艺术家(可选) + 找到 %d 个匹配项 + 已同步 + %1$s • %2$s + 歌词提供者 + https://lrclib.net/ + diff --git a/app/src/main/res/values-zh-rTW/strings_screens.xml b/app/src/main/res/values-zh-rTW/strings_screens.xml new file mode 100644 index 000000000..a0ae15a25 --- /dev/null +++ b/app/src/main/res/values-zh-rTW/strings_screens.xml @@ -0,0 +1,244 @@ + + + + 错误:流派 ID 缺失 + + + 开始吧! + 第 %1$d 步,共 %2$d 步 + 请先授予所需权限。 + 请授予所有所需权限。 + 欢迎使用 + β + Beta + 让我们为您完成所有设置。 + 媒体权限 + PixelPlayer 需要访问您的音频文件以构建您的音乐库。 + 权限已授予 + 授予媒体权限 + 通知 + 启用通知以便在锁屏和通知栏控制您的音乐。 + 启用通知 + 您有备份文件吗? + 如果您已有 PixelPlayer 备份,现在恢复它可以跳过此设备上的大部分剩余设置。 + 导入备份 + 正在检查备份 + 正在检查备份包… + 正在恢复备份 + 跳过 / 暂不 + 恢复备份 + 在完成设置之前,查看您要导入的内容。 + 已选择 %1$d 个模块,共 %2$d 个 + 创建于 %1$s + 来自版本 %1$s 的备份 + 未知版本 + 恢复所选项 + 正在恢复 + 排除的文件夹 + 默认扫描所有文件夹。选择在构建媒体库时要忽略的任何位置。 + 选择要忽略的文件夹 + 请先授予存储权限 + 应用主题 + 在开始探索媒体库之前,选择您喜欢的外观。 + 深色 + PixelPlayer 默认的 Material 3 深色外观。 + 浅色 + 整个应用采用更明亮的 Material 3 外观。 + 跟随系统 + 匹配您手机当前的外观设置。 + 推荐 + 您稍后可以在“设置 > 外观 > 应用主题”中更改此设置。 + 媒体库布局 + 选择您首选的媒体库导航方式。 + 歌曲 + 紧凑模式 + 使用极简胶囊导航 + 使用标准标签栏 + 歌曲 + 专辑 + 艺术家 + 您稍后可以在“设置 > 外观 > 媒体库导航”中更改此设置。 + 应用导航 + 选择底部导航栏的样式。 + 默认样式 + 带有圆角的悬浮胶囊 + 标准全宽栏 + 自定义圆角半径 + 您稍后可以在“设置 > 外观 > 导航栏样式”中更改此设置。 + 闹钟和提醒 + 可选,但如果您使用睡眠定时器并希望 PixelPlayer 准时停止播放,则推荐使用。 + 授予权限 + 电池优化 + 某些 Android 设备会强制结束后台应用。请为 PixelPlayer 禁用电池优化,以防止意外的播放中断。 + 禁用优化 + 一切就绪! + 您已准备好享受音乐了。 + + + 搜索… + 搜索 + 清除搜索 + 最近搜索 + 清除全部 + 历史 + 删除搜索历史项 + 无结果 + 没有找到“%1$s”的结果 + 未找到任何内容 + 尝试不同的搜索词或检查您的过滤条件。 + 未找到结果。 + 按流派浏览 + 无可用流派。 + + + 播放 %1$s + 收起 %1$s + 展开 %1$s + 编辑艺术家图片 + 更改照片 + 恢复默认 + 随机播放艺术家 + + + 唱片 %d + %1$s 的封面 + %1$s · %2$s + + + 未找到播放列表。 + 此播放列表为空。 + 点击“添加歌曲”开始。 + 此文件夹不包含歌曲。 + 对歌曲排序 + 更多选项 + 播放列表选项 + 编辑播放列表 + 删除播放列表 + 删除播放列表? + 您确定要删除此播放列表吗? + 设置默认过渡效果 + 导出播放列表 + %1$s • %2$s + 播放 + 添加 + 添加歌曲 + 移除 + 移除歌曲 + 重新排序 + 重新排序歌曲 + + + 全局过渡效果 + 播放列表规则 + 除非被覆盖,否则此配置适用于所有播放源。 + 为此特定播放列表配置默认行为。 + 活动状态 + 全局默认 + 播放列表默认 + 跟随全局 + 自定义覆盖 + 自定义覆盖 + 启用以设置此播放列表的具体规则。 + 正在使用全局默认值 + 更改已成功保存 + 过渡样式 + 曲目之间如何混合 + + 淡入淡出 (Crossfade) + 过渡时长 + 总重叠时长 %1$d 秒 + 重置过渡效果 + 当前歌曲 + 下一首歌曲 + 曲目将重叠 %1$d 秒 + 音量曲线 + 微调音频斜率 + 淡出 + 淡入 + + + 新建智能播放列表 + 新建播放列表 + 添加歌曲 + 返回或取消 + 下一步 + 创建 + 编辑播放列表 + 自动生成拼图 + 添加照片 + 选择图片 + 更改 + 移除 + 播放列表名称 + 我的超赞混音 + 编辑封面 + 调整您的封面图片 + 使用双指缩放和拖动手势找到完美的构图 + 手动 + 智能 + 使用 AI 生成 + 智能规则 + 默认 + 图片 + 图标 + 背景颜色 + 图标符号 + 形状样式 + 形状参数 + 圆角半径 + 平滑度 + 边数 + 曲线 + 旋转 + 缩放 + 播放最多 + 您播放次数最多的曲目。 + 最近播放 + 您最近听过的歌曲。 + 被遗忘的最爱 + 您有一段时间没听过的最爱曲目。 + 新发现 + 最近添加但播放次数较少的曲目。 + + + 快速填充流派 + 排序与播放 + 随机播放 + 排序依据 + 艺术家 + 专辑 + 标题 + 通用艺术家 + 随机播放 %1$s + + + 选择歌曲 + 选择流派 + 搜索歌曲 + 新建流派 + 添加自定义 + 添加自定义流派 + 流派名称 + 选择图标 + 流派:%1$s + 选择一个流派 + 快速填充 + + + DJ 空间 + 正在加载… + 打碟机 %1$d + 加载歌曲 + 未加载歌曲 + + 音轨分离 (Stem separation) 功能暂不可用。 + 音量 + 速度 + 交叉推子 + 打碟机 1 + 打碟机 2 + 选择一首歌曲 + 播放/暂停 + 歌曲封面 + x%1$.2f + diff --git a/app/src/main/res/values-zh-rTW/strings_settings.xml b/app/src/main/res/values-zh-rTW/strings_settings.xml new file mode 100644 index 000000000..feae1075f --- /dev/null +++ b/app/src/main/res/values-zh-rTW/strings_settings.xml @@ -0,0 +1,652 @@ + + + + 音乐管理 + 管理文件夹、刷新媒体库、解析选项 + 外观 + 主题、布局和视觉样式 + 播放 + 音频行为、淡入淡出和后台播放 + 行为 + 手势、触感反馈和导航行为 + AI 集成 (β) + AI 提供商、API 密钥和模型设置 + 备份与恢复 + 导出和恢复您的个人应用数据 + 开发者选项 + 实验性功能和调试 + 均衡器 + 调整音频频率和预设 + 设备性能 + 音频规格、编解码器和解码器信息 + 账户 + 管理 Telegram、Google Drive、网易云音乐等服务 + 关于 + 应用信息、版本和鸣谢 + + + + + 已启用 + 已禁用 + 打开 + 全选 + 清除选择 + 关闭通知 + + + 媒体库结构 + 排除的目录 + 扫描媒体库时将跳过此处的文件夹。 + 艺术家 + 多艺术家解析和整理选项。 + 过滤 + 最小歌曲时长 + 每张专辑最少曲目数 + 专辑封面缓存限制 + 同步与扫描 + 刷新媒体库 + 扫描整个媒体库以查找新增和修改的文件。 + 完全重新扫描 + 正在运行完全重新扫描 + 已开始完全重新扫描… + 媒体库同步完成 + 重建数据库 + 重建数据库? + 这将从头开始完全重建您的音乐库。所有导入的歌词、收藏和自定义元数据都将丢失。此操作无法撤销。 + 重建 + 正在重建数据库 + 正在重建数据库… + 自动扫描 .lrc 文件 + 在同步媒体库时,自动扫描并分配同一文件夹中的 .lrc 文件。 + 歌词管理 + 歌词来源优先级 + 选择获取歌词时优先尝试的来源。 + 内嵌优先 + 在线优先 + 本地 (.lrc) 优先 + 重置已导入的歌词 + 从数据库中移除所有已导入的歌词。 + 重置已导入的歌词? + 此操作无法撤销。 + + + 刷新 + 默认允许所有内容。点击文件夹将其标记为免扫描。 + 此处无子文件夹 + 向上导航 + 转到根目录 + + + 需要重新扫描 + 艺术家设置已更改。请重新扫描媒体库以应用更改。 + 重新扫描 + 正在扫描… + 多艺术家解析 + 字符分隔符 + 当前:%1$s + 单词分隔符 + + 当前:%1$s + 配置 + 从标题提取艺术家 + 检测歌曲标题中的 feat.、ft.、with + 媒体库整理 + 按专辑艺术家分组 + 在主要艺术家下显示合作专辑 + 关于多艺术家解析 + + PixelPlayer 使用字符分隔符(/、;、&)和单词分隔符(feat.、ft.、vs.、x)来拆分艺术家标签。单词分隔符不区分大小写。 + “从标题提取艺术家”会检测歌曲标题中如 (feat. Artist) 的模式。 + 反斜杠 (\) 可用于转义字符分隔符。 + + 示例 + \u2192 + \u266A + \"Artist1/Artist2\" + Artist1, Artist2 + \"Drake feat. Rihanna\" + Drake, Rihanna + \"Marshmello x Bastille\" + Marshmello, Bastille + \"Song (ft. B)\" by A + A, B + \"AC\\DC\" + AC/DC(已转义) + + + 分隔符 + 当前分隔符 + 点击分隔符将其移除。至少需要一个分隔符。 + 添加新分隔符 + 例如:/ 或 ; + 添加分隔符 + 默认分隔符 + 重置分隔符? + 这将清除您所有自定义的分隔符并恢复默认设置。此操作无法撤销。 + 分隔符已重置为默认 + 至少需要一个分隔符 + 已添加分隔符 + 分隔符已存在或无效 + 空格 + + + 单词分隔符 + 当前单词分隔符 + 当这些关键词前后有空格时,会分割艺术家名称。匹配不区分大小写。点击以移除。 + 未配置单词分隔符 + 添加新单词分隔符 + 例如:feat. 或 ft. + 添加单词分隔符 + 单词分隔符的工作原理 + 单词分隔符不区分大小写,且要求前后有空格。\n\n单字符分隔符(如 \"x\")需要在两侧都留有空格以避免误匹配。\n\n示例:\n \"Drake feat. Rihanna\" -> Drake, Rihanna\n \"Marshmello x Bastille\" -> Marshmello, Bastille\n \"A vs. B\" -> A, B + 重置单词分隔符? + 这将清除您所有自定义的单词分隔符并恢复默认关键词。此操作无法撤销。 + 已添加单词分隔符 + 已存在或无效 + 单词分隔符已重置为默认 + + + 正在准备同步 + 正在读取 MediaStore + 正在处理曲目 + 正在保存到数据库 + 正在扫描歌词文件 + 正在清理专辑封面缓存 + 正在同步云端源 + 正在完成同步 + %1$s • %2$d%% (%3$d/%4$d) + %1$s… + + + 全局主题 + 应用语言 + 选择应用界面的语言。 + 跟随系统 + 英语 + 西班牙语 + 德语 + 法语 + 俄语 + 简体中文 + 繁體中文 + 日語 + 越南語 + 印尼語 + 意大利语 + 韩语 + 挪威语(Bokmål) + 土耳其语 + 应用主题 + 在浅色、深色之间切换,或跟随系统外观。 + 浅色主题 + 深色主题 + 跟随系统 + 使用平滑圆角 + 使用复杂的圆角形状以有效提升美观度,但可能会影响低端设备的性能 + 关闭模糊效果 + 在应用中关闭模糊效果以节省电量和资源。 + 显示滚动条 + 在音乐列表中显示侧边滚动条,便于快速滚动。 + 正在播放 + 播放器主题 + 选择悬浮播放器的外观。 + 专辑封面 + 系统动态主题 + 显示播放器文件信息 + 在播放器进度部分显示编解码器、比特率和采样率。 + 专辑封面调色板样式 + 当前:%1$s。打开实时预览并选择样式。 + 轮播图样式 + 选择专辑轮播图的外观。 + 无预览 (No Peek) + 单预览 (One Peek) + 首页拼图 + 拼图模式 + 为“你的推荐”拼图选择形状排列方式。 + 自动轮换模式 + 每次访问首页时循环切换拼图模式。 + 导航栏 + 导航栏样式 + 选择导航栏的外观。 + 默认 + 全宽 + 紧凑模式 + 仅显示图标并降低导航栏高度。 + 导航栏圆角半径 + 调整导航栏的圆角半径。 + 歌词界面 + 沉浸式歌词 + 自动隐藏控件并放大文本。 + 自动隐藏延迟 + 控件隐藏前的时间。 + 3秒 + 4秒 + 5秒 + 6秒 + 应用导航 + 默认选项卡 + 选择默认启动时的选项卡。 + 首页 + 搜索 + 媒体库 + 媒体库导航 + 选择在媒体库选项卡之间移动的方式。 + 标签栏(默认) + 紧凑胶囊与网格 + + + 颜色 + 调色板样式 + 为播放器界面选择专辑颜色。 + 柔和 (Tonal Spot) + 平衡且平静。 + 鲜艳 (Vibrant) + 高饱和度点缀。 + 表现力 (Expressive) + 大胆的色调变化和对比。 + 混搭 (Fruit Salad) + 俏皮的旋转点缀。 + 色彩准确度 + 0 表示保持当前调整。值越高越接近专辑封面的主色调。 + 当前 + 更准确 + 0 • 当前 + %1$d • 微妙 + %1$d • 平衡 + %1$d • 精确 + + + 调整圆角半径 + 使导航栏形状的圆角与设备的物理圆角相匹配,以获得无缝的外观。 + 圆角半径 + %1$d dp + + + 后台播放 + 关闭后继续播放 + 如果关闭此项,从最近任务中移除应用将停止播放。 + 电池优化 + 禁用电池优化以防止播放中断。 + 电池优化已被禁用 + 无法打开电池设置 + 音量标准化 (ReplayGain) + 启用 ReplayGain + 使用音频文件中的 ReplayGain 元数据标准化音量。 + 增益模式 + 曲目:对每首歌曲进行标准化。专辑:按专辑进行标准化。 + 曲目 + 专辑 + 投屏 + 连接/断开投屏时自动播放 + 切换投屏连接后立即开始播放。 + 耳机 + 耳机重新连接时恢复播放 + 如果播放因拔出耳机而暂停,则在重新连接时自动恢复。 + 队列与过渡 + 淡入淡出 + 启用歌曲之间的平滑过渡。 + 淡入淡出时长 + Hi-Fi 模式 + 浮点 32 位音频输出。如果您的设备播放卡顿,请禁用此项。 + 此设备不支持(PCM_FLOAT AudioTrack 不可用)。 + 持久随机播放 + 即使关闭应用后也能记住随机播放设置。 + 显示队列历史记录 + 在队列中显示以前播放过的歌曲。 + + + 文件夹 + 返回手势控制文件夹 + 在“文件夹”选项卡中,系统返回手势会在离开媒体库之前导航文件夹层级。 + 播放器手势 + 点击背景关闭播放器 + 点击模糊的背景以关闭播放器面板。 + 触感反馈 + 触感反馈 + 在整个应用中启用震动反馈。 + + + AI 提供商 + 提供商 + 选择您的 AI 提供商 + 安全 Token 模式 + 开启 — 快速且低成本。向 AI 发送最少的数据(约 1K token)。 + 关闭 — 深度上下文。发送完整的听歌偏好资料(约 8K token)以获得更丰富的结果。 + 凭据 + %1$s API 密钥 + 从 %1$s 获取 + Google AI Studio (aistudio.google.com) + DeepSeek 平台 (api.deepseek.com) + Groq 控制台 (console.groq.com) + Mistral AI 平台 (console.mistral.ai) + NVIDIA Build (build.nvidia.com) + 月之暗面 (Moonshot) AI 平台 (platform.moonshot.cn) + 智谱 AI 开放平台 (bigmodel.cn) + OpenAI 平台 (platform.openai.com) + 模型选择 + 正在加载可用模型… + 加载模型失败 + AI 模型 + 选择一个模型。 + 输入 API 密钥 + 提示词行为 + 系统提示词 (System Prompt) + 自定义 AI 的行为方式。 + 预设提示词 + 输入系统提示词… + 专业策展人 (Professional Curator) + 你是“Vibe-Engine”,一位世界级的音乐策展人和声音心流大师。你的目标是构建无缝、高保真的听觉体验。请优先考虑和声兼容性、符合逻辑的 BPM 过渡,并在熟悉的挚爱与富有品味、逻辑驱动的发现之间取得精妙平衡。 + 创意先锋 (Creative Maverick) + 你是一位前卫的音乐探索者,专注于“意想不到的凝聚力”。你的任务是通过识别非显而易见的声音共性来打破传统的流派界限。在保持令人惊讶但不可否认的过渡逻辑的同时,优先考虑罕见的深度曲目、实验性纹理和艺术新意。 + 严谨图书管理员 (Strict Librarian) + 你是一位精准的音乐数据库架构师。你的逻辑由绝对的元数据精确性和严格的分类界限所驱动。尽量减少算法发现,优先保持严格的流派一致性、能量水平匹配,并最大程度地检索出用户定义的高度具体的偏好。 + 氛围向导 (Atmospheric Guide) + 你是环境纹理和低能量心流的大师。专心挑选能够促进“深度专注”或“宁静”状态的曲目。优先选择原声的温暖感、极简主义的编曲和柔和的过渡,同时严格避免瞬态强烈的声音或动态范围的突然转变。 + 声音狂热者 (Sonic Enthusiast) + 你是一位专注于制作复杂性和配器的发烧友分析师。优先选择具有高动态范围、复杂多重节奏和卓越声场质量的曲目。偏好那些奖励听众关注技术保真度和编曲细节的主动聆听作品。 + 能量催化剂 (Energy Catalyst) + 你是一个高动量的节奏生成器。你的哲学以驱动感强的低音线、强烈的打击乐和极具感染力的律动为中心。优先考虑高 BPM 的夜店兼容性、切分音能量和持续的节奏张力,以使听众的心率和动力保持在最高水平。 + AI 使用报告 + 总消耗量 + %1$s token 追踪\n提示:%2$s | 输出:%3$s | 思考:%4$s + 清除日志 + AI 活动日志 (%1$d) + %1$s · %2$s + 显示 + 隐藏 + + + 备份的工作原理 + 选择版块,导出一个 .pxpl 文件,并在稍后导入它。恢复操作仅替换您选择的版块。 + 创建备份 + 导出备份 + 未选择版块。 + 已选择所有版块。 + 已选择 %1$d 个版块,共 %2$d 个。 + %1$s 创建一个 .pxpl 备份文件。 + 选择并导出 + 恢复备份 + 导入备份 + 选择并恢复 + 浏览或从最近的备份中选择。所选数据将替换当前数据。 + + + 确切选择您想包含在备份包中的内容。 + 选择一个 .pxpl 备份文件进行检查。您将在下一步选择要恢复的版块。 + 已选择 %1$d 个版块,共 %2$d 个 + 已选择 %1$d 个模块,共 %2$d 个 + 最近的备份 + 没有最近的备份 + 以前导入的备份将显示在这里。 + %1$d 个条目 · 将替换当前数据 + 导出 .pxpl + 恢复所选项 + 正在传输… + PixelPlayer_Backup_%1$d.pxpl + 正在创建备份 + 正在恢复备份 + %1$d%% + %1$s • %2$s + 正在导出 + 正在导入 + 正在恢复 + 从历史记录中移除 + 正在检查… + 浏览文件 + 第 %1$d 步,共 %2$d 步 + 恢复模块 + 备份详情 + 创建时间 + 应用版本 + 架构 (Schema) + 设备 + 未知 + · %1$s + %1$d 个模块 · v%2$s · 架构 v%3$d + \? + 全选 + 取消全选 + + + 无效备份:%1$s + 正在准备恢复 + 正在启动恢复任务。 + 正在准备备份 + 正在启动备份任务。 + 备份恢复成功 + 恢复完成,但存在一些未解决的问题。 + 无法完成恢复:%1$s + 恢复失败:%1$s + 数据导出成功 + 导出失败:%1$s + 数据恢复成功 + 恢复完成,存在未解决的问题。失败:%1$s + v%1$d + %1$s %2$s + + + 实验性功能 + 实验性 + 播放器界面加载实验和开关。 + 测试设置流程 + 启动新手引导设置界面进行测试。 + 维护 + 强制重新生成 Daily Mix + 立即重新创建每日推荐播放列表。 + 重新生成 Daily Mix + 重新生成 Daily Mix? + 这将丢弃当前的推荐,并根据最近的听歌习惯生成一个新的。 + Daily Mix 重新生成已开始 + 强制重新生成统计数据 + 清除缓存并重新计算播放统计数据。 + 重新生成 + 正在处理… + 重新生成统计数据 + 重新生成统计数据? + 这将清除统计数据缓存并强制从数据库历史记录重新计算。 + 统计数据重新生成已开始 + 强制重新生成专辑调色板 + 重建每张专辑封面的所有缓存调色板变体,或选择单个进行刷新。 + 全部重新生成 + 重新生成所有专辑调色板? + 这将清除缓存的主题数据,并重建 %1$d 个唯一专辑封面的所有调色板样式。 + 正在重新生成… + 正在重新生成专辑调色板… + 正在重建 %1$d 个唯一专辑封面的缓存调色板变体。在大型媒体库中这可能需要一些时间。 + 已完成 %1$d 个,共 %2$d 个 + 已重新生成 %1$d 个专辑封面调色板 + 已重新生成 %1$d 个(共 %2$d 个)专辑封面调色板 + 选择歌曲 + 选择一首歌曲以清除缓存的主题数据,并从专辑封面重新生成所有调色板样式。 + 按标题、艺术家或专辑搜索 + 没有与您搜索匹配的歌曲。 + 未找到带有专辑封面的歌曲。 + 正在重新生成调色板… + 已为 %1$s 重新生成调色板 + 无法为 %1$s 重新生成调色板 + 诊断 + 触发测试崩溃 + 模拟一次崩溃以测试崩溃报告系统。 + 测试崩溃是从开发者选项触发的 - 这是为了测试崩溃报告系统的有意行为 + + + 实验性 + 播放器界面加载调整 + 动画歌词(高端设备) + 为歌词使用弹簧动画和视觉效果。在低端设备上可能导致掉帧。 + 歌词模糊效果 + 对非活动歌词应用景深模糊。 + 模糊强度 + 调整模糊效果的强度。 + %1$.1fx + 第 1 步 · 选择要延迟的内容 + 延迟所有内容 + 在面板背景完全展开之前,保留所有播放器内容。 + 专辑轮播 + 在面板展开前延迟专辑封面和轮播图。 + 歌曲元数据 + 延迟标题、艺术家以及歌词/队列操作。 + 进度条 + 在展开完成之前延迟时间轴和时间标签。 + 播放控制 + 延迟播放/暂停、快进/快退和收藏控件。 + 所有延迟组件均处于活动状态。禁用“延迟所有内容”以自定义各个部分。 + 第 2 步 · 配置占位图行为 + 对延迟项使用占位图 + 在组件等待展开时渲染轻量级占位图,以保持布局稳定。 + 第 3 步 · 选择占位图切换为真实内容的时机 + 选择一种模式。阈值模式使用滑块;拖动释放模式等待直到您释放面板手势。 + 启用至少一个延迟组件以解锁触发模式。 + 阈值 + 使用展开百分比。 + 拖动释放 + 仅在手势释放后切换。 + 展开阈值 + 在延迟组件变得可见之前,面板必须展开的程度。 + 内容在 %1$d%% 展开时出现 + 在播放器关闭时也应用 + 使用关闭阈值在折叠时切换回占位图。 + 关闭阈值 + 在占位图再次接管之前需要折叠多少程度。 + 占位图在折叠 %1$d%% 后出现 + 拖动释放模式会绕过阈值和关闭行为。交换仅在面板拖动手势结束时发生。 + 使占位图透明 + 占位图保留其布局空间,但变为不可见。 + 视觉质量 + 专辑封面分辨率 + 低 (256px) - 更好的性能 + 中等 (512px) - 均衡 + 高 (800px) - 最佳质量 + 原图 - 最高质量 + + + 播放需检查 + 准备就绪可播放 + -- + 格式 + 硬件解码 + 本地歌曲 + 本地音乐存储 + 音乐大小 + %1$d 首本地歌曲 + 可用空间 + 总计 %1$s + 音乐占用 + 设备已用 + %1$d%% + <1% + %1$d 首云端歌曲 + %1$d 个文件不可读 + 播放路径 + + + 采样率 + %1$d Hz + 每个缓冲区 %1$d 帧 + Hi-Fi PCM 浮点 + 32 位浮点输出路径 + 低延迟支持 + Pro Audio 支持 + 内存 + 可用(总计 %1$s) + 支持硬件卸载的格式 + 没有压缩格式报告支持硬件卸载 (hardware offload)。 + 还有 +%1$d 个 + 检测到的输出 + 内置输出 + 蓝牙音频 + USB 音频 + 有线音频 + 数字输出 + 其他输出 + Android 未报告任何输出路由。 + ExoPlayer 引擎 + %1$s 个渲染器 + 格式兼容性 + %1$d 首支持的曲目 + %1$d 个未知格式 + 未报告解码器 + 硬件解码器 + 软件解码器 + 硬件卸载 + 媒体库中有 %1$d 首 + 兼容性检测结果 + 无重大不兼容问题 + 您已索引的曲目与 Android 报告此设备支持的解码器相匹配。 + %1$d 首曲目可能无法原生解码 + 需检查的格式:%1$s。 + %1$d 首本地曲目可能会被重采样 + 媒体库采样率达到 %1$d Hz,高于当前的输出采样率。 + %1$d 首曲目具有未知的元数据 + 进行完整的媒体库重新扫描可以填补缺失的 MIME、比特率和采样率数据。 + 设备信息 + 制造商 + 型号 + 品牌 + 设备 + Android 版本 + SDK 版本 + 硬件 + 性能报告 + 生成一份可分享的诊断报告,以帮助我们分类播放或扫描卡顿问题。该报告仅包含设备、媒体库和计时数据 — 不包含文件路径、标题或艺术家。 + 生成报告 + 重新生成 + 复制 + 分享 + 报告已复制到剪贴板 + PixelPlayer 性能报告 + 高级性能诊断 + 默认关闭。用于记录短暂卡顿时间线,便于测试版问题排查。 + 有效期至 %1$s + 立即标记卡顿 + 已标记卡顿时刻 + + + 已连接的账户 + 管理关联的提供商并将每个集成功能掌握在自己手中。 + 已关联服务 + 活跃 + 可用 + 敬请期待 + 已连接 + 敬请期待 + 打开服务 + 正在登出… + 尚未关联任何账户 + 连接一个提供商即可在此界面对其进行管理。 + 连接 %1$s + %1$s(敬请期待) + Google Drive 功能即将推出。 + 目前无法打开此屏幕。 + + + 关于 + PixelPlayer + 由社区共同打造的开源音乐播放器。 + 版本 v%1$s + 开源 + 社区优先 + Material 3 表现力设计 + 目前未找到贡献者。请稍后再试。 + 维护者 + PixelPlayer 背后的开发者。 + 社区焦点 + 感谢对本项目有重大影响的合作者。 + 开源贡献者 + 来自 GitHub 的实时贡献者名单。 + %1$d 次贡献 + GitHub + 代码仓库 + Telegram + 支持 + 打开 GitHub 仓库 + 加入 Telegram 社区 + 打开 GitHub 个人资料 + 打开 Telegram + %1$s 的头像 + %1$s 的图标 + 音量 + 音量为零时暂停 + 当音量设置为 0 时自动暂停播放 + diff --git a/app/src/main/res/values-zh-rTW/strings_widget.xml b/app/src/main/res/values-zh-rTW/strings_widget.xml new file mode 100644 index 000000000..5a2fd3c03 --- /dev/null +++ b/app/src/main/res/values-zh-rTW/strings_widget.xml @@ -0,0 +1,17 @@ + + + 可根据尺寸自适应的响应式小组件 + 紧凑型播放栏 + 包含随机和循环播放的完整控件 + 极简方形播放器 + + 点击打开 + 专辑封面 + 专辑封面占位图 + + 点击播放 + 歌曲标题 + 艺术家 + + 进度条,%1$d%% + \ No newline at end of file From b98c567bdfb9309d491a9d36ec96f44c9cd853ba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Jun 2026 22:23:58 +0000 Subject: [PATCH 10/12] chore(deps): bump the github-actions group with 2 updates Bumps the github-actions group with 2 updates: [actions/checkout](https://github.com/actions/checkout) and [actions/cache](https://github.com/actions/cache). Updates `actions/checkout` from 6 to 7 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v6...v7) Updates `actions/cache` from 5 to 6 - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: actions/cache dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql.yml | 2 +- .github/workflows/nightly-apk.yml | 4 ++-- .github/workflows/phone-debug.yml | 2 +- .github/workflows/phone-release.yml | 4 ++-- .github/workflows/wearos-apk.yml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index d4bb1bac0..2841e1ae2 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -21,7 +21,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@v7 - name: Set up JDK 21 uses: actions/setup-java@v5 diff --git a/.github/workflows/nightly-apk.yml b/.github/workflows/nightly-apk.yml index 12a85bebe..c3b4a3bfe 100644 --- a/.github/workflows/nightly-apk.yml +++ b/.github/workflows/nightly-apk.yml @@ -85,7 +85,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@v7 - name: Set up JDK 21 uses: actions/setup-java@v5 @@ -98,7 +98,7 @@ jobs: - name: Cache nightly keystore id: cache-keystore - uses: actions/cache@v5 + uses: actions/cache@v6 with: path: vz-pixelplay.jks key: ${{ runner.os }}-nightly-keystore-vz-pixelplay diff --git a/.github/workflows/phone-debug.yml b/.github/workflows/phone-debug.yml index 91d799be5..4c54d81b1 100644 --- a/.github/workflows/phone-debug.yml +++ b/.github/workflows/phone-debug.yml @@ -18,7 +18,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@v7 - name: Set up JDK 21 uses: actions/setup-java@v5 diff --git a/.github/workflows/phone-release.yml b/.github/workflows/phone-release.yml index 14cd88749..34774a81b 100644 --- a/.github/workflows/phone-release.yml +++ b/.github/workflows/phone-release.yml @@ -18,7 +18,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@v7 - name: Set up JDK 21 uses: actions/setup-java@v5 @@ -31,7 +31,7 @@ jobs: - name: Cache keystore id: cache-keystore - uses: actions/cache@v5 + uses: actions/cache@v6 with: path: vz-pixelplay.jks key: ${{ runner.os }}-keystore-vz-pixelplay diff --git a/.github/workflows/wearos-apk.yml b/.github/workflows/wearos-apk.yml index 862829a51..c0218dfa9 100644 --- a/.github/workflows/wearos-apk.yml +++ b/.github/workflows/wearos-apk.yml @@ -18,7 +18,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@v7 - name: Set up JDK 21 uses: actions/setup-java@v5 From dce462d2e9c4d4b47ad2ad7b8840d7f64609dde3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Jun 2026 22:28:13 +0000 Subject: [PATCH 11/12] chore(deps): bump the gradle-dependencies group with 2 updates Bumps the gradle-dependencies group with 2 updates: [gradle-wrapper](https://github.com/gradle/gradle) and [com.google.genai:google-genai](https://github.com/googleapis/java-genai). Updates `gradle-wrapper` from 9.5.1 to 9.6.0 - [Release notes](https://github.com/gradle/gradle/releases) - [Commits](https://github.com/gradle/gradle/compare/v9.5.1...v9.6.0) Updates `com.google.genai:google-genai` from 1.58.0 to 1.60.0 - [Release notes](https://github.com/googleapis/java-genai/releases) - [Changelog](https://github.com/googleapis/java-genai/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/java-genai/compare/v1.58.0...v1.60.0) --- updated-dependencies: - dependency-name: gradle-wrapper dependency-version: 9.6.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: gradle-dependencies - dependency-name: com.google.genai:google-genai dependency-version: 1.60.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: gradle-dependencies ... Signed-off-by: dependabot[bot] --- gradle/libs.versions.toml | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 ++-- gradlew | 4 ++-- gradlew.bat | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4a104ce63..c1f463bff 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,7 @@ accompanistDrawablepainter = "0.37.3" agp = "9.2.1" app = "1.7.0" -googleGenai = "1.58.0" +googleGenai = "1.60.0" googlePlayServicesCast = "22.3.1" animation = "1.11.3" appcompat = "1.7.1" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 116d9acdb..dcf577fe3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=bafc141b619ad6350fd975fc903156dd5c151998cc8b058e8c1044ab5f7b031f -distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.1-bin.zip +distributionSha256Sum=bbaeb2fef8710818cf0e261201dab964c572f92b942812df0c3620d62a529a01 +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.0-bin.zip networkTimeout=10000 retries=0 retryBackOffMs=500 diff --git a/gradlew b/gradlew index b9bb139f7..249efbb03 100755 --- a/gradlew +++ b/gradlew @@ -20,7 +20,7 @@ ############################################################################## # -# Gradle start up script for POSIX generated by Gradle. +# gradlew start up script for POSIX generated by Gradle. # # Important for running: # @@ -29,7 +29,7 @@ # bash, then to run this script, type that shell name before the whole # command line, like: # -# ksh Gradle +# ksh gradlew # # Busybox and similar reduced shells will NOT work, because this script # requires all of these POSIX shell features: diff --git a/gradlew.bat b/gradlew.bat index aa5f10b06..8508ef684 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -19,7 +19,7 @@ @if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem -@rem Gradle startup script for Windows +@rem gradlew startup script for Windows @rem @rem ########################################################################## @@ -72,7 +72,7 @@ echo location of your Java installation. 1>&2 -@rem Execute Gradle +@rem Execute gradlew @rem endlocal doesn't take effect until after the line is parsed and variables are expanded @rem which allows us to clear the local environment before executing the java command endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel From 8607ca0ea72a714c15cb1de5689f15a62116118a Mon Sep 17 00:00:00 2001 From: Dae Euhwa Date: Wed, 24 Jun 2026 21:26:10 -0500 Subject: [PATCH 12/12] File cleanup --- message.txt | 89 ----------------------------------------------------- 1 file changed, 89 deletions(-) delete mode 100644 message.txt diff --git a/message.txt b/message.txt deleted file mode 100644 index 167d87d48..000000000 --- a/message.txt +++ /dev/null @@ -1,89 +0,0 @@ -PixelPlayer on  master [!] via  v9.5.1 via  v21.0.11 via  v2.4.0 -❯ ./gradlew assembleDebug --no-daemon -To honour the JVM settings for this build a single-use Daemon process will be forked. For more on this, please refer to https://docs.gradle.org/9.5.1/userguide/gradle_daemon.html#sec:disabling_the_daemon in the Gradle documentation. -Daemon will be stopped at the end of the build -Calculating task graph as no cached configuration is available for tasks: assembleDebug - -> Task :app:stripDebugDebugSymbols -Unable to strip the following libraries, packaging them as they are: libandroidx.graphics.path.so, libffmpegJNI.so, libtaglib.so, libtdjni.so. Run with --info option to learn more. - -> Task :wear:stripDebugDebugSymbols -Unable to strip the following libraries, packaging them as they are: libandroidx.graphics.path.so. Run with --info option to learn more. - -> Task :app:compileDebugKotlin -w: The argument '-Xannotation-default-target=param-property' is redundant for the current language version 2.4. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/data/database/PixelPlayDatabase.kt:294:34 The corresponding parameter in the supertype 'Migration' is named 'db'. This may cause problems when calling this function with named arguments. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/data/database/PixelPlayDatabase.kt:305:34 The corresponding parameter in the supertype 'Migration' is named 'db'. This may cause problems when calling this function with named arguments. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/data/network/navidrome/NavidromeApiService.kt:518:64 Expression is unused. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/data/remote/qqmusic/QQSignGenerator.kt:80:29 'var allowFileAccessFromFileURLs: Boolean' is deprecated. Deprecated in Java. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/data/remote/qqmusic/QQSignGenerator.kt:81:29 'var allowUniversalAccessFromFileURLs: Boolean' is deprecated. Deprecated in Java. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/data/repository/MediaStoreSongRepository.kt:385:45 No cast needed. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/data/telegram/TelegramRepository.kt:198:49 'when' expression over a subject of type 'Any?' is not exhaustive. Add a 'null' or 'else' branch. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/data/telegram/TelegramRepository.kt:222:53 'when' expression over a subject of type 'Any?' is not exhaustive. Add a 'null' or 'else' branch. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/AiMetadataSheet.kt:52:22 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/AiPlaylistSheet.kt:87:22 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/AlbumMultiSelectionOptionSheet.kt:66:22 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/CastBottomSheet.kt:336:22 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/CustomPresetsSheet.kt:54:22 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/DailyMixMenu.kt:31:22 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/EditSongSheet.kt:890:30 'fun rememberTransformableState(onTransformation: (Float, Offset, Float) -> Unit): TransformableState' is deprecated. Prefer remembering a TransformableState with a onTransformation lambda that takes the centroid. This centroid (if specified) is the point at which zooming or rotation should happen around which allows for more natural transformations. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/EditSongSheet.kt:1039:37 Condition is always 'true'. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/GenreMultiSelectionOptionSheet.kt:68:22 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/GenreSortBottomSheet.kt:55:22 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/LibrarySortBottomSheet.kt:80:22 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/LyricsSheet.kt:457:26 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/MultiSelectionBottomSheet.kt:112:22 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/PlaylistBottomSheet.kt:67:22 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/PlaylistMultiSelectionBottomSheet.kt:91:22 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/ReorderTabsSheet.kt:109:22 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/ReorderTabsSheet.kt:124:41 'static field FLAG_IGNORE_GLOBAL_SETTING: Int' is deprecated. Deprecated in Java. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/RoundedParallaxCarousell.kt:578:59 Redundant call of conversion method. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/RoundedParallaxCarousell.kt:578:82 Redundant call of conversion method. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/SongInfoBottomSheet.kt:332:22 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/SongInfoBottomSheet.kt:777:61 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/SongPickerBottomSheet.kt:107:22 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/StreamingProviderSheet.kt:52:30 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/TimerOptionsBottomSheet.kt:78:22 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/components/player/FullPlayerContent.kt:983:34 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/screens/DeviceCapabilitiesScreen.kt:307:28 'val LocalClipboardManager: ProvidableCompositionLocal' is deprecated. Use LocalClipboard instead which supports suspend functions. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/screens/HomeScreen.kt:255:22 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/screens/HomeScreen.kt:256:26 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/screens/LibraryMediaTabs.kt:223:39 No cast needed. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/screens/LibraryMediaTabs.kt:534:39 No cast needed. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/screens/LibraryScreen.kt:2657:22 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/screens/LibrarySongsTab.kt:225:39 No cast needed. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/screens/MashupScreen.kt:69:22 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/screens/PlaylistDetailScreen.kt:818:26 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/screens/SettingsCategoryScreen.kt:297:39 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/screens/StatsScreen.kt:220:13 Expression is unused. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/telegram/channel/TelegramChannelSearchSheet.kt:78:22 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/telegram/dashboard/TelegramDashboardScreen.kt:706:22 'fun rememberModalBottomSheetState(skipPartiallyExpanded: Boolean = ..., confirmValueChange: (SheetValue) -> Boolean = ...): SheetState' is deprecated. Use rememberBottomSheetState with Hidden initial value. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/AccountsViewModel.kt:117:67 No cast needed. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/AccountsViewModel.kt:118:62 No cast needed. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/AccountsViewModel.kt:119:66 No cast needed. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/AccountsViewModel.kt:120:56 No cast needed. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/AccountsViewModel.kt:121:70 No cast needed. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/AccountsViewModel.kt:122:68 No cast needed. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/CastStateHolder.kt:199:22 This declaration overrides a deprecated member but is not marked as deprecated itself. Add the '@Deprecated' annotation or suppress the diagnostic. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/CastTransferStateHolder.kt:1036:34 Unnecessary safe call on a non-null receiver of type 'HttpURLConnection'. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/ConnectivityStateHolder.kt:334:49 Unnecessary safe call on a non-null receiver of type 'String'. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/ConnectivityStateHolder.kt:509:33 'val connectionInfo: WifiInfo!' is deprecated. Deprecated in Java. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/GenreDetailViewModel.kt:161:61 Elvis operator (?:) always returns the left operand of non-nullable type 'String'. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/GenreDetailViewModel.kt:198:82 Elvis operator (?:) always returns the left operand of non-nullable type 'String'. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/GenreDetailViewModel.kt:199:80 Elvis operator (?:) always returns the left operand of non-nullable type 'String'. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/GenreDetailViewModel.kt:281:57 Elvis operator (?:) always returns the left operand of non-nullable type 'String'. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/GenreDetailViewModel.kt:282:58 Elvis operator (?:) always returns the left operand of non-nullable type 'String'. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/GenreDetailViewModel.kt:284:65 Elvis operator (?:) always returns the left operand of non-nullable type 'String'. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/GenreDetailViewModel.kt:296:56 Elvis operator (?:) always returns the left operand of non-nullable type 'String'. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/GenreDetailViewModel.kt:297:57 Elvis operator (?:) always returns the left operand of non-nullable type 'String'. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/PlaybackStateHolder.kt:701:45 Unnecessary safe call on a non-null receiver of type 'Song'. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/PlayerViewModel.kt:153:40 'fun set(index: Int, element: Song): PersistentList' is deprecated. Use replacingAt() instead. For more details, read the documentation for this function. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/PlayerViewModel.kt:159:40 'fun removeAt(index: Int): PersistentList' is deprecated. Use removingAt() instead. For more details, read the documentation for this function. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/PlayerViewModel.kt:166:10 'fun removeAt(index: Int): PersistentList' is deprecated. Use removingAt() instead. For more details, read the documentation for this function. -w: file:///home/dae/VZ_Dev/work/PixelPlayer/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/PlayerViewModel.kt:167:10 'fun add(index: Int, element: Song): PersistentList' is deprecated. Use addingAt() instead. For more details, read the documentation for this function. - -[Incubating] Problems report is available at: file:///home/dae/VZ_Dev/work/PixelPlayer/build/reports/problems/problems-report.html - -BUILD SUCCESSFUL in 10m 43s -115 actionable tasks: 114 executed, 1 up-to-date -Configuration cache entry stored.