AhmadYGG/NoverraAutoTranslate
Standalone realtime auto-translate for SA-MP: Pawn filterscript + Go backend over LibreTranslate
В этом репозитории нет файла лицензии. Код открыт для чтения, но само по себе это не даёт права использовать его.
README.md
Noverra AutoTranslate (Standalone)
Sistem auto-translate chat realtime untuk server SA-MP, diekstrak dari NoverraGamemode menjadi project berdiri sendiri.
Terdiri dari 2 bagian:
| Bagian | Lokasi | Bahasa | Fungsi |
|---|---|---|---|
| Filterscript SA-MP | filterscripts/autotranslate.pwn | Pawn | Kirim teks pemain ke API, tampilkan hasil di game |
| Backend API | backend/ | Go | Proxy/cache di depan LibreTranslate |
Arsitektur
┌────────────┐ HTTP GET ┌──────────────┐ POST JSON ┌────────────────┐
│ SA-MP │ ───────────► │ Go API │ ───────────► │ LibreTranslate │
│ (Pawn FS) │ ?text=&to= │ :8080 │ /translate │ :5000 │
│ │ ◄─────────── │ (cache+rate) │ ◄─────────── │ (mesin MT) │
└────────────┘ plain text └──────────────┘ JSON └────────────────┘
- Pawn memanggil API dengan
HTTP()(GET, query-string) dan menerima plain text. - Go API auto-detect bahasa sumber, cache 5 menit, rate-limit, timeout 5 detik, dan fallback ke teks asli kalau gagal.
- LibreTranslate = mesin machine-translation open source (jalan lokal, tanpa API key).
Struktur Folder
NoverraAutoTranslate/
├── docker-compose.yml # menjalankan Go API + LibreTranslate
├── filterscripts/
│ └── autotranslate.pwn # filterscript (hanya butuh a_samp)
└── backend/
├── cmd/server/main.go # entrypoint, baca env LIBRE_URL
├── internal/handler/ # HTTP handler (/translate, /detect, /languages)
├── internal/service/ # logic translate, cache, rate limiter
├── go.mod / go.sum
└── Dockerfile
Requirements
Backend (Go API + LibreTranslate)
- Docker + Docker Compose v2 (
docker compose) — cara termudah, sudah termasuk semuanya. - Tanpa Docker: Go 1.22+ dan instance LibreTranslate yang jalan terpisah.
- RAM ≥ 2GB disarankan (LibreTranslate + model bahasa rakus memori).
- Disk ≥ 2–3GB untuk image LibreTranslate + model yang diunduh (disimpan di
./libretranslate-data). - Koneksi internet saat pertama build (download image & model bahasa).
- Dependency Go:
github.com/patrickmn/go-cache v2.1.0(auto viago.mod/go.sum).
Filterscript (SA-MP)
- Server SA-MP 0.3.7 / open.mp dengan dukungan native
HTTP()(a_http). - Pawn compiler (
pawncc3.10.x) + includea_samp.inc. - Tidak butuh YSI, zcmd, atau sscanf — murni
a_samp. - Akses jaringan dari mesin SA-MP ke backend (port
4001atau domain kamu).
Jaringan
- Port host 4001 terbuka untuk API (bisa diganti di
docker-compose.yml). - Port 5000 LibreTranslate internal saja (jangan diekspos publik).
Setup
1. Jalankan Backend (Docker — direkomendasikan)
cd NoverraAutoTranslate
docker compose up -d --build
- API tersedia di
http://<host>:4001(port host 4001 → container 8080). - Pertama kali jalan, LibreTranslate mengunduh model bahasa (
LT_LOAD_ONLY=en,id,es,fr,de). Bisa makan beberapa menit;start_periodhealthcheck = 600s. Tunggu sampai sehat:
docker compose ps
docker compose logs -f libre # lihat progres download model
Test:
curl "http://localhost:4001/health"
curl "http://localhost:4001/translate?text=halo+dunia&from=id&to=en"
# -> hello world
2. (Opsional) Jalankan Backend tanpa Docker
cd backend
go mod download
LIBRE_URL=http://localhost:5000 go run cmd/server/main.go
(harus ada LibreTranslate jalan sendiri di LIBRE_URL).
3. Pasang Filterscript
- Edit
filterscripts/autotranslate.pwn, ganti host API ke backend kamu:#define TRANSLATE_API_HOST "127.0.0.1:4001"Native
HTTP()SA-MP otomatis pakai skemahttp://, jadi cukuphost:portatau domain (mis.translate.domainmu.com). Jangan tulishttp://di depan. - Compile
autotranslate.pwn→autotranslate.amx, taruh difilterscripts/server kamu. - Tambahkan ke
server.cfg:filterscripts autotranslate - Restart server.
Cara Pakai (in-game)
Command bawaan filterscript:
| Command | Fungsi |
|---|---|
/translate <lang> <text> | Translate teks ke <lang>, sumber auto-detect. Contoh: /translate en Halo dunia |
/tme <text> | Action /me diterjemahkan id → en, dikirim ke pemain sekitar (radius 20m) |
/translatelang | List bahasa yang didukung |
Integrasi ke kode sendiri
Fungsi inti, panggil dari mana saja:
TranslateText(text[], fromLang[]="id", toLang[]="en", callback[]="", playerid=INVALID_PLAYER_ID, extraData=0);
Callback dipanggil saat selesai:
forward MyCb(requestid, playerid, success, const translatedText[], extraData);
public MyCb(requestid, playerid, success, const translatedText[], extraData)
{
if(success) SendClientMessage(playerid, -1, translatedText);
}
// contoh: auto-detect -> Indonesia
TranslateText("Hello world", "auto", "id", "MyCb", playerid);
API Reference (backend)
| Endpoint | Method | Query | Response |
|---|---|---|---|
/translate | GET | text (wajib), from (default id, auto = detect), to (default en) | plain text hasil; teks asli jika gagal |
/detect | GET | text | plain text kode bahasa |
/languages | GET | — | JSON daftar bahasa |
/health | GET | — | OK |
Env:
| Variable | Default | Keterangan |
|---|---|---|
LIBRE_URL | http://libre:5000 | endpoint LibreTranslate |
Kelebihan
- ✅ Gratis & self-hosted — LibreTranslate open source, tanpa API key / biaya per-request.
- ✅ Privasi — teks tidak dikirim ke pihak ketiga (Google/DeepL); semua jalan di server sendiri.
- ✅ Cepat untuk teks berulang — cache 5 menit (cached < 50ms).
- ✅ Tahan gagal — timeout + fallback ke teks asli, server game tidak ngehang.
- ✅ Rate limit bawaan (mencegah spam/abuse).
- ✅ Filterscript murni
a_samp— tidak butuh YSI/zcmd/sscanf, bisa ditempel ke gamemode apa pun.
Kekurangan / Catatan
- ⚠️ Kualitas terjemahan LibreTranslate di bawah Google/DeepL, terutama bahasa gaul/slang RP.
- ⚠️ Boros resource — LibreTranslate butuh RAM cukup besar (≈1–2GB+) dan unduh model di awal. Batasi bahasa via
LT_LOAD_ONLY. - ⚠️ Format API custom — backend ini pakai GET query-string + response plain text (bukan format POST/JSON LibreTranslate resmi). Filterscript hanya cocok dengan backend ini.
- ⚠️ Batas teks
TRANSLATE_MAX_LENGTH = 256char per request (di sisi Pawn). - ⚠️ HTTP, bukan HTTPS — native
HTTP()SA-MP klasik tidak mendukung TLS dengan baik; idealnya backend di jaringan internal/localhost, bukan diekspos publik tanpa proxy. - ⚠️ Max 100 request bersamaan (
MAX_TRANSLATE_REQUESTS) di sisi Pawn; lebih dari itu ditolak sampai slot kosong. - ⚠️ Rate limiter backend (
30 req/menit) saat ini per-key, tapi handler belum memanggilAllow()— fungsionalitas ada, aktivasinya perlu dihubungkan jika diperlukan.
Troubleshooting
/translatetidak ada respon → cekTRANSLATE_API_HOSTdi pawn sudah benar & backend hidup (curl .../health).- Selalu balik teks asli → LibreTranslate belum siap (masih download model) atau bahasa tujuan tidak dimuat di
LT_LOAD_ONLY. - Connection failed di log server → firewall/port; pastikan port 4001 (atau domainmu) reachable dari mesin SA-MP.
Страница собрана из того, что GitHub публикует о репозитории. samp.directory не хранит этот код. Сообщить о проблеме с этой записью