diff --git a/CHANGELOG.md b/CHANGELOG.md index 65dc2e457..66166bb82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,11 @@ All notable changes to Stability Matrix will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning 2.0](https://semver.org/spec/v2.0.0.html). +## v2.4.2 +### Added +- Added Japanese UI language option, thanks to kgmkm_mkgm for the translation +- Language selection available in Settings, and defaults to system language if supported + ## v2.4.1 ### Fixed - Fixed deleting checkpoints not updating the visual grid until the page is refreshed diff --git a/README.md b/README.md index 94eeac30e..73d111e4a 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,14 @@ Multi-Platform Package Manager for Stable Diffusion

+## Localization +Stability Matrix is now available in the following languages, thanks to our community contributors: +- 🇺🇸 English +- 🇯🇵 日本語 + - kgmkm_mkgm + +If you would like to contribute a translation, please create an issue or contact us on Discord. Include an email where we'll send an invite to our [POEditor](https://poeditor.com/) project. + ## License This repository maintains the latest source code release for Stability Matrix, and is licensed under the [GNU Affero General Public License](https://www.gnu.org/licenses/agpl-3.0.en.html). Binaries and executable releases are licensed under the [End User License Agreement](https://lykos.ai/license). diff --git a/StabilityMatrix.Avalonia/App.axaml b/StabilityMatrix.Avalonia/App.axaml index bf99f45c6..abaec107f 100644 --- a/StabilityMatrix.Avalonia/App.axaml +++ b/StabilityMatrix.Avalonia/App.axaml @@ -18,6 +18,7 @@ 700 + avares://StabilityMatrix.Avalonia/Assets/Fonts/NotoSansJP#Noto Sans JP diff --git a/StabilityMatrix.Avalonia/App.axaml.cs b/StabilityMatrix.Avalonia/App.axaml.cs index d97a9ee76..cbaa65d24 100644 --- a/StabilityMatrix.Avalonia/App.axaml.cs +++ b/StabilityMatrix.Avalonia/App.axaml.cs @@ -222,7 +222,11 @@ private static void ConfigureServiceProvider() if (settingsManager.TryFindLibrary()) { - Cultures.TrySetSupportedCulture(settingsManager.Settings.Language); + Cultures.SetSupportedCultureOrDefault(settingsManager.Settings.Language); + } + else + { + Cultures.TrySetSupportedCulture(Settings.GetDefaultCulture()); } Services.GetRequiredService().StartEventListener(); diff --git a/StabilityMatrix.Avalonia/Assets.cs b/StabilityMatrix.Avalonia/Assets.cs index c87070292..6b06b2eaf 100644 --- a/StabilityMatrix.Avalonia/Assets.cs +++ b/StabilityMatrix.Avalonia/Assets.cs @@ -16,9 +16,6 @@ internal static class Assets public static AvaloniaResource AppIconPng { get; } = new("avares://StabilityMatrix.Avalonia/Assets/Icon.png"); - public static AvaloniaResource RegionalFontJapanese { get; } = - new("avares://StabilityMatrix.Avalonia/Assets/Fonts/NotoSansJP-Variable.ttf"); - /// /// Fixed image for models with no images. /// diff --git a/StabilityMatrix.Avalonia/Assets/Fonts/NotoSansJP-Variable.ttf b/StabilityMatrix.Avalonia/Assets/Fonts/NotoSansJP-Variable.ttf deleted file mode 100644 index 505477e0d..000000000 Binary files a/StabilityMatrix.Avalonia/Assets/Fonts/NotoSansJP-Variable.ttf and /dev/null differ diff --git a/StabilityMatrix.Avalonia/Assets/Fonts/NotoSansJP/NotoSansJP-Regular.ttf b/StabilityMatrix.Avalonia/Assets/Fonts/NotoSansJP/NotoSansJP-Regular.ttf new file mode 100644 index 000000000..1583096a2 Binary files /dev/null and b/StabilityMatrix.Avalonia/Assets/Fonts/NotoSansJP/NotoSansJP-Regular.ttf differ diff --git a/StabilityMatrix.Avalonia/Assets/Fonts/NotoSansJP/NotoSansJP-SemiBold.ttf b/StabilityMatrix.Avalonia/Assets/Fonts/NotoSansJP/NotoSansJP-SemiBold.ttf new file mode 100644 index 000000000..cc72ab304 Binary files /dev/null and b/StabilityMatrix.Avalonia/Assets/Fonts/NotoSansJP/NotoSansJP-SemiBold.ttf differ diff --git a/StabilityMatrix.Avalonia/Assets/Fonts/NotoSansJP-Variable LICENSE.txt b/StabilityMatrix.Avalonia/Assets/Fonts/NotoSansJP/OFL.txt similarity index 100% rename from StabilityMatrix.Avalonia/Assets/Fonts/NotoSansJP-Variable LICENSE.txt rename to StabilityMatrix.Avalonia/Assets/Fonts/NotoSansJP/OFL.txt diff --git a/StabilityMatrix.Avalonia/Languages/Cultures.cs b/StabilityMatrix.Avalonia/Languages/Cultures.cs index d2ed65ba5..598b31d47 100644 --- a/StabilityMatrix.Avalonia/Languages/Cultures.cs +++ b/StabilityMatrix.Avalonia/Languages/Cultures.cs @@ -38,6 +38,14 @@ cultureCode is null return culture; } + public static void SetSupportedCultureOrDefault(string? cultureCode) + { + if (!TrySetSupportedCulture(cultureCode)) + { + TrySetSupportedCulture(Default); + } + } + public static bool TrySetSupportedCulture(string? cultureCode) { if ( diff --git a/StabilityMatrix.Avalonia/Languages/Resources.ja-JP.resx b/StabilityMatrix.Avalonia/Languages/Resources.ja-JP.resx index c92cd5ae7..2b09a66a0 100644 --- a/StabilityMatrix.Avalonia/Languages/Resources.ja-JP.resx +++ b/StabilityMatrix.Avalonia/Languages/Resources.ja-JP.resx @@ -118,67 +118,70 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 打ち上げ + Launch + In Japanese, the literal translation of "launch" can be misinterpreted as "turning on the PC". After much deliberation, I decided that it would be easier to understand if "launch" were not translated. - やめる + 終了 保存 - 戻る + キャンセル 言語 - 新しい言語オプションを有効にするには、再起動が必要です。 + 言語を変更するにはRelaunchが必要です - リローンチ + Relaunch - 後で再スタート + 後でRelaunch - 再起動が必要 + Relaunch Required - 未知のパッケージ + Unknown Package - 輸入 + インポート パッケージタイプ - バージョン + Version - バージョン・タイプ + Version Type - リリース + Releases - + Branches - チェックポイントをここにドラッグ&ドロップしてインポート + インポートしたいcheckpointをここにドラッグ&ドロップ + checkpoint / embedding / LoRA are often used in the same way as the above words on Japanese information websites, so it is easier to understand them without translation. - 強調 + Emphasis + The word has not been translated because it is not possible to guess what part of the UI it is used in. It is a little difficult to translate the word into Japanese, so I want to be careful not to change the meaning of the word. - 省略 + Deemphasis - エメベデイング / テキストの反転 + Emebeddings / Textual Inversion - ネットワーク(Lora / LyCORIS) + Networks (Lora / LyCORIS) コメント @@ -187,40 +190,40 @@ 高倍率でピクセルグリッドを表示 - ステップ + Steps - ステップ - ベース + Steps - Base - ステップ - リファイナー + Steps - Refiner - CFGスケール + CFG Scale - ノイズ除去の強さ + Denoising Strength - 高さ + - リファイナー + Refiner VAE - モデル + Model 接続 - 接続... + 接続中... 閉じる @@ -232,10 +235,10 @@ 更新あり - パトロンになる + Patronになる - Discordサーバーに参加する + Discordに参加 ダウンロード @@ -244,7 +247,7 @@ インストール - 初回セットアップをスキップする + セットアップをスキップする 予期せぬエラーが発生しました @@ -256,7 +259,7 @@ 表示名 - この名前のインストールはすでに存在する。 + 同じ名前のものが既に存在します。 別の名前を選択するか、別のインストール場所を選択してください。 @@ -268,28 +271,29 @@ コミット - 共有モデルフォルダー戦略 + Shared Model Folder Strategy PyTorchバージョン - 終了したらダイアログを閉じる + 終了時にダイアログを閉じる - データディレクトリ + データフォルダ + I think there are many windows users, so I changed the word "directory" to "folder". - ここにモデルのチェックポイント、LORA、ウェブUI、設定などがインストールされる。 + ここにcheckpoint、LORA、Web UI、設定などがインストールされます。 - FAT32またはexFATドライブを使用するとエラーが発生する場合があります。他のドライブを選択することで、よりスムーズにご利用いただけます。 + フォーマット形式がFAT32またはexFATのドライブを使用するとエラーが発生する場合があります。他のドライブを選択することで、よりスムーズにご利用いただけます。 - 携帯モード + Portableモード - ポータブルモードでは、すべてのデータと設定はアプリケーションと同じディレクトリに保存されます。Data」フォルダを持つアプリケーションを別の場所やコンピュータに移動することができます。 + Portableモードでは、すべてのデータと設定はアプリケーションと同じフォルダに保存されます。アプリケーションと、その「Data」フォルダを一緒に移動させることで、別のフォルダや別のコンピュータに移すことができます。 続ける @@ -301,25 +305,25 @@ 次の画像 - モデル説明 + Modelの説明 - 安定性マトリックスの新バージョンが登場! + Stability Matrixがバージョンアップ! - 最新のインポート + 直近のインポート すべてのバージョン - 検索モデル、#タグ、または@ユーザー + 検索 ( models, #tags, @users ) 検索 - 注文 + 並び替え 期間 @@ -331,10 +335,10 @@ ベースモデル - NSFWコンテンツを表示する + NSFWコンテンツを表示 - データ提供:CivitAI + Data provided by CivitAI ページ @@ -361,52 +365,54 @@ CivitAIで開く - 接続モデル + メタデータ取得済みモデル + i rewrited "model got metadata". The reason for this is that when translated into Japanese, it was difficult to understand what the connection was to if only "connected" was used. ローカルモデル - エクスプローラーで表示 + エクスプローラで表示 - 新しい + New フォルダ - ここにファイルをドロップしてインポートする + ここにファイルをドロップしてインポート - 接続済みとしてインポートする + インポート時にメタデータを自動検索 + "metadata retrieval on import", This is also because it was difficult to understand what "online" means in Japanese. - 新しいローカル・インポートで接続されたメタデータを検索する + ローカルからのインポート時にオンラインでメタデータを検索して適用します - インデックス... + インデックス作成中... - モデルフォルダー + モデルフォルダ - カテゴリー + カテゴリ - 始めよう + さあ、始めよう - を読み、同意します。 + 次の約款を読み、同意します: - ライセンス契約。 + 使用許諾契約書 - 接続メタデータの検索 + メタデータが見つかりました - モデル画像を表示 + モデルの見出し画像を表示 外観 @@ -415,22 +421,23 @@ テーマ - チェックポイント・マネージャー + Checkpoint Manager - シャットダウン時の共有チェックポイント・ディレクトリのシンボリックリンクの削除 + checkpointフォルダにあるシンボリックリンクをソフトの終了時に削除 - 安定性マトリックスを別のドライブに移動する際に問題がある場合は、このオプションを選択します。 + Stability Matrix を別のドライブに移動する際に問題が起きた場合、ここにチェック + It may be better to use a variable like {0} for the app name - チェックポイント・キャッシュのリセット + Checkpointキャッシュのリセット - インストールされているチェックポイントキャッシュを再構築します。モデルブラウザでチェックポイントのラベルが正しくない場合に使用します。 + checkpointsキャッシュを再構築します。Model Browserでcheckpointsのラベルが正しくない場合に使用してください - パッケージ環境 + パッケージの環境 編集 @@ -442,22 +449,22 @@ 組み込みPython - チェック・バージョン + バージョンを確認 統合 - 不協和音の豊かな存在感 + Discord Rich Presence システム - スタートメニューに安定性マトリックスを追加 + スタートメニューにStability Matrixを追加 - 現在のアプリのロケーションを使用します。 + 現在のアプリの場所を使用します。アプリを移動すると、これを再度実行できます Windowsのみ @@ -469,31 +476,31 @@ 全ユーザーに追加 - 新しいデータディレクトリを選択 + 新しいデータフォルダを選択 - 既存のデータは移動しない + 既にあるデータは移動しません - ディレクトリを選択 + フォルダを選択 - について + About - 安定性マトリックス + Stability Matrix ライセンスとオープンソースに関する注意事項 - Launchをクリックして開始する! + "Launch"をクリックして始めよう! ストップ - 送信入力 + インプットを送信 インプット @@ -505,7 +512,7 @@ 入力が必要 - 確認は? + これでいい? はい @@ -514,34 +521,34 @@ いいえ - オープンWeb UI + Web UIを開く - スタビリティ・マトリックスへようこそ! + Stability Matrixへようこそ! - お好みのインターフェイスを選択し、インストールをクリックして開始します。 + 好きなUIをインストールして始めよう - インストール + インストール中 - 打ち上げページに進む + Launchページに進む - パッケージのダウンロード... + パッケージをダウンロード中... ダウンロード完了 - 設置完了 + インストール完了 - 前提条件のインストール... + 前提ライブラリのインストール中... - パッケージ要件のインストール... + パッケージに必要なライブラリのインストール中... エクスプローラで開く @@ -553,7 +560,7 @@ アンインストール - アップデートの確認 + アップデートを確認 更新 @@ -562,13 +569,13 @@ パッケージの追加 - パッケージを追加して始めましょう! + パッケージを追加して始めよう! 名称 - 価値 + Value 削除 @@ -598,7 +605,7 @@ リスタート - 削除の確認 + 削除の再確認 これにより、生成された画像や追加したファイルを含め、パッケージフォルダとそのすべてのコンテンツが削除されます。 @@ -610,7 +617,7 @@ パッケージのアンインストール - 一部のファイルを削除できませんでした。パッケージディレクトリで開いているファイルをすべて閉じてから、もう一度やり直してください。 + 一部のファイルを削除できませんでした。該当のディレクトリ内にあるファイルで開いていたものを全て閉じて、もう一度試してください。 無効なパッケージタイプ @@ -637,6 +644,7 @@ パッケージのインストールエラー - 支店 + Branch + For Japanese engineers who use git on a daily basis, it is easier to understand terms used in git as they are in English. \ No newline at end of file diff --git a/StabilityMatrix.Avalonia/Views/MainWindow.axaml.cs b/StabilityMatrix.Avalonia/Views/MainWindow.axaml.cs index 71f2520e0..579135263 100644 --- a/StabilityMatrix.Avalonia/Views/MainWindow.axaml.cs +++ b/StabilityMatrix.Avalonia/Views/MainWindow.axaml.cs @@ -149,7 +149,10 @@ public void SetDefaultFonts() { if (Cultures.Current?.Name == "ja-JP") { - fonts.Add(Assets.RegionalFontJapanese.UriPath.ToString()); + var customFont = (Application.Current!.Resources["NotoSansJP"] as FontFamily)!; + Resources["ContentControlThemeFontFamily"] = customFont; + FontFamily = customFont; + return; } else if (Compat.IsWindows) { @@ -171,16 +174,20 @@ public void SetDefaultFonts() else { Resources["ContentControlThemeFontFamily"] = FontFamily.Default; + FontFamily = FontFamily.Default; return; } - Resources["ContentControlThemeFontFamily"] = new FontFamily(string.Join(",", fonts)); + var fontString = new FontFamily(string.Join(",", fonts)); + Resources["ContentControlThemeFontFamily"] = fontString; + FontFamily = fontString; } catch (Exception e) { LogManager.GetCurrentClassLogger().Error(e); Resources["ContentControlThemeFontFamily"] = FontFamily.Default; + FontFamily = FontFamily.Default; } } diff --git a/StabilityMatrix.Avalonia/Views/SettingsPage.axaml b/StabilityMatrix.Avalonia/Views/SettingsPage.axaml index c70861025..985ca391a 100644 --- a/StabilityMatrix.Avalonia/Views/SettingsPage.axaml +++ b/StabilityMatrix.Avalonia/Views/SettingsPage.axaml @@ -39,7 +39,6 @@ diff --git a/StabilityMatrix.Core/Models/Settings/Settings.cs b/StabilityMatrix.Core/Models/Settings/Settings.cs index 85b4597d7..956a6152e 100644 --- a/StabilityMatrix.Core/Models/Settings/Settings.cs +++ b/StabilityMatrix.Core/Models/Settings/Settings.cs @@ -1,4 +1,5 @@ -using System.Text.Json.Serialization; +using System.Globalization; +using System.Text.Json.Serialization; namespace StabilityMatrix.Core.Models.Settings; @@ -7,7 +8,7 @@ public class Settings public int? Version { get; set; } = 1; public bool FirstLaunchSetupComplete { get; set; } public string? Theme { get; set; } = "Dark"; - public string? Language { get; set; } = "en-US"; + public string? Language { get; set; } = GetDefaultCulture().Name; public List InstalledPackages { get; set; } = new(); @@ -83,4 +84,18 @@ public void UpdateActiveInstalledPackage() ActiveInstalledPackageId = InstalledPackages[0].Id; } } + + /// + /// Return either the system default culture, if supported, or en-US + /// + /// + public static CultureInfo GetDefaultCulture() + { + var supportedCultures = new[] { "en-US", "ja-JP" }; + + var systemCulture = CultureInfo.InstalledUICulture; + return supportedCultures.Contains(systemCulture.Name) + ? systemCulture + : new CultureInfo("en-US"); + } }