diff --git a/frontend/src/i18n/index.js b/frontend/src/i18n/index.js index 2da33c8..9625754 100644 --- a/frontend/src/i18n/index.js +++ b/frontend/src/i18n/index.js @@ -62,13 +62,13 @@ const messages = { notAvailable: 'not available', setupFailed: 'Could not finish account setup', chatActionFailed: 'Could not complete that chat action', - groupCreateFailed: 'Could not create the persona group', + groupCreateFailed: 'Could not create the Persona group', myDashboardSubtitle: 'Your practice summary — see your wins and what still needs practice.', noPractice: 'No practice yet', - noPracticeHint: 'Go to Training and try closing a sale with a persona.', + noPracticeHint: 'Go to Training and try closing a sale with a Persona.', weakAreas: 'Weak areas', - weakAreasIntro: 'Choose a weakness to lock into a private persona for repeat practice.', - demoWeakAreasReadOnly: 'Read-only analysis — private persona creation is unavailable for demo accounts.', + weakAreasIntro: 'Choose a weakness to lock into a private Persona for repeat practice.', + demoWeakAreasReadOnly: 'Read-only analysis — private Persona creation is unavailable for demo accounts.', winsLabel: 'Wins', lossesLabel: 'Losses', evidenceFrom: 'Evidence from', @@ -79,10 +79,10 @@ const messages = { prev: 'Previous', next: 'Next', noSessionsPage: 'No sessions on this page.', - privatePersonasIntro: 'Private personas are visible only to you for repeat practice.', + privatePersonasIntro: 'Private Personas are visible only to you for repeat practice.', manualPersonaTitle: 'Create from my brief', manualPersonaPlaceholder: 'e.g. A customer who pushes hard on price and does not trust sellers', - noPrivatePersonas: 'No private personas yet', + noPrivatePersonas: 'No private Personas yet', privatePersonasHint: 'Create one above, or return to weak areas to choose a challenge.', creating: 'Creating…', productLabel: 'Product', @@ -95,17 +95,17 @@ const messages = { visibilitySaved: 'Visibility saved.', visibilityUpdateFailed: 'Could not update group visibility. Please try again.', groupInstructions: 'How to use this page', - groupInstructionAnalyze: 'The system creates 15 personas automatically after analysis.', - groupInstructionEdit: 'Edit a persona card when you need to adjust its details.', - groupInstructionStart: 'To practice: open Training, choose this product, choose a persona, then start a chat.', - noPersonas: 'No personas yet', + groupInstructionAnalyze: 'The system creates 15 Personas automatically after analysis.', + groupInstructionEdit: 'Edit a Persona card when you need to adjust its details.', + groupInstructionStart: 'To practice: open Training, choose this product, choose a Persona, then start a chat.', + noPersonas: 'No Personas yet', noPersonasHint: 'Personas will appear when analysis finishes.', previewMode: 'Preview mode — admin practice is excluded from trainee analytics.', session: 'Session', failurePoints: 'Missed points', coaching: 'Coaching', - adminPersonaHint: 'Admin: adjust persona details here.', - newPersona: 'New persona', + adminPersonaHint: 'Admin: adjust Persona details here.', + newPersona: 'New Persona', personaBasicInfo: 'Basic information', personaCustomerInfo: 'Customer information', personaSalesInfo: 'Sales information', @@ -131,20 +131,20 @@ const messages = { personaOpener: 'Customer conversation opener', personaLockedHint: 'Editing is restricted — only super admins can view or edit this section (to protect the competitive advantage).', personaSpecial: 'Special', - personaSave: 'Save persona', + personaSave: 'Save Persona', personaClose: 'Close', - createVariant: 'Create a persona from this one', - scenarioContext: 'Choose the conversation context. The persona identity and who starts are fixed by the persona.', + createVariant: 'Create a Persona from this one', + scenarioContext: 'Choose the conversation context. The Persona identity and who starts are fixed by the Persona.', total: 'Total', dateRange: 'Date range', apply: 'Apply', clear: 'Clear', - hardestPersonas: 'Hardest personas', + hardestPersonas: 'Hardest Personas', closeRate: 'Close rate', activeUsers: 'Active users', closeRateByDifficulty: 'Close rate by difficulty', - closeRateByDifficultyHint: 'Bucketed so easy-only practice cannot hide a real weakness. A high overall win rate may just mean people trained only on easy personas.', - skewEasy: 'Most practice is on easy personas — check the buckets', + closeRateByDifficultyHint: 'Bucketed so easy-only practice cannot hide a real weakness. A high overall win rate may just mean people trained only on easy Personas.', + skewEasy: 'Most practice is on easy Personas — check the buckets', last30Days: 'Last 30 days', default30Note: 'Default view = last 30 days', teamWeakAreas: 'Team weak areas', @@ -154,17 +154,17 @@ const messages = { traineeTable: 'Per-trainee results', traineeTableHint: 'Sessions, wins, close rate and the biggest weakness for each trainee.', topWeakArea: 'Top weak area', - managePersonas: 'Manage personas', + managePersonas: 'Manage Personas', difficulty: 'Difficulty', trained: 'Trained', addProduct: 'Add product', - trainingSubtitle: 'Pick a product group, then choose a persona to practice closing the sale.', + trainingSubtitle: 'Pick a product group, then choose a Persona to practice closing the sale.', noTraining: 'No training groups available', noProductsHint: 'Create your first product to start practicing.', groups: 'Customer Groups (Persona)', ownProducts: 'My products', noOwnProducts: 'No products yet', - noOwnProductsHint: 'Add a product first. Its personas will be generated and shown inside that product.', + noOwnProductsHint: 'Add a product first. Its Personas will be generated and shown inside that product.', orgProducts: 'Org products', myTraining: 'My Training', adminTools: 'Admin Tools', @@ -185,7 +185,7 @@ const messages = { revokeDemoFailed: 'Could not revoke the demo account.', demoAccountCreateFailed: 'Could not create the demo account.', analytics: 'Analytics', - groupBuilder: 'Create persona group', + groupBuilder: 'Create Persona group', create: 'Create', analyze: 'Analyze', analyzing: 'Analyzing…', @@ -200,11 +200,11 @@ const messages = { language: 'Language', thai: 'Thai', english: 'English', - personas: 'personas', + personas: 'Personas', tierA: 'Tier A — Ready to buy', tierB: 'Tier B — Unsure', tierC: 'Tier C — Not interested but has pain', - selectPersona: 'Select a persona to practice', + selectPersona: 'Select a Persona to practice', chooseScenario: 'Choose a scenario', chatGuideTitle: 'How to practice', chatGuideText: 'You are playing the salesperson. Chat with this customer and try to close the sale. Ask about their needs, solve their pain, and handle their objections. When the customer makes a decision (buys, walks away, or chooses to trial first), the chat closes automatically and your score and coaching appear.', @@ -218,9 +218,9 @@ const messages = { score: 'Score', pain: 'Pain', why: 'Reason', - reveal: 'Revealed persona details', - generatePersona: 'Generate my persona', - myPersonas: 'My personas', + reveal: 'Revealed Persona details', + generatePersona: 'Generate my Persona', + myPersonas: 'My Personas', mySessions: 'My sessions', inProgress: 'In progress', resume: 'Resume', @@ -253,7 +253,7 @@ const messages = { passwordTooShort: 'รหัสผ่านต้องมีความยาวอย่างน้อย 12 ตัวอักษร', passwordMismatch: 'รหัสผ่านที่ยืนยันไม่ตรงกัน', setupTitle: 'ตั้งค่าบัญชีของคุณ', - setupSubtitle: 'เข้าสู่ระบบครั้งแรกสำหรับ ', + setupSubtitle: 'เข้าสู่ระบบครั้งแรกสำหรับ', loginError: 'ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง กรุณาลองอีกครั้ง', signInWithGoogle: 'เข้าสู่ระบบด้วย Google', signInWithFacebook: 'เข้าสู่ระบบด้วย Facebook', @@ -290,7 +290,7 @@ const messages = { winsShort: 'ชนะ', lossesShort: 'แพ้', playsLabel: 'ครั้ง', - groupReport: 'รายงานกลุ่ม persona', + groupReport: 'รายงานกลุ่ม Persona', viewReport: 'ดูรายงาน', downloadReport: 'ดาวน์โหลดรายงาน', reportLoadFailed: 'โหลดรายงานไม่สำเร็จ', @@ -298,13 +298,13 @@ const messages = { notAvailable: 'ไม่มีข้อมูล', setupFailed: 'ตั้งค่าบัญชีไม่สำเร็จ', chatActionFailed: 'ดำเนินการในแชทไม่สำเร็จ', - groupCreateFailed: 'สร้างกลุ่ม persona ไม่สำเร็จ', + groupCreateFailed: 'สร้างกลุ่ม Persona ไม่สำเร็จ', myDashboardSubtitle: 'สรุปผลการฝึกของคุณ — ดูว่าปิดการขายได้กี่ครั้ง และยังต้องฝึกจุดไหน', noPractice: 'ยังไม่มีประวัติการฝึก', - noPracticeHint: 'ไปที่หน้าการฝึก แล้วลองปิดการขายกับ persona สักคน', + noPracticeHint: 'ไปที่หน้าการฝึก แล้วลองปิดการขายกับ Persona สักคน', weakAreas: 'จุดอ่อนที่ควรฝึก', - weakAreasIntro: 'เลือกจุดที่อยากล็อกไว้ แล้วสร้าง persona ส่วนตัวสำหรับฝึกซ้ำ', - demoWeakAreasReadOnly: 'อ่านผลวิเคราะห์ได้อย่างเดียว — บัญชีทดลองไม่สามารถสร้าง persona ส่วนตัวได้', + weakAreasIntro: 'เลือกจุดที่อยากล็อกไว้ แล้วสร้าง Persona ส่วนตัวสำหรับฝึกซ้ำ', + demoWeakAreasReadOnly: 'อ่านผลวิเคราะห์ได้อย่างเดียว — บัญชีทดลองไม่สามารถสร้าง Persona ส่วนตัวได้', winsLabel: 'ชนะ', lossesLabel: 'แพ้', evidenceFrom: 'หลักฐานจาก', @@ -315,10 +315,10 @@ const messages = { prev: 'ก่อนหน้า', next: 'ถัดไป', noSessionsPage: 'หน้านี้ยังไม่มี session', - privatePersonasIntro: 'persona ในส่วนนี้เป็นพื้นที่ส่วนตัวของคุณ ใช้สำหรับฝึกซ้ำ', + privatePersonasIntro: 'Personaในส่วนนี้เป็นพื้นที่ส่วนตัวของคุณ ใช้สำหรับฝึกซ้ำ', manualPersonaTitle: 'สร้างจากโจทย์ของฉัน', manualPersonaPlaceholder: 'เช่น ลูกค้าที่ต่อราคาแรงและไม่เชื่อใจผู้ขาย', - noPrivatePersonas: 'ยังไม่มี persona ส่วนตัว', + noPrivatePersonas: 'ยังไม่มี Personaส่วนตัว', privatePersonasHint: 'สร้างจากโจทย์ด้านบน หรือกลับไปที่จุดอ่อนเพื่อเลือกโจทย์', creating: 'กำลังสร้าง…', productLabel: 'สินค้า', @@ -331,17 +331,17 @@ const messages = { visibilitySaved: 'บันทึกการมองเห็นแล้ว', visibilityUpdateFailed: 'เปลี่ยนการมองเห็นของกลุ่มไม่สำเร็จ กรุณาลองใหม่', groupInstructions: 'วิธีใช้หน้านี้', - groupInstructionAnalyze: 'ระบบจะสร้าง persona 15 คนให้อัตโนมัติเมื่อวิเคราะห์เสร็จ', - groupInstructionEdit: 'กดแก้ไขการ์ดเพื่อปรับรายละเอียด persona ให้ตรงกับโจทย์', - groupInstructionStart: 'เริ่มฝึก: ไปที่การฝึก เลือกสินค้านี้ เลือก persona แล้วเริ่มแชท', - noPersonas: 'ยังไม่มี persona', - noPersonasHint: 'persona จะปรากฏเมื่อวิเคราะห์กลุ่มสำเร็จ', + groupInstructionAnalyze: 'ระบบจะสร้าง Persona 15 คนให้อัตโนมัติเมื่อวิเคราะห์เสร็จ', + groupInstructionEdit: 'กดแก้ไขการ์ดเพื่อปรับรายละเอียด Persona ให้ตรงกับโจทย์', + groupInstructionStart: 'เริ่มฝึก: ไปที่การฝึก เลือกสินค้านี้ เลือก Persona แล้วเริ่มแชท', + noPersonas: 'ยังไม่มี Persona', + noPersonasHint: 'Personaจะปรากฏเมื่อวิเคราะห์กลุ่มสำเร็จ', previewMode: 'โหมด Preview — ผลการฝึกของผู้ดูแลจะไม่เข้า analytics ของผู้ฝึก', session: 'Session', failurePoints: 'จุดที่พลาด', coaching: 'ข้อเสนอแนะ', - adminPersonaHint: 'ผู้ดูแลสามารถปรับรายละเอียดของ persona ได้ที่นี่', - newPersona: 'persona ใหม่', + adminPersonaHint: 'ผู้ดูแลสามารถปรับรายละเอียดของ Personaได้ที่นี่', + newPersona: 'Personaใหม่', personaBasicInfo: 'ข้อมูลพื้นฐาน', personaCustomerInfo: 'ข้อมูลลูกค้า', personaSalesInfo: 'ข้อมูลการขาย', @@ -367,15 +367,15 @@ const messages = { personaOpener: 'ช่องทางสำหรับลูกค้าเปิดบทสนทนา (opener)', personaLockedHint: 'ปิดการแก้ไข — เฉพาะผู้ดูแลระดับสูงเท่านั้นที่ดู/แก้ได้ (เพื่อรักษาความได้เปรียบ)', personaSpecial: 'พิเศษ', - personaSave: 'บันทึก persona', + personaSave: 'บันทึก Persona', personaClose: 'ปิด', - createVariant: 'สร้าง persona จากต้นแบบนี้', - scenarioContext: 'เลือกบริบทการสนทนา โดยตัวตนของลูกค้าและคนที่เริ่มก่อนมาจาก persona', + createVariant: 'สร้าง Persona จากต้นแบบนี้', + scenarioContext: 'เลือกบริบทการสนทนา โดยตัวตนของลูกค้าและคนที่เริ่มก่อนมาจาก Persona', total: 'ทั้งหมด', dateRange: 'ช่วงเวลา', apply: 'กรอง', clear: 'ล้าง', - hardestPersonas: 'persona ที่ขายยากที่สุด', + hardestPersonas: 'Personaที่ขายยากที่สุด', closeRate: 'อัตราปิดการขาย', activeUsers: 'ผู้ที่ฝึกในรอบนี้', closeRateByDifficulty: 'อัตราปิดการขายแยกตามความยาก', @@ -390,17 +390,17 @@ const messages = { traineeTable: 'ผลการฝึกรายคน', traineeTableHint: 'จำนวนครั้ง ชนะ อัตราปิดการขาย และจุดอ่อนเด่นของแต่ละคน', topWeakArea: 'จุดอ่อนเด่น', - managePersonas: 'จัดการ persona', + managePersonas: 'จัดการ Persona', difficulty: 'ระดับความยาก', trained: 'ฝึกแล้ว', addProduct: 'เพิ่มสินค้า', - trainingSubtitle: 'เลือกกลุ่มสินค้า แล้วเลือก persona เพื่อฝึกปิดการขาย', + trainingSubtitle: 'เลือกกลุ่มสินค้า แล้วเลือก Personaเพื่อฝึกปิดการขาย', noTraining: 'ยังไม่มีกลุ่มฝึก', noProductsHint: 'สร้างสินค้าชิ้นแรกของคุณเพื่อเริ่มฝึก', groups: 'กลุ่มลูกค้า (Persona)', ownProducts: 'สินค้าของฉัน', noOwnProducts: 'ยังไม่มีสินค้าของคุณ', - noOwnProductsHint: 'เพิ่มสินค้าก่อน ระบบจะสร้าง persona และแสดง persona ไว้ภายในสินค้านั้น', + noOwnProductsHint: 'เพิ่มสินค้าก่อน ระบบจะสร้าง Persona และแสดง Persona ไว้ภายในสินค้านั้น', orgProducts: 'สินค้าขององค์กร', myTraining: 'ประวัติการฝึก', adminTools: 'เครื่องมือผู้ดูแลระบบ', @@ -421,7 +421,7 @@ const messages = { revokeDemoFailed: 'เพิกถอนบัญชีทดลองไม่สำเร็จ', demoAccountCreateFailed: 'สร้างบัญชีทดลองไม่สำเร็จ', analytics: 'สถิติ', - groupBuilder: 'สร้างกลุ่ม persona', + groupBuilder: 'สร้างกลุ่ม Persona', create: 'สร้าง', analyze: 'วิเคราะห์', analyzing: 'กำลังวิเคราะห์…', @@ -436,11 +436,11 @@ const messages = { language: 'ภาษา', thai: 'ไทย', english: 'อังกฤษ', - personas: 'persona', + personas: 'Persona', tierA: 'ระดับ A — พร้อมตัดสินใจซื้อ', tierB: 'ระดับ B — ยังไม่แน่ใจ', tierC: 'ระดับ C — ไม่สนใจแต่มีปัญหา', - selectPersona: 'เลือก persona เพื่อฝึก', + selectPersona: 'เลือก Personaเพื่อฝึก', chooseScenario: 'เลือกสถานการณ์', chatGuideTitle: 'วิธีฝึก', chatGuideText: 'คุณรับบทเป็นพนักงานขาย พูดคุยกับลูกค้าคนนี้เพื่อพยายามปิดการขายให้ได้ สอบถามความต้องการ แก้ไขปัญหาของลูกค้า และรับมือกับข้อโต้แย้ง เมื่อลูกค้าตัดสินใจ (ซื้อ ปฏิเสธ หรือขอลองใช้ก่อน) ระบบจะปิดแชทและสรุปผลให้อัตโนมัติ', @@ -454,9 +454,9 @@ const messages = { score: 'คะแนน', pain: 'ปัญหาของลูกค้า', why: 'เหตุผล', - reveal: 'รายละเอียด persona ที่ถูกซ่อนไว้', - generatePersona: 'สร้าง persona เพิ่มเติม', - myPersonas: 'Persona ของฉัน', + reveal: 'รายละเอียด Persona ที่ถูกซ่อนไว้', + generatePersona: 'สร้าง Personaเพิ่มเติม', + myPersonas: 'Personaของฉัน', mySessions: 'ประวัติการฝึกของฉัน', inProgress: 'กำลังฝึก', resume: 'ฝึกต่อ', diff --git a/frontend/src/views/GroupBuilder.vue b/frontend/src/views/GroupBuilder.vue index 255d9e0..f2be3ae 100644 --- a/frontend/src/views/GroupBuilder.vue +++ b/frontend/src/views/GroupBuilder.vue @@ -8,14 +8,14 @@