Bot WA AI Multi-Language
Cara membuat bot AI WhatsApp multi-bahasa. Auto-detect language, respond sesuai bahasa. Tutorial lengkap!
AI bisa bicara banyak bahasa!
Dengan AI, bot kamu bisa otomatis detect bahasa customer dan respond dalam bahasa yang sama. No manual translation needed!
Keunggulan AI Multi-Language
📊 PERBANDINGAN:
RULE-BASED MULTI-LANGUAGE:
- Butuh template per bahasa
- Manual translation
- Maintenance berat
- Limited languages
AI MULTI-LANGUAGE:
- Auto-detect language
- Response natural per bahasa
- Single system prompt
- Support 95+ languagesBahasa yang Didukung
🌍 LANGUAGE SUPPORT:
TIER 1 (Excellent):
- English
- Spanish
- French
- German
- Chinese
- Japanese
TIER 2 (Very Good):
- Indonesian ✅
- Portuguese
- Italian
- Korean
- Arabic
- Hindi
TIER 3 (Good):
- Thai
- Vietnamese
- Turkish
- Dutch
- PolishImplementasi Basic
System Prompt Multi-Language:
javascript
const MULTILANG_PROMPT = `You are a customer service AI for [BRAND], an Indonesian online store.
LANGUAGE RULES:
1. Detect the language the customer uses
2. ALWAYS respond in the SAME language
3. If Indonesian: use casual, friendly tone with "Kak"
4. If English: use professional but warm tone
5. Match their formality level
ABOUT [BRAND]:
- Fashion store based in Indonesia
- Ships internationally
- Products: Dresses, Blouses, Pants
- Price range: $15-50 USD / Rp 200k-750k
INDONESIAN SPECIFIC:
- Gunakan "Kak" untuk panggilan
- Emoji boleh digunakan 😊
- Casual tapi sopan
- Harga dalam Rupiah
ENGLISH SPECIFIC:
- Use "Hi" or "Hello"
- Professional warmth
- Prices in USD
- Clear and concise
OTHER LANGUAGES:
- Be respectful of cultural norms
- Adapt formality to the language
- Convert prices if needed`;Basic Implementation:
javascript
async function multiLangChat(userId, userMessage) {
const response = await openai.chat.completions.create({
model: 'gpt-4o',
messages: [
{ role: 'system', content: MULTILANG_PROMPT },
{ role: 'user', content: userMessage }
]
});
return response.choices[0].message.content;
}
// Test
await multiLangChat(user, "Halo, mau tanya harga dress");
// → "Hai Kak! Untuk dress, harga mulai dari Rp 200.000..."
await multiLangChat(user, "Hello, what dresses do you have?");
// → "Hi! We have a lovely collection of dresses..."
await multiLangChat(user, "Bonjour, avez-vous des robes?");
// → "Bonjour! Oui, nous avons une belle collection..."Advanced: Language Detection & Routing
Detect Language First:
javascript
async function detectLanguage(text) {
const response = await openai.chat.completions.create({
model: 'gpt-4o-mini',
messages: [{
role: 'user',
content: `Detect the language of this text.
Return only the ISO 639-1 code (e.g., 'en', 'id', 'zh').
Text: "${text}"`
}],
max_tokens: 10
});
return response.choices[0].message.content.trim().toLowerCase();
}
// Alternative: Use a library
const LanguageDetect = require('languagedetect');
const lngDetector = new LanguageDetect();
function detectLanguageLocal(text) {
const result = lngDetector.detect(text, 1);
if (result.length > 0) {
const langMap = {
'indonesian': 'id',
'english': 'en',
'chinese': 'zh',
'japanese': 'ja',
// ... more
};
return langMap[result[0][0]] || 'en';
}
return 'en'; // default
}Store User Language Preference:
javascript
const userLanguages = new Map();
async function chat(userId, userMessage) {
// Detect language if not known
let userLang = userLanguages.get(userId);
if (!userLang) {
userLang = await detectLanguage(userMessage);
userLanguages.set(userId, userLang);
}
// Build language-specific prompt
const prompt = buildPromptForLanguage(userLang);
const response = await openai.chat.completions.create({
model: 'gpt-4o',
messages: [
{ role: 'system', content: prompt },
{ role: 'user', content: userMessage }
]
});
return response.choices[0].message.content;
}
function buildPromptForLanguage(lang) {
const basePrompt = `You are a customer service AI for [BRAND].
RESPOND IN: ${getLanguageName(lang)}`;
const langSpecific = {
'id': `
BAHASA INDONESIA:
- Panggil dengan "Kak"
- Tone casual dan ramah
- Harga dalam Rupiah
- Emoji boleh: 😊💕🛍️`,
'en': `
ENGLISH:
- Professional but warm
- Prices in USD
- Clear and helpful
- Minimal emoji`,
'zh': `
中文:
- 礼貌用语
- 价格用人民币
- 专业友好`
};
return basePrompt + (langSpecific[lang] || langSpecific['en']);
}Localized Content
Price Conversion:
javascript
const exchangeRates = {
'IDR': 1,
'USD': 0.000063,
'SGD': 0.000085,
'MYR': 0.00028,
'CNY': 0.00046
};
const currencyByLang = {
'id': 'IDR',
'en': 'USD',
'zh': 'CNY',
'ms': 'MYR'
};
function convertPrice(priceIDR, targetLang) {
const currency = currencyByLang[targetLang] || 'USD';
const rate = exchangeRates[currency];
const converted = priceIDR * rate;
return formatCurrency(converted, currency);
}
function formatCurrency(amount, currency) {
const formats = {
'IDR': `Rp ${amount.toLocaleString('id-ID')}`,
'USD': `$${amount.toFixed(2)}`,
'SGD': `S$${amount.toFixed(2)}`,
'MYR': `RM${amount.toFixed(2)}`,
'CNY': `¥${amount.toFixed(2)}`
};
return formats[currency] || `$${amount.toFixed(2)}`;
}Localized Templates:
javascript
const greetings = {
'id': 'Hai Kak! Selamat datang di [BRAND] 😊',
'en': 'Hi there! Welcome to [BRAND]!',
'zh': '您好!欢迎来到 [BRAND]!',
'ja': 'こんにちは![BRAND]へようこそ!',
'ko': '안녕하세요! [BRAND]에 오신 것을 환영합니다!',
'th': 'สวัสดีค่ะ! ยินดีต้อนรับสู่ [BRAND]!',
'vi': 'Xin chào! Chào mừng đến với [BRAND]!'
};
const menuOptions = {
'id': {
products: '🛍️ Lihat Produk',
order: '📦 Cek Pesanan',
help: '💬 Bantuan'
},
'en': {
products: '🛍️ View Products',
order: '📦 Track Order',
help: '💬 Help'
}
// ... more languages
};Language Switching
Allow Manual Switch:
javascript
const switchCommands = {
'english': 'en',
'indonesia': 'id',
'bahasa': 'id',
'chinese': 'zh',
'中文': 'zh',
'japanese': 'ja',
'日本語': 'ja'
};
async function handleMessage(userId, text) {
// Check for language switch command
const lowerText = text.toLowerCase();
for (const [command, lang] of Object.entries(switchCommands)) {
if (lowerText.includes(command)) {
userLanguages.set(userId, lang);
const confirmations = {
'en': 'Language switched to English! How can I help you?',
'id': 'Bahasa diubah ke Indonesia! Ada yang bisa dibantu? 😊',
'zh': '语言已切换为中文!有什么可以帮您的?'
};
return confirmations[lang];
}
}
// Normal chat flow
return await chat(userId, text);
}Handling Mixed Language
javascript
// Some users mix languages (code-switching)
// AI naturally handles this
const MIXED_LANG_PROMPT = `You are a customer service AI.
LANGUAGE HANDLING:
- Customers may mix languages (e.g., Indonesian + English)
- Detect the PRIMARY language they're using
- Respond in their primary language
- It's okay to use common loan words
EXAMPLES:
User: "Halo, mau tanya price list dong"
→ Primary: Indonesian (respond in Indonesian)
→ "Hai Kak! Price list bisa dilihat di..."
User: "Hi, bisa COD gak?"
→ Primary: Indonesian with English greeting
→ "Hai Kak! Bisa COD untuk area Jabodetabek..."`;Analytics Multi-Language
javascript
// Track language distribution
async function trackLanguageUsage(userId, lang) {
await db.analytics.updateOne(
{ date: today() },
{
$inc: {
[`languages.${lang}`]: 1,
totalMessages: 1
}
},
{ upsert: true }
);
}
// Dashboard data
async function getLanguageStats() {
const stats = await db.analytics.aggregate([
{ $group: {
_id: null,
languages: { $mergeObjects: '$languages' }
}}
]).toArray();
return stats[0]?.languages || {};
}
// Result example:
// { id: 8500, en: 1200, zh: 300, ja: 50 }Best Practices
DO ✅
- Let AI auto-detect language
- Store user preference
- Localize prices & formats
- Handle code-switching
- Provide switch option
- Test with native speakersDON'T ❌
- Force one language
- Machine-translate templates
- Ignore cultural nuances
- Mix formality levels
- Skip localization
- Assume all users speak EnglishFAQ
AI bisa berapa bahasa?
95+ bahasa untuk GPT-4/Claude. Kualitas terbaik untuk bahasa populer.
Perlu training khusus per bahasa?
Tidak untuk LLM besar. Cukup system prompt yang jelas tentang tone per bahasa.
Bagaimana dengan slang/bahasa gaul?
AI cukup paham slang umum. Untuk slang sangat lokal, bisa ditambahkan di prompt.
Kesimpulan
Multi-language AI = Global reach!
| Single Language | Multi-Language AI |
|---|---|
| Limited market | Global market |
| Manual translate | Auto-respond |
| Inconsistent | Natural |