Skip to content

Commit 7d64c14

Browse files
committed
feat: add custom quick actions
1 parent 898011d commit 7d64c14

21 files changed

Lines changed: 603 additions & 116 deletions

File tree

src/data/Constants.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,18 @@ DefaultSettings[Settings.QUICK_MENU_SHORTCUT] = 'CmdOrCtrl+P';
8282
DefaultSettings[SyncSettings.GIST_ID] = undefined;
8383
DefaultSettings[SyncSettings.GIST_TOKEN] = undefined;
8484

85+
export interface QuickAction {
86+
id: string;
87+
label: string;
88+
url: string;
89+
}
90+
91+
const DefaultQuickActions: QuickAction[] = [
92+
{ id: 'default-google', label: 'Google', url: 'https://www.google.com/search?q=${encodedText}' },
93+
{ id: 'default-google-ai', label: 'Google AI', url: 'https://www.google.com/search?q=${encodedText}&udm=50' },
94+
{ id: 'default-translate', label: 'Translate', url: 'https://translate.google.com/?sl=auto&tl=${language}&text=${encodedText}' },
95+
];
96+
8597
const OS = {
8698
IS_DARWIN: process.platform === 'darwin',
8799
IS_LINUX: process.platform === 'linux',
@@ -121,5 +133,5 @@ const IsDebug = {
121133
'state': !IsProduction && true,
122134
};
123135

124-
export { DefaultSettings, IsDebug, IsProduction, OS, Path, Permission, Positions, Settings, SyncSettings };
136+
export { DefaultQuickActions, DefaultSettings, IsDebug, IsProduction, OS, Path, Permission, Positions, Settings, SyncSettings };
125137

src/data/Storage.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { DefaultSettings, IsDebug, Permission, Settings } from '@/data/Constants';
1+
import { DefaultQuickActions, DefaultSettings, IsDebug, Permission, QuickAction, Settings } from '@/data/Constants';
22
import { PlainPage } from '@/model/Page';
33
import PreferencesService from '@/service/PreferencesService';
44
import { app, safeStorage, session } from 'electron';
@@ -253,6 +253,14 @@ class Storage {
253253
static export(): string {
254254
return Vault.export();
255255
}
256+
257+
static getQuickActions(): QuickAction[] {
258+
return Vault.get('QuickActions', DefaultQuickActions)!;
259+
}
260+
261+
static setQuickActions(items: QuickAction[]): void {
262+
Vault.set('QuickActions', items);
263+
}
256264
}
257265

258266
/**

src/locale/de.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export const de: Strings = {
4444
home: 'Startseite',
4545
resetWindow: 'Fenster Zurücksetzen',
4646
resetBounds: 'Position Zurücksetzen',
47-
searchOnWeb: 'Im Web suchen',
47+
quickActions: 'Schnellaktionen',
4848
searchOnGoogle: 'Google durchsuchen',
4949
searchWithGemini: 'Mit Gemini suchen',
5050
translate: 'Übersetzen',
@@ -187,6 +187,7 @@ export const de: Strings = {
187187
pages: 'Seiten',
188188
permissions: 'Berechtigungen',
189189
settings: 'Einstellungen',
190+
quickActions: 'Schnellaktionen',
190191
sync: 'Synchronisierung',
191192
about: 'Über',
192193
},
@@ -318,6 +319,30 @@ export const de: Strings = {
318319
revokeUrlDialog: 'Alle Berechtigungen für "{url}" widerrufen?',
319320
},
320321

322+
quickActions: {
323+
search: 'Schnellaktionen suchen...',
324+
label: 'Bezeichnung',
325+
labelPlaceholder: 'Menüname',
326+
url: 'URL',
327+
urlPlaceholder: 'https://example.com/search?q=${encodedText}',
328+
addItem: 'Schnellaktion hinzufügen',
329+
remove: 'Entfernen',
330+
drag: 'Ziehen zum Neuanordnen',
331+
emptyTitle: 'Keine Schnellaktionen',
332+
emptyDesc: 'Fügen Sie Ihre erste Schnellaktion hinzu',
333+
variablesTitle: 'Verfügbare Variablen',
334+
variablesDesc: 'Verwenden Sie diese Variablen in der URL-Vorlage. Sie werden beim Ausführen der Suche durch die tatsächlichen Werte ersetzt.',
335+
variables: {
336+
language: 'Sprachcode aus der App-Sprache (z. B. "de")',
337+
region: 'Regionscode aus der App-Sprache (z. B. "DE"), leer falls nicht verfügbar',
338+
locale: 'Vollständige App-Sprache (z. B. "de-DE")',
339+
encodedText: 'Markierter Text, URL-kodiert',
340+
text: 'Markierter Text, roh (nicht kodiert)',
341+
encodedLink: 'Link-URL des angeklickten Elements, URL-kodiert',
342+
link: 'Link-URL des rechts angeklickten Elements, leer wenn kein Link',
343+
},
344+
},
345+
321346
sync: {
322347
localFileTitle: 'Lokale Dateisicherung',
323348
localFileDesc: 'Exportieren Sie Ihre Konfiguration in eine JSON-Datei oder importieren Sie aus einer zuvor gespeicherten Sicherung.',

src/locale/en.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export const en = {
4444
home: 'Home',
4545
resetWindow: 'Reset Window',
4646
resetBounds: 'Reset Bounds',
47-
searchOnWeb: 'Search on Web',
47+
quickActions: 'Quick Actions',
4848
searchOnGoogle: 'Search on Google',
4949
searchWithGemini: 'Search with Gemini',
5050
translate: 'Translate',
@@ -186,6 +186,7 @@ export const en = {
186186
pages: 'Pages',
187187
permissions: 'Permissions',
188188
settings: 'Settings',
189+
quickActions: 'Quick Actions',
189190
sync: 'Sync',
190191
about: 'About',
191192
},
@@ -317,6 +318,30 @@ export const en = {
317318
revokeUrlDialog: 'Revoke all permissions for "{url}"?',
318319
},
319320

321+
quickActions: {
322+
search: 'Search quick actions...',
323+
label: 'Label',
324+
labelPlaceholder: 'Menu name',
325+
url: 'URL',
326+
urlPlaceholder: 'https://example.com/search?q=${encodedText}',
327+
addItem: 'Add quick action',
328+
remove: 'Remove',
329+
drag: 'Drag to reorder',
330+
emptyTitle: 'No quick actions',
331+
emptyDesc: 'Add your first quick action to get started',
332+
variablesTitle: 'Available Variables',
333+
variablesDesc: 'Use these variables in the URL template. They will be replaced with the actual values when the search is performed.',
334+
variables: {
335+
language: 'Language code from app locale (e.g. "en")',
336+
region: 'Region code from app locale (e.g. "US"), empty if not available',
337+
locale: 'Full app locale (e.g. "en-US")',
338+
encodedText: 'Selected text, URL encoded',
339+
text: 'Selected text, raw (not encoded)',
340+
encodedLink: 'Link URL of the right-clicked element, URL encoded',
341+
link: 'Link URL of the right-clicked element, empty if not a link',
342+
},
343+
},
344+
320345
sync: {
321346
localFileTitle: 'Local File Backup',
322347
localFileDesc: 'Export your configuration to a JSON file or import from a previously saved backup.',

src/locale/es.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export const es: Strings = {
4444
home: 'Inicio',
4545
resetWindow: 'Restablecer Ventana',
4646
resetBounds: 'Restablecer Posición',
47-
searchOnWeb: 'Buscar en la Web',
47+
quickActions: 'Acciones rápidas',
4848
searchOnGoogle: 'Buscar en Google',
4949
searchWithGemini: 'Buscar con Gemini',
5050
translate: 'Traducir',
@@ -187,6 +187,7 @@ export const es: Strings = {
187187
pages: 'Páginas',
188188
permissions: 'Permisos',
189189
settings: 'Configuración',
190+
quickActions: 'Acciones rápidas',
190191
sync: 'Sincronización',
191192
about: 'Acerca de',
192193
},
@@ -318,6 +319,30 @@ export const es: Strings = {
318319
revokeUrlDialog: '¿Revocar todos los permisos para "{url}"?',
319320
},
320321

322+
quickActions: {
323+
search: 'Buscar acciones rápidas...',
324+
label: 'Etiqueta',
325+
labelPlaceholder: 'Nombre del menú',
326+
url: 'URL',
327+
urlPlaceholder: 'https://example.com/search?q=${encodedText}',
328+
addItem: 'Agregar acción rápida',
329+
remove: 'Eliminar',
330+
drag: 'Arrastrar para reordenar',
331+
emptyTitle: 'Sin acciones rápidas',
332+
emptyDesc: 'Agregue su primera acción rápida para comenzar',
333+
variablesTitle: 'Variables disponibles',
334+
variablesDesc: 'Use estas variables en la plantilla de URL. Se reemplazarán con los valores reales al realizar la búsqueda.',
335+
variables: {
336+
language: 'Código de idioma de la aplicación (p. ej. "es")',
337+
region: 'Código de región de la aplicación (p. ej. "ES"), vacío si no está disponible',
338+
locale: 'Idioma completo de la aplicación (p. ej. "es-ES")',
339+
encodedText: 'Texto seleccionado, codificado en URL',
340+
text: 'Texto seleccionado, sin codificar',
341+
encodedLink: 'URL del enlace del elemento clicado, codificada',
342+
link: 'URL del enlace del elemento clicado, vacío si no es un enlace',
343+
},
344+
},
345+
321346
sync: {
322347
localFileTitle: 'Copia de Seguridad Local',
323348
localFileDesc: 'Exporta tu configuración a un archivo JSON o importa desde una copia de seguridad guardada anteriormente.',

src/locale/fr.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export const fr: Strings = {
4444
home: 'Accueil',
4545
resetWindow: 'Réinitialiser la Fenêtre',
4646
resetBounds: 'Réinitialiser la Position',
47-
searchOnWeb: 'Rechercher sur le Web',
47+
quickActions: 'Actions rapides',
4848
searchOnGoogle: 'Rechercher sur Google',
4949
searchWithGemini: 'Rechercher avec Gemini',
5050
translate: 'Traduire',
@@ -187,6 +187,7 @@ export const fr: Strings = {
187187
pages: 'Pages',
188188
permissions: 'Autorisations',
189189
settings: 'Paramètres',
190+
quickActions: 'Actions rapides',
190191
sync: 'Synchronisation',
191192
about: 'À propos',
192193
},
@@ -318,6 +319,30 @@ export const fr: Strings = {
318319
revokeUrlDialog: 'Révoquer toutes les autorisations pour "{url}" ?',
319320
},
320321

322+
quickActions: {
323+
search: 'Rechercher des actions rapides...',
324+
label: 'Libellé',
325+
labelPlaceholder: 'Nom du menu',
326+
url: 'URL',
327+
urlPlaceholder: 'https://example.com/search?q=${encodedText}',
328+
addItem: 'Ajouter une action rapide',
329+
remove: 'Supprimer',
330+
drag: 'Glisser pour réordonner',
331+
emptyTitle: 'Aucune action rapide',
332+
emptyDesc: 'Ajoutez votre première action rapide pour commencer',
333+
variablesTitle: 'Variables disponibles',
334+
variablesDesc: 'Utilisez ces variables dans le modèle d\'URL. Elles seront remplacées par les valeurs réelles lors de la recherche.',
335+
variables: {
336+
language: 'Code de langue de l\'application (ex. "fr")',
337+
region: 'Code de région de l\'application (ex. "FR"), vide si non disponible',
338+
locale: 'Langue complète de l\'application (ex. "fr-FR")',
339+
encodedText: 'Texte sélectionné, encodé en URL',
340+
text: 'Texte sélectionné, brut (non encodé)',
341+
encodedLink: 'URL du lien de l\'élément cliqué, encodée',
342+
link: 'URL du lien de l\'élément cliqué, vide si ce n\'est pas un lien',
343+
},
344+
},
345+
321346
sync: {
322347
localFileTitle: 'Sauvegarde Locale',
323348
localFileDesc: 'Exportez votre configuration vers un fichier JSON ou importez depuis une sauvegarde précédente.',

src/locale/it.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export const it: Strings = {
4444
home: 'Home',
4545
resetWindow: 'Ripristina Finestra',
4646
resetBounds: 'Ripristina Posizione',
47-
searchOnWeb: 'Cerca sul Web',
47+
quickActions: 'Azioni rapide',
4848
searchOnGoogle: 'Cerca su Google',
4949
searchWithGemini: 'Cerca con Gemini',
5050
translate: 'Traduci',
@@ -187,6 +187,7 @@ export const it: Strings = {
187187
pages: 'Pagine',
188188
permissions: 'Permessi',
189189
settings: 'Impostazioni',
190+
quickActions: 'Azioni rapide',
190191
sync: 'Sincronizzazione',
191192
about: 'Informazioni',
192193
},
@@ -318,6 +319,30 @@ export const it: Strings = {
318319
revokeUrlDialog: 'Revocare tutti i permessi per "{url}"?',
319320
},
320321

322+
quickActions: {
323+
search: 'Cerca azioni rapide...',
324+
label: 'Etichetta',
325+
labelPlaceholder: 'Nome del menu',
326+
url: 'URL',
327+
urlPlaceholder: 'https://example.com/search?q=${encodedText}',
328+
addItem: 'Aggiungi azione rapida',
329+
remove: 'Rimuovi',
330+
drag: 'Trascina per riordinare',
331+
emptyTitle: 'Nessuna azione rapida',
332+
emptyDesc: 'Aggiungi la tua prima azione rapida per iniziare',
333+
variablesTitle: 'Variabili disponibili',
334+
variablesDesc: 'Usa queste variabili nel modello URL. Verranno sostituite con i valori effettivi durante la ricerca.',
335+
variables: {
336+
language: 'Codice lingua dell\'app (es. "it")',
337+
region: 'Codice regione dell\'app (es. "IT"), vuoto se non disponibile',
338+
locale: 'Lingua completa dell\'app (es. "it-IT")',
339+
encodedText: 'Testo selezionato, codificato URL',
340+
text: 'Testo selezionato, grezzo (non codificato)',
341+
encodedLink: 'URL del link dell\'elemento cliccato, codificata',
342+
link: 'URL del link dell\'elemento cliccato, vuoto se non è un link',
343+
},
344+
},
345+
321346
sync: {
322347
localFileTitle: 'Backup Locale',
323348
localFileDesc: 'Esporta la tua configurazione in un file JSON o importa da un backup salvato in precedenza.',

src/locale/pt-BR.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export const ptBR: Strings = {
4444
home: 'Início',
4545
resetWindow: 'Redefinir Janela',
4646
resetBounds: 'Redefinir Posição',
47-
searchOnWeb: 'Pesquisar na Web',
47+
quickActions: 'Ações rápidas',
4848
searchOnGoogle: 'Pesquisar no Google',
4949
searchWithGemini: 'Pesquisar com Gemini',
5050
translate: 'Traduzir',
@@ -187,6 +187,7 @@ export const ptBR: Strings = {
187187
pages: 'Páginas',
188188
permissions: 'Permissões',
189189
settings: 'Configurações',
190+
quickActions: 'Ações rápidas',
190191
sync: 'Sincronização',
191192
about: 'Sobre',
192193
},
@@ -318,6 +319,30 @@ export const ptBR: Strings = {
318319
revokeUrlDialog: 'Revogar todas as permissões para "{url}"?',
319320
},
320321

322+
quickActions: {
323+
search: 'Pesquisar ações rápidas...',
324+
label: 'Nome',
325+
labelPlaceholder: 'Nome do menu',
326+
url: 'URL',
327+
urlPlaceholder: 'https://example.com/search?q=${encodedText}',
328+
addItem: 'Adicionar ação rápida',
329+
remove: 'Remover',
330+
drag: 'Arraste para reordenar',
331+
emptyTitle: 'Nenhuma ação rápida',
332+
emptyDesc: 'Adicione sua primeira ação rápida para começar',
333+
variablesTitle: 'Variáveis disponíveis',
334+
variablesDesc: 'Use estas variáveis no modelo de URL. Elas serão substituídas pelos valores reais ao realizar a pesquisa.',
335+
variables: {
336+
language: 'Código do idioma da aplicação (ex. "pt")',
337+
region: 'Código da região da aplicação (ex. "BR"), vazio se não disponível',
338+
locale: 'Idioma completo da aplicação (ex. "pt-BR")',
339+
encodedText: 'Texto selecionado, codificado na URL',
340+
text: 'Texto selecionado, bruto (não codificado)',
341+
encodedLink: 'URL do link do elemento clicado, codificada',
342+
link: 'URL do link do elemento clicado, vazio se não for um link',
343+
},
344+
},
345+
321346
sync: {
322347
localFileTitle: 'Backup de Arquivo Local',
323348
localFileDesc: 'Exporte sua configuração para um arquivo JSON ou importe de um backup salvo anteriormente.',

src/locale/pt-PT.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export const ptPT: Strings = {
4444
home: 'Início',
4545
resetWindow: 'Repor Janela',
4646
resetBounds: 'Repor Posição',
47-
searchOnWeb: 'Pesquisar na Web',
47+
quickActions: 'Ações rápidas',
4848
searchOnGoogle: 'Pesquisar no Google',
4949
searchWithGemini: 'Pesquisar com Gemini',
5050
translate: 'Traduzir',
@@ -187,6 +187,7 @@ export const ptPT: Strings = {
187187
pages: 'Páginas',
188188
permissions: 'Permissões',
189189
settings: 'Definições',
190+
quickActions: 'Ações rápidas',
190191
sync: 'Sincronização',
191192
about: 'Sobre',
192193
},
@@ -318,6 +319,30 @@ export const ptPT: Strings = {
318319
revokeUrlDialog: 'Revogar todas as permissões para "{url}"?',
319320
},
320321

322+
quickActions: {
323+
search: 'Pesquisar ações rápidas...',
324+
label: 'Nome',
325+
labelPlaceholder: 'Nome do menu',
326+
url: 'URL',
327+
urlPlaceholder: 'https://example.com/search?q=${encodedText}',
328+
addItem: 'Adicionar ação rápida',
329+
remove: 'Remover',
330+
drag: 'Arrastar para reordenar',
331+
emptyTitle: 'Nenhuma ação rápida',
332+
emptyDesc: 'Adicione a sua primeira ação rápida para começar',
333+
variablesTitle: 'Variáveis disponíveis',
334+
variablesDesc: 'Utilize estas variáveis no modelo de URL. Serão substituídas pelos valores reais ao efetuar a pesquisa.',
335+
variables: {
336+
language: 'Código do idioma da aplicação (ex. "pt")',
337+
region: 'Código da região da aplicação (ex. "PT"), vazio se não disponível',
338+
locale: 'Idioma completo da aplicação (ex. "pt-PT")',
339+
encodedText: 'Texto selecionado, codificado na URL',
340+
text: 'Texto selecionado, bruto (não codificado)',
341+
encodedLink: 'URL do link do elemento clicado, codificada',
342+
link: 'URL do link do elemento clicado, vazio se não for um link',
343+
},
344+
},
345+
321346
sync: {
322347
localFileTitle: 'Cópia de Segurança Local',
323348
localFileDesc: 'Exporte a sua configuração para um ficheiro JSON ou importe de uma cópia de segurança guardada anteriormente.',

0 commit comments

Comments
 (0)