Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions assets/locales/en.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ pin = "Pin"
unpin = "Unpin"

# Settings
settings_button = "Settings"
settings_title = "Ropy Settings"
settings_back = "←"
settings_cancel = "Cancel"
Expand Down
63 changes: 63 additions & 0 deletions assets/locales/ja.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# Japanese translations for Ropy
# 日本語翻訳

# Application
app_name = "Ropy"
app_description = "RustとGPUIで構築されたクリップボードマネージャー"

# Tray menu
tray_show = "表示"
tray_quit = "終了"

# Main window
search_placeholder = "/ で検索 ... "
no_records = "クリップボード履歴がありません"
clear_all = "すべてクリア"
pin = "ピン留め"
unpin = "ピン留め解除"

# Settings
settings_button = "設定"
settings_title = "Ropy 設定"
settings_back = "←"
settings_cancel = "キャンセル"
settings_save = "保存"

# Settings sections
settings_language = "言語"
settings_language_description = "使用する言語を選択してください"

settings_theme = "テーマ"
settings_theme_light = "ライト"
settings_theme_dark = "ダーク"
settings_theme_system = "システム"

settings_hotkey = "ホットキー設定"
settings_activation_key = "起動キー"
settings_hotkey_hint = "形式: control+shift+d または cmd+shift+v"
settings_hotkey_invalid = "無効なホットキー形式です"

settings_storage = "ストレージ設定"
settings_max_history = "最大履歴件数"

settings_system = "システム"
settings_autostart = "システム起動時に起動"
settings_autostart_on = "オン"
settings_autostart_off = "オフ"

# Content types
content_type_text = "テキスト"
content_type_image = "画像"
content_type_file = "ファイル"

# Messages
message_copied = "クリップボードにコピーしました"
message_deleted = "レコードを削除しました"
message_cleared = "履歴をクリアしました"

# About
about_title = "Ropy について"
about_version = "バージョン"
about_description = "RustとGPUIで構築された軽量クリップボードマネージャーです。"
about_github = "GitHub"
about_back = "←"
1 change: 1 addition & 0 deletions assets/locales/zh-CN.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ pin = "固定"
unpin = "取消固定"

# 设置
settings_button = "设置"
settings_title = "Ropy 设置"
settings_back = "←"
settings_cancel = "取消"
Expand Down
2 changes: 1 addition & 1 deletion src/gui/board/render.rs
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ pub fn render_header(board: &RopyBoard, cx: &mut Context<'_, RopyBoard>) -> impl
Button::new("settings-button")
.ghost()
.icon(Icon::empty().path("settings.svg"))
.tooltip("Settings")
.tooltip(board.i18n.t("settings_button"))
.on_click(cx.listener(|this, _, window, cx| {
this.show_settings = true;
window.focus(&this.focus_handle);
Expand Down
10 changes: 8 additions & 2 deletions src/i18n/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,21 @@ pub enum Language {
English,
#[serde(rename = "zh-CN")]
ChineseSimplified,
#[serde(rename = "ja")]
Japanese,
}

impl Language {
pub fn display_name(&self) -> &'static str {
match self {
Language::English => "English",
Language::ChineseSimplified => "简体中文",
Language::Japanese => "日本語",
}
}

pub fn all() -> Vec<Language> {
vec![Language::English, Language::ChineseSimplified]
vec![Language::English, Language::ChineseSimplified, Language::Japanese]
}
}

Expand Down Expand Up @@ -71,6 +74,7 @@ impl I18n {
let content = match language {
Language::English => include_str!("../../assets/locales/en.toml"),
Language::ChineseSimplified => include_str!("../../assets/locales/zh-CN.toml"),
Language::Japanese => include_str!("../../assets/locales/ja.toml"),
Copy link

Copilot AI Jan 14, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The existing tests for I18n initialization and language switching only cover English and Chinese languages. Consider adding a test case to verify that Japanese translations can be loaded successfully, similar to the existing test_i18n_initialization test but with Language::Japanese, or extending test_i18n_language_switch to include switching to Japanese.

Copilot uses AI. Check for mistakes.
};
Translations::from_toml(content)
}
Expand Down Expand Up @@ -125,6 +129,7 @@ mod tests {
fn test_language_display_name() {
assert_eq!(Language::English.display_name(), "English");
assert_eq!(Language::ChineseSimplified.display_name(), "简体中文");
assert_eq!(Language::Japanese.display_name(), "日本語");
}

#[test]
Expand Down Expand Up @@ -171,8 +176,9 @@ mod tests {
#[test]
fn test_language_all() {
let languages = Language::all();
assert_eq!(languages.len(), 2);
assert_eq!(languages.len(), 3);
assert!(languages.contains(&Language::English));
assert!(languages.contains(&Language::ChineseSimplified));
assert!(languages.contains(&Language::Japanese));
}
}