Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

モデルの追加・選択ダイアログ機能 #135

Merged
merged 21 commits into from
Feb 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
5e042fd
feat: モデルの選択ダイアログを開く処理
ayutaz Feb 6, 2025
3c35602
feat: モデル選択ダイアログUIの作成とLocalize対応
ayutaz Feb 6, 2025
622fee9
自動翻訳を追加(GitHub Actionsによる)
actions-user Feb 6, 2025
5938bd7
feat: Localization Tablesを保存したときにcsvを自動で保存するEditor処理の追加
ayutaz Feb 6, 2025
e0f8141
fix: Localizeテキストの変更
ayutaz Feb 6, 2025
e4e6df8
自動翻訳を追加(GitHub Actionsによる)
actions-user Feb 6, 2025
17a9bed
fix: load localization
ayutaz Feb 6, 2025
9a4d086
fix: ロードしたVRMの一覧の作成
ayutaz Feb 6, 2025
ccb288a
fix: 選択したことがわかるUIの対応
ayutaz Feb 6, 2025
f731071
feat: Defaultモデルをモデル選択画面の一番上の追加
ayutaz Feb 7, 2025
388325c
自動翻訳を追加(GitHub Actionsによる)
actions-user Feb 7, 2025
7d73e91
feat: UI上でモデルの選択
ayutaz Feb 7, 2025
e15350e
feat: モデル一覧にモデルのサムネイル画像のロード処理の追加
ayutaz Feb 7, 2025
82ae9c6
fix: Defaultモデルのmeta情報の更新
ayutaz Feb 7, 2025
75ea77d
fix: meta情報をPrefabの作成処理の処理順序の変更
ayutaz Feb 7, 2025
e729c6d
fix: フォルダから追加するボタンの追加
ayutaz Feb 7, 2025
bf0a099
自動翻訳を追加(GitHub Actionsによる)
actions-user Feb 7, 2025
f0309b9
fix: ローカライズの反映
ayutaz Feb 7, 2025
56688ea
自動翻訳を追加(GitHub Actionsによる)
actions-user Feb 7, 2025
61734aa
fix: モデルのmeta情報取得処理の別スレッドに逃がして処理の高速化
ayutaz Feb 7, 2025
6cafb0e
fix: CSVのローカライズの処理の一行目をスキップ
ayutaz Feb 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 7 additions & 8 deletions .github/scripts/translate_localization.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@
def translate_text(text, target_language):
try:
response = client.chat.completions.create(
model="gpt-4o-mini",
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": f"Translate the following Japanese text to {target_language}. Return only the translated text without any additional explanations or notes.\n\n{text}"}
]
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": f"Translate the following Japanese text to {target_language}. Return only the translated text without any additional explanations or notes.\n\n{text}"}
]
)
# 翻訳結果を取得
translation = response.choices[0].message.content.strip()
Expand All @@ -36,11 +36,11 @@ def translate_text(text, target_language):
print(f"翻訳中にエラーが発生しました:{e}")
return None

# 各行に対して翻訳を実行
for idx, row in df.iterrows():
# 各行に対して翻訳を実行(先頭行をスキップ)
for idx, row in df.iloc[1:].iterrows():
japanese_text = row.get('Japanese(ja)', '')
key = row.get('Key', '')

# 日本語テキストが存在する場合のみ翻訳を実行
if pd.notnull(japanese_text) and japanese_text.strip() != '':
print(f"キー '{key}' の翻訳を実行します。")
Expand Down Expand Up @@ -88,7 +88,6 @@ def write_custom_csv(df, csv_path):
data_row.append(f'"{value}"')
csvfile.write(','.join(data_row) + '\n')


# カスタム関数でCSVを保存
write_custom_csv(df, csv_path)
print("翻訳が完了し、CSVファイルが更新されました。")
178 changes: 178 additions & 0 deletions Assets/uDesktopMascot/Editor/LocalizationTableSaveProcessor.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
using UnityEditor;
using UnityEngine;
using UnityEngine.Localization.Tables;
using UnityEditor.Localization;
using System.IO;
using System.Text;
using System.Collections.Generic;
using System.Globalization;

