mirror of
https://github.com/stablyai/orca.git
synced 2026-10-31 00:57:45 +00:00
feat(i18n): add Turkish UI language (#34718)
* feat(i18n): add Turkish UI language Register Turkish (tr) as a built-in UI language alongside en, zh, ko, ja, es, fr and pt: language setting, system-locale detection, renderer and main-process lazy catalogs, Settings picker label in every catalog, Settings search keyword, onboarding picker, docs, README link and a Turkish style glossary (config/i18n-turkish.md). tr.json comes from the community Turkish catalog (#22200, refreshed in #31316), reconciled with the current en.json: keys retired from en.json, entries whose English source changed since the refresh, and entries with placeholder mismatches are dropped and fall back to English until the next translation pass. Supersedes #31316. Co-authored-by: Uğur Pala <mail@ugurpala.com> Co-authored-by: mert <mmerttpz@gmail.com> Co-authored-by: Mehmet Efe Aytaş <mehmetefeaytas@icloud.com> * feat(i18n): complete Turkish catalog Translate the 1,432 keys tr.json was missing, restore the count placeholder in six Turkish singular forms, and order the catalog like en.json. * fix(i18n): apply Turkish translation review Correct 32 mistranslations (wrong meaning, translated command names and example paths, swapped placeholders) and 525 glossary and grammar issues that two independent review passes both flagged. * fix(i18n): Turkish review fixes and dotted-I settings search Fold U+0307 from lowercased Turkish İ so settings search matches plain-i queries, fix sampled Turkish meaning/terminology issues, and align the glossary casing rule with the catalog. --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> Co-authored-by: Uğur Pala <mail@ugurpala.com> Co-authored-by: mert <mmerttpz@gmail.com> Co-authored-by: Mehmet Efe Aytaş <mehmetefeaytas@icloud.com>
This commit is contained in:
co-authored by
OrcaWin
Uğur Pala
mert
Mehmet Efe Aytaş
parent
5237d52f82
commit
4b1967bdd8
@@ -12,7 +12,7 @@
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<sub><a href="docs/readme/README.zh-CN.md">中文</a> · <a href="docs/readme/README.ja.md">日本語</a> · <a href="docs/readme/README.ko.md">한국어</a> · <a href="docs/readme/README.es.md">Español</a> · <a href="docs/readme/README.fr.md">Français</a> · <a href="docs/readme/README.pt.md">Português</a></sub>
|
||||
<sub><a href="docs/readme/README.zh-CN.md">中文</a> · <a href="docs/readme/README.ja.md">日本語</a> · <a href="docs/readme/README.ko.md">한국어</a> · <a href="docs/readme/README.es.md">Español</a> · <a href="docs/readme/README.fr.md">Français</a> · <a href="docs/readme/README.pt.md">Português</a> · <a href="docs/readme/README.tr.md">Türkçe</a></sub>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
# Turkish (tr) UI Glossary and Style
|
||||
|
||||
Catalog: `src/renderer/src/i18n/locales/tr.json`. Missing keys fall back to English at runtime.
|
||||
|
||||
## Voice
|
||||
|
||||
- Prose and instructions use polite `siz`: `Bir dal seçin`, `hesabınız`.
|
||||
- Buttons and menu items use the bare imperative: `Aç`, `Sil`, `Kaldır`, `Yeniden dene`, `İptal`.
|
||||
- Failures name the action with a passive inability form: `kaydedilemedi`, `açılamadı`. Use `başarısız` only as an adjective.
|
||||
- Confirmations are impersonal: `Pencere kapatılsın mı?`
|
||||
- Follow the casing of the English source: title case for title-case labels (`Varsayılan Arama Motoru`), sentence case elsewhere. Keep brand names and acronyms as written.
|
||||
- Labels have no final period. Use `…`, not `...`.
|
||||
- A noun after a number stays singular: `{{count}} dosya`, `{{count}} commit`.
|
||||
|
||||
## Suffixes
|
||||
|
||||
- Put an apostrophe before suffixes on proper names and acronyms, and choose the suffix by how the word is pronounced: `GitHub'da`, `Orca'ya`, `SSH'yi`, `CLI'yi`, `Linear'ın`.
|
||||
- English technical terms kept in English also take an apostrophe: `worktree'ler`, `commit'leri`, `branch'e`.
|
||||
- Established loanwords take the suffix directly: `terminalde`, `paneli`, `modele`, `repoda`.
|
||||
- When the suffix would go on the name of a UI section, rephrase instead: `Ayarlar bölümünde`, not `Ayarlar'da`.
|
||||
|
||||
## Terms
|
||||
|
||||
| English | Turkish | Note |
|
||||
| ------------------------------------------------------------------ | --------------------- | ------------------------------------------------------- |
|
||||
| worktree | worktree | Keep in English. It is a separate term from workspace. |
|
||||
| workspace | çalışma alanı | |
|
||||
| repository / repo | repository / repo | Keep in English. Do not use `depo`. |
|
||||
| branch, commit, pull request, merge, rebase, diff, stash, checkout | (kept in English) | For the verb form use `merge et`, `commit'le`. |
|
||||
| base branch | temel branch | |
|
||||
| terminal | terminal | |
|
||||
| pane / panel | bölme / panel | Keep the two terms distinct. |
|
||||
| tab | sekme | |
|
||||
| sidebar | kenar çubuğu | |
|
||||
| shell | kabuk | `PowerShell` keeps its name. |
|
||||
| session | oturum | |
|
||||
| editor | düzenleyici | |
|
||||
| agent | ajan | |
|
||||
| chat | sohbet | |
|
||||
| prompt | istem | |
|
||||
| skill | beceri | Do not use `yetenek`. |
|
||||
| plugin | eklenti | |
|
||||
| automation / task | otomasyon / görev | |
|
||||
| dashboard | pano | |
|
||||
| token (LLM) | token | For an auth token use `belirteç`. |
|
||||
| settings | ayarlar | |
|
||||
| shortcut / keybinding | kısayol / tuş ataması | |
|
||||
| sign in | oturum aç | |
|
||||
| remote (Git) / remote (host) | remote / uzak | |
|
||||
| server, SSH host | sunucu, SSH sunucusu | |
|
||||
| browser | tarayıcı | |
|
||||
| review | inceleme / İncele | |
|
||||
| check (CI) | kontrol | |
|
||||
| issue | sorun | Product names such as `GitHub Issues` stay as they are. |
|
||||
| comment, approve | yorum, onayla | |
|
||||
| delete / remove | sil / kaldır | Keep the two terms distinct. |
|
||||
|
||||
Do not translate placeholders (`{{value0}}`), markup, commands, paths, or labels that belong to another product's UI.
|
||||
|
||||
## Casing (dotted and dotless I)
|
||||
|
||||
In Turkish, `i` uppercases to `İ` and `I` lowercases to `ı`. Code that compares or normalizes identifiers, keys, paths, or commands must not call locale-sensitive `toLocaleUpperCase()` or `toLocaleLowerCase()` without passing a locale. Use `toLowerCase()`, or pass `'en-US'` explicitly. Only text that is displayed may follow the Turkish rules.
|
||||
@@ -13,6 +13,13 @@
|
||||
"dynamic": false,
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"filePath": "src/renderer/src/components/settings/appearance-search.ts",
|
||||
"kind": "object-property:keywords",
|
||||
"text": "Dil",
|
||||
"dynamic": false,
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"filePath": "src/renderer/src/components/settings/appearance-search.ts",
|
||||
"kind": "object-property:keywords",
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<sub><a href="../../README.md">English</a> · <a href="README.zh-CN.md">中文</a> · <a href="README.ja.md">日本語</a> · <a href="README.ko.md">한국어</a> · <a href="README.fr.md">Français</a> · <a href="README.pt.md">Português</a></sub>
|
||||
<sub><a href="../../README.md">English</a> · <a href="README.zh-CN.md">中文</a> · <a href="README.ja.md">日本語</a> · <a href="README.ko.md">한국어</a> · <a href="README.fr.md">Français</a> · <a href="README.pt.md">Português</a> · <a href="README.tr.md">Türkçe</a></sub>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<sub><a href="../../README.md">English</a> · <a href="README.zh-CN.md">中文</a> · <a href="README.ja.md">日本語</a> · <a href="README.ko.md">한국어</a> · <a href="README.es.md">Español</a> · <a href="README.pt.md">Português</a></sub>
|
||||
<sub><a href="../../README.md">English</a> · <a href="README.zh-CN.md">中文</a> · <a href="README.ja.md">日本語</a> · <a href="README.ko.md">한국어</a> · <a href="README.es.md">Español</a> · <a href="README.pt.md">Português</a> · <a href="README.tr.md">Türkçe</a></sub>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<sub><a href="../../README.md">English</a> · <a href="README.zh-CN.md">中文</a> · <a href="README.ko.md">한국어</a> · <a href="README.es.md">Español</a> · <a href="README.fr.md">Français</a> · <a href="README.pt.md">Português</a></sub>
|
||||
<sub><a href="../../README.md">English</a> · <a href="README.zh-CN.md">中文</a> · <a href="README.ko.md">한국어</a> · <a href="README.es.md">Español</a> · <a href="README.fr.md">Français</a> · <a href="README.pt.md">Português</a> · <a href="README.tr.md">Türkçe</a></sub>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<sub><a href="../../README.md">English</a> · <a href="README.zh-CN.md">中文</a> · <a href="README.ja.md">日本語</a> · <a href="README.es.md">Español</a> · <a href="README.fr.md">Français</a> · <a href="README.pt.md">Português</a></sub>
|
||||
<sub><a href="../../README.md">English</a> · <a href="README.zh-CN.md">中文</a> · <a href="README.ja.md">日本語</a> · <a href="README.es.md">Español</a> · <a href="README.fr.md">Français</a> · <a href="README.pt.md">Português</a> · <a href="README.tr.md">Türkçe</a></sub>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<sub><a href="../../README.md">English</a> · <a href="README.zh-CN.md">中文</a> · <a href="README.ja.md">日本語</a> · <a href="README.ko.md">한국어</a> · <a href="README.es.md">Español</a> · <a href="README.fr.md">Français</a></sub>
|
||||
<sub><a href="../../README.md">English</a> · <a href="README.zh-CN.md">中文</a> · <a href="README.ja.md">日本語</a> · <a href="README.ko.md">한국어</a> · <a href="README.es.md">Español</a> · <a href="README.fr.md">Français</a> · <a href="README.tr.md">Türkçe</a></sub>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
|
||||
@@ -0,0 +1,276 @@
|
||||
<h1 align="center">
|
||||
<a href="https://onOrca.dev"><img src="../../resources/build/icon.png" alt="Orca" width="64" valign="middle" /></a> Orca
|
||||
</h1>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/stablyai/orca"><img src="https://img.shields.io/github/stars/stablyai/orca?style=flat&label=%E2%98%85&color=08C" alt="GitHub yıldızları" /></a>
|
||||
<a href="https://github.com/stablyai/orca/releases"><img src="../assets/readme-downloads.svg" alt="Tüm sürümlerdeki toplam indirme sayısı" /></a>
|
||||
<img src="https://img.shields.io/badge/license-MIT-08C?style=flat" alt="Lisans: MIT" />
|
||||
<a href="https://discord.gg/fzjDKHxv8Q"><img src="https://img.shields.io/badge/Discord-5865F2?logo=discord&logoColor=white" alt="Orca Discord'una katılın" /></a>
|
||||
<a href="https://x.com/orca_build"><img src="https://img.shields.io/badge/X-000000?logo=x&logoColor=white" alt="Orca'yı X'te takip edin" /></a>
|
||||
<img src="https://img.shields.io/badge/macOS%20%7C%20Windows%20%7C%20Linux-4493F8?style=flat-square" alt="Desteklenen platformlar: macOS, Windows ve Linux" />
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<sub><a href="../../README.md">English</a> · <a href="README.zh-CN.md">中文</a> · <a href="README.ja.md">日本語</a> · <a href="README.ko.md">한국어</a> · <a href="README.es.md">Español</a> · <a href="README.fr.md">Français</a> · <a href="README.pt.md">Português</a></sub>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<strong>100x geliştiriciler için yapay zekâ orkestratörü.</strong><br/>
|
||||
Codex, Claude Code, OpenCode veya Pi'yi yan yana çalıştırın - her biri kendi worktree'sinde, hepsi tek yerden takip edilir.
|
||||
</p>
|
||||
|
||||
<h3 align="center"><a href="https://onorca.dev/download"><ins>Orca'yı indirin</ins></a></h3>
|
||||
|
||||
<p align="center">
|
||||
<img src="../assets/readme-hero.jpg" alt="Paralel worktree'lerde ajan çalıştıran Orca masaüstü uygulaması, köşede Orca mobil yardımcı uygulaması" width="960" />
|
||||
</p>
|
||||
|
||||
## Özellikler
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td width="50%" valign="middle">
|
||||
|
||||
### Mobil Yardımcı
|
||||
|
||||
Ajanlarınızı telefonunuzdan izleyin ve yönlendirin - bir ajan işini bitirdiğinde bildirim alın, nerede olursanız olun takip talimatı gönderin.
|
||||
|
||||
[iOS App Store](https://apps.apple.com/us/app/orca-ide/id6766130217) · [Android APK](https://www.onorca.dev/download/android) · [Dokümanlar →](https://www.onorca.dev/docs/mobile)
|
||||
|
||||
</td>
|
||||
<td width="50%">
|
||||
<a href="https://www.onorca.dev/docs/mobile"><picture><source srcset="../assets/feature-wall/mobile-companion-app-showcase.gif" type="image/gif"><img src="../assets/feature-wall/mobile-companion-app-showcase.jpg" alt="Mobil yardımcı uygulamayla birlikte Orca masaüstü" width="100%" /></picture></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="50%" valign="middle">
|
||||
|
||||
### Paralel Worktree'ler
|
||||
|
||||
Tek bir prompt'u beş ajana birden dağıtın; her biri kendi izole git worktree'sinde çalışsın - sonuçları karşılaştırıp kazananı merge edin.
|
||||
|
||||
[Dokümanlar →](https://www.onorca.dev/docs/model/worktrees)
|
||||
|
||||
</td>
|
||||
<td width="50%">
|
||||
<a href="https://www.onorca.dev/docs/model/worktrees"><picture><source srcset="../site/public/docs/tab-split.gif" type="image/gif"><img src="../site/public/docs/posters/tab-split.jpg" alt="Paralel worktree orkestrasyonu" width="100%" /></picture></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="50%" valign="middle">
|
||||
|
||||
### Terminal Bölmeleri
|
||||
|
||||
WebGL ile çizilen Ghostty ayarında terminaller, sınırsız bölme ve yeniden başlatmadan sağ çıkan scrollback.
|
||||
|
||||
[Dokümanlar →](https://www.onorca.dev/docs/terminal)
|
||||
|
||||
</td>
|
||||
<td width="50%">
|
||||
<a href="https://www.onorca.dev/docs/terminal"><picture><source srcset="../../resources/onboarding/feature-wall/tile-02.webp" type="image/webp"><img src="../../resources/onboarding/feature-wall/tile-02.poster.jpg" alt="Terminal bölmeleri" width="100%" /></picture></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="50%" valign="middle">
|
||||
|
||||
### Tasarım Modu
|
||||
|
||||
Gerçek bir Chromium penceresindeki herhangi bir arayüz öğesine tıklayın; öğenin HTML'i, CSS'i ve kırpılmış ekran görüntüsü doğrudan ajanınızın prompt'una gitsin.
|
||||
|
||||
[Dokümanlar →](https://www.onorca.dev/docs/browser/design-mode)
|
||||
|
||||
</td>
|
||||
<td width="50%">
|
||||
<a href="https://www.onorca.dev/docs/browser/design-mode"><picture><source srcset="../site/public/docs/orca-design-mode.gif" type="image/gif"><img src="../../resources/onboarding/feature-wall/tile-05.poster.jpg" alt="Gömülü tarayıcı ve Tasarım Modu" width="100%" /></picture></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="50%" valign="middle">
|
||||
|
||||
### GitHub ve Linear, Yerleşik
|
||||
|
||||
PR'ları, issue'ları ve proje panolarını uygulamanın içinde gezin - herhangi bir görevden worktree açın, bağlam değiştirmeden inceleyin.
|
||||
|
||||
[Dokümanlar →](https://www.onorca.dev/docs/review/linear)
|
||||
|
||||
</td>
|
||||
<td width="50%">
|
||||
<a href="https://www.onorca.dev/docs/review/linear"><picture><source srcset="../../resources/onboarding/feature-wall/tile-03.webp" type="image/webp"><img src="../../resources/onboarding/feature-wall/tile-03.poster.jpg" alt="Orca'da GitHub ve Linear görev akışları" width="100%" /></picture></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="50%" valign="middle">
|
||||
|
||||
### SSH Worktree'leri
|
||||
|
||||
Ajanları güçlü bir uzak makinede çalıştırın; dosya düzenleme, git ve terminaller eksiksiz - otomatik yeniden bağlanma ve port yönlendirme dahil.
|
||||
|
||||
[Dokümanlar →](https://www.onorca.dev/docs/ssh)
|
||||
|
||||
</td>
|
||||
<td width="50%">
|
||||
<a href="https://www.onorca.dev/docs/ssh"><picture><source srcset="../../resources/onboarding/feature-wall/tile-06.webp" type="image/webp"><img src="../../resources/onboarding/feature-wall/tile-06.poster.jpg" alt="SSH üzerinden uzak worktree'ler" width="100%" /></picture></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="50%" valign="middle">
|
||||
|
||||
### Yapay Zekâ Diff'lerine Not Düşün
|
||||
|
||||
Herhangi bir diff satırına yorum bırakın ve ajana geri gönderin - Orca'dan çıkmadan inceleyin, düzenleyin ve commit edin.
|
||||
|
||||
[Dokümanlar →](https://www.onorca.dev/docs/review/annotate-ai-diff)
|
||||
|
||||
</td>
|
||||
<td width="50%">
|
||||
<a href="https://www.onorca.dev/docs/review/annotate-ai-diff"><picture><source srcset="../site/public/docs/annotate-ai-diff.gif" type="image/gif"><img src="../../resources/onboarding/feature-wall/tile-08.poster.jpg" alt="Yapay zekâ tarafından üretilen diff'lere not düşme" width="100%" /></picture></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="50%" valign="middle">
|
||||
|
||||
### Dosyaları Ajanlara Sürükleyin
|
||||
|
||||
Her yerde otomatik kaydeden VS Code editörü - dosyaları veya görselleri doğrudan bir ajan prompt'una sürükleyin.
|
||||
|
||||
[Dokümanlar →](https://www.onorca.dev/docs/editing/file-explorer)
|
||||
|
||||
</td>
|
||||
<td width="50%">
|
||||
<a href="https://www.onorca.dev/docs/editing/file-explorer"><picture><source srcset="../../resources/onboarding/feature-wall/tile-07.gif" type="image/gif"><img src="../../resources/onboarding/feature-wall/tile-07.poster.jpg" alt="Bir ajan prompt'una dosya ve görsel sürükleme" width="100%" /></picture></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="50%" valign="middle">
|
||||
|
||||
### Orca CLI
|
||||
|
||||
Orca'yı ajanlar da kullanır - her akışı `orca worktree create`, `snapshot`, `click` ve `fill` ile script'leyin.
|
||||
|
||||
[Dokümanlar →](https://www.onorca.dev/docs/cli/overview)
|
||||
|
||||
</td>
|
||||
<td width="50%">
|
||||
<a href="https://www.onorca.dev/docs/cli/overview"><picture><source srcset="../../resources/onboarding/feature-wall/tile-09.webp" type="image/webp"><img src="../../resources/onboarding/feature-wall/tile-09.poster.jpg" alt="Orca'yı CLI'dan script'leme" width="100%" /></picture></a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
**Kutudan çıkan diğerleri:**
|
||||
|
||||
- **[Hızlı açma](https://www.onorca.dev/docs/model/quick-open)** - Worktree'ler, dosyalar, ajanlar, komutlar ve repo bağlamı arasında akışınızdan çıkmadan arama yapın.
|
||||
- **[Hesap değiştirme ve kullanım takibi](https://www.onorca.dev/docs/agents/usage-tracking)** - Claude ve Codex kullanımınızı ve limit sıfırlanma zamanlarını görün, yeniden giriş yapmadan hesaplar arasında geçiş yapın.
|
||||
- **[Zengin repo önizlemeleri](https://www.onorca.dev/docs/editing/markdown)** - Çalışma alanında Markdown, görsel, PDF ve repo dokümanlarını önizleyin.
|
||||
- **[Bilgisayar Kullanımı](https://www.onorca.dev/docs/cli/computer-use)** - Bir akış gerçek etkileşim gerektirdiğinde ajanların masaüstü uygulamalarını ve görünür arayüzü kullanmasına izin verin.
|
||||
- **[Bildirimler ve okunmadı durumu](https://www.onorca.dev/docs/notifications)** - Bir ajan bittiğinde ya da ilginizi istediğinde haberiniz olsun; sonra dönmek için konuşmaları okunmadı olarak işaretleyin.
|
||||
- **Ve çok daha fazlası** - her gün sürüm çıkarıyoruz, bu liste sürekli geride kalıyor. Asıl özellik listesi [changelog](https://github.com/stablyai/orca/releases).
|
||||
|
||||
---
|
||||
|
||||
## Desteklenen Ajanlar
|
||||
|
||||
**Herhangi bir CLI ajanıyla** çalışır - terminalde çalışan her şey Orca'da da çalışır.
|
||||
|
||||
<p>
|
||||
<a href="https://docs.anthropic.com/claude/docs/claude-code"><kbd><img src="../assets/claude-logo.svg" alt="Claude Code logosu" width="16" valign="middle" /> Claude Code</kbd></a>
|
||||
<a href="https://github.com/openai/codex"><kbd><img src="https://www.google.com/s2/favicons?domain=openai.com&sz=64" alt="Codex logosu" width="16" valign="middle" /> Codex</kbd></a>
|
||||
<a href="https://x.ai/cli"><kbd><img src="https://www.google.com/s2/favicons?domain=x.ai&sz=64" alt="Grok logosu" width="16" valign="middle" /> Grok</kbd></a>
|
||||
<a href="https://cursor.com/cli"><kbd><img src="https://www.google.com/s2/favicons?domain=cursor.com&sz=64" alt="Cursor logosu" width="16" valign="middle" /> Cursor</kbd></a>
|
||||
<a href="https://docs.github.com/en/copilot/how-tos/set-up/install-copilot-cli"><kbd><img src="https://www.google.com/s2/favicons?domain=github.com&sz=64" alt="GitHub Copilot logosu" width="16" valign="middle" /> GitHub Copilot</kbd></a>
|
||||
<a href="https://dev.meta.ai/docs/muse-code"><kbd><img src="../../src/shared/agent-icons/muse.png" alt="Muse logosu" width="16" valign="middle" /> Muse</kbd></a>
|
||||
<a href="https://deepseek-harness.github.io/deepseek-harness/"><kbd><img src="../../src/shared/agent-icons/dsh.png" alt="DeepSeek Harness logosu" width="16" valign="middle" /> DeepSeek Harness</kbd></a>
|
||||
<a href="https://zcode.z.ai/en/docs"><kbd><img src="../../src/shared/agent-icons/zcode.png" alt="ZCode logosu" width="16" valign="middle" /> ZCode</kbd></a>
|
||||
<a href="https://opencode.ai/docs/cli/"><kbd><img src="https://www.google.com/s2/favicons?domain=opencode.ai&sz=64" alt="OpenCode logosu" width="16" valign="middle" /> OpenCode</kbd></a>
|
||||
<a href="https://mimo.xiaomi.com/coder"><kbd><img src="https://www.google.com/s2/favicons?domain=mimo.xiaomi.com&sz=64" alt="MiMo Code logosu" width="16" valign="middle" /> MiMo Code</kbd></a>
|
||||
<a href="https://ampcode.com/manual#install"><kbd><img src="https://www.google.com/s2/favicons?domain=ampcode.com&sz=64" alt="Amp logosu" width="16" valign="middle" /> Amp</kbd></a>
|
||||
<a href="https://openclaude.gitlawb.com/"><kbd><img src="../../resources/openclaude-logo.png" alt="OpenClaude logosu" width="16" valign="middle" /> OpenClaude</kbd></a>
|
||||
<a href="https://antigravity.google/docs/cli-overview"><kbd><img src="https://www.google.com/s2/favicons?domain=antigravity.google&sz=64" alt="Antigravity logosu" width="16" valign="middle" /> Antigravity</kbd></a>
|
||||
<a href="https://pi.dev"><kbd><img src="https://pi.dev/favicon.svg" alt="Pi logosu" width="16" valign="middle" /> Pi</kbd></a>
|
||||
<a href="https://omp.sh"><kbd><img src="https://omp.sh/favicon.svg" alt="oh-my-pi logosu" width="16" valign="middle" /> oh-my-pi</kbd></a>
|
||||
<a href="https://hermes-agent.nousresearch.com/docs/"><kbd><img src="https://www.google.com/s2/favicons?domain=nousresearch.com&sz=64" alt="Hermes Agent logosu" width="16" valign="middle" /> Hermes Agent</kbd></a>
|
||||
<a href="https://devin.ai/cli"><kbd><img src="https://www.google.com/s2/favicons?domain=devin.ai&sz=64" alt="Devin logosu" width="16" valign="middle" /> Devin</kbd></a>
|
||||
<a href="https://block.github.io/goose/docs/quickstart/"><kbd><img src="https://www.google.com/s2/favicons?domain=goose-docs.ai&sz=64" alt="Goose logosu" width="16" valign="middle" /> Goose</kbd></a>
|
||||
<a href="https://docs.augmentcode.com/cli/overview"><kbd><img src="https://www.google.com/s2/favicons?domain=augmentcode.com&sz=64" alt="Auggie logosu" width="16" valign="middle" /> Auggie</kbd></a>
|
||||
<a href="https://github.com/autohandai/code-cli"><kbd><img src="https://www.google.com/s2/favicons?domain=autohand.ai&sz=64" alt="Autohand Code logosu" width="16" valign="middle" /> Autohand Code</kbd></a>
|
||||
<a href="https://github.com/charmbracelet/crush"><kbd><img src="https://www.google.com/s2/favicons?domain=charm.sh&sz=64" alt="Charm logosu" width="16" valign="middle" /> Charm</kbd></a>
|
||||
<a href="https://docs.cline.bot/cline-cli/overview"><kbd><img src="https://www.google.com/s2/favicons?domain=cline.bot&sz=64" alt="Cline logosu" width="16" valign="middle" /> Cline</kbd></a>
|
||||
<a href="https://www.codebuddy.ai/cli"><kbd><img src="https://www.google.com/s2/favicons?domain=codebuddy.ai&sz=64" alt="CodeBuddy logosu" width="16" valign="middle" /> CodeBuddy</kbd></a>
|
||||
<a href="https://www.codebuff.com/docs/help/quick-start"><kbd><img src="https://www.google.com/s2/favicons?domain=codebuff.com&sz=64" alt="Codebuff logosu" width="16" valign="middle" /> Codebuff</kbd></a>
|
||||
<a href="https://freebuff.com"><kbd><img src="../../src/shared/agent-icons/freebuff.png" alt="Freebuff logosu" width="16" valign="middle" /> Freebuff</kbd></a>
|
||||
<a href="https://commandcode.ai/docs/quickstart"><kbd><img src="https://www.google.com/s2/favicons?domain=commandcode.ai&sz=64" alt="Command Code logosu" width="16" valign="middle" /> Command Code</kbd></a>
|
||||
<a href="https://docs.continue.dev/guides/cli"><kbd><img src="https://www.google.com/s2/favicons?domain=continue.dev&sz=64" alt="Continue logosu" width="16" valign="middle" /> Continue</kbd></a>
|
||||
<a href="https://docs.factory.ai/cli/getting-started/quickstart"><kbd><img src="../assets/droid-logo.svg" alt="Droid logosu" width="16" valign="middle" /> Droid</kbd></a>
|
||||
<a href="https://kilo.ai/docs/cli"><kbd><img src="https://raw.githubusercontent.com/Kilo-Org/kilocode/main/packages/kilo-vscode/assets/icons/kilo-light.svg" alt="Kilocode logosu" width="16" valign="middle" /> Kilocode</kbd></a>
|
||||
<a href="https://www.kimi.com/code/docs/en/kimi-code-cli/getting-started.html"><kbd><img src="https://www.google.com/s2/favicons?domain=moonshot.cn&sz=64" alt="Kimi logosu" width="16" valign="middle" /> Kimi</kbd></a>
|
||||
<a href="https://kiro.dev/docs/cli/"><kbd><img src="https://www.google.com/s2/favicons?domain=kiro.dev&sz=64" alt="Kiro logosu" width="16" valign="middle" /> Kiro</kbd></a>
|
||||
<a href="https://github.com/mistralai/mistral-vibe"><kbd><img src="https://www.google.com/s2/favicons?domain=mistral.ai&sz=64" alt="Mistral Vibe logosu" width="16" valign="middle" /> Mistral Vibe</kbd></a>
|
||||
<a href="https://github.com/QwenLM/qwen-code"><kbd><img src="https://www.google.com/s2/favicons?domain=qwenlm.github.io&sz=64" alt="Qwen Code logosu" width="16" valign="middle" /> Qwen Code</kbd></a>
|
||||
<a href="https://support.atlassian.com/rovo/docs/install-and-run-rovo-dev-cli-on-your-device/"><kbd><img src="https://www.google.com/s2/favicons?domain=atlassian.com&sz=64" alt="Rovo Dev logosu" width="16" valign="middle" /> Rovo Dev</kbd></a>
|
||||
<kbd>+ her CLI ajanı</kbd>
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
## Kurulum
|
||||
|
||||
### Masaüstü - macOS, Windows, Linux
|
||||
|
||||
- **[onOrca.dev üzerinden indirin](https://onorca.dev/download)**
|
||||
- Ya da derlemeyi doğrudan alın: [macOS Apple Silicon](https://github.com/stablyai/orca/releases/latest/download/orca-macos-arm64.dmg) · [macOS Intel](https://github.com/stablyai/orca/releases/latest/download/orca-macos-x64.dmg) · [Windows (.exe)](https://github.com/stablyai/orca/releases/latest/download/orca-windows-setup.exe) · [Linux AppImage](https://github.com/stablyai/orca/releases/latest/download/orca-linux.AppImage) · [Tüm derlemeler](https://github.com/stablyai/orca/releases/latest)
|
||||
|
||||
_Ya da bir paket yöneticisiyle:_
|
||||
|
||||
```bash
|
||||
# macOS (Homebrew)
|
||||
brew install --cask stablyai/orca/orca
|
||||
|
||||
# Arch Linux (AUR) - kaynaktan derlemek için stably-orca-git
|
||||
yay -S stably-orca-bin
|
||||
```
|
||||
|
||||
### Mobil Yardımcı - iOS, Android
|
||||
|
||||
Ajanlarınızı telefonunuzdan izlemek ve yönlendirmek için masaüstü uygulamanızla eşleştirin.
|
||||
|
||||
- **iOS:** [App Store'dan indirin](https://apps.apple.com/us/app/orca-ide/id6766130217)
|
||||
- **Android:** [APK'yı indirin](https://www.onorca.dev/download/android) · [Kurulum rehberi](https://www.onorca.dev/docs/android-apk)
|
||||
|
||||
---
|
||||
|
||||
## Topluluk ve Destek
|
||||
|
||||
- **Discord:** Topluluğa **[Discord](https://discord.gg/fzjDKHxv8Q)** üzerinden katılın.
|
||||
- **Twitter / X:** Güncellemeler ve duyurular için **[@orca_build](https://x.com/orca_build)** hesabını takip edin.
|
||||
- **WeChat:** 12 numaralı grup doldu. Orca topluluğunun 13 numaralı WeChat grubuna katılmak için karekodu okutun.
|
||||
|
||||
<img src="../assets/wechat-qr-group13.jpg" alt="Orca topluluğunun 13 numaralı WeChat grubu karekodu" width="160" />
|
||||
|
||||
- **Geri bildirim ve fikirler:** Hızlı sürüm çıkarıyoruz. Eksik bulduğunuz bir şey mi var? [Yeni bir özellik isteyin](https://github.com/stablyai/orca/issues).
|
||||
- **Gizlilik:** Orca'nın hangi anonim kullanım verisini topladığını ve bunu nasıl kapatacağınızı [gizlilik ve telemetri dokümanlarında](https://www.onorca.dev/docs/telemetry) bulabilirsiniz.
|
||||
- **Destek olun:** Günlük sürümleri takip etmek için bu repoyu [yıldızlayın](https://github.com/stablyai/orca).
|
||||
|
||||
---
|
||||
|
||||
## Geliştirme
|
||||
|
||||
Katkıda bulunmak veya yerelde çalıştırmak ister misiniz? [CONTRIBUTING.md](../../.github/CONTRIBUTING.md) rehberimize bakın.
|
||||
|
||||
Mobil uygulamayı bir masaüstü sunucusuyla eşleştiren relay de bu repoda,
|
||||
[`cloud/`](../../cloud/README.md) altında yer alıyor; ayrı bir pnpm workspace'i ve kurulum rehberi var.
|
||||
|
||||
<a href="https://github.com/stablyai/orca/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=stablyai/orca" alt="Orca katkıda bulunanlar" />
|
||||
</a>
|
||||
|
||||
<p align="center">
|
||||
<img src="../assets/star-history.png" alt="stablyai/orca için GitHub yıldız geçmişi grafiği" width="880" />
|
||||
</p>
|
||||
|
||||
## İmzalı Derlemeler
|
||||
|
||||
Windows kod imzalama [SignPath.io](https://signpath.io) tarafından sağlanmaktadır, sertifika [SignPath Foundation](https://signpath.org) tarafından verilmiştir.
|
||||
|
||||
## Lisans
|
||||
|
||||
Orca, [MIT Lisansı](../../LICENSE) altında ücretsiz ve açık kaynaktır.
|
||||
@@ -12,7 +12,7 @@
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<sub><a href="../../README.md">English</a> · <a href="README.ja.md">日本語</a> · <a href="README.ko.md">한국어</a> · <a href="README.es.md">Español</a> · <a href="README.fr.md">Français</a> · <a href="README.pt.md">Português</a></sub>
|
||||
<sub><a href="../../README.md">English</a> · <a href="README.ja.md">日本語</a> · <a href="README.ko.md">한국어</a> · <a href="README.es.md">Español</a> · <a href="README.fr.md">Français</a> · <a href="README.pt.md">Português</a> · <a href="README.tr.md">Türkçe</a></sub>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
|
||||
@@ -28,7 +28,7 @@ Settings are grouped into panes. Everything here is searchable with `Cmd-,` then
|
||||
- Status bar toggles, including **Resource Manager** (CPU/memory/sessions, daemon controls, workspace disk scans).
|
||||
- **Usage percentages** — show provider limits as **% used** or **% remaining** on the status-bar roster.
|
||||
- App Icon — cycle between Classic, Watercolor, and Blue for the icon shown in the Dock and window switcher.
|
||||
- **Language** — primary Interface control. Switch between System (follows the OS), English, 中文(简体), 繁體中文(台灣), 한국어, 日本語, Español, Français, Português (Brasil), or Русский. Settings search also matches native words for “language” (语言 / 語言 / 언어 / 言語 / Idioma / Langue / Язык) so you can find Language while the UI is still in English.
|
||||
- **Language** — primary Interface control. Switch between System (follows the OS), English, 中文(简体), 繁體中文(台灣), 한국어, 日本語, Español, Français, Português (Brasil), Русский, or Türkçe. Settings search also matches native words for “language” (语言 / 語言 / 언어 / 言語 / Idioma / Langue / Язык / Dil) so you can find Language while the UI is still in English.
|
||||
|
||||
## Git
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ const LAZY_LOCALE_LOADERS: Record<
|
||||
ko: () => import('../../renderer/src/i18n/locales/ko.json'),
|
||||
pt: () => import('../../renderer/src/i18n/locales/pt.json'),
|
||||
ru: () => import('../../renderer/src/i18n/locales/ru.json'),
|
||||
tr: () => import('../../renderer/src/i18n/locales/tr.json'),
|
||||
zh: () => import('../../renderer/src/i18n/locales/zh.json'),
|
||||
'zh-Hant': () => import('../../renderer/src/i18n/locales/zh-Hant.json')
|
||||
}
|
||||
|
||||
@@ -321,7 +321,7 @@ describe('onboarding language request', () => {
|
||||
expect(screen.getByRole('radio', { name: 'Français' }).getAttribute('data-state')).toBe(
|
||||
'checked'
|
||||
)
|
||||
expect(screen.getAllByRole('radio')).toHaveLength(9)
|
||||
expect(screen.getAllByRole('radio')).toHaveLength(10)
|
||||
expect(screen.getByRole('radio', { name: 'Русский' })).toBeTruthy()
|
||||
expect(save).not.toHaveBeenCalled()
|
||||
expect(useAppStore.getState().settings?.uiLanguage).toBe('system')
|
||||
@@ -460,7 +460,7 @@ describe('onboarding language request', () => {
|
||||
})
|
||||
installWebPreloadApi()
|
||||
render(<OnboardingLanguageSwitcher open onOpenChange={vi.fn()} />)
|
||||
expect(screen.getAllByRole('radio')).toHaveLength(9)
|
||||
expect(screen.getAllByRole('radio')).toHaveLength(10)
|
||||
expect(screen.queryByRole('button', { name: 'Other language…' })).toBeNull()
|
||||
expect(screen.queryByRole('textbox')).toBeNull()
|
||||
} finally {
|
||||
@@ -476,7 +476,7 @@ describe('onboarding language request', () => {
|
||||
const save = vi.fn().mockResolvedValue(undefined)
|
||||
useAppStore.setState({ updateSettingsOrThrow: save })
|
||||
render(<OnboardingLanguageSwitcher open onOpenChange={vi.fn()} />)
|
||||
expect(screen.getAllByRole('radio')).toHaveLength(9)
|
||||
expect(screen.getAllByRole('radio')).toHaveLength(10)
|
||||
expect(screen.queryByRole('button', { name: 'Retry' })).toBeNull()
|
||||
expect(save).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
@@ -57,6 +57,7 @@ export const getLanguageEntries = createLocalizedCatalog((): SettingsSearchEntry
|
||||
...translateSearchKeyword('settings.appearance.language.french', 'Français'),
|
||||
...translateSearchKeyword('settings.appearance.language.portuguese', 'Português (Brasil)'),
|
||||
...translateSearchKeyword('settings.appearance.language.russian', 'Русский'),
|
||||
...translateSearchKeyword('settings.appearance.language.turkish', 'Türkçe'),
|
||||
// Index native language words in every locale so users can find their language from an unfamiliar UI.
|
||||
'语言',
|
||||
'語言',
|
||||
@@ -65,6 +66,7 @@ export const getLanguageEntries = createLocalizedCatalog((): SettingsSearchEntry
|
||||
'Idioma',
|
||||
'Langue',
|
||||
'Язык',
|
||||
'Dil',
|
||||
...translateSearchKeyword(
|
||||
'auto.components.settings.appearance.search.language.locale',
|
||||
'locale'
|
||||
|
||||
@@ -40,6 +40,11 @@ describe('settings-search', () => {
|
||||
expect(matchesSettingsSearch('accounts', section.searchEntries)).toBe(false)
|
||||
})
|
||||
|
||||
it('matches Turkish dotted capital I labels from lowercase queries', () => {
|
||||
expect(matchesSettingsSearch('imleç opaklığı', [{ title: 'İmleç Opaklığı' }])).toBe(true)
|
||||
expect(matchesSettingsSearch('İMLEÇ', [{ title: 'imleç' }])).toBe(true)
|
||||
})
|
||||
|
||||
it('keeps empty search ranking in source order without reading entries', () => {
|
||||
const sections = [
|
||||
{
|
||||
|
||||
@@ -60,8 +60,13 @@ export function isSettingsSearchQueryTooLarge(
|
||||
return isClipboardTextByteLengthOverLimit(query, maxBytes)
|
||||
}
|
||||
|
||||
// Turkish İ lowercases to i + U+0307; drop the dot so plain-i queries still match.
|
||||
function foldSettingsSearchText(value: string): string {
|
||||
return value.toLowerCase().replaceAll('\u0307', '')
|
||||
}
|
||||
|
||||
export function normalizeSettingsSearchQuery(query: string): string {
|
||||
return query.trim().toLowerCase()
|
||||
return foldSettingsSearchText(query.trim())
|
||||
}
|
||||
|
||||
function scoreSettingsSearchText(
|
||||
@@ -72,7 +77,7 @@ function scoreSettingsSearchText(
|
||||
if (!value) {
|
||||
return SETTINGS_SEARCH_NO_MATCH_SCORE
|
||||
}
|
||||
const normalizedValue = value.toLowerCase()
|
||||
const normalizedValue = foldSettingsSearchText(value)
|
||||
if (normalizedValue === normalizedQuery) {
|
||||
return tier.exact
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ import jaCatalogUrl from './locales/ja.json?url'
|
||||
import koCatalogUrl from './locales/ko.json?url'
|
||||
import ptCatalogUrl from './locales/pt.json?url'
|
||||
import ruCatalogUrl from './locales/ru.json?url'
|
||||
import trCatalogUrl from './locales/tr.json?url'
|
||||
import zhCatalogUrl from './locales/zh.json?url'
|
||||
import zhHantCatalogUrl from './locales/zh-Hant.json?url'
|
||||
import { isPseudoLocalizationLocale, pseudoLocalizeString } from './pseudo-localization'
|
||||
@@ -37,6 +38,7 @@ const NON_DEFAULT_LOCALE_URLS: Record<Exclude<SupportedUiLocale, 'en'>, string>
|
||||
ko: koCatalogUrl,
|
||||
pt: ptCatalogUrl,
|
||||
ru: ruCatalogUrl,
|
||||
tr: trCatalogUrl,
|
||||
zh: zhCatalogUrl,
|
||||
'zh-Hant': zhHantCatalogUrl
|
||||
}
|
||||
|
||||
@@ -358,7 +358,8 @@
|
||||
"spanish": "Español",
|
||||
"french": "Français",
|
||||
"portuguese": "Português (Brasil)",
|
||||
"russian": "Русский"
|
||||
"russian": "Русский",
|
||||
"turkish": "Türkçe"
|
||||
},
|
||||
"statusBar": {
|
||||
"claudeToggleDescription": "Show Claude token and cost usage for the active workspace.",
|
||||
|
||||
@@ -116,7 +116,8 @@
|
||||
"spanish": "Español",
|
||||
"french": "Français",
|
||||
"portuguese": "Português (Brasil)",
|
||||
"russian": "Русский"
|
||||
"russian": "Русский",
|
||||
"turkish": "Türkçe"
|
||||
},
|
||||
"statusBar": {
|
||||
"claudeToggleDescription": "Muestra el consumo de tokens y el costo de Claude para el espacio de trabajo activo.",
|
||||
|
||||
@@ -289,7 +289,8 @@
|
||||
"spanish": "Español",
|
||||
"french": "Français",
|
||||
"portuguese": "Português (Brasil)",
|
||||
"russian": "Русский"
|
||||
"russian": "Русский",
|
||||
"turkish": "Türkçe"
|
||||
},
|
||||
"statusBar": {
|
||||
"claudeToggleDescription": "Afficher l'utilisation des tokens et des coûts de Claude pour l'espace de travail actif.",
|
||||
|
||||
@@ -116,7 +116,8 @@
|
||||
"spanish": "Español",
|
||||
"french": "Français",
|
||||
"portuguese": "Português (Brasil)",
|
||||
"russian": "Русский"
|
||||
"russian": "Русский",
|
||||
"turkish": "Türkçe"
|
||||
},
|
||||
"statusBar": {
|
||||
"claudeToggleDescription": "アクティブなワークスペースの Claude トークンとコストの使用状況を表示します。",
|
||||
|
||||
@@ -116,7 +116,8 @@
|
||||
"spanish": "Español",
|
||||
"french": "Français",
|
||||
"portuguese": "Português (Brasil)",
|
||||
"russian": "Русский"
|
||||
"russian": "Русский",
|
||||
"turkish": "Türkçe"
|
||||
},
|
||||
"statusBar": {
|
||||
"claudeToggleDescription": "활성 워크스페이스에 대한 Claude 토큰 및 비용 사용량을 표시합니다.",
|
||||
|
||||
@@ -733,7 +733,8 @@
|
||||
"spanish": "Español",
|
||||
"french": "Français",
|
||||
"portuguese": "Português (Brasil)",
|
||||
"russian": "Русский"
|
||||
"russian": "Русский",
|
||||
"turkish": "Türkçe"
|
||||
},
|
||||
"statusBar": {
|
||||
"claudeToggleDescription": "Mostra o uso de tokens e custo do Claude para o espaço de trabalho ativo.",
|
||||
|
||||
@@ -358,7 +358,8 @@
|
||||
"spanish": "Español",
|
||||
"french": "Français",
|
||||
"portuguese": "Português (Brasil)",
|
||||
"russian": "Русский"
|
||||
"russian": "Русский",
|
||||
"turkish": "Türkçe"
|
||||
},
|
||||
"statusBar": {
|
||||
"claudeToggleDescription": "Показывать расход токенов и стоимость Claude для активного рабочего пространства.",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -358,7 +358,8 @@
|
||||
"spanish": "Español",
|
||||
"french": "Français",
|
||||
"portuguese": "Português (Brasil)",
|
||||
"russian": "Русский"
|
||||
"russian": "Русский",
|
||||
"turkish": "Türkçe"
|
||||
},
|
||||
"statusBar": {
|
||||
"claudeToggleDescription": "顯示目前工作區的 Claude token 用量與費用。",
|
||||
|
||||
@@ -116,7 +116,8 @@
|
||||
"spanish": "Español",
|
||||
"french": "Français",
|
||||
"portuguese": "Português (Brasil)",
|
||||
"russian": "Русский"
|
||||
"russian": "Русский",
|
||||
"turkish": "Türkçe"
|
||||
},
|
||||
"statusBar": {
|
||||
"claudeToggleDescription": "显示当前工作区的 Claude Token 与费用消耗情况。",
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
UI_LANGUAGE_RUSSIAN,
|
||||
UI_LANGUAGE_SPANISH,
|
||||
UI_LANGUAGE_SYSTEM,
|
||||
UI_LANGUAGE_TURKISH,
|
||||
type BuiltInUiLanguage,
|
||||
type UiLanguage
|
||||
} from '../../../shared/ui-language'
|
||||
@@ -36,7 +37,8 @@ export const UI_LANGUAGE_CHOICES: UiLanguageChoice[] = [
|
||||
{ value: UI_LANGUAGE_SPANISH, labelKey: 'settings.appearance.language.spanish' },
|
||||
{ value: UI_LANGUAGE_FRENCH, labelKey: 'settings.appearance.language.french' },
|
||||
{ value: UI_LANGUAGE_PORTUGUESE, labelKey: 'settings.appearance.language.portuguese' },
|
||||
{ value: UI_LANGUAGE_RUSSIAN, labelKey: 'settings.appearance.language.russian' }
|
||||
{ value: UI_LANGUAGE_RUSSIAN, labelKey: 'settings.appearance.language.russian' },
|
||||
{ value: UI_LANGUAGE_TURKISH, labelKey: 'settings.appearance.language.turkish' }
|
||||
]
|
||||
|
||||
const UI_LANGUAGE_CHOICE_FALLBACKS: Record<BuiltInUiLanguage, string> = {
|
||||
@@ -49,7 +51,8 @@ const UI_LANGUAGE_CHOICE_FALLBACKS: Record<BuiltInUiLanguage, string> = {
|
||||
[UI_LANGUAGE_SPANISH]: 'Español',
|
||||
[UI_LANGUAGE_FRENCH]: 'Français',
|
||||
[UI_LANGUAGE_PORTUGUESE]: 'Português (Brasil)',
|
||||
[UI_LANGUAGE_RUSSIAN]: 'Русский'
|
||||
[UI_LANGUAGE_RUSSIAN]: 'Русский',
|
||||
[UI_LANGUAGE_TURKISH]: 'Türkçe'
|
||||
}
|
||||
|
||||
export function getUiLanguageChoiceLabel(
|
||||
|
||||
@@ -11,6 +11,7 @@ import {
|
||||
UI_LANGUAGE_RUSSIAN,
|
||||
UI_LANGUAGE_SPANISH,
|
||||
UI_LANGUAGE_SYSTEM,
|
||||
UI_LANGUAGE_TURKISH,
|
||||
normalizeUiLanguage
|
||||
} from './ui-language'
|
||||
|
||||
@@ -26,6 +27,7 @@ describe('normalizeUiLanguage', () => {
|
||||
expect(normalizeUiLanguage(UI_LANGUAGE_FRENCH)).toBe('fr')
|
||||
expect(normalizeUiLanguage(UI_LANGUAGE_PORTUGUESE)).toBe('pt')
|
||||
expect(normalizeUiLanguage(UI_LANGUAGE_RUSSIAN)).toBe('ru')
|
||||
expect(normalizeUiLanguage(UI_LANGUAGE_TURKISH)).toBe('tr')
|
||||
})
|
||||
|
||||
it('falls back unknown values to system', () => {
|
||||
|
||||
@@ -9,6 +9,7 @@ export const UI_LANGUAGE_SPANISH = 'es'
|
||||
export const UI_LANGUAGE_FRENCH = 'fr'
|
||||
export const UI_LANGUAGE_PORTUGUESE = 'pt'
|
||||
export const UI_LANGUAGE_RUSSIAN = 'ru'
|
||||
export const UI_LANGUAGE_TURKISH = 'tr'
|
||||
|
||||
export type BuiltInUiLanguage =
|
||||
| typeof UI_LANGUAGE_SYSTEM
|
||||
@@ -21,6 +22,7 @@ export type BuiltInUiLanguage =
|
||||
| typeof UI_LANGUAGE_FRENCH
|
||||
| typeof UI_LANGUAGE_PORTUGUESE
|
||||
| typeof UI_LANGUAGE_RUSSIAN
|
||||
| typeof UI_LANGUAGE_TURKISH
|
||||
|
||||
export type PluginUiLanguage = `plugin:${string}`
|
||||
export type UiLanguage = BuiltInUiLanguage | PluginUiLanguage
|
||||
@@ -35,7 +37,8 @@ const UI_LANGUAGE_VALUES = new Set<BuiltInUiLanguage>([
|
||||
UI_LANGUAGE_SPANISH,
|
||||
UI_LANGUAGE_FRENCH,
|
||||
UI_LANGUAGE_PORTUGUESE,
|
||||
UI_LANGUAGE_RUSSIAN
|
||||
UI_LANGUAGE_RUSSIAN,
|
||||
UI_LANGUAGE_TURKISH
|
||||
])
|
||||
|
||||
const PLUGIN_UI_LANGUAGE_RE =
|
||||
|
||||
@@ -37,6 +37,7 @@ describe('system language detection', () => {
|
||||
['en-US', 'en', 'supported'],
|
||||
['fr_CA.UTF-8', 'fr', 'supported'],
|
||||
['pt-PT', 'pt', 'supported'],
|
||||
['tr_TR.UTF-8', 'tr', 'supported'],
|
||||
['zh-Hans-TW', 'zh', 'supported'],
|
||||
['zh-Hant-CN', 'zh-Hant', 'supported'],
|
||||
['zh-Latn-CN', 'en', 'unsupported'],
|
||||
|
||||
@@ -9,6 +9,7 @@ import {
|
||||
UI_LANGUAGE_RUSSIAN,
|
||||
UI_LANGUAGE_SPANISH,
|
||||
UI_LANGUAGE_SYSTEM,
|
||||
UI_LANGUAGE_TURKISH,
|
||||
isPluginUiLanguage,
|
||||
type UiLanguage
|
||||
} from './ui-language'
|
||||
@@ -22,7 +23,8 @@ export const SUPPORTED_UI_LOCALES = [
|
||||
'es',
|
||||
'fr',
|
||||
'pt',
|
||||
'ru'
|
||||
'ru',
|
||||
'tr'
|
||||
] as const
|
||||
export type SupportedUiLocale = (typeof SUPPORTED_UI_LOCALES)[number]
|
||||
|
||||
@@ -148,6 +150,9 @@ export function resolveUiLocale(
|
||||
if (language === UI_LANGUAGE_RUSSIAN) {
|
||||
return 'ru'
|
||||
}
|
||||
if (language === UI_LANGUAGE_TURKISH) {
|
||||
return 'tr'
|
||||
}
|
||||
return normalizeSupportedUiLocale(systemLocale)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user