Expand AITURK Turkish settings and desktop surfaces for beta 5

This commit is contained in:
yilsem committed 2026-09-06 05:03:32 +03:00
1 parent 237d1e2060
commit 5e76f58637
108 files changed
+6675 -1034

No files matched your search

@@ -24,25 +24,32 @@ const en = BOTS_LOCALES.en
const ja = BOTS_LOCALES.ja
const zh = BOTS_LOCALES.zh
const zhHant = BOTS_LOCALES['zh-hant']
const tr = BOTS_LOCALES.tr
describe('BOTS_LOCALES', () => {
it('covers the English key tree in every shipped locale', () => {
expect(ja).toBeDefined()
expect(zh).toBeDefined()
expect(zhHant).toBeDefined()
expect(tr).toBeDefined()
const enPaths = leafEntries(en).map(([path]) => path)
expect(leafEntries(ja).map(([path]) => path)).toEqual(enPaths)
expect(leafEntries(zh).map(([path]) => path)).toEqual(enPaths)
expect(leafEntries(zhHant).map(([path]) => path)).toEqual(enPaths)
expect(
leafEntries(tr)
.map(([path]) => path)
.sort()
).toEqual([...enPaths].sort())
})
it('translates user-visible chrome instead of echoing English', () => {
const samples = ['roster.emptyTitle', 'bot.newTitle', 'group.manageTitle', 'tools.skillsHub'] as const
const enByPath = Object.fromEntries(leafEntries(en))
for (const locale of [ja, zh, zhHant]) {
for (const locale of [tr, ja, zh, zhHant]) {
const byPath = Object.fromEntries(leafEntries(locale))
for (const path of samples) {
@@ -55,7 +62,7 @@ describe('BOTS_LOCALES', () => {
const sentinel = 'QUERY_SENTINEL'
const gateway = 'GATEWAY_SENTINEL'
for (const locale of [en, ja, zh, zhHant]) {
for (const locale of [en, tr, ja, zh, zhHant]) {
const byPath = Object.fromEntries(leafEntries(locale))
const queryFn = byPath['roster.noMatchQuery'] as (query: string) => string
const bothFn = byPath['roster.noMatchQueryOn'] as (query: string, gateway: string) => string
+3 -2
View File
@@ -33,8 +33,9 @@ import { type PluginLocaleBundles, type PluginTranslate, usePluginI18n } from '@
import { useMemo } from 'react'
import { getPluginCtx } from './shared'
import { tr } from './tr'
type BotsMessages = {
export type BotsMessages = {
/** Left rail: the bot + group-chat roster. */
roster: {
search: string
@@ -1128,7 +1129,7 @@ const zhHant: BotsMessages = {
}
/** Registered via `ctx.i18n.register` at plugin load (disposer tracked). */
export const BOTS_LOCALES: PluginLocaleBundles = { en, ja, zh, 'zh-hant': zhHant }
export const BOTS_LOCALES: PluginLocaleBundles = { en, tr, ja, zh, 'zh-hant': zhHant }
// Bind the message SHAPE to a plugin translator: string leaves resolve now,
// function leaves forward their args through t(path, …).
+218
View File
@@ -0,0 +1,218 @@
import type { BotsMessages } from './i18n'
export const tr: BotsMessages = {
roster: {
search: 'Bot ve grup sohbetlerinde ara',
searchPlaceholder: 'Bot ve grup sohbetlerinde ara…',
newBotOrGroup: 'Yeni bot veya grup sohbeti',
groupChats: 'Grup sohbetleri',
emptyTitle: 'Henüz bot yok',
emptyDesc: 'İlk botunuzu oluşturun.',
noMatchQuery: query => `“${query}” ile eşleşen bot veya grup sohbeti yok`,
noMatchQueryOn: (query, gateway) => `${gateway} üzerinde “${query}” ile eşleşen bot veya grup sohbeti yok`,
noMatchFiltersOn: gateway => `${gateway} üzerinde bu filtrelere uyan bot veya grup sohbeti yok`,
noMatchFilters: 'Bu filtrelere uyan bot veya grup sohbeti yok.',
clearFilters: 'Filtreleri temizle',
allHidden: 'Tüm botlar gizli',
allHiddenDesc: 'Botlar çalışmaya devam eder ve geçmişleri korunur.',
showHidden: 'Gizli botları göster',
noHiddenMatch: 'Bu filtrelere uyan gizli bot yok.',
hiddenFromRoster: 'Listede gizli',
pinned: 'Sabitlenenler',
needsAttention: 'ilgilenmeniz gerekiyor',
needsInput: 'Yanıtınız gerekiyor',
botsAndGroups: 'Botlar ve grup sohbetleri',
botsOnly: 'Yalnızca botlar',
groupsOnly: 'Yalnızca grup sohbetleri',
anyActivity: 'Tüm etkinlikler',
activeNow: 'Şu anda etkin',
recentlyActive: 'Yakın zamanda etkin',
older: 'Daha eski',
gatewayRemoved: 'Ağ geçidi kaldırıldı',
onDemand: 'Gerektiğinde',
ready: 'Hazır',
statusUnknown: 'Durum bilinmiyor',
unavailable: 'Kullanılamıyor',
retryNow: 'Şimdi yeniden dene',
rosterUnavailable: reason =>
`Liste kullanılamıyor: ${reason}. Ağ geçidi profiles.list özelliğini desteklemiyorsa AITURK’ü güncelleyip ağ geçidini yeniden başlatın.`,
waitingForGateway:
'Ağ geçidi bağlantısı bekleniyor… Uzak bağlantılar birkaç saniye sürebilir; otomatik olarak yeniden denenir.'
},
sections: {
newSection: 'Yeni bölüm',
newTitle: 'Yeni bölüm',
renameTitle: 'Bölümü yeniden adlandır',
nameLabel: 'Bölüm adı',
namePlaceholder: 'ör. Müşteriler',
create: 'Oluştur',
rename: 'Yeniden adlandır…',
moveUp: 'Yukarı taşı',
moveDown: 'Aşağı taşı',
unassigned: 'Atanmamış',
options: name => `${name} bölümü seçenekleri`,
headingTip: 'Botları buraya bırakın · yeniden adlandırmak için çift tıklayın',
emptyHint: 'Botları buraya sürükleyin',
moveTo: 'Bölüme taşı',
newSectionEllipsis: 'Yeni bölüm…',
removeFromSection: 'Bölümden çıkar',
deleted: (name, count) =>
count === 0 ? `“${name}” silindi` : `“${name}” silindi; ${count} bot Atanmamış bölümüne taşındı`,
undo: 'Geri al'
},
bot: {
newTitle: 'Yeni bot',
editTitle: 'Profili düzenle',
editMenu: 'Düzenle…',
helpPromptPlaceholder: 'Bu bot hangi konuda yardımcı olsun?',
descriptionHint: 'Botun adı ve açıklamasından otomatik oluşturmak için boş bırakın.',
newChatWith: 'Bu botla yeni sohbet',
openBotChat: 'Bot sohbetini aç',
duplicate: 'Çoğalt',
duplicateFailed: 'Çoğaltılamadı',
deleteTitle: 'Bot ve profili silinsin mi?',
removeFromAllGroups: 'Tüm gruplardan çıkar',
createFirstHint: 'Botlar panelini açıp “Yeni bot” düğmesine basın.',
createFailed: 'Profil henüz oluşturulamadı',
advanced: 'Gelişmiş',
advancedHint: 'Gelişmiş — model, beceriler, araç grupları, SOUL.md',
advancedFailed: 'Gelişmiş yapılandırma başarısız oldu',
openAnotherChatUnsupported: 'Başka bir bot sohbeti açmak için AITURK IDE’yi güncelleyin.',
remoteConnectionsUnsupported: 'Diğer bağlantılardaki botlarla sohbet etmek için AITURK IDE’yi güncelleyin.',
chatEmpty: 'Başlamak için bir mesaj yazın.',
kickoff: 'Merhaba, bana kendinden bahseder misin?'
},
avatar: {
classicShapes: 'Klasik şekiller',
blobFromName: 'Botun adından oluşturulan yüz',
unlockFollowsName: 'Kilidi aç; yüz yeniden botun adına göre oluşsun',
randomize: 'Rastgele oluştur',
tabBot: 'Bot',
tabGenerate: 'Oluştur',
upload: 'Yükle',
tabPet: 'Maskot',
removeImage: 'Görseli kaldır; şekil kullan',
removeBackToShape: 'Kaldır; şekil avatarına dön',
describePlaceholder: 'Avatarınızı tarif edin…',
describeHint: 'Ad, unvan, açıklama ve ajan mesajlaşma listesinden otomatik oluşturmak için boş bırakın.',
matchTheName: 'Ada uygun oluştur',
pickPet: 'Bu botun profil resmi için bir maskot seçin.',
petLoadFailed: 'Maskot yüklenemedi; başka birini deneyin.',
imageTooLarge: 'Görsel çok büyük (en fazla 15 MB).',
generationFailed: 'Avatar oluşturulamadı',
savedLocally: 'Görünüm yerel olarak kaydedildi; uzak sunucuya kaydedilemedi',
savedLocallyDescriptionFailed: 'Görünüm yerel olarak kaydedildi; açıklama güncellenemedi',
generate: 'Oluştur',
generating: 'Oluşturuluyor…'
},
group: {
newTitle: 'Yeni grup sohbeti',
manageDesc: 'Bir bot birden fazla grup sohbetine katılabilir. Üyelikler tüm bilgisayarlarla eşitlenir.',
manageTitle: 'Grupları yönet',
settingsTitle: 'Grup ayarları',
settingsDesc: 'Grubu yeniden adlandırın veya oda resmi seçin. Üyeler ve geçmiş korunur.',
nameLabel: 'Grup adı',
searchToAdd: 'Eklenecek botları ara',
searchToAddPlaceholder: 'Eklenecek botları ara…',
removeFromSelection: 'Seçimden çıkar',
disbandTitle: 'Grup sohbeti dağıtılsın mı?',
deleteTitle: 'Grup sohbeti silinsin mi?',
deleteAction: 'Sil',
composerPlaceholder: 'Bir mesaj yazın; gruptaki tüm botlar odadaki mesajları duyar.',
attachHint: 'Dosya ekleyin; yanıt veren tüm botlar dosyaları görür',
newThread: 'Yeni konuşma',
reply: 'Yanıtla',
replyInThread: 'Konuşmada yanıtla',
replyInThreadPlaceholder: 'Konuşmada yanıtla…',
openThread: 'Bu konuşmayı aç',
collapseThread: 'Konuşmayı daralt',
collapseThreadLabel: 'Bu konuşmayı daralt',
activity: 'Etkinlik',
noActivityYet: 'Bu turda henüz etkinlik yok.',
showActivity: 'Oda etkinliğini göster',
hideActivity: 'Oda etkinliğini gizle',
stop: 'Durdur',
stopHint: 'Bu çalıştırmayı durdur; sıradaki üyeyi keser ve diğerlerini bekletir',
allHeldStatus: count => `${count} botun tümü duraklatıldı`,
heldMembersStatus: members => `Duraklatılanlar: ${members}`,
holdReleaseHint: 'Sürdürmek için duraklatılan botu etiketleyin veya @all resume gönderin.',
needsYourInput: 'Bu grup sohbetindeki bir bot yanıtınızı bekliyor',
pictureGenerationFailed: 'Grup resmi oluşturulamadı',
nameTaken: name => `“${name}” adlı grup zaten var.`,
memberCount: count => `${count} bot`,
settingsHint: group => `Grup ayarları — ${group} grubunu yeniden adlandırın veya oda resmi seçin`,
settingsLabel: group => `${group} grup ayarları`,
disbandHint: group => `${group} grup sohbetini dağıt`,
disbandLabel: group => `${group} grubunu dağıt`,
disbandAction: 'Dağıt',
disbanding: 'Dağıtılıyor…',
disbandDone: 'Dağıtıldı',
disbanded: group => `“${group}” dağıtıldı`,
disbandDescPrefix: 'Dağıtılacak grup: ',
disbandDescSuffix: count =>
`. ${count} botun grup bağlantısı kaldırılır ve ortak oda günlüğü temizlenir. Botlar ve gruba ait bireysel oturumları korunur.`,
stopped: group => `${group} durduruldu; kalan turlar siz sürdürünceye kadar bekletilir`,
removeAttachment: 'Eki kaldır',
threadFallback: 'Konuşma',
replyCount: replies => `${replies} yanıt`,
dropToThread: 'Bu konuşma yanıtına eklemek için bırakın',
dropToRoom: 'Eklemek için bırakın; yanıt veren tüm botlar görür',
waitingForAnswer: 'Yanıtınız bekleniyor…',
memberThinking: name => `${name} düşünüyor…`,
roomWorking: 'Odada çalışılıyor…',
messageRoom: group => `${group} grubuna mesaj gönder`,
newThreadPlaceholder: group => `${group} içinde yeni konuşma… (yönlendirmek için @ad, tümü için @everyone)`,
everyoneMeta: 'Odadaki tüm botlar',
commandApproval: 'komut onayı',
answerFailed: (handle, error) => `Yanıt @${handle} kullanıcısına gönderilemedi: ${error}`,
wantsToRunCommand: handle => `@${handle} bir komut çalıştırmak istiyor:`,
asks: handle => `@${handle} soruyor:`,
answerTo: member => `@${member} kullanıcısına yanıt ver`
},
tools: {
skillsHub: 'AITURK beceri merkezi',
filterSkills: 'Becerileri filtrele…',
searchHub: 'Merkezde ara (topluluk ve bilinen kaynaklar)…',
noMcpServers: 'Yapılandırılmış veya katalogda bulunan MCP sunucusu yok.'
},
cron: {
filterHint:
'Bu profilde zamanlanmış görevler var ancak hiçbiri bu bot için etiketlenmemiş. Burada görünmesi için göreve “[bot:<ad>] …” biçiminde ad verin veya aşağıdaki zamanlanmış görevler bölümüne bakın.',
needsRosterFirst: 'Bu bot önce listede görünmeli.',
staleNotice: 'Zamanlanmış görevler yenilenemedi. Son alınan liste gösteriliyor.',
readFailure: 'Liste hâlâ mevcut olabilir; okuma başarısız oldu, silme işlemi yapılmadı.',
createDesc: bot =>
`${bot} tarafından zamanlanarak çalıştırılan yinelenen görev. Çalıştırmalar botun kendi sohbet geçmişinde görünür.`,
instruction: 'Talimat',
whenToRun: 'Çalıştırma zamanı',
dayOfMonth: 'Ayın günü',
sendResultsTo: 'Sonuçların gönderileceği yer',
runHistoryOnly: 'Yalnızca çalıştırma geçmişi',
botChatTarget: bot => `${bot} sohbeti (bot yanıt verir)`,
continuity: 'Süreklilik: her çalıştırma önceki çıktıyı görür; tekrarları önleyip kaldığı yerden sürdürür',
onceIn: when => `Bir kez (${when})`,
everyNDays: days => `${days} günde bir`,
everyNHours: hours => `${hours} saatte bir`,
everyNMinutes: minutes => `${minutes} dakikada bir`,
freqOnce: 'Bir kez, şu süre sonra…',
freqHourly: 'Her saat',
freqDaily: 'Her gün',
freqWeekdays: 'Hafta içi',
freqWeekly: 'Her hafta',
freqMonthly: 'Her ay',
freqInterval: 'Aralık',
freqAdvanced: 'Gelişmiş…',
unitMinutes: 'dakika',
unitHours: 'saat',
unitDays: 'gün',
runsOnce: (count, unit) => `${count} ${unit} sonra bir kez çalışır`,
runsHourly: 'Her saat başında çalışır',
runsDaily: time => `Her gün ${time} saatinde çalışır`,
runsWeekdays: time => `Pazartesiden cumaya ${time} saatinde çalışır`,
runsWeekly: (day, time) => `Her ${day} ${time} saatinde çalışır`,
runsMonthly: (day, time) => `Her ayın ${day}. günü ${time} saatinde çalışır`,
runsInterval: (count, unit) => `${count} ${unit} aralıkla çalışır`,
runsRaw: 'Ham zamanlama — every Nm/Nh/Nd veya 5 alanlı cron ifadesi',
timesTotal: count => `, toplam ${count} kez`
}
}