Skip to content

Commit 775d288

Browse files
authored
feat(i18n): add th locale support (anomalyco#10809)
1 parent bc4968a commit 775d288

19 files changed

Lines changed: 978 additions & 3 deletions

File tree

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@
2929
<a href="README.ru.md">Русский</a> |
3030
<a href="README.ar.md">العربية</a> |
3131
<a href="README.no.md">Norsk</a> |
32-
<a href="README.br.md">Português (Brasil)</a>
32+
<a href="README.br.md">Português (Brasil)</a> |
33+
<a href="README.th.md">ไทย</a>
3334
</p>
3435

3536
[![OpenCode Terminal UI](packages/web/src/assets/lander/screenshot.png)](https://opencode.ai)

README.th.md

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
<p align="center">
2+
<a href="https://opencode.ai">
3+
<picture>
4+
<source srcset="packages/console/app/src/asset/logo-ornate-dark.svg" media="(prefers-color-scheme: dark)">
5+
<source srcset="packages/console/app/src/asset/logo-ornate-light.svg" media="(prefers-color-scheme: light)">
6+
<img src="packages/console/app/src/asset/logo-ornate-light.svg" alt="OpenCode logo">
7+
</picture>
8+
</a>
9+
</p>
10+
<p align="center">เอเจนต์การเขียนโค้ดด้วย AI แบบโอเพนซอร์ส</p>
11+
<p align="center">
12+
<a href="https://opencode.ai/discord"><img alt="Discord" src="https://img.shields.io/discord/1391832426048651334?style=flat-square&label=discord" /></a>
13+
<a href="https://www.npmjs.com/package/opencode-ai"><img alt="npm" src="https://img.shields.io/npm/v/opencode-ai?style=flat-square" /></a>
14+
<a href="https://github.com/anomalyco/opencode/actions/workflows/publish.yml"><img alt="สถานะการสร้าง" src="https://img.shields.io/github/actions/workflow/status/anomalyco/opencode/publish.yml?style=flat-square&branch=dev" /></a>
15+
</p>
16+
17+
<p align="center">
18+
<a href="README.md">English</a> |
19+
<a href="README.zh.md">简体中文</a> |
20+
<a href="README.zht.md">繁體中文</a> |
21+
<a href="README.ko.md">한국어</a> |
22+
<a href="README.de.md">Deutsch</a> |
23+
<a href="README.es.md">Español</a> |
24+
<a href="README.fr.md">Français</a> |
25+
<a href="README.it.md">Italiano</a> |
26+
<a href="README.da.md">Dansk</a> |
27+
<a href="README.ja.md">日本語</a> |
28+
<a href="README.pl.md">Polski</a> |
29+
<a href="README.ru.md">Русский</a> |
30+
<a href="README.ar.md">العربية</a> |
31+
<a href="README.no.md">Norsk</a> |
32+
<a href="README.br.md">Português (Brasil)</a> |
33+
<a href="README.th.md">ไทย</a>
34+
</p>
35+
36+
[![OpenCode Terminal UI](packages/web/src/assets/lander/screenshot.png)](https://opencode.ai)
37+
38+
---
39+
40+
### การติดตั้ง
41+
42+
```bash
43+
# YOLO
44+
curl -fsSL https://opencode.ai/install | bash
45+
46+
# ตัวจัดการแพ็กเกจ
47+
npm i -g opencode-ai@latest # หรือ bun/pnpm/yarn
48+
scoop install opencode # Windows
49+
choco install opencode # Windows
50+
brew install anomalyco/tap/opencode # macOS และ Linux (แนะนำ อัปเดตเสมอ)
51+
brew install opencode # macOS และ Linux (brew formula อย่างเป็นทางการ อัปเดตน้อยกว่า)
52+
paru -S opencode-bin # Arch Linux
53+
mise use -g opencode # ระบบปฏิบัติการใดก็ได้
54+
nix run nixpkgs#opencode # หรือ github:anomalyco/opencode สำหรับสาขาพัฒนาล่าสุด
55+
```
56+
57+
> [!TIP]
58+
> ลบเวอร์ชันที่เก่ากว่า 0.1.x ก่อนติดตั้ง
59+
60+
### แอปพลิเคชันเดสก์ท็อป (เบต้า)
61+
62+
OpenCode มีให้ใช้งานเป็นแอปพลิเคชันเดสก์ท็อป ดาวน์โหลดโดยตรงจาก [หน้ารุ่น](https://github.com/anomalyco/opencode/releases) หรือ [opencode.ai/download](https://opencode.ai/download)
63+
64+
| แพลตฟอร์ม | ดาวน์โหลด |
65+
| --------------------- | ------------------------------------- |
66+
| macOS (Apple Silicon) | `opencode-desktop-darwin-aarch64.dmg` |
67+
| macOS (Intel) | `opencode-desktop-darwin-x64.dmg` |
68+
| Windows | `opencode-desktop-windows-x64.exe` |
69+
| Linux | `.deb`, `.rpm`, หรือ AppImage |
70+
71+
```bash
72+
# macOS (Homebrew)
73+
brew install --cask opencode-desktop
74+
# Windows (Scoop)
75+
scoop bucket add extras; scoop install extras/opencode-desktop
76+
```
77+
78+
#### ไดเรกทอรีการติดตั้ง
79+
80+
สคริปต์การติดตั้งจะใช้ลำดับความสำคัญตามเส้นทางการติดตั้ง:
81+
82+
1. `$OPENCODE_INSTALL_DIR` - ไดเรกทอรีการติดตั้งที่กำหนดเอง
83+
2. `$XDG_BIN_DIR` - เส้นทางที่สอดคล้องกับ XDG Base Directory Specification
84+
3. `$HOME/bin` - ไดเรกทอรีไบนารีผู้ใช้มาตรฐาน (หากมีอยู่หรือสามารถสร้างได้)
85+
4. `$HOME/.opencode/bin` - ค่าสำรองเริ่มต้น
86+
87+
```bash
88+
# ตัวอย่าง
89+
OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
90+
XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
91+
```
92+
93+
### เอเจนต์
94+
95+
OpenCode รวมเอเจนต์ในตัวสองตัวที่คุณสามารถสลับได้ด้วยปุ่ม `Tab`
96+
97+
- **build** - เอเจนต์เริ่มต้น มีสิทธิ์เข้าถึงแบบเต็มสำหรับงานพัฒนา
98+
- **plan** - เอเจนต์อ่านอย่างเดียวสำหรับการวิเคราะห์และการสำรวจโค้ด
99+
- ปฏิเสธการแก้ไขไฟล์โดยค่าเริ่มต้น
100+
- ขอสิทธิ์ก่อนเรียกใช้คำสั่ง bash
101+
- เหมาะสำหรับสำรวจโค้ดเบสที่ไม่คุ้นเคยหรือวางแผนการเปลี่ยนแปลง
102+
103+
นอกจากนี้ยังมีเอเจนต์ย่อย **general** สำหรับการค้นหาที่ซับซ้อนและงานหลายขั้นตอน
104+
ใช้ภายในและสามารถเรียกใช้ได้โดยใช้ `@general` ในข้อความ
105+
106+
เรียนรู้เพิ่มเติมเกี่ยวกับ [เอเจนต์](https://opencode.ai/docs/agents)
107+
108+
### เอกสารประกอบ
109+
110+
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีกำหนดค่า OpenCode [**ไปที่เอกสารของเรา**](https://opencode.ai/docs)
111+
112+
### การมีส่วนร่วม
113+
114+
หากคุณสนใจที่จะมีส่วนร่วมใน OpenCode โปรดอ่าน [เอกสารการมีส่วนร่วม](./CONTRIBUTING.md) ก่อนส่ง Pull Request
115+
116+
### การสร้างบน OpenCode
117+
118+
หากคุณทำงานในโปรเจกต์ที่เกี่ยวข้องกับ OpenCode และใช้ "opencode" เป็นส่วนหนึ่งของชื่อ เช่น "opencode-dashboard" หรือ "opencode-mobile" โปรดเพิ่มหมายเหตุใน README ของคุณเพื่อชี้แจงว่าไม่ได้สร้างโดยทีม OpenCode และไม่ได้เกี่ยวข้องกับเราในทางใด
119+
120+
### คำถามที่พบบ่อย
121+
122+
#### ต่างจาก Claude Code อย่างไร?
123+
124+
คล้ายกับ Claude Code มากในแง่ความสามารถ นี่คือความแตกต่างหลัก:
125+
126+
- โอเพนซอร์ส 100%
127+
- ไม่ผูกมัดกับผู้ให้บริการใดๆ แม้ว่าเราจะแนะนำโมเดลที่เราจัดหาให้ผ่าน [OpenCode Zen](https://opencode.ai/zen) OpenCode สามารถใช้กับ Claude, OpenAI, Google หรือแม้กระทั่งโมเดลในเครื่องได้ เมื่อโมเดลพัฒนาช่องว่างระหว่างพวกมันจะปิดลงและราคาจะลดลง ดังนั้นการไม่ผูกมัดกับผู้ให้บริการจึงสำคัญ
128+
- รองรับ LSP ใช้งานได้ทันทีหลังการติดตั้งโดยไม่ต้องปรับแต่งหรือเปลี่ยนแปลงฟังก์ชันการทำงานใด ๆ
129+
- เน้นที่ TUI OpenCode สร้างโดยผู้ใช้ neovim และผู้สร้าง [terminal.shop](https://terminal.shop) เราจะผลักดันขีดจำกัดของสิ่งที่เป็นไปได้ในเทอร์มินัล
130+
- สถาปัตยกรรมไคลเอนต์/เซิร์ฟเวอร์ ตัวอย่างเช่น อาจอนุญาตให้ OpenCode ทำงานบนคอมพิวเตอร์ของคุณ ในขณะที่คุณสามารถขับเคลื่อนจากระยะไกลผ่านแอปมือถือ หมายความว่า TUI frontend เป็นหนึ่งในไคลเอนต์ที่เป็นไปได้เท่านั้น
131+
132+
---
133+
134+
**ร่วมชุมชนของเรา** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)

packages/app/src/context/language.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { dict as ru } from "@/i18n/ru"
1717
import { dict as ar } from "@/i18n/ar"
1818
import { dict as no } from "@/i18n/no"
1919
import { dict as br } from "@/i18n/br"
20+
import { dict as th } from "@/i18n/th"
2021
import { dict as uiEn } from "@opencode-ai/ui/i18n/en"
2122
import { dict as uiZh } from "@opencode-ai/ui/i18n/zh"
2223
import { dict as uiZht } from "@opencode-ai/ui/i18n/zht"
@@ -31,13 +32,14 @@ import { dict as uiRu } from "@opencode-ai/ui/i18n/ru"
3132
import { dict as uiAr } from "@opencode-ai/ui/i18n/ar"
3233
import { dict as uiNo } from "@opencode-ai/ui/i18n/no"
3334
import { dict as uiBr } from "@opencode-ai/ui/i18n/br"
35+
import { dict as uiTh } from "@opencode-ai/ui/i18n/th"
3436

35-
export type Locale = "en" | "zh" | "zht" | "ko" | "de" | "es" | "fr" | "da" | "ja" | "pl" | "ru" | "ar" | "no" | "br"
37+
export type Locale = "en" | "zh" | "zht" | "ko" | "de" | "es" | "fr" | "da" | "ja" | "pl" | "ru" | "ar" | "no" | "br" | "th"
3638

3739
type RawDictionary = typeof en & typeof uiEn
3840
type Dictionary = i18n.Flatten<RawDictionary>
3941

40-
const LOCALES: readonly Locale[] = ["en", "zh", "zht", "ko", "de", "es", "fr", "da", "ja", "pl", "ru", "ar", "no", "br"]
42+
const LOCALES: readonly Locale[] = ["en", "zh", "zht", "ko", "de", "es", "fr", "da", "ja", "pl", "ru", "ar", "no", "br", "th"]
4143

4244
function detectLocale(): Locale {
4345
if (typeof navigator !== "object") return "en"
@@ -65,6 +67,7 @@ function detectLocale(): Locale {
6567
)
6668
return "no"
6769
if (language.toLowerCase().startsWith("pt")) return "br"
70+
if (language.toLowerCase().startsWith("th")) return "th"
6871
}
6972

7073
return "en"
@@ -94,6 +97,7 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
9497
if (store.locale === "ar") return "ar"
9598
if (store.locale === "no") return "no"
9699
if (store.locale === "br") return "br"
100+
if (store.locale === "th") return "th"
97101
return "en"
98102
})
99103

@@ -118,6 +122,7 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
118122
if (locale() === "ar") return { ...base, ...i18n.flatten({ ...ar, ...uiAr }) }
119123
if (locale() === "no") return { ...base, ...i18n.flatten({ ...no, ...uiNo }) }
120124
if (locale() === "br") return { ...base, ...i18n.flatten({ ...br, ...uiBr }) }
125+
if (locale() === "th") return { ...base, ...i18n.flatten({ ...th, ...uiTh }) }
121126
return { ...base, ...i18n.flatten({ ...ko, ...uiKo }) }
122127
})
123128

@@ -138,6 +143,7 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
138143
ar: "language.ar",
139144
no: "language.no",
140145
br: "language.br",
146+
th: "language.th",
141147
}
142148

143149
const label = (value: Locale) => t(labelKey[value])

packages/app/src/i18n/ar.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,7 @@ export const dict = {
331331
"language.ar": "العربية",
332332
"language.no": "Norsk",
333333
"language.br": "Português (Brasil)",
334+
"language.th": "ไทย",
334335

335336
"toast.language.title": "لغة",
336337
"toast.language.description": "تم التبديل إلى {{language}}",

packages/app/src/i18n/br.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,7 @@ export const dict = {
330330
"language.ar": "العربية",
331331
"language.no": "Norsk",
332332
"language.br": "Português (Brasil)",
333+
"language.th": "ไทย",
333334

334335
"toast.language.title": "Idioma",
335336
"toast.language.description": "Alterado para {{language}}",

packages/app/src/i18n/da.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,7 @@ export const dict = {
332332
"language.ar": "العربية",
333333
"language.no": "Norsk",
334334
"language.br": "Português (Brasil)",
335+
"language.th": "ไทย",
335336

336337
"toast.language.title": "Sprog",
337338
"toast.language.description": "Skiftede til {{language}}",

packages/app/src/i18n/de.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,7 @@ export const dict = {
338338
"language.ar": "العربية",
339339
"language.no": "Norsk",
340340
"language.br": "Português (Brasil)",
341+
"language.th": "ไทย",
341342

342343
"toast.language.title": "Sprache",
343344
"toast.language.description": "Zu {{language}} gewechselt",

packages/app/src/i18n/en.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,7 @@ export const dict = {
337337
"language.ar": "العربية",
338338
"language.no": "Norsk",
339339
"language.br": "Português (Brasil)",
340+
"language.th": "ไทย",
340341

341342
"toast.language.title": "Language",
342343
"toast.language.description": "Switched to {{language}}",

packages/app/src/i18n/es.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ export const dict = {
333333
"language.ar": "العربية",
334334
"language.no": "Norsk",
335335
"language.br": "Português (Brasil)",
336+
"language.th": "ไทย",
336337

337338
"toast.language.title": "Idioma",
338339
"toast.language.description": "Cambiado a {{language}}",

packages/app/src/i18n/fr.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ export const dict = {
333333
"language.ar": "العربية",
334334
"language.no": "Norsk",
335335
"language.br": "Português (Brasil)",
336+
"language.th": "ไทย",
336337

337338
"toast.language.title": "Langue",
338339
"toast.language.description": "Passé à {{language}}",

0 commit comments

Comments
 (0)