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
27 changes: 27 additions & 0 deletions src-tauri/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -599,6 +599,26 @@ fn simulate_paste_in_place() -> Result<(), String> {

// --- Trigger Engine: Keystroke monitoring ---

/// Tray menu item handles, kept so the frontend can relabel them once i18n has
/// loaded (the tray is built in Rust before the webview, so it starts English).
struct TrayMenuState {
show: tauri::menu::MenuItem<tauri::Wry>,
quit: tauri::menu::MenuItem<tauri::Wry>,
}

/// Relabel the tray menu in the user's language. Called by the frontend after
/// i18n initialises and whenever the language changes.
#[tauri::command]
fn set_tray_labels(
state: tauri::State<'_, TrayMenuState>,
show: String,
quit: String,
) -> Result<(), String> {
state.show.set_text(show).map_err(|e| e.to_string())?;
state.quit.set_text(quit).map_err(|e| e.to_string())?;
Ok(())
}

/// Shared state for the trigger engine (source-agnostic: snippets, vault, etc.)
struct TriggerEngineState {
/// Map of trigger_text → source_id (e.g. "snippet:uuid" or "vault:uuid:field")
Expand Down Expand Up @@ -1630,6 +1650,7 @@ pub fn run() {
get_frontmost_app,
show_panel,
hide_panel,
set_tray_labels,
ocr_image,
simulate_backspace,
update_triggers,
Expand Down Expand Up @@ -1662,6 +1683,12 @@ pub fn run() {
.item(&quit_item)
.build()?;

// Keep handles so the frontend can localise the labels post-i18n.
app.manage(TrayMenuState {
show: show_item.clone(),
quit: quit_item.clone(),
});

let mut tray_builder = TrayIconBuilder::new();

// macOS: Use template image (black on transparent, system adapts color)
Expand Down
12 changes: 12 additions & 0 deletions src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { useEffect, useState, useCallback } from 'react';
import { AnimatePresence } from 'framer-motion';
import { getCurrentWindow, PhysicalPosition, type CloseRequestedEvent } from '@tauri-apps/api/window';
import { listen } from '@tauri-apps/api/event';
import { invoke } from '@tauri-apps/api/core';
import { Sidebar } from './components/layout/Sidebar';
import { SearchBar } from './components/layout/DragBar';
import { HintBar } from './components/layout/HintBar';
Expand Down Expand Up @@ -59,6 +60,17 @@ function App() {
saveListWidth(width);
}, []);

// Localise the native tray menu, which Rust builds in English before the
// webview (and thus i18n) exists. Re-sync whenever the language changes.
useEffect(() => {
const syncTray = () => {
invoke('set_tray_labels', { show: i18n.t('tray.show'), quit: i18n.t('tray.quit') }).catch(() => {});
};
syncTray();
i18n.on('languageChanged', syncTray);
return () => { i18n.off('languageChanged', syncTray); };
}, []);

useEffect(() => {
const init = async () => {
await initDatabase();
Expand Down
4 changes: 3 additions & 1 deletion src/i18n/locales/ar.json
Original file line number Diff line number Diff line change
Expand Up @@ -447,5 +447,7 @@
"vault.dialog.bank.swift": "SWIFT (اختياري)",
"vault.dialog.personal.countryPlaceholder": "الدولة",
"vault.dialog.personal.popular": "شائع",
"vault.dialog.personal.allCountries": "كل الدول"
"vault.dialog.personal.allCountries": "كل الدول",
"tray.show": "إظهار QlipLab",
"tray.quit": "إنهاء"
}
4 changes: 3 additions & 1 deletion src/i18n/locales/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -447,5 +447,7 @@
"vault.dialog.bank.swift": "SWIFT (optional)",
"vault.dialog.personal.countryPlaceholder": "Land",
"vault.dialog.personal.popular": "Beliebt",
"vault.dialog.personal.allCountries": "Alle Länder"
"vault.dialog.personal.allCountries": "Alle Länder",
"tray.show": "QlipLab anzeigen",
"tray.quit": "Beenden"
}
4 changes: 3 additions & 1 deletion src/i18n/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -447,5 +447,7 @@
"vault.dialog.bank.swift": "SWIFT (optional)",
"vault.dialog.personal.countryPlaceholder": "Country",
"vault.dialog.personal.popular": "Popular",
"vault.dialog.personal.allCountries": "All Countries"
"vault.dialog.personal.allCountries": "All Countries",
"tray.show": "Show QlipLab",
"tray.quit": "Quit"
}
4 changes: 3 additions & 1 deletion src/i18n/locales/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -447,5 +447,7 @@
"vault.dialog.bank.swift": "SWIFT (opcional)",
"vault.dialog.personal.countryPlaceholder": "País",
"vault.dialog.personal.popular": "Populares",
"vault.dialog.personal.allCountries": "Todos los países"
"vault.dialog.personal.allCountries": "Todos los países",
"tray.show": "Mostrar QlipLab",
"tray.quit": "Salir"
}
4 changes: 3 additions & 1 deletion src/i18n/locales/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -447,5 +447,7 @@
"vault.dialog.bank.swift": "SWIFT (facultatif)",
"vault.dialog.personal.countryPlaceholder": "Pays",
"vault.dialog.personal.popular": "Populaires",
"vault.dialog.personal.allCountries": "Tous les pays"
"vault.dialog.personal.allCountries": "Tous les pays",
"tray.show": "Afficher QlipLab",
"tray.quit": "Quitter"
}
4 changes: 3 additions & 1 deletion src/i18n/locales/hi.json
Original file line number Diff line number Diff line change
Expand Up @@ -447,5 +447,7 @@
"vault.dialog.bank.swift": "SWIFT (वैकल्पिक)",
"vault.dialog.personal.countryPlaceholder": "देश",
"vault.dialog.personal.popular": "लोकप्रिय",
"vault.dialog.personal.allCountries": "सभी देश"
"vault.dialog.personal.allCountries": "सभी देश",
"tray.show": "QlipLab दिखाएं",
"tray.quit": "बाहर निकलें"
}
4 changes: 3 additions & 1 deletion src/i18n/locales/it.json
Original file line number Diff line number Diff line change
Expand Up @@ -447,5 +447,7 @@
"vault.dialog.bank.swift": "SWIFT (facoltativo)",
"vault.dialog.personal.countryPlaceholder": "Paese",
"vault.dialog.personal.popular": "Popolari",
"vault.dialog.personal.allCountries": "Tutti i paesi"
"vault.dialog.personal.allCountries": "Tutti i paesi",
"tray.show": "Mostra QlipLab",
"tray.quit": "Esci"
}
4 changes: 3 additions & 1 deletion src/i18n/locales/ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -447,5 +447,7 @@
"vault.dialog.bank.swift": "SWIFT(任意)",
"vault.dialog.personal.countryPlaceholder": "国",
"vault.dialog.personal.popular": "人気",
"vault.dialog.personal.allCountries": "すべての国"
"vault.dialog.personal.allCountries": "すべての国",
"tray.show": "QlipLab を表示",
"tray.quit": "終了"
}
4 changes: 3 additions & 1 deletion src/i18n/locales/ko.json
Original file line number Diff line number Diff line change
Expand Up @@ -447,5 +447,7 @@
"vault.dialog.bank.swift": "SWIFT (선택)",
"vault.dialog.personal.countryPlaceholder": "국가",
"vault.dialog.personal.popular": "인기",
"vault.dialog.personal.allCountries": "모든 국가"
"vault.dialog.personal.allCountries": "모든 국가",
"tray.show": "QlipLab 표시",
"tray.quit": "종료"
}
4 changes: 3 additions & 1 deletion src/i18n/locales/nl.json
Original file line number Diff line number Diff line change
Expand Up @@ -447,5 +447,7 @@
"vault.dialog.bank.swift": "SWIFT (optioneel)",
"vault.dialog.personal.countryPlaceholder": "Land",
"vault.dialog.personal.popular": "Populair",
"vault.dialog.personal.allCountries": "Alle landen"
"vault.dialog.personal.allCountries": "Alle landen",
"tray.show": "QlipLab tonen",
"tray.quit": "Afsluiten"
}
4 changes: 3 additions & 1 deletion src/i18n/locales/pl.json
Original file line number Diff line number Diff line change
Expand Up @@ -447,5 +447,7 @@
"vault.dialog.bank.swift": "SWIFT (opcjonalnie)",
"vault.dialog.personal.countryPlaceholder": "Kraj",
"vault.dialog.personal.popular": "Popularne",
"vault.dialog.personal.allCountries": "Wszystkie kraje"
"vault.dialog.personal.allCountries": "Wszystkie kraje",
"tray.show": "Pokaż QlipLab",
"tray.quit": "Zakończ"
}
4 changes: 3 additions & 1 deletion src/i18n/locales/pt.json
Original file line number Diff line number Diff line change
Expand Up @@ -447,5 +447,7 @@
"vault.dialog.bank.swift": "SWIFT (opcional)",
"vault.dialog.personal.countryPlaceholder": "País",
"vault.dialog.personal.popular": "Populares",
"vault.dialog.personal.allCountries": "Todos os países"
"vault.dialog.personal.allCountries": "Todos os países",
"tray.show": "Mostrar QlipLab",
"tray.quit": "Sair"
}
4 changes: 3 additions & 1 deletion src/i18n/locales/ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -447,5 +447,7 @@
"vault.dialog.bank.swift": "SWIFT (необязательно)",
"vault.dialog.personal.countryPlaceholder": "Страна",
"vault.dialog.personal.popular": "Популярные",
"vault.dialog.personal.allCountries": "Все страны"
"vault.dialog.personal.allCountries": "Все страны",
"tray.show": "Показать QlipLab",
"tray.quit": "Выход"
}
4 changes: 3 additions & 1 deletion src/i18n/locales/tr.json
Original file line number Diff line number Diff line change
Expand Up @@ -447,5 +447,7 @@
"vault.dialog.bank.swift": "SWIFT (isteğe bağlı)",
"vault.dialog.personal.countryPlaceholder": "Ülke",
"vault.dialog.personal.popular": "Popüler",
"vault.dialog.personal.allCountries": "Tüm Ülkeler"
"vault.dialog.personal.allCountries": "Tüm Ülkeler",
"tray.show": "QlipLab'ı Göster",
"tray.quit": "Çıkış"
}
4 changes: 3 additions & 1 deletion src/i18n/locales/zh.json
Original file line number Diff line number Diff line change
Expand Up @@ -447,5 +447,7 @@
"vault.dialog.bank.swift": "SWIFT(可选)",
"vault.dialog.personal.countryPlaceholder": "国家/地区",
"vault.dialog.personal.popular": "常用",
"vault.dialog.personal.allCountries": "所有国家/地区"
"vault.dialog.personal.allCountries": "所有国家/地区",
"tray.show": "显示 QlipLab",
"tray.quit": "退出"
}
Loading