91 lines
2.5 KiB
TypeScript
91 lines
2.5 KiB
TypeScript
import type { MenuItemConstructorOptions } from 'electron'
|
||
|
||
export type NativeMenuLocale = 'en' | 'tr'
|
||
|
||
// Only the primary settings surface owns the app-wide menu language. Utility
|
||
// windows have their own I18nProvider and must not overwrite that preference.
|
||
export function resolveNativeMenuLocale(
|
||
value: unknown,
|
||
senderId: number,
|
||
primaryId: number | undefined
|
||
): NativeMenuLocale | null {
|
||
if (primaryId === undefined || senderId !== primaryId) {
|
||
return null
|
||
}
|
||
|
||
if (value === 'tr') {
|
||
return 'tr'
|
||
}
|
||
|
||
if (typeof value === 'string' && ['en', 'zh', 'zh-hant', 'ja', 'ar', 'ru'].includes(value)) {
|
||
return 'en'
|
||
}
|
||
|
||
return null
|
||
}
|
||
|
||
export function localizeNativeMenu(
|
||
template: MenuItemConstructorOptions[],
|
||
locale: NativeMenuLocale,
|
||
appName: string
|
||
): MenuItemConstructorOptions[] {
|
||
if (locale !== 'tr') {
|
||
return template
|
||
}
|
||
|
||
const labels: Record<string, string> = {
|
||
[`About ${appName}`]: `${appName} Hakkında`,
|
||
'Check for Updates…': 'Güncellemeleri kontrol et…',
|
||
File: 'Dosya',
|
||
'New Window': 'Yeni pencere',
|
||
'Open Folder…': 'Klasör aç…',
|
||
Close: 'Kapat',
|
||
Edit: 'Düzen',
|
||
View: 'Görünüm',
|
||
Reload: 'Yenile',
|
||
'Toggle Developer Tools': 'Geliştirici araçlarını aç/kapat',
|
||
'Actual Size': 'Gerçek boyut',
|
||
'Zoom In': 'Yakınlaştır',
|
||
'Zoom Out': 'Uzaklaştır',
|
||
Window: 'Pencere',
|
||
Help: 'Yardım'
|
||
}
|
||
|
||
const roles: Partial<Record<NonNullable<MenuItemConstructorOptions['role']>, string>> = {
|
||
services: 'Servisler',
|
||
hide: `${appName} uygulamasını gizle`,
|
||
hideOthers: 'Diğerlerini gizle',
|
||
unhide: 'Tümünü göster',
|
||
quit: `${appName} uygulamasından çık`,
|
||
undo: 'Geri al',
|
||
redo: 'Yinele',
|
||
cut: 'Kes',
|
||
copy: 'Kopyala',
|
||
paste: 'Yapıştır',
|
||
pasteAndMatchStyle: 'Biçimlendirmeden yapıştır',
|
||
delete: 'Sil',
|
||
selectAll: 'Tümünü seç',
|
||
forceReload: 'Uygulamayı zorla yenile',
|
||
togglefullscreen: 'Tam ekranı aç/kapat',
|
||
minimize: 'Simge durumuna küçült',
|
||
zoom: 'Pencereyi büyüt/küçült',
|
||
front: 'Tümünü öne getir',
|
||
close: 'Kapat'
|
||
}
|
||
|
||
return template.map(item => {
|
||
const label =
|
||
item.label !== undefined
|
||
? Object.hasOwn(labels, item.label)
|
||
? labels[item.label]
|
||
: item.label
|
||
: item.role && roles[item.role]
|
||
|
||
return {
|
||
...item,
|
||
...(label !== undefined && { label }),
|
||
...(Array.isArray(item.submenu) && { submenu: localizeNativeMenu(item.submenu, locale, appName) })
|
||
}
|
||
})
|
||
}
|