Tek makale 19 dil: dosya yapısı, çeviri prompt'u, 5 gerçek tuzak, tek POST nasıl atılır.
Anthropic ve OpenAI'ın resmi dokümantasyonu sadece İngilizce. Bu, küresel AI geliştirici içerik ekosisteminde devasa bir boşluk. how2claude tam bu boşluğu dolduruyor — her makale 19 dilde aynı anda yayına çıkıyor: zh / en / zh-TW / ja / ko / es / pt-BR / id / vi / tr / ar / fr / de / it / ru / uk / pl / he / th.
İnsan çevirmen tutmak gerçekçi değil (makale başına 20 çeviri, her biri birkaç bin dolar). Claude'a yaptırmak marjinal maliyeti neredeyse sıfıra indiriyor — ama "Japoncaya çevir" diye atıvermek, makine çevirisi kokan ve yazarın sesi silinmiş bir metin geri veriyor. Aşağıdaki, bu işi doğru yapmanın tam akışı: dosya yapısı, çeviri prompt'unun nasıl yazılacağı, Claude'un kesinlikle tökezleyeceği noktalar, 19 dilin ve her dile göre tweet'lerin tek POST çağrısıyla API'ye nasıl gönderileceği.
Bu iki şey çok farklı.
Çeviri, anlamı A dilinden B diline taşır — Google Translate'in yaptığı şey. "Doğru" okunur ama "düz" kalır.
Yerelleştirme, yazarın tonunu, ritmini ve teknik düzeyini koruyup hedef dilin kendi "teknik blog sesiyle" yeniden yazar. Sonuç anadili tarafından yazılmış gibi okunur.
Claude için çeviri 5 dakikalık iş; yerelleştirme ise prompt'un şunları açıkça belirtmesini gerektirir:
how2claude'un /write-article komutu her dil için bir stil gereksinimi içerir:
| Dil dosyası | Stil gereksinimi |
|---|---|
ja.md |
Teknik blog sesi, doğal Japonca |
ko.md |
Teknik blog sesi, doğal Korece |
zh-TW.md |
Tayvan kullanımı, geleneksel karakterler |
ar.md |
Modern Standart Arapça (yazılı) |
id.md |
Standart Endonezce |
Tek satır farkı gibi görünür. Ama Claude için belirleyicidir — bu satır olmazsa varsayılan olarak "ders kitabı çevirisi" üretir.
Her taslak için bir klasör, 20 dosya:
docs/drafts/let-claude-translate-articles/
├── meta.json # 19 dilin title + summary'si
├── zh.md # Çince (kaynak, ilk yazılan)
├── en.md # İngilizce (ilk çeviri partisi)
├── zh-TW.md
├── ja.md
├── ko.md
├── ...(14 dil daha)
└── th.md
meta.json:
{
"category_slug": "use-cases",
"series_slug": "writing",
"free": true,
"title": {
"zh": "让 Claude 把一篇文章翻译成 19 种语言",
"en": "Letting Claude Translate One Article Into 19 Languages",
"tr": "Claude'a bir makaleyi 19 dile çevirtmek",
"...": "..."
},
"summary": {
"tr": "Tek makale 19 dil: dosya yapısı, çeviri prompt'u, 5 gerçek tuzak, tek POST nasıl atılır.",
"...": "..."
}
}
Her .md dosyasının ilk satırı # başlık, gerisi gövde. Title md'nin ilk satırından değil, meta.json'dan alınır — böylece her dilin title'ı cilalanmış bir kısa ifadedir, makalenin başındaki çeviri sırasında uzamış olabilecek cümle değil.
Kaçınılacak iki akış:
Yanlış: zincirleme çeviri. zh → en → ja → ko → ...
Sorun: ja, en'e dayanır; ko, ja'ya — her atlayışta biraz anlam sızar. th (Tayca) sırasında elinizde dördüncü elden bilgi kalır.
Doğru: radyal çeviri. zh'yi kesinleştir → en / ja / ko / ar / id / ... hepsini doğrudan kaynaktan üret.
Her dil orijinalden doğrudan çıkar, ara durak yok.
Prompt yapısı (/write-article içinde paketlenmiş):
Bu X hakkında bir teknik blog yazısı, Çince kaynak:
[zh.md tamamı]
Aşağıdaki dillere çevir, dile özel gereksinimler:
- ja.md: teknik blog sesi, doğal Japonca
- ko.md: teknik blog sesi, doğal Korece
- ar.md: Modern Standart Arapça (yazılı)
...
Kurallar:
1. Yazarın doğrudan, profesyonel, hafif özeleştirel tonunu koru
2. Kod blokları, komutlar, API adları, URL'leri çevirme
3. Başlıklar, alt başlıklar, paragraf akışı yeniden düzenlenebilir
4. Her dil için ayrı title üret — kısa, kanca taşıyan, orijinal başlığın bire bir çevirisi değil
18 dili paralel çevir, Claude tek oturumda bitirir. Önemli bir detay: aynı oturumda / aynı model sürümünde yap — oturumlar ve model nesilleri arasında ses kayar.
X, CJK (Çince/Japonca/Korece) karakterlerini daha katı sayar. Claude'dan bu kısıtlamayla tweet üretmesini istedim:
İlk geçişte üç Çince tweet taştı (160, 164, 152). Claude İngilizce tweet'leri harfiyen çevirmişti — 260 karakterlik İngilizce tweet Çinceye çevrildiğinde sınıra tam denk geliyor.
Kural: Çince tweet'ler yeniden yazılmalı, çevrilmemeli. Gereksinimler: 140 karakter sınırı, kanca zorunlu, bir miktar detay kaybı kabul.
zh → zh-TW tembelliğe davet eder: basitleştirilmiş-geleneksel dönüştürücüsüne at. Karakterler eşleşir, kelime dağarcığı eşleşmez:
| zh | zh-TW (yanlış) | zh-TW (doğru) |
|---|---|---|
| 文件 | 文件 | 檔案 |
| 信息 | 信息 | 資訊 |
| 软件 | 軟件 | 軟體 |
| 视频 | 視頻 | 影片 |
Claude'dan zh-TW isterken ikisini de söyle: "Tayvan kullanımı, geleneksel karakterler". "Sadece geleneksel" karakter dönüşümü verir.
Arapça ve İbranice sağdan sola yazılır. Rails tarafında <html dir="rtl"> ve Tailwind'in rtl: varyantları gerekir. Ama çevirinin kendisinde de tuzaklar var:
unicode-bidi: isolate'a ihtiyacı var, yoksa kod RTL akışına "çekilir", yerine ،, ? yerine ؟ kullanır. Claude varsayılanda İngilizce noktalama kullanır; açıkça belirtmek gerekir2026) ama paragrafın genel akışı sağdan sola. Tarayıcılar halleder ama Claude ham metin yazarken sık sık karıştırırOrijinaldeki gündelik ifadeler ("tek seferde bastım", "tuzağa bastım", "yedim") Claude tarafından Japonca/Koreceye varsayılan olarak resmi yazılı biçimlerle (「一気に実装」「落とし穴」「失敗」) çevrilir — anlam uyar, ton buharlaşır.
Düzeltme: prompt'ta açıkça söyle — "yazarın doğrudan, hafif özeleştirel, resmi olmayan teknik blog sesini koru; akademikleştirme". Buna rağmen bazı diller (Almanca, Rusça) kaynaktan bir tık daha "resmi" iner — dillerin kendisi yazılı kayıt yanlısıdır.
Koddaki dizeler iki kovaya ayrılır — UI metni (çevrilir) ve yer tutucular/değişken adları (çevrilmez):
t("pricing.page_title") # çevirme (i18n key)
"user_id" # çevirme (değişken adı)
"Monthly subscription" # metinde örnek olarak gösteriliyorsa → çevirme
Koda bitişik her şey için "çevirme" daha güvenli varsayılandır. Asıl çevrilmesi gereken i18n locale dosyalarıdır (config/locales/xx.yml), o ayrı iştir.
/publish-article taslağı how2claude.com/api/articles adresine POST eder:
{
"category_slug": "use-cases",
"series_slug": "writing",
"free": true,
"thread": true,
"title": { "zh": "...", "en": "...", "ja": "...", ... },
"summary": { "zh": "...", "en": "...", ... },
"content": { "zh": "<md>", "en": "<md>", ... },
"tweets": { "en": ["...", "..."], "zh": [...], ... }
}
Tek istek yaklaşık 300KB (19 dil × ~15KB). Sunucu veritabanı tablolarına ayırır:
articles tablosu, title / summary / content locale'e göre anahtarlanan jsonbx_queue_tweets tablosu, locale + hesap başına, zamanlama kuyruğuna gönderilirTweet'ler yalnızca X hesabı bağlı locale'lere gider (şu an en/zh/ja/ko/ar/id — 6 tane). Hesabı olmayan diller [] gönderir. Hesapları sorgulama:
Account.all.each { |a| puts "#{a.locale}: #{a.name}" }
# en: @how2claude
# zh: @howtoclaude
# ja: @how2claude_ja
# ko: @how2claude_ko
# ar: @how2claude_ar
# id: @how2claude_id
Claude'a bir makaleyi 19 dile çevirtmenin tam kontrol listesi:
dir="rtl" + Tailwind rtl: varyantları gerekir. Karışık noktalama ve kod bloğu izolasyonu ayrı ele alınır.Asıl darboğaz çeviri kalitesi değil — Claude 4 sınıfı modeller Japoncaya/Koreceye/Arapçaya/Rusçaya anadile yakın kalitede çevirir. Darboğaz şudur: bir makaleyi 19 dilin okuru önüne koymaya istekli misin. Teknik olarak 5 dakika sürer. İçerik açısından, 200 kat izleyiciye aynı anda hizmet etmeye istekli olmayı gerektirir.