namespace uDesktopMascot.Editor
{
/// <summary>
/// ローカリゼーションテーブルをセーブ時に自動でCSVにエクスポートする処理
/// </summary>
public class LocalizationTableSaveProcessor : AssetModificationProcessor
{
/// <summary>
/// アセットが保存される直前に呼び出されるコールバック。
/// 保存されるアセットがローカリゼーションテーブルである場合、CSVエクスポートを行います。
/// </summary>
/// <param name="paths">保存されるアセットのパスの配列</param>
/// <returns>保存されるアセットのパスの配列</returns>
private static string[] OnWillSaveAssets(string[] paths)
{
// 保存されるアセットパスをループ
foreach (var path in paths)
{
// アセットがローカリゼーションテーブルかどうかを確認
var asset = AssetDatabase.LoadAssetAtPath<Object>(path);
if (asset is StringTable stringTable)
{
// CSVエクスポートの処理を実行
ExportStringTableToCSV(stringTable);
}
}
return paths;
}

/// <summary>
/// 指定されたStringTableを含むテーブルコレクションをCSVにエクスポートします。
/// </summary>
/// <param name="stringTable">エクスポートするStringTable</param>
private static void ExportStringTableToCSV(StringTable stringTable)
{
// テーブルコレクションを取得
var tableCollection = LocalizationEditorSettings.GetCollectionFromTable(stringTable) as StringTableCollection;
if (tableCollection == null)
{
Debug.LogError($"テーブルコレクションが見つかりませんでした:{stringTable.TableCollectionName}");
return;
}

// エクスポート先のパスを設定
var exportPath = "Assets/uDesktopMascot/LocalizationTable/LocalizationTable.csv";
var exportDirectory = Path.GetDirectoryName(exportPath);
if (!Directory.Exists(exportDirectory))
{
Directory.CreateDirectory(exportDirectory);
}

// CSVデータを生成
var csvData = GenerateCSVData(tableCollection);

// CSVファイルを書き出し(既に存在する場合は上書き)
File.WriteAllText(exportPath, csvData, Encoding.UTF8);

Debug.Log($"CSVエクスポートが完了しました:{exportPath}");
}

/// <summary>
/// テーブルコレクションのデータからCSV形式の文字列を生成します。
/// </summary>
/// <param name="tableCollection">CSVデータを生成するStringTableCollection</param>
/// <returns>生成されたCSV形式の文字列</returns>
private static string GenerateCSVData(StringTableCollection tableCollection)
{
var sb = new StringBuilder();

// ヘッダーを追加(ダブルクォーテーションなし)
sb.Append("Key,Id");
// 言語カラムの順序を元のCSVと同じにする
var localeCodes = new List<string>();
foreach (var localeCode in new[] { "en", "fr", "it", "ja", "ko" })
{
var table = tableCollection.GetTable(localeCode);
if (table != null)
{
localeCodes.Add(localeCode);
var languageName = GetLanguageName(localeCode);
sb.Append($",{languageName}({localeCode})");
}
}
sb.AppendLine();

// エントリを取得
var sharedData = tableCollection.SharedData;
foreach (var sharedEntry in sharedData.Entries)
{
// Keyフィールドをダブルクォーテーションで囲む
var key = EscapeCSVField(sharedEntry.Key);

// Idフィールドはそのまま(ダブルクォーテーションなし)
var id = sharedEntry.Id.ToString();

sb.Append($"{key},{id}");

foreach (var localeCode in localeCodes)
{
var table = tableCollection.GetTable(localeCode) as StringTable;
if (table != null)
{
var entry = table.GetEntry(sharedEntry.Id);
if (entry != null)
{
// ローカライズされた値をダブルクォーテーションで囲む
var localizedValue = EscapeCSVField(entry.LocalizedValue);
sb.Append($",{localizedValue}");
}
else
{
// 空の値でもダブルクォーテーションを付ける
sb.Append($",\"\"");
}
}
else
{
// テーブルが存在しない場合もダブルクォーテーション付きの空文字を追加
sb.Append($",\"\"");
}
}
sb.AppendLine();
}

return sb.ToString();
}

/// <summary>
/// CSVフィールドをダブルクォーテーションで囲み、内部のダブルクォーテーションをエスケープします。
/// </summary>
/// <param name="field">エスケープするフィールドの文字列</param>
/// <returns>ダブルクォーテーションで囲まれた、エスケープ処理された文字列</returns>
private static string EscapeCSVField(string field)
{
if (string.IsNullOrEmpty(field))
{
return "\"\"";
}

// ダブルクォーテーションをエスケープ
if (field.Contains("\""))
{
field = field.Replace("\"", "\"\"");
}

// フィールドをダブルクォーテーションで囲む
return $"\"{field}\"";
}

/// <summary>
/// ロケールコードから言語名を取得します。
/// </summary>
/// <param name="localeCode">ロケールコード(例:"en")</param>
/// <returns>言語名(例:"English")</returns>
private static string GetLanguageName(string localeCode)
{
try
{
var culture = new CultureInfo(localeCode);
return culture.EnglishName;
}
catch
{
// ロケールコードが認識されない場合はそのまま返す
return localeCode;
}
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file added Assets/uDesktopMascot/Images/UI/frame.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
156 changes: 156 additions & 0 deletions Assets/uDesktopMascot/Images/UI/frame.png.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading