diff --git a/api/constants/languages.py b/api/constants/languages.py index 284f3d8758..0ae69d77d2 100644 --- a/api/constants/languages.py +++ b/api/constants/languages.py @@ -2,7 +2,7 @@ import json from models.model import AppModelConfig -languages = ['en-US', 'zh-Hans', 'pt-BR', 'es-ES', 'fr-FR', 'de-DE', 'ja-JP', 'ko-KR', 'ru-RU', 'it-IT', 'uk-UA'] +languages = ['en-US', 'zh-Hans', 'pt-BR', 'es-ES', 'fr-FR', 'de-DE', 'ja-JP', 'ko-KR', 'ru-RU', 'it-IT', 'uk-UA', 'vi-VN'] language_timezone_mapping = { 'en-US': 'America/New_York', @@ -16,6 +16,7 @@ language_timezone_mapping = { 'ru-RU': 'Europe/Moscow', 'it-IT': 'Europe/Rome', 'uk-UA': 'Europe/Kyiv', + 'vi-VN': 'Asia/Ho_Chi_Minh', } @@ -79,6 +80,16 @@ user_input_form_template = { } } ], + "vi-VN": [ + { + "paragraph": { + "label": "Nội dung truy vấn", + "variable": "default_input", + "required": False, + "default": "" + } + } + ], } demo_model_templates = { @@ -208,7 +219,6 @@ demo_model_templates = { ) } ], - 'zh-Hans': [ { 'name': '翻译助手', @@ -335,91 +345,92 @@ demo_model_templates = { ) } ], - 'uk-UA': [{ - "name": "Помічник перекладу", - "icon": "", - "icon_background": "", - "description": "Багатомовний перекладач, який надає можливості перекладу різними мовами, перекладаючи введені користувачем дані на потрібну мову.", - "mode": "completion", - "model_config": AppModelConfig( - provider="openai", - model_id="gpt-3.5-turbo-instruct", - configs={ - "prompt_template": "Будь ласка, перекладіть наступний текст на {{target_language}}:\n", - "prompt_variables": [ - { - "key": "target_language", - "name": "Цільова мова", - "description": "Мова, на яку ви хочете перекласти.", - "type": "select", - "default": "Ukrainian", - "options": [ - "Chinese", - "English", - "Japanese", - "French", - "Russian", - "German", - "Spanish", - "Korean", - "Italian", - ], + 'uk-UA': [ + { + "name": "Помічник перекладу", + "icon": "", + "icon_background": "", + "description": "Багатомовний перекладач, який надає можливості перекладу різними мовами, перекладаючи введені користувачем дані на потрібну мову.", + "mode": "completion", + "model_config": AppModelConfig( + provider="openai", + model_id="gpt-3.5-turbo-instruct", + configs={ + "prompt_template": "Будь ласка, перекладіть наступний текст на {{target_language}}:\n", + "prompt_variables": [ + { + "key": "target_language", + "name": "Цільова мова", + "description": "Мова, на яку ви хочете перекласти.", + "type": "select", + "default": "Ukrainian", + "options": [ + "Chinese", + "English", + "Japanese", + "French", + "Russian", + "German", + "Spanish", + "Korean", + "Italian", + ], + }, + ], + "completion_params": { + "max_token": 1000, + "temperature": 0, + "top_p": 0, + "presence_penalty": 0.1, + "frequency_penalty": 0.1, }, - ], - "completion_params": { - "max_token": 1000, - "temperature": 0, - "top_p": 0, - "presence_penalty": 0.1, - "frequency_penalty": 0.1, }, - }, - opening_statement="", - suggested_questions=None, - pre_prompt="Будь ласка, перекладіть наступний текст на {{target_language}}:\n{{query}}\ntranslate:", - model=json.dumps({ - "provider": "openai", - "name": "gpt-3.5-turbo-instruct", - "mode": "completion", - "completion_params": { - "max_tokens": 1000, - "temperature": 0, - "top_p": 0, - "presence_penalty": 0.1, - "frequency_penalty": 0.1, - }, - }), - user_input_form=json.dumps([ - { - "select": { - "label": "Цільова мова", - "variable": "target_language", - "description": "Мова, на яку ви хочете перекласти.", - "default": "Chinese", - "required": True, - 'options': [ - 'Chinese', - 'English', - 'Japanese', - 'French', - 'Russian', - 'German', - 'Spanish', - 'Korean', - 'Italian', - ] + opening_statement="", + suggested_questions=None, + pre_prompt="Будь ласка, перекладіть наступний текст на {{target_language}}:\n{{query}}\ntranslate:", + model=json.dumps({ + "provider": "openai", + "name": "gpt-3.5-turbo-instruct", + "mode": "completion", + "completion_params": { + "max_tokens": 1000, + "temperature": 0, + "top_p": 0, + "presence_penalty": 0.1, + "frequency_penalty": 0.1, + }, + }), + user_input_form=json.dumps([ + { + "select": { + "label": "Цільова мова", + "variable": "target_language", + "description": "Мова, на яку ви хочете перекласти.", + "default": "Chinese", + "required": True, + 'options': [ + 'Chinese', + 'English', + 'Japanese', + 'French', + 'Russian', + 'German', + 'Spanish', + 'Korean', + 'Italian', + ] + } + }, { + "paragraph": { + "label": "Запит", + "variable": "query", + "required": True, + "default": "" + } } - }, { - "paragraph": { - "label": "Запит", - "variable": "query", - "required": True, - "default": "" - } - } - ]) - ) - }, + ]) + ) + }, { "name": "AI інтерв’юер фронтенду", "icon": "", @@ -460,5 +471,132 @@ demo_model_templates = { ), } ], - + 'vi-VN': [ + { + 'name': 'Trợ lý dịch thuật', + 'icon': '', + 'icon_background': '', + 'description': 'Trình dịch đa ngôn ngữ cung cấp khả năng dịch bằng nhiều ngôn ngữ, dịch thông tin đầu vào của người dùng sang ngôn ngữ họ cần.', + 'mode': 'completion', + 'model_config': AppModelConfig( + provider='openai', + model_id='gpt-3.5-turbo-instruct', + configs={ + 'prompt_template': "Hãy dịch đoạn văn bản sau sang ngôn ngữ {{target_language}}:\n", + 'prompt_variables': [ + { + "key": "target_language", + "name": "Ngôn ngữ đích", + "description": "Ngôn ngữ bạn muốn dịch sang.", + "type": "select", + "default": "Vietnamese", + 'options': [ + 'Chinese', + 'English', + 'Japanese', + 'French', + 'Russian', + 'German', + 'Spanish', + 'Korean', + 'Italian', + 'Vietnamese', + ] + } + ], + 'completion_params': { + 'max_token': 1000, + 'temperature': 0, + 'top_p': 0, + 'presence_penalty': 0.1, + 'frequency_penalty': 0.1, + } + }, + opening_statement='', + suggested_questions=None, + pre_prompt="Hãy dịch đoạn văn bản sau sang {{target_language}}:\n{{query}}\ndịch:", + model=json.dumps({ + "provider": "openai", + "name": "gpt-3.5-turbo-instruct", + "mode": "completion", + "completion_params": { + "max_tokens": 1000, + "temperature": 0, + "top_p": 0, + "presence_penalty": 0.1, + "frequency_penalty": 0.1 + } + }), + user_input_form=json.dumps([ + { + "select": { + "label": "Ngôn ngữ đích", + "variable": "target_language", + "description": "Ngôn ngữ bạn muốn dịch sang.", + "default": "Vietnamese", + "required": True, + 'options': [ + 'Chinese', + 'English', + 'Japanese', + 'French', + 'Russian', + 'German', + 'Spanish', + 'Korean', + 'Italian', + 'Vietnamese', + ] + } + }, { + "paragraph": { + "label": "Query", + "variable": "query", + "required": True, + "default": "" + } + } + ]) + ) + }, + { + 'name': 'Phỏng vấn front-end AI', + 'icon': '', + 'icon_background': '', + 'description': 'Một người phỏng vấn front-end mô phỏng để kiểm tra mức độ kỹ năng phát triển front-end thông qua việc đặt câu hỏi.', + 'mode': 'chat', + 'model_config': AppModelConfig( + provider='openai', + model_id='gpt-3.5-turbo', + configs={ + 'introduction': 'Xin chào, chào mừng đến với cuộc phỏng vấn của chúng tôi. Tôi là người phỏng vấn cho công ty công nghệ này và tôi sẽ kiểm tra kỹ năng phát triển web front-end của bạn. Tiếp theo, tôi sẽ hỏi bạn một số câu hỏi kỹ thuật. Hãy trả lời chúng càng kỹ lưỡng càng tốt. ', + 'prompt_template': "Bạn sẽ đóng vai người phỏng vấn cho một công ty công nghệ, kiểm tra kỹ năng phát triển web front-end của người dùng và đặt ra 5-10 câu hỏi kỹ thuật sắc bén.\n\nXin lưu ý:\n- Mỗi lần chỉ hỏi một câu hỏi.\n - Sau khi người dùng trả lời một câu hỏi, hãy hỏi trực tiếp câu hỏi tiếp theo mà không cố gắng sửa bất kỳ lỗi nào mà thí sinh mắc phải.\n- Nếu bạn cho rằng người dùng đã không trả lời đúng cho một số câu hỏi liên tiếp, hãy hỏi ít câu hỏi hơn.\n- Sau đặt câu hỏi cuối cùng, bạn có thể hỏi câu hỏi này: Tại sao bạn lại rời bỏ công việc cuối cùng của mình? Sau khi người dùng trả lời câu hỏi này, vui lòng bày tỏ sự hiểu biết và ủng hộ của bạn.\n", + 'prompt_variables': [], + 'completion_params': { + 'max_token': 300, + 'temperature': 0.8, + 'top_p': 0.9, + 'presence_penalty': 0.1, + 'frequency_penalty': 0.1, + } + }, + opening_statement='Xin chào, chào mừng đến với cuộc phỏng vấn của chúng tôi. Tôi là người phỏng vấn cho công ty công nghệ này và tôi sẽ kiểm tra kỹ năng phát triển web front-end của bạn. Tiếp theo, tôi sẽ hỏi bạn một số câu hỏi kỹ thuật. Hãy trả lời chúng càng kỹ lưỡng càng tốt. ', + suggested_questions=None, + pre_prompt="Bạn sẽ đóng vai người phỏng vấn cho một công ty công nghệ, kiểm tra kỹ năng phát triển web front-end của người dùng và đặt ra 5-10 câu hỏi kỹ thuật sắc bén.\n\nXin lưu ý:\n- Mỗi lần chỉ hỏi một câu hỏi.\n - Sau khi người dùng trả lời một câu hỏi, hãy hỏi trực tiếp câu hỏi tiếp theo mà không cố gắng sửa bất kỳ lỗi nào mà thí sinh mắc phải.\n- Nếu bạn cho rằng người dùng đã không trả lời đúng cho một số câu hỏi liên tiếp, hãy hỏi ít câu hỏi hơn.\n- Sau đặt câu hỏi cuối cùng, bạn có thể hỏi câu hỏi này: Tại sao bạn lại rời bỏ công việc cuối cùng của mình? Sau khi người dùng trả lời câu hỏi này, vui lòng bày tỏ sự hiểu biết và ủng hộ của bạn.\n", + model=json.dumps({ + "provider": "openai", + "name": "gpt-3.5-turbo", + "mode": "chat", + "completion_params": { + "max_tokens": 300, + "temperature": 0.8, + "top_p": 0.9, + "presence_penalty": 0.1, + "frequency_penalty": 0.1 + } + }), + user_input_form=None + ) + } + ], } diff --git a/web/i18n/language.ts b/web/i18n/language.ts index 9b7f5a27f0..c72717dc84 100644 --- a/web/i18n/language.ts +++ b/web/i18n/language.ts @@ -16,6 +16,7 @@ export type I18nText = { 'ru-RU': string 'it-IT': string 'uk-UA': string + 'vi-VN': string } export const languages = [ @@ -97,6 +98,12 @@ export const languages = [ example: 'Привет, Dify!', supported: true, }, + { + value: 'vi-VN', + name: 'Tiếng Việt(Việt Nam)', + example: 'Xin chào, Dify!', + supported: true, + }, ] export const LanguagesSupported = languages.filter(item => item.supported).map(item => item.value) @@ -119,6 +126,7 @@ export const NOTICE_I18N = { ja_JP: '重要なお知らせ', ko_KR: '중요 공지', uk_UA: 'Важливе повідомлення', + vi_VN: 'Thông báo quan trọng', }, desc: { en_US: 'Our system will be unavailable from 19:00 to 24:00 UTC on August 28 for an upgrade. For questions, kindly contact our support team (support@dify.ai). We value your patience.', @@ -130,6 +138,7 @@ export const NOTICE_I18N = { ja_JP: 'Our system will be unavailable from 19:00 to 24:00 UTC on August 28 for an upgrade. For questions, kindly contact our support team (support@dify.ai). We value your patience.', ko_KR: 'Our system will be unavailable from 19:00 to 24:00 UTC on August 28 for an upgrade. For questions, kindly contact our support team (support@dify.ai). We value your patience.', uk_UA: 'Наша система буде недоступна з 19:00 до 24:00 UTC 28 серпня для оновлення. Якщо у вас виникнуть запитання, будь ласка, зв’яжіться з нашою службою підтримки (support@dify.ai). Дякуємо за терпіння.', + vi_VN: 'Hệ thống của chúng tôi sẽ ngừng hoạt động từ 19:00 đến 24:00 UTC vào ngày 28 tháng 8 để nâng cấp. Nếu có thắc mắc, vui lòng liên hệ với nhóm hỗ trợ của chúng tôi (support@dify.ai). Chúng tôi đánh giá cao sự kiên nhẫn của bạn.', }, href: '#', } diff --git a/web/i18n/vi-VN/app-annotation.ts b/web/i18n/vi-VN/app-annotation.ts new file mode 100644 index 0000000000..2b70b8608c --- /dev/null +++ b/web/i18n/vi-VN/app-annotation.ts @@ -0,0 +1,87 @@ +const translation = { + title: 'Chú thích', + name: 'Chú thích cho câu Trả lời', + editBy: 'Câu trả lời được chỉnh sửa bởi {{author}}', + noData: { + title: 'Không có chú thích', + description: 'Bạn có thể chỉnh sửa chú thích trong phần gỡ lỗi ứng dụng hoặc nhập hàng loạt chú thích vào đây để có phản hồi chất lượng cao.', + }, + table: { + header: { + question: 'câu hỏi', + answer: 'câu trả lời', + createdAt: 'tạo lúc', + hits: 'lượt truy cập', + actions: 'hành động', + addAnnotation: 'Thêm chú thích', + bulkImport: 'Nhập hàng loạt', + bulkExport: 'Xuất hoàng loạt', + clearAll: 'Xóa tất cả chú thích', + }, + }, + editModal: { + title: 'Chỉnh sửa chú thích Trả lời', + queryName: 'Truy vấn người dùng', + answerName: 'Câu chuyện của BOT', + yourAnswer: 'Câu trả lời của bạn', + answerPlaceholder: 'Nhập câu trả lời của bạn vào đây', + yourQuery: 'Truy vấn của bạn', + queryPlaceholder: 'Nhập truy vấn của bạn ở đây', + removeThisCache: 'Xóa chú thích này', + createdAt: 'Được tạo lúc', + }, + addModal: { + title: 'Thêm chú thích Trả lời', + queryName: 'Câu hỏi', + answerName: 'Trả lời', + answerPlaceholder: 'Nhập câu trả lời vào đây', + queryPlaceholder: 'Nhập truy vấn ở đây', + createNext: 'Thêm một phản hồi có chú thích khác', + }, + batchModal: { + title: 'Nhập hàng loạt', + csvUploadTitle: 'Kéo và thả tệp CSV của bạn vào đây hoặc ', + browse: 'duyệt', + tip: 'Tệp CSV phải tuân theo cấu trúc sau:', + question: 'câu hỏi', + answer: 'trả lời', + contentTitle: 'đoạn nội dung', + content: 'nội dung', + template: 'Tải mẫu tại đây', + cancel: 'Bỏ', + run: 'Run Batch', + runError: 'Run batch failed', + processing: 'In batch processing', + completed: 'Import completed', + error: 'Import Error', + ok: 'OK', + }, + errorMessage: { + answerRequired: 'Câu trả lời là bắt buộc', + queryRequired: 'Câu hỏi là bắt buộc', + }, + viewModal: { + annotatedResponse: 'Chú thích Trả lời', + hitHistory: 'Lịch sử lượt truy cập', + hit: 'Truy cập', + hits: 'Lượt truy cập', + noHitHistory: 'Không có lịch sử truy cập', + }, + hitHistoryTable: { + query: 'Truy vấn', + match: 'Chính xác', + response: 'Phản ứng', + source: 'Nguồn', + score: 'Điểm', + time: 'Thời gian', + }, + initSetup: { + title: 'Chú thích Trả lời Thiết lập ban đầu', + configTitle: 'Thiết lập trả lời chú thích', + confirmBtn: 'Lưu & Kích hoạt', + configConfirmBtn: 'Lưu', + }, + embeddingModelSwitchTip: 'Mô hình vector hóa văn bản chú thích, mô hình chuyển đổi sẽ được nhúng lại, dẫn đến phát sinh thêm chi phí.', +} + +export default translation diff --git a/web/i18n/vi-VN/app-api.ts b/web/i18n/vi-VN/app-api.ts new file mode 100644 index 0000000000..67c5a8bfa7 --- /dev/null +++ b/web/i18n/vi-VN/app-api.ts @@ -0,0 +1,82 @@ +const translation = { + apiServer: 'API Server', + apiKey: 'API Key', + status: 'Trạng thái', + disabled: 'Tắt', + ok: 'Đang hoạt động', + copy: 'Sao chép', + copied: 'Đã chép', + play: 'Chạy', + pause: 'Dừng', + playing: 'Đang chạy', + merMaind: { + rerender: 'Redo Rerender', + }, + never: 'Không bao giờ', + apiKeyModal: { + apiSecretKey: 'API khoá bí mật', + apiSecretKeyTips: 'Để ngăn chặn việc lạm dụng API, hãy bảo vệ Khóa API của bạn. Tránh sử dụng nó dưới dạng văn bản thuần túy trong mã giao diện người dùng. :)', + createNewSecretKey: 'Tạo khóa bí mật mới', + secretKey: 'Khóa bí mật', + created: 'CREATED', + lastUsed: 'LAST USED', + generateTips: 'Giữ chìa khóa này ở nơi an toàn và dễ tiếp cận.', + }, + actionMsg: { + deleteConfirmTitle: 'Xóa khóa bí mật này?', + deleteConfirmTips: 'Hành động này không thể được hoàn tác.', + ok: 'OK', + }, + completionMode: { + title: 'Completion App API', + info: 'Đối với việc tạo văn bản chất lượng cao, như bài viết, tóm tắt và dịch thuật, hãy sử dụng API hoàn thành tin nhắn với đầu vào người dùng. Việc tạo văn bản dựa trên các thông số mô hình và mẫu đề xuất được thiết lập trong Dify Prompt Engineering.', + createCompletionApi: 'Tạo tin nhắn hoàn thành', + createCompletionApiTip: 'Tạo một tin nhắn hoàn thành để hỗ trợ chế độ câu hỏi và trả lời.', + inputsTips: '(Tùy chọn) Cung cấp các trường đầu vào người dùng dưới dạng cặp khóa-giá trị, tương ứng với các biến trong Prompt Eng. Khóa là tên biến, Giá trị là giá trị tham số. Nếu loại trường là Lựa chọn, Giá trị đã gửi phải là một trong các lựa chọn đã thiết lập trước.', + queryTips: 'Nội dung văn bản đầu vào của người dùng.', + blocking: 'Loại chặn, đợi để thực hiện hoàn tất và trả kết quả. (Yêu cầu có thể bị gián đoạn nếu quá trình kéo dài)', + streaming: 'trả về dữ liệu theo luồng. Thực hiện trả dữ liệu theo luồng dựa trên SSE (Sự kiện được gửi từ máy chủ).', + messageFeedbackApi: 'Phản hồi tin nhắn (thích)', + messageFeedbackApiTip: 'Đánh giá các tin nhắn nhận được thay mặt cho người dùng cuối với các lựa chọn thích hoặc không thích. Dữ liệu này hiển thị trên trang Nhật ký & Chú thích và được sử dụng cho việc điều chỉnh mô hình trong tương lai.', + messageIDTip: 'ID tin nhắn', + ratingTip: 'thích hoặc không thích, null là hủy bỏ', + parametersApi: 'Thu thập thông tin tham số ứng dụng', + parametersApiTip: 'Truy xuất các tham số Đầu vào được cấu hình, bao gồm tên biến, tên trường, loại và giá trị mặc định. Thường được sử dụng để hiển thị các trường này trong một biểu mẫu hoặc điền vào các giá trị mặc định sau khi máy khách tải.', + }, + chatMode: { + title: 'Chat App API', + info: 'Đối với ứng dụng trò chuyện linh hoạt sử dụng định dạng Câu hỏi và Trả lời, gọi API tin nhắn trò chuyện để bắt đầu cuộc trò chuyện. Duy trì cuộc trò chuyện liên tục bằng cách chuyển conversation_id đã trả về. Các tham số phản hồi và mẫu phụ thuộc vào các cài đặt của Dify Prompt Eng.', + createChatApi: 'Tạo tin nhắn trò chuyện', + createChatApiTip: 'Tạo một tin nhắn trò chuyện mới hoặc tiếp tục một cuộc trò chuyện đang tồn tại.', + inputsTips: '(Tùy chọn) Cung cấp các trường đầu vào người dùng dưới dạng cặp khóa-giá trị, tương ứng với các biến trong Prompt Eng. Khóa là tên biến, Giá trị là giá trị tham số. Nếu loại trường là Lựa chọn, Giá trị đã gửi phải là một trong các lựa chọn đã thiết lập trước.', + queryTips: 'Nội dung câu hỏi của người dùng', + blocking: 'Loại chặn, đợi để thực hiện hoàn tất và trả kết quả. (Yêu cầu có thể bị gián đoạn nếu quá trình kéo dài)', + streaming: 'trả về dữ liệu theo luồng. Thực hiện trả dữ liệu theo luồng dựa trên SSE (Sự kiện được gửi từ máy chủ).', + conversationIdTip: '(Tùy chọn) ID cuộc trò chuyện: để trống cho cuộc trò chuyện lần đầu; chuyển conversation_id từ ngữ cảnh để tiếp tục cuộc trò chuyện.', + messageFeedbackApi: 'Phản hồi của người dùng cuối về tin nhắn, như', + messageFeedbackApiTip: 'Đánh giá các tin nhắn nhận được thay mặt cho người dùng cuối với các lựa chọn thích hoặc không thích. Dữ liệu này hiển thị trên trang Nhật ký & Chú thích và được sử dụng cho việc điều chỉnh mô hình trong tương lai.', + messageIDTip: 'ID tin nhắn', + ratingTip: 'thích hoặc không thích, null là hủy bỏ', + chatMsgHistoryApi: 'Lấy lịch sử tin nhắn trò chuyện', + chatMsgHistoryApiTip: 'Trang đầu tiên trả về `limit` tin nhắn mới nhất, được sắp xếp theo thứ tự ngược lại.', + chatMsgHistoryConversationIdTip: 'ID Cuộc trò chuyện', + chatMsgHistoryFirstId: 'ID của bản ghi trò chuyện đầu tiên trên trang hiện tại. Giá trị mặc định là không có.', + chatMsgHistoryLimit: 'Bao nhiêu cuộc trò chuyện được trả lại trong một yêu cầu', + conversationsListApi: 'Lấy danh sách cuộc trò chuyện', + conversationsListApiTip: 'Lấy danh sách phiên của người dùng hiện tại. Theo mặc định, trả về 20 phiên cuối cùng.', + conversationsListFirstIdTip: 'ID của bản ghi cuối cùng trên trang hiện tại, mặc định không có.', + conversationsListLimitTip: 'Bao nhiêu cuộc trò chuyện được trả lại trong một yêu cầu', + conversationRenamingApi: 'Đổi tên cuộc trò chuyện', + conversationRenamingApiTip: 'Đổi tên cuộc trò chuyện; tên sẽ được hiển thị trong giao diện nhiều phiên.', + conversationRenamingNameTip: 'Tên mới', + parametersApi: 'Thu thập thông tin tham số ứng dụng', + parametersApiTip: 'Truy xuất các tham số Đầu vào được cấu hình, bao gồm tên biến, tên trường, loại và giá trị mặc định. Thường được sử dụng để hiển thị các trường này trong một biểu mẫu hoặc điền vào các giá trị mặc định sau khi máy khách tải.', + }, + develop: { + requestBody: 'Nội dung yêu cầu', + pathParams: 'Thông số đường dẫn', + query: 'Truy vấn', + }, +} + +export default translation diff --git a/web/i18n/vi-VN/app-debug.ts b/web/i18n/vi-VN/app-debug.ts new file mode 100644 index 0000000000..7a65edc8b4 --- /dev/null +++ b/web/i18n/vi-VN/app-debug.ts @@ -0,0 +1,409 @@ +const translation = { + pageTitle: { + line1: 'PROMPT', + line2: 'Engineering', + }, + orchestrate: 'Orchestrate', + promptMode: { + simple: 'Chuyển sang Chế độ Chuyên gia để chỉnh sửa toàn bộ PROMPT', + advanced: 'Chế độ Chuyên gia', + switchBack: 'Chuyển về', + advancedWarning: { + title: 'Bạn đã chuyển sang Chế độ Chuyên gia, và một khi bạn sửa đổi PROMPT, bạn KHÔNG THỂ quay lại chế độ cơ bản.', + description: 'Trong Chế độ Chuyên gia, bạn có thể chỉnh sửa toàn bộ PROMPT.', + learnMore: 'Tìm hiểu thêm', + ok: 'OK', + }, + operation: { + addMessage: 'Thêm Tin nhắn', + }, + contextMissing: 'Thiếu thành phần Ngữ cảnh, hiệu quả của prompt có thể không tốt.', + }, + operation: { + applyConfig: 'Xuất bản', + resetConfig: 'Đặt lại', + debugConfig: 'Gỡ lỗi', + addFeature: 'Thêm Tính năng', + automatic: 'Tự động', + stopResponding: 'Dừng phản hồi', + agree: 'thích', + disagree: 'không thích', + cancelAgree: 'Hủy thích', + cancelDisagree: 'Hủy không thích', + userAction: 'Người dùng ', + }, + notSetAPIKey: { + title: 'Khóa nhà cung cấp LLM chưa được đặt', + trailFinished: 'Kết thúc dấu vết', + description: 'Khóa nhà cung cấp LLM chưa được đặt, và cần được đặt trước khi gỡ lỗi.', + settingBtn: 'Đi đến cài đặt', + }, + trailUseGPT4Info: { + title: 'Hiện không hỗ trợ gpt-4', + description: 'Sử dụng gpt-4, vui lòng đặt API Key.', + }, + feature: { + groupChat: { + title: 'Nâng cao trò chuyện', + description: 'Thêm cài đặt trước cuộc trò chuyện cho ứng dụng có thể cải thiện trải nghiệm người dùng.', + }, + groupExperience: { + title: 'Nâng cao trải nghiệm', + }, + conversationOpener: { + title: 'Khởi động cuộc trò chuyện', + description: 'Trong một ứng dụng trò chuyện, câu nói đầu tiên mà AI tự động nói với người dùng thường được sử dụng như một lời chào.', + }, + suggestedQuestionsAfterAnswer: { + title: 'Theo dõi', + description: 'Thiết lập đề xuất câu hỏi tiếp theo có thể mang lại trò chuyện tốt hơn cho người dùng.', + resDes: '3 đề xuất cho câu hỏi tiếp theo của người dùng.', + tryToAsk: 'Thử hỏi', + }, + moreLikeThis: { + title: 'Nhiều hơn như vậy', + description: 'Tạo nhiều văn bản cùng một lúc, và sau đó chỉnh sửa và tiếp tục tạo ra.', + generateNumTip: 'Số lượng mỗi lần tạo ra', + tip: 'Sử dụng tính năng này sẽ tốn thêm token.', + }, + speechToText: { + title: 'Chuyển đổi Giọng nói thành Văn bản', + description: 'Một khi được bật, bạn có thể sử dụng đầu vào giọng nói.', + resDes: 'Đầu vào Giọng nói đã được bật', + }, + textToSpeech: { + title: 'Chuyển đổi Văn bản thành Giọng nói', + description: 'Một khi được bật, văn bản có thể được chuyển đổi thành giọng nói.', + resDes: 'Chuyển đổi Văn bản thành Âm thanh đã được bật', + }, + citation: { + title: 'Trích dẫn và Ghi chú', + description: 'Một khi được bật, hiển thị tài liệu nguồn và phần được ghi nhận của nội dung được tạo ra.', + resDes: 'Trích dẫn và Ghi chú đã được bật', + }, + annotation: { + title: 'Phản hồi Chú thích', + description: 'Bạn có thể thêm phản hồi chất lượng cao vào bộ nhớ cache để ưu tiên phù hợp với các câu hỏi của người dùng tương tự.', + resDes: 'Phản hồi Chú thích đã được bật', + scoreThreshold: { + title: 'Ngưỡng Điểm', + description: 'Được sử dụng để đặt ngưỡng tương đồng cho phản hồi chú thích.', + easyMatch: 'Tương đồng Dễ dàng', + accurateMatch: 'Tương đồng Chính xác', + }, + matchVariable: { + title: 'Biến Phù hợp', + choosePlaceholder: 'Chọn biến phù hợp', + }, + cacheManagement: 'Chú thích', + cached: 'Đã ghi chú', + remove: 'Xóa', + removeConfirm: 'Xóa chú thích này?', + add: 'Thêm chú thích', + edit: 'Chỉnh sửa chú thích', + }, + dataSet: { + title: 'Ngữ cảnh', + noData: 'Bạn có thể nhập Dữ liệu như là ngữ cảnh', + words: 'Từ', + textBlocks: 'Khối Văn bản', + selectTitle: 'Chọn Kiến thức tham khảo', + selected: 'Kiến thức đã chọn', + noDataSet: 'Không tìm thấy Kiến thức', + toCreate: 'Đi tới tạo mới', + notSupportSelectMulti: 'Hiện chỉ hỗ trợ một Kiến thức', + queryVariable: { + title: 'Biến Truy vấn', + tip: 'Biến này sẽ được sử dụng làm đầu vào truy vấn cho việc truy xuất ngữ cảnh, lấy thông tin ngữ cảnh liên quan đến đầu vào của biến này.', + choosePlaceholder: 'Chọn biến truy vấn', + noVar: 'Không có biến', + noVarTip: 'xin vui lòng tạo một biến dưới phần Biến', + unableToQueryDataSet: 'Không thể truy vấn Kiến thức', + unableToQueryDataSetTip: 'Không thể truy vấn Kiến thức thành công, vui lòng chọn một biến truy vấn ngữ cảnh trong phần ngữ cảnh.', + ok: 'OK', + contextVarNotEmpty: 'biến truy vấn ngữ cảnh không thể trống', + deleteContextVarTitle: 'Xóa biến “{{varName}}”?', + deleteContextVarTip: 'Biến này đã được thiết lập là biến truy vấn ngữ cảnh, và việc loại bỏ nó sẽ ảnh hưởng đến việc sử dụng bình thường của Kiến thức. Nếu bạn vẫn cần xóa nó, vui lòng chọn lại nó trong phần ngữ cảnh.', + }, + }, + tools: { + title: 'Công cụ', + tips: 'Công cụ cung cấp một phương thức gọi API chuẩn, lấy đầu vào người dùng hoặc biến làm tham số yêu cầu để truy vấn dữ liệu bên ngoài như ngữ cảnh.', + toolsInUse: '{{count}} công cụ đang được sử dụng', + modal: { + title: 'Công cụ', + toolType: { + title: 'Loại Công cụ', + placeholder: 'Vui lòng chọn loại công cụ', + }, + name: { + title: 'Tên', + placeholder: 'Vui lòng nhập tên', + }, + variableName: { + title: 'Tên Biến', + placeholder: 'Vui lòng nhập tên biến', + }, + }, + }, + conversationHistory: { + title: 'Lịch sử Cuộc trò chuyện', + description: 'Đặt tên tiền tố cho các vai trò trong cuộc trò chuyện', + tip: 'Lịch sử Cuộc trò chuyện chưa được bật, vui lòng thêm vào phần prompt ở trên.', + learnMore: 'Tìm hiểu thêm', + editModal: { + title: 'Chỉnh sửa Tên Vai trò Cuộc trò chuyện', + userPrefix: 'Tiền tố Người dùng', + assistantPrefix: 'Tiền tố Trợ lý', + }, + }, + toolbox: { + title: 'HỘP CÔNG CỤ', + }, + moderation: { + title: 'Kiểm duyệt nội dung', + description: 'Bảo vệ đầu ra của mô hình bằng cách sử dụng API kiểm duyệt hoặc duy trì một danh sách từ nhạy cảm.', + allEnabled: 'Nội dung ĐẦU VÀO/ĐẦU RA Đã Bật', + inputEnabled: 'Nội dung ĐẦU VÀO Đã Bật', + outputEnabled: 'Nội dung ĐẦU RA Đã Bật', + modal: { + title: 'Cài đặt kiểm duyệt nội dung', + provider: { + title: 'Nhà cung cấp', + openai: 'Kiểm duyệt OpenAI', + openaiTip: { + prefix: 'Kiểm duyệt OpenAI yêu cầu một khóa API OpenAI được cấu hình trong ', + suffix: '.', + }, + keywords: 'Từ khóa', + }, + keywords: { + tip: 'Mỗi dòng một từ khóa, phân tách bằng các dòng. Tối đa 100 ký tự mỗi dòng.', + placeholder: 'Mỗi dòng một từ khóa, phân tách bằng các dòng', + line: 'Dòng', + }, + content: { + input: 'Kiểm duyệt Nội dung ĐẦU VÀO', + output: 'Kiểm duyệt Nội dung ĐẦU RA', + preset: 'Câu trả lời mẫu', + placeholder: 'Nội dung câu trả lời mẫu ở đây', + condition: 'Đã bật ít nhất một kiểm duyệt nội dung ĐẦU VÀO và ĐẦU RA', + fromApi: 'Câu trả lời mẫu được trả về bởi API', + errorMessage: 'Câu trả lời mẫu không thể trống', + supportMarkdown: 'Hỗ trợ Markdown', + }, + openaiNotConfig: { + before: 'Kiểm duyệt OpenAI yêu cầu một khóa API OpenAI được cấu hình trong', + after: '', + }, + }, + }, + }, + automatic: { + title: 'Tự động hóa triển khai ứng dụng', + description: 'Mô tả tình huống của bạn, Dify sẽ tự động hóa một ứng dụng cho bạn.', + intendedAudience: 'Ai là đối tượng mục tiêu?', + intendedAudiencePlaceHolder: 'ví dụ: Sinh viên', + solveProblem: 'Họ hy vọng AI có thể giải quyết vấn đề gì cho họ?', + solveProblemPlaceHolder: 'ví dụ: Đánh giá thành tích học tập', + generate: 'Tạo ra', + audiencesRequired: 'Yêu cầu Đối tượng mục tiêu', + problemRequired: 'Vấn đề cần thiết', + resTitle: 'Chúng tôi đã tự động hóa ứng dụng sau đây cho bạn.', + apply: 'Áp dụng tự động hóa này', + noData: 'Mô tả tình huống sử dụng của bạn ở bên trái, xem trước tự động hóa sẽ hiển thị ở đây.', + loading: 'Tự động hóa ứng dụng cho bạn...', + overwriteTitle: 'Ghi đè cấu hình hiện tại?', + overwriteMessage: 'Áp dụng tự động hóa này sẽ ghi đè lên cấu hình hiện tại.', + }, + resetConfig: { + title: 'Xác nhận đặt lại?', + message: + 'Đặt lại sẽ loại bỏ các thay đổi, khôi phục cấu hình đã xuất bản lần cuối.', + }, + errorMessage: { + nameOfKeyRequired: 'tên của khóa: {{key}} được yêu cầu', + valueOfVarRequired: 'giá trị {{key}} không thể trống', + queryRequired: 'Văn bản yêu cầu được yêu cầu.', + waitForResponse: + 'Vui lòng đợi phản hồi của tin nhắn trước để hoàn thành.', + waitForBatchResponse: + 'Vui lòng đợi phản hồi của tác vụ hàng loạt để hoàn thành.', + notSelectModel: 'Vui lòng chọn một mô hình', + waitForImgUpload: 'Vui lòng đợi hình ảnh được tải lên', + }, + chatSubTitle: 'Hướng dẫn', + completionSubTitle: 'Tiền Tố Lời Nhắc', + promptTip: + 'Lời nhắc hướng dẫn các phản hồi của AI với hướng dẫn và ràng buộc. Chèn biến như {{input}}. Lời nhắc này sẽ không được hiển thị cho người dùng.', + formattingChangedTitle: 'Định dạng đã thay đổi', + formattingChangedText: + 'Thay đổi định dạng sẽ đặt lại khu vực gỡ lỗi, bạn có chắc chắn không?', + variableTitle: 'Biến', + variableTip: + 'Người dùng điền các biến vào một biểu mẫu, tự động thay thế các biến trong lời nhắc.', + notSetVar: 'Biến cho phép người dùng giới thiệu các từ khóa lời nhắc hoặc mở đầu khi điền vào biểu mẫu. Bạn có thể thử nhập "{{input}}" trong các từ khóa lời nhắc.', + autoAddVar: 'Biến không xác định được tham chiếu trong tiền-lời nhắc, bạn có muốn thêm chúng vào biểu mẫu đầu vào người dùng không?', + variableTable: { + key: 'Khóa Biến', + name: 'Tên Trường Nhập Liệu Người Dùng', + optional: 'Tùy chọn', + type: 'Loại Nhập Liệu', + action: 'Hành động', + typeString: 'Chuỗi', + typeSelect: 'Chọn', + }, + varKeyError: { + canNoBeEmpty: 'Khóa biến không thể trống', + tooLong: 'Khóa biến: {{key}} quá dài. Không thể dài hơn 30 ký tự', + notValid: 'Khóa biến: {{key}} không hợp lệ. Chỉ có thể chứa chữ cái, số, và dấu gạch dưới', + notStartWithNumber: 'Khóa biến: {{key}} không thể bắt đầu bằng số', + keyAlreadyExists: 'Khóa biến: :{{key}} đã tồn tại', + }, + otherError: { + promptNoBeEmpty: 'Lời nhắc không thể trống', + historyNoBeEmpty: 'Lịch sử cuộc trò chuyện phải được thiết lập trong lời nhắc', + queryNoBeEmpty: 'Truy vấn phải được thiết lập trong lời nhắc', + }, + variableConig: { + modalTitle: 'Thiết lập trường', + description: 'Thiết lập cho biến {{varName}}', + fieldType: 'Loại Trường', + string: 'Văn Bản Ngắn', + paragraph: 'Đoạn Văn', + select: 'Chọn', + notSet: 'Không được thiết lập, hãy thử nhập {{input}} vào lời nhắc tiền.', + stringTitle: 'Tùy chọn hộp văn bản biểu mẫu', + maxLength: 'Độ dài Tối đa', + options: 'Tùy chọn', + addOption: 'Thêm tùy chọn', + apiBasedVar: 'Biến Dựa trên API', + }, + vision: { + name: 'Tầm nhìn', + description: 'Cho phép tầm nhìn sẽ cho phép mô hình nhận hình ảnh và trả lời các câu hỏi về chúng.', + settings: 'Cài đặt', + visionSettings: { + title: 'Cài đặt Tầm nhìn', + resolution: 'Độ phân giải', + resolutionTooltip: `Độ phân giải thấp sẽ cho phép mô hình nhận một phiên bản hình ảnh 512 x 512 thấp hơn, và đại diện cho hình ảnh với ngân sách 65 token. Điều này cho phép API trả về phản hồi nhanh hơn và tiêu thụ ít token đầu vào cho các trường hợp sử dụng không yêu cầu chi tiết cao. + \n + độ phân giải cao sẽ đầu tiên cho phép mô hình nhìn thấy hình ảnh thấp hơn và sau đó tạo ra các cắt chi tiết của hình ảnh đầu vào dưới dạng hình vuông 512px dựa trên kích thước hình ảnh đầu vào. Mỗi cắt chi tiết sử dụng hai lần ngân sách token cho tổng cộng 129 token.`, + high: 'Cao', + low: 'Thấp', + uploadMethod: 'Phương thức Tải lên', + both: 'Cả hai', + localUpload: 'Tải lên Nội bộ', + url: 'URL', + uploadLimit: 'Giới hạn Tải lên', + }, + }, + voice: { + name: 'Giọng nói', + defaultDisplay: 'Giọng mặc định', + description: 'Cài đặt giọng nói văn bản thành tiếng', + settings: 'Cài đặt', + voiceSettings: { + title: 'Cài đặt Giọng nói', + language: 'Ngôn ngữ', + resolutionTooltip: 'Giọng nói văn bản hỗ trợ ngôn ngữ。', + voice: 'Giọng', + }, + }, + openingStatement: { + title: 'Mở đầu Trò chuyện', + add: 'Thêm', + writeOpner: 'Viết câu mở đầu', + placeholder: 'Viết thông điệp mở đầu của bạn ở đây, bạn có thể sử dụng biến, hãy thử nhập {{biến}}.', + openingQuestion: 'Câu Hỏi Mở đầu', + noDataPlaceHolder: + 'Bắt đầu cuộc trò chuyện với người dùng có thể giúp AI thiết lập một mối quan hệ gần gũi hơn với họ trong các ứng dụng trò chuyện.', + varTip: 'Bạn có thể sử dụng biến, hãy thử nhập {{biến}}', + tooShort: 'Ít nhất 20 từ của lời nhắc ban đầu được yêu cầu để tạo ra các lời nhận đầu tiên cho cuộc trò chuyện.', + notIncludeKey: 'Lời nhắc ban đầu không bao gồm biến: {{khóa}}. Vui lòng thêm nó vào lời nhắc ban đầu.', + }, + modelConfig: { + model: 'Mô hình', + setTone: 'Thiết lập tông của phản hồi', + title: 'Mô hình và Tham số', + modeType: { + chat: 'Trò chuyện', + completion: 'Hoàn thành', + }, + }, + inputs: { + title: 'Gỡ Lỗi và Xem Trước', + noPrompt: 'Hãy thử viết một số lời nhắc trong trường tiền-lời nhắc', + userInputField: 'Trường Nhập Liệu Người Dùng', + noVar: 'Điền vào giá trị của biến, nó sẽ tự động thay thế từ khóa lời nhắc mỗi khi bắt đầu phiên mới.', + chatVarTip: + 'Điền vào giá trị của biến, nó sẽ tự động thay thế từ khóa lời nhắc mỗi khi bắt đầu phiên mới', + completionVarTip: + 'Điền vào giá trị của biến, nó sẽ tự động thay thế từ khóa lời nhắc mỗi khi một câu hỏi được gửi.', + previewTitle: 'Xem Trước Lời Nhắc', + queryTitle: 'Nội dung Truy vấn', + queryPlaceholder: 'Vui lòng nhập văn bản yêu cầu.', + run: 'CHẠY', + }, + result: 'Văn bản Đầu Ra', + datasetConfig: { + settingTitle: 'Cài đặt Truy xuất', + retrieveOneWay: { + title: 'N-to-1 Truy xuất', + description: 'Dựa trên ý định của người dùng và mô tả Kiến thức, Agent tự động chọn Kiến thức tốt nhất để truy vấn. Tốt nhất cho các ứng dụng có Kiến thức cụ thể, giới hạn.', + }, + retrieveMultiWay: { + title: 'Truy xuất đa hướng', + description: 'Dựa trên ý định của người dùng, truy vấn qua tất cả Kiến thức, truy xuất văn bản liên quan từ nhiều nguồn và chọn ra kết quả tốt nhất phù hợp với truy vấn của người dùng sau khi sắp xếp lại. Yêu cầu cấu hình của API Rerank model.', + }, + rerankModelRequired: 'Rerank model là bắt buộc', + params: 'Tham số', + top_k: 'Top K', + top_kTip: 'Sử dụng để lọc các phần chính xác nhất với các câu hỏi của người dùng. Hệ thống cũng sẽ tự động điều chỉnh giá trị của Top K, theo max_tokens của mô hình đã chọn.', + score_threshold: 'Ngưỡng Điểm', + score_thresholdTip: 'Sử dụng để thiết lập ngưỡng tương đồng cho việc lọc các phần.', + retrieveChangeTip: 'Thay đổi chế độ chỉ mục và chế độ truy xuất có thể ảnh hưởng đến các ứng dụng liên quan đến Kiến thức này.', + }, + debugAsSingleModel: 'Gỡ Lỗi như Một Mô hình', + debugAsMultipleModel: 'Gỡ Lỗi như Nhiều Mô hình', + duplicateModel: 'Sao chép', + publishAs: 'Xuất bản dưới dạng', + assistantType: { + name: 'Loại Trợ lý', + chatAssistant: { + name: 'Trợ lý Cơ bản', + description: 'Xây dựng một trợ lý dựa trên trò chuyện sử dụng một Mô hình Ngôn ngữ Lớn.', + }, + agentAssistant: { + name: 'Trợ lý Tác nhân', + description: 'Xây dựng một Tác nhân thông minh có thể tự động chọn các công cụ để hoàn thành các nhiệm vụ.', + }, + }, + agent: { + agentMode: 'Chế độ Tác nhân', + agentModeDes: 'Thiết lập loại chế độ suy luận cho tác nhân', + agentModeType: { + ReACT: 'ReAct', + functionCall: 'Gọi Hàm', + }, + setting: { + name: 'Thiết lập Tác nhân', + description: 'Thiết lập Tác nhân cho phép thiết lập chế độ tác nhân và các tính năng nâng cao như các lời nhắc tích hợp sẵn, chỉ có sẵn trong loại Tác nhân.', + maximumIterations: { + name: 'Số Lần Lặp Tối đa', + description: 'Giới hạn số lần lặp một trợ lý tác nhân có thể thực hiện', + }, + }, + buildInPrompt: 'Lời Nhắc Tích Hợp', + firstPrompt: 'Tiền-lời Nhắc Đầu Tiên', + nextIteration: 'Lần Lặp Tiếp Theo', + promptPlaceholder: 'Viết tiền-lời nhắc của bạn ở đây', + tools: { + name: 'Công cụ', + description: 'Sử dụng công cụ có thể mở rộng các khả năng của LLM, như tìm kiếm trên internet hoặc thực hiện các phép tính khoa học', + enabled: 'Đã kích hoạt', + }, + }, +} + +export default translation diff --git a/web/i18n/vi-VN/app-log.ts b/web/i18n/vi-VN/app-log.ts new file mode 100644 index 0000000000..318eb42b86 --- /dev/null +++ b/web/i18n/vi-VN/app-log.ts @@ -0,0 +1,69 @@ +const translation = { + title: 'Nhật ký', + description: 'Nhật ký ghi lại trạng thái hoạt động của ứng dụng, bao gồm đầu vào của người dùng và phản hồi của trí tuệ nhân tạo.', + dateTimeFormat: 'MM/DD/YYYY hh:mm A', + table: { + header: { + time: 'Thời gian', + endUser: 'Người dùng cuối', + input: 'Đầu vào', + output: 'Đầu ra', + summary: 'Tiêu đề', + messageCount: 'Số lượng tin nhắn', + userRate: 'Tỷ lệ người dùng', + adminRate: 'Tỷ lệ quản trị', + }, + pagination: { + previous: 'Trước', + next: 'Tiếp', + }, + empty: { + noChat: 'Chưa có cuộc trò chuyện', + noOutput: 'Không có đầu ra', + element: { + title: 'Có ai ở đó không?', + content: 'Quan sát và ghi chú các tương tác giữa người dùng cuối và ứng dụng trí tuệ nhân tạo ở đây để liên tục cải thiện độ chính xác của trí tuệ nhân tạo. Bạn có thể thử chia sẻ hoặc kiểm tra ứng dụng Web của mình, sau đó quay lại trang này.', + }, + }, + }, + detail: { + time: 'Thời gian', + conversationId: 'ID Cuộc trò chuyện', + promptTemplate: 'Mẫu Nhắc nhở', + promptTemplateBeforeChat: 'Mẫu Nhắc nhở Trước Cuộc trò chuyện · Như Tin nhắn Hệ thống', + annotationTip: 'Cải thiện Được Đánh Dấu bởi {{user}}', + timeConsuming: '', + second: 'giây', + tokenCost: 'Token đã tiêu', + loading: 'đang tải', + operation: { + like: 'thích', + dislike: 'không thích', + addAnnotation: 'Thêm Cải thiện', + editAnnotation: 'Chỉnh sửa Cải thiện', + annotationPlaceholder: 'Nhập câu trả lời mong muốn mà bạn muốn trí tuệ nhân tạo trả lời, có thể được sử dụng cho việc điều chỉnh mô hình và cải thiện liên tục chất lượng tạo văn bản trong tương lai.', + }, + variables: 'Biến', + uploadImages: 'Ảnh đã tải lên', + }, + filter: { + period: { + today: 'Hôm nay', + last7days: '7 Ngày qua', + last4weeks: '4 Tuần qua', + last3months: '3 Tháng qua', + last12months: '12 Tháng qua', + monthToDate: 'Từ Đầu tháng đến nay', + quarterToDate: 'Từ Đầu quý đến nay', + yearToDate: 'Từ Đầu năm đến nay', + allTime: 'Tất cả thời gian', + }, + annotation: { + all: 'Tất cả', + annotated: 'Cải thiện Đã Đánh Dấu ({{count}} mục)', + not_annotated: 'Chưa Đánh Dấu', + }, + }, +} + +export default translation diff --git a/web/i18n/vi-VN/app-overview.ts b/web/i18n/vi-VN/app-overview.ts new file mode 100644 index 0000000000..23a256adbe --- /dev/null +++ b/web/i18n/vi-VN/app-overview.ts @@ -0,0 +1,139 @@ +const translation = { + welcome: { + firstStepTip: 'Để bắt đầu,', + enterKeyTip: 'nhập khóa API OpenAI của bạn bên dưới', + getKeyTip: 'Lấy khóa API của bạn từ bảng điều khiển OpenAI', + placeholder: 'Khóa API OpenAI của bạn (ví dụ: sk-xxxx)', + }, + apiKeyInfo: { + cloud: { + trial: { + title: 'Bạn đang sử dụng hạn mức thử nghiệm của {{providerName}}.', + description: 'Hạn mức thử nghiệm được cung cấp cho việc thử nghiệm của bạn. Trước khi hạn mức cuộc gọi thử nghiệm được sử dụng hết, vui lòng thiết lập nhà cung cấp mô hình của riêng bạn hoặc mua thêm hạn mức.', + }, + exhausted: { + title: 'Hạn mức thử nghiệm của bạn đã được sử dụng hết, vui lòng thiết lập APIKey của bạn.', + description: 'Hạn mức thử nghiệm của bạn đã được sử dụng hết. Vui lòng thiết lập nhà cung cấp mô hình của riêng bạn hoặc mua thêm hạn mức.', + }, + }, + selfHost: { + title: { + row1: 'Để bắt đầu,', + row2: 'thiết lập nhà cung cấp mô hình của bạn trước.', + }, + }, + callTimes: 'Số lần gọi', + usedToken: 'Token đã sử dụng', + setAPIBtn: 'Đi đến thiết lập nhà cung cấp mô hình', + tryCloud: 'Hoặc thử phiên bản đám mây của Dify với báo giá miễn phí', + }, + overview: { + title: 'Tổng quan', + appInfo: { + explanation: 'WebApp Trí tuệ nhân tạo Sẵn sàng sử dụng', + accessibleAddress: 'URL Công cộng', + preview: 'Xem trước', + regenerate: 'Tạo lại', + preUseReminder: 'Vui lòng kích hoạt WebApp trước khi tiếp tục.', + settings: { + entry: 'Cài đặt', + title: 'Cài đặt WebApp', + webName: 'Tên WebApp', + webDesc: 'Mô tả WebApp', + webDescTip: 'Văn bản này sẽ được hiển thị trên phía máy khách, cung cấp hướng dẫn cơ bản về cách sử dụng ứng dụng', + webDescPlaceholder: 'Nhập mô tả của WebApp', + language: 'Ngôn ngữ', + more: { + entry: 'Hiển thị thêm cài đặt', + copyright: 'Bản quyền', + copyRightPlaceholder: 'Nhập tên tác giả hoặc tổ chức', + privacyPolicy: 'Chính sách Bảo mật', + privacyPolicyPlaceholder: 'Nhập liên kết chính sách bảo mật', + privacyPolicyTip: 'Giúp người truy cập hiểu về dữ liệu mà ứng dụng thu thập, xem Chính sách Bảo mật của Dify.', + }, + }, + embedded: { + entry: 'Nhúng', + title: 'Nhúng vào trang web', + explanation: 'Chọn cách nhúng ứng dụng trò chuyện vào trang web của bạn', + iframe: 'Để thêm ứng dụng trò chuyện ở bất kỳ đâu trên trang web của bạn, thêm iframe này vào mã html của bạn.', + scripts: 'Để thêm ứng dụng trò chuyện vào phía dưới bên phải của trang web của bạn, thêm mã này vào mã html của bạn.', + chromePlugin: 'Cài đặt Phần mở rộng Chrome Dify Chatbot', + copied: 'Đã sao chép', + copy: 'Sao chép', + }, + qrcode: { + title: 'Mã QR để chia sẻ', + scan: 'Quét để chia sẻ ứng dụng', + download: 'Tải về Mã QR', + }, + customize: { + way: 'cách', + entry: 'Tùy chỉnh', + title: 'Tùy chỉnh WebApp Trí tuệ nhân tạo', + explanation: 'Bạn có thể tùy chỉnh giao diện trước của ứng dụng Web để phù hợp với kịch bản và nhu cầu phong cách của bạn.', + way1: { + name: 'Fork mã nguồn máy khách, chỉnh sửa và triển khai lên Vercel (được khuyến nghị)', + step1: 'Fork mã nguồn máy khách và chỉnh sửa', + step1Tip: 'Nhấn vào đây để fork mã nguồn vào tài khoản GitHub của bạn và chỉnh sửa mã', + step1Operation: 'Dify-WebClient', + step2: 'Triển khai lên Vercel', + step2Tip: 'Nhấn vào đây để nhập kho vào Vercel và triển khai', + step2Operation: 'Nhập kho', + step3: 'Cấu hình biến môi trường', + step3Tip: 'Thêm các biến môi trường sau vào Vercel', + }, + way2: { + name: 'Viết mã phía máy khách để gọi API và triển khai nó lên máy chủ', + operation: 'Tài liệu', + }, + }, + }, + apiInfo: { + title: 'API Dịch vụ Backend', + explanation: 'Dễ dàng tích hợp vào ứng dụng của bạn', + accessibleAddress: 'Điểm cuối API Dịch vụ', + doc: 'Tài liệu Tham khảo API', + }, + status: { + running: 'Đang hoạt động', + disable: 'Tắt', + }, + }, + analysis: { + title: 'Phân tích', + ms: 'ms', + tokenPS: 'Token/s', + totalMessages: { + title: 'Tổng số tin nhắn', + explanation: 'Số lượt tương tác AI hàng ngày; không bao gồm kỹ thuật kịch bản / gỡ lỗi.', + }, + activeUsers: { + title: 'Người dùng hoạt động', + explanation: 'Người dùng duy nhất tham gia trò chuyện với AI; không bao gồm kỹ thuật kịch bản / gỡ lỗi.', + }, + tokenUsage: { + title: 'Sử dụng Token', + explanation: 'Phản ánh việc sử dụng token hàng ngày của mô hình ngôn ngữ cho ứng dụng, hữu ích cho mục đích kiểm soát chi phí.', + consumed: 'Đã tiêu', + }, + avgSessionInteractions: { + title: 'Trung bình Tương tác trong phiên', + explanation: 'Số lượt giao tiếp giữa người dùng và AI liên tục; cho các ứng dụng dựa trên cuộc trò chuyện.', + }, + userSatisfactionRate: { + title: 'Tỷ lệ Hài lòng của Người dùng', + explanation: 'Số lượng thích cho mỗi 1.000 tin nhắn. Điều này cho thấy tỷ lệ phản hồi mà người dùng rất hài lòng.', + }, + avgResponseTime: { + title: 'Trung bình Thời gian Phản hồi', + explanation: 'Thời gian (ms) để AI xử lý / phản hồi; cho các ứng dụng dựa trên văn bản.', + }, + tps: { + title: 'Tốc độ Đầu ra Token', + explanation: 'Đo hiệu suất của LLM. Đếm tốc độ đầu ra Token của LLM từ khi bắt đầu yêu cầu cho đến khi hoàn thành đầu ra.', + }, + }, +} + +export default translation diff --git a/web/i18n/vi-VN/app.ts b/web/i18n/vi-VN/app.ts new file mode 100644 index 0000000000..b321f53d3e --- /dev/null +++ b/web/i18n/vi-VN/app.ts @@ -0,0 +1,54 @@ +const translation = { + createApp: 'Tạo ứng dụng mới', + types: { + all: 'Tất cả', + assistant: 'Trợ lý', + completion: 'Hoàn thành', + }, + modes: { + completion: 'Máy tạo văn bản', + chat: 'Trợ lý Cơ bản', + }, + createFromConfigFile: 'Tạo ứng dụng từ tệp cấu hình', + deleteAppConfirmTitle: 'Xóa ứng dụng này?', + deleteAppConfirmContent: + 'Việc xóa ứng dụng là không thể đảo ngược. Người dùng sẽ không thể truy cập vào ứng dụng của bạn nữa, và tất cả cấu hình và nhật ký mẫu sẽ bị xóa vĩnh viễn.', + appDeleted: 'Ứng dụng đã bị xóa', + appDeleteFailed: 'Xóa ứng dụng thất bại', + join: 'Tham gia cộng đồng', + communityIntro: + 'Thảo luận với các thành viên nhóm, người đóng góp và nhà phát triển trên các kênh khác nhau.', + roadmap: 'Xem lộ trình của chúng tôi', + appNamePlaceholder: 'Vui lòng nhập tên của ứng dụng', + newApp: { + startToCreate: 'Hãy bắt đầu với ứng dụng mới của bạn', + captionName: 'Biểu tượng & tên ứng dụng', + captionAppType: 'Bạn muốn tạo loại ứng dụng nào?', + previewDemo: 'Xem trước demo', + chatApp: 'Trợ lý', + chatAppIntro: + 'Tôi muốn xây dựng một ứng dụng dựa trên trò chuyện. Ứng dụng này sử dụng định dạng câu hỏi và trả lời, cho phép nhiều vòng trò chuyện liên tục.', + agentAssistant: 'Trợ lý Mới cho Đại lý', + completeApp: 'Máy Tạo Văn Bản', + completeAppIntro: + 'Tôi muốn tạo một ứng dụng tạo ra văn bản chất lượng cao dựa trên các mẫu, như việc tạo bài viết, tóm tắt, dịch thuật và nhiều hơn nữa.', + showTemplates: 'Tôi muốn chọn từ một mẫu', + hideTemplates: 'Quay lại lựa chọn chế độ', + Create: 'Tạo', + Cancel: 'Hủy', + nameNotEmpty: 'Tên không được để trống', + appTemplateNotSelected: 'Vui lòng chọn một mẫu', + appTypeRequired: 'Vui lòng chọn loại ứng dụng', + appCreated: 'Ứng dụng đã được tạo', + appCreateFailed: 'Không thể tạo ứng dụng', + }, + editApp: { + startToEdit: 'Chỉnh sửa ứng dụng', + }, + emoji: { + ok: 'Đồng ý', + cancel: 'Hủy', + }, +} + +export default translation diff --git a/web/i18n/vi-VN/billing.ts b/web/i18n/vi-VN/billing.ts new file mode 100644 index 0000000000..71abd8a884 --- /dev/null +++ b/web/i18n/vi-VN/billing.ts @@ -0,0 +1,115 @@ +const translation = { + currentPlan: 'Kế hoạch Hiện tại', + upgradeBtn: { + plain: 'Nâng cấp Kế hoạch', + encourage: 'Nâng cấp Ngay', + encourageShort: 'Nâng cấp', + }, + viewBilling: 'Quản lý thanh toán và đăng ký', + buyPermissionDeniedTip: 'Vui lòng liên hệ với quản trị viên doanh nghiệp của bạn để đăng ký', + plansCommon: { + title: 'Chọn một kế hoạch phù hợp với bạn', + yearlyTip: 'Nhận 2 tháng miễn phí khi đăng ký hàng năm!', + mostPopular: 'Phổ biến nhất', + planRange: { + monthly: 'Hàng tháng', + yearly: 'Hàng năm', + }, + month: 'tháng', + year: 'năm', + save: 'Tiết kiệm ', + free: 'Miễn phí', + currentPlan: 'Kế hoạch Hiện tại', + contractSales: 'Liên hệ bộ phận bán hàng', + contractOwner: 'Liên hệ quản lý nhóm', + startForFree: 'Bắt đầu miễn phí', + getStartedWith: 'Bắt đầu với ', + contactSales: 'Liên hệ Bán hàng', + talkToSales: 'Nói chuyện với Bộ phận Bán hàng', + modelProviders: 'Nhà cung cấp Mô hình', + teamMembers: 'Thành viên Nhóm', + buildApps: 'Xây dựng Ứng dụng', + vectorSpace: 'Không gian Vector', + vectorSpaceBillingTooltip: 'Mỗi 1MB có thể lưu trữ khoảng 1.2 triệu ký tự dữ liệu vector hóa (ước tính sử dụng OpenAI Embeddings, thay đổi tùy theo các mô hình).', + vectorSpaceTooltip: 'Không gian Vector là hệ thống bộ nhớ dài hạn cần thiết cho LLMs để hiểu dữ liệu của bạn.', + documentsUploadQuota: 'Hạn mức Tải lên Tài liệu', + documentProcessingPriority: 'Ưu tiên Xử lý Tài liệu', + documentProcessingPriorityTip: 'Để có ưu tiên xử lý tài liệu cao hơn, vui lòng nâng cấp kế hoạch của bạn.', + documentProcessingPriorityUpgrade: 'Xử lý nhiều dữ liệu với độ chính xác cao và tốc độ nhanh hơn.', + priority: { + 'standard': 'Tiêu chuẩn', + 'priority': 'Ưu tiên', + 'top-priority': 'Ưu tiên Cao nhất', + }, + logsHistory: 'Lịch sử Nhật ký', + customTools: 'Công cụ Tùy chỉnh', + unavailable: 'Không có sẵn', + days: 'ngày', + unlimited: 'Không giới hạn', + support: 'Hỗ trợ', + supportItems: { + communityForums: 'Diễn đàn cộng đồng', + emailSupport: 'Hỗ trợ qua email', + priorityEmail: 'Hỗ trợ qua email & chat ưu tiên', + logoChange: 'Thay đổi Logo', + SSOAuthentication: 'Xác thực SSO', + personalizedSupport: 'Hỗ trợ cá nhân hóa', + dedicatedAPISupport: 'Hỗ trợ API dành riêng', + customIntegration: 'Tích hợp và hỗ trợ tùy chỉnh', + ragAPIRequest: 'Yêu cầu API RAG', + bulkUpload: 'Tải lên tài liệu hàng loạt', + agentMode: 'Chế độ Đại lý', + workflow: 'Quy trình làm việc', + }, + comingSoon: 'Sắp ra mắt', + member: 'Thành viên', + memberAfter: 'Thành viên', + messageRequest: { + title: 'Số Lượng Tin Nhắn', + tooltip: 'Hạn mức triệu hồi tin nhắn cho các kế hoạch sử dụng mô hình OpenAI (ngoại trừ gpt4). Các tin nhắn vượt quá giới hạn sẽ sử dụng Khóa API OpenAI của bạn.', + }, + annotatedResponse: { + title: 'Hạn Mức Quota Phản hồi Đã được Ghi chú', + tooltip: 'Chỉnh sửa và ghi chú thủ công các phản hồi cung cấp khả năng trả lời câu hỏi chất lượng cao có thể tùy chỉnh cho các ứng dụng. (Chỉ áp dụng trong các ứng dụng trò chuyện)', + }, + ragAPIRequestTooltip: 'Đề cập đến số lượng cuộc gọi API triệu hồi chỉ khả năng xử lý cơ sở kiến thức của Dify.', + receiptInfo: 'Chỉ chủ nhóm và quản trị viên nhóm có thể đăng ký và xem thông tin thanh toán', + }, + plans: { + sandbox: { + name: 'Hộp Cát', + description: 'Thử nghiệm miễn phí 200 lần GPT', + includesTitle: 'Bao gồm:', + }, + professional: { + name: 'Chuyên nghiệp', + description: 'Dành cho cá nhân và các nhóm nhỏ để mở khóa nhiều sức mạnh với giá cả phải chăng.', + includesTitle: 'Tất cả trong kế hoạch miễn phí, cộng thêm:', + }, + team: { + name: 'Nhóm', + description: 'Hợp tác mà không giới hạn và tận hưởng hiệu suất hạng nhất.', + includesTitle: 'Tất cả trong kế hoạch Chuyên nghiệp, cộng thêm:', + }, + enterprise: { + name: 'Doanh nghiệp', + description: 'Nhận toàn bộ khả năng và hỗ trợ cho các hệ thống quan trọng cho nhiệm vụ quy mô lớn.', + includesTitle: 'Tất cả trong kế hoạch Nhóm, cộng thêm:', + }, + }, + vectorSpace: { + fullTip: 'Không gian Vector đã đầy.', + fullSolution: 'Nâng cấp kế hoạch của bạn để có thêm không gian.', + }, + apps: { + fullTipLine1: 'Nâng cấp kế hoạch của bạn để', + fullTipLine2: 'xây dựng thêm ứng dụng.', + }, + annotatedResponse: { + fullTipLine1: 'Nâng cấp kế hoạch của bạn để', + fullTipLine2: 'ghi chú thêm cuộc trò chuyện.', + quotaTitle: 'Hạn Mức Quota Phản hồi Đã được Ghi chú', + }, +} + +export default translation diff --git a/web/i18n/vi-VN/common.ts b/web/i18n/vi-VN/common.ts new file mode 100644 index 0000000000..ed130d8fa0 --- /dev/null +++ b/web/i18n/vi-VN/common.ts @@ -0,0 +1,505 @@ +const translation = { + api: { + success: 'Thành công', + actionSuccess: 'Thành công', + saved: 'Đã lưu', + create: 'Tạo', + remove: 'Xóa', + }, + operation: { + create: 'Tạo mới', + confirm: 'Xác nhận', + cancel: 'Hủy bỏ', + clear: 'Xóa', + save: 'Lưu', + edit: 'Chỉnh sửa', + add: 'Thêm', + added: 'Đã thêm', + refresh: 'Làm mới', + reset: 'Đặt lại', + search: 'Tìm kiếm', + change: 'Thay đổi', + remove: 'Xóa', + send: 'Gửi', + copy: 'Sao chép', + lineBreak: 'Ngắt dòng', + sure: 'Tôi chắc chắn', + download: 'Tải xuống', + delete: 'Xóa', + settings: 'Cài đặt', + setup: 'Thiết lập', + getForFree: 'Nhận miễn phí', + reload: 'Tải lại', + ok: 'OK', + log: 'Nhật ký', + learnMore: 'Tìm hiểu thêm', + params: 'Tham số', + }, + placeholder: { + input: 'Vui lòng nhập', + select: 'Vui lòng chọn', + }, + voice: { + language: { + zhHans: 'Tiếng Trung', + enUS: 'Tiếng Anh', + deDE: 'Tiếng Đức', + frFR: 'Tiếng Pháp', + esES: 'Tiếng Tây Ban Nha', + itIT: 'Tiếng Ý', + thTH: 'Tiếng Thái', + idID: 'Tiếng Indonesia', + jaJP: 'Tiếng Nhật', + koKR: 'Tiếng Hàn', + ptBR: 'Tiếng Bồ Đào Nha', + ruRU: 'Tiếng Nga', + ukUA: 'Tiếng Ukraina', + }, + }, + unit: { + char: 'ký tự', + }, + actionMsg: { + noModification: 'Hiện không có sự thay đổi.', + modifiedSuccessfully: 'Chỉnh sửa thành công', + modifiedUnsuccessfully: 'Chỉnh sửa không thành công', + copySuccessfully: 'Đã sao chép thành công', + paySucceeded: 'Thanh toán thành công', + payCancelled: 'Thanh toán đã hủy', + generatedSuccessfully: 'Tạo thành công', + generatedUnsuccessfully: 'Tạo không thành công', + }, + model: { + params: { + temperature: 'Nhiệt độ', + temperatureTip: + 'Kiểm soát sự ngẫu nhiên: Giảm nhiệt độ dẫn đến ít kết quả hoàn thành ngẫu nhiên hơn. Khi nhiệt độ tiến gần về không, mô hình sẽ trở nên xác định và lặp lại.', + top_p: 'Top P', + top_pTip: + 'Kiểm soát đa dạng thông qua lấy mẫu nhân nhóm: 0.5 có nghĩa là nửa số tùy chọn có khả năng cao được xem xét.', + presence_penalty: 'Phạt sự hiện diện', + presence_penaltyTip: + 'Độ lớn của sự phạt cho các token mới dựa trên việc chúng có xuất hiện trong văn bản cho đến nay hay không.\nTăng khả năng của mô hình để nói về các chủ đề mới.', + frequency_penalty: 'Phạt tần suất', + frequency_penaltyTip: + 'Độ lớn của sự phạt cho các token mới dựa trên tần suất hiện tại của chúng trong văn bản cho đến nay.\nGiảm khả năng của mô hình để lặp lại cùng một dòng văn bản.', + max_tokens: 'Max token', + max_tokensTip: + 'Sử dụng để giới hạn độ dài tối đa của câu trả lời, theo token. \nGiá trị lớn có thể giới hạn không gian còn lại cho từ khóa khởi đầu, nhật ký trò chuyện và Kiến thức. \nKhuyến nghị đặt giá trị dưới hai phần ba của gpt-4-1106-preview, gpt-4-vision-preview max token (đầu vào 128k đầu ra 4k)', + maxTokenSettingTip: 'Cài đặt max token của bạn quá cao, có thể hạn chế không gian cho từ khóa, truy vấn và dữ liệu. Xem xét đặt nó dưới 2/3.', + setToCurrentModelMaxTokenTip: 'Max token được cập nhật đến 80% token tối đa của mô hình hiện tại {{maxToken}}.', + stop_sequences: 'Chuỗi dừng', + stop_sequencesTip: 'Lên đến bốn chuỗi nơi API sẽ dừng việc tạo ra các token tiếp theo. Văn bản được trả về sẽ không chứa chuỗi dừng.', + stop_sequencesPlaceholder: 'Nhập chuỗi và nhấn Tab', + }, + tone: { + Creative: 'Sáng tạo', + Balanced: 'Cân bằng', + Precise: 'Chính xác', + Custom: 'Tùy chỉnh', + }, + addMoreModel: 'Điều chỉnh cài đặt để thêm mô hình', + }, + menus: { + status: 'beta', + explore: 'Khám phá', + apps: 'Studio', + plugins: 'Plugins', + pluginsTips: 'Tích hợp các plugin bên thứ ba hoặc tạo ra các AI-Plugin tương thích với ChatGPT.', + datasets: 'Kiến thức', + datasetsTips: 'SẮP RA MẮT: Nhập dữ liệu văn bản của bạn hoặc viết dữ liệu theo thời gian thực thông qua Webhook để cải thiện ngữ cảnh LLM.', + newApp: 'Ứng dụng mới', + newDataset: 'Tạo Kiến thức', + tools: 'Công cụ', + }, + userProfile: { + settings: 'Cài đặt', + workspace: 'Không gian làm việc', + createWorkspace: 'Tạo Không gian làm việc', + helpCenter: 'Trung tâm trợ giúp', + roadmapAndFeedback: 'Lộ trình & Phản hồi', + community: 'Cộng đồng', + about: 'Về chúng tôi', + logout: 'Đăng xuất', + }, + settings: { + accountGroup: 'ACCOUNT', + workplaceGroup: 'WORKSPACE', + account: 'Tài khoản của tôi', + members: 'Thành viên', + billing: 'Thanh toán', + integrations: 'Tích hợp', + language: 'Ngôn ngữ', + provider: 'Nhà cung cấp mô hình', + dataSource: 'Nguồn dữ liệu', + plugin: 'Plugins', + apiBasedExtension: 'Mở rộng dựa trên API', + }, + account: { + avatar: 'Ảnh đại diện', + name: 'Tên', + email: 'Email', + password: 'Mật khẩu', + passwordTip: 'Bạn có thể đặt một mật khẩu cố định nếu bạn không muốn sử dụng mã đăng nhập tạm thời', + setPassword: 'Đặt mật khẩu', + resetPassword: 'Đặt lại mật khẩu', + currentPassword: 'Mật khẩu hiện tại', + newPassword: 'Mật khẩu mới', + confirmPassword: 'Xác nhận mật khẩu', + notEqual: 'Hai mật khẩu không giống nhau.', + langGeniusAccount: 'Tài khoản Dify', + langGeniusAccountTip: 'Tài khoản Dify của bạn và dữ liệu người dùng liên quan.', + editName: 'Chỉnh sửa Tên', + showAppLength: 'Hiển thị {{length}} ứng dụng', + }, + members: { + team: 'Nhóm', + invite: 'Mời', + name: 'TÊN', + lastActive: 'HOẠT ĐỘNG GẦN ĐÂY', + role: 'VAI TRÒ', + pending: 'Đang chờ...', + owner: 'Chủ sở hữu', + admin: 'Quản trị viên', + adminTip: 'Có thể xây dựng ứng dụng và quản lý cài đặt nhóm', + normal: 'Bình thường', + normalTip: 'Chỉ có thể sử dụng ứng dụng, không thể xây dựng ứng dụng', + inviteTeamMember: 'Mời thành viên nhóm', + inviteTeamMemberTip: 'Sau khi đăng nhập, họ có thể truy cập trực tiếp vào dữ liệu nhóm của bạn.', + email: 'Email', + emailInvalid: 'Định dạng Email không hợp lệ', + emailPlaceholder: 'Vui lòng nhập email', + sendInvite: 'Gửi Lời mời', + invitedAsRole: 'Được mời với vai trò {{role}}', + invitationSent: 'Lời mời đã được gửi', + invitationSentTip: 'Lời mời đã được gửi, và họ có thể đăng nhập vào Dify để truy cập vào dữ liệu nhóm của bạn.', + invitationLink: 'Liên kết Lời mời', + failedinvitationEmails: 'Dưới đây là danh sách email không gửi được lời mời', + ok: 'OK', + removeFromTeam: 'Xóa khỏi nhóm', + removeFromTeamTip: 'Sẽ xóa quyền truy cập nhóm', + setAdmin: 'Đặt làm quản trị viên', + setMember: 'Đặt thành viên bình thường', + disinvite: 'Hủy lời mời', + deleteMember: 'Xóa thành viên', + you: '(Bạn)', + }, + integrations: { + connected: 'Đã kết nối', + google: 'Google', + googleAccount: 'Đăng nhập bằng tài khoản Google', + github: 'GitHub', + githubAccount: 'Đăng nhập bằng tài khoản GitHub', + connect: 'Kết nối', + }, + language: { + displayLanguage: 'Ngôn ngữ hiển thị', + timezone: 'Múi giờ', + }, + provider: { + apiKey: 'Khóa API', + enterYourKey: 'Nhập khóa API của bạn ở đây', + invalidKey: 'Khóa API OpenAI không hợp lệ', + validatedError: 'Xác minh thất bại: ', + validating: 'Đang xác minh khóa...', + saveFailed: 'Lưu khóa API thất bại', + apiKeyExceedBill: 'Khóa API này không có lượng truy vấn khả dụng, vui lòng đọc', + addKey: 'Thêm Khóa', + comingSoon: 'Sắp Ra Mắt', + editKey: 'Chỉnh sửa', + invalidApiKey: 'Khóa API không hợp lệ', + azure: { + apiBase: 'Cơ sở API', + apiBasePlaceholder: 'URL cơ sở API của điểm cuối Azure OpenAI của bạn.', + apiKey: 'Khóa API', + apiKeyPlaceholder: 'Nhập khóa API của bạn ở đây', + helpTip: 'Tìm hiểu Dịch vụ Azure OpenAI', + }, + openaiHosted: { + openaiHosted: 'OpenAI đang lưu trữ', + onTrial: 'TRIÊN DÙNG THỬ', + exhausted: 'HẾT QUOTA', + desc: 'Dịch vụ lưu trữ OpenAI được cung cấp bởi Dify cho phép bạn sử dụng các mô hình như GPT-3.5. Trước khi hết lượng truy vấn dùng thử, bạn cần thiết lập các nhà cung cấp mô hình khác.', + callTimes: 'Số lần gọi', + usedUp: 'Quota dùng thử đã hết. Thêm nhà cung cấp Mô hình của riêng bạn.', + useYourModel: 'Hiện đang sử dụng nhà cung cấp Mô hình của riêng bạn.', + close: 'Đóng', + }, + anthropicHosted: { + anthropicHosted: 'Anthropic Claude', + onTrial: 'TRIÊN DÙNG THỬ', + exhausted: 'HẾT QUOTA', + desc: 'Mô hình mạnh mẽ, vượt trội trong một loạt các nhiệm vụ từ trò chuyện phức tạp và tạo nội dung sáng tạo đến hướng dẫn chi tiết.', + callTimes: 'Số lần gọi', + usedUp: 'Quota dùng thử đã hết. Thêm nhà cung cấp Mô hình của riêng bạn.', + useYourModel: 'Hiện đang sử dụng nhà cung cấp Mô hình của riêng bạn.', + close: 'Đóng', + }, + anthropic: { + using: 'Khả năng nhúng đang sử dụng', + enableTip: 'Để kích hoạt mô hình Anthrop, bạn cần ràng buộc với Dịch vụ OpenAI hoặc Azure OpenAI trước.', + notEnabled: 'Chưa được kích hoạt', + keyFrom: 'Nhận khóa API của bạn từ Anthrop', + }, + encrypted: { + front: 'Khóa API của bạn sẽ được mã hóa và lưu trữ bằng', + back: ' công nghệ.', + }, + }, + modelProvider: { + notConfigured: 'Mô hình hệ thống vẫn chưa được cấu hình hoàn toàn và một số chức năng có thể không khả dụng.', + systemModelSettings: 'Cài đặt Mô hình Hệ thống', + systemModelSettingsLink: 'Tại sao cần thiết phải thiết lập mô hình hệ thống?', + selectModel: 'Chọn mô hình của bạn', + setupModelFirst: 'Vui lòng thiết lập mô hình của bạn trước', + systemReasoningModel: { + key: 'Mô hình lập luận hệ thống', + tip: 'Thiết lập mô hình suy luận mặc định sẽ được sử dụng để tạo ứng dụng, cũng như các tính năng như việc tạo tên cuộc trò chuyện và đề xuất câu hỏi tiếp theo cũng sẽ sử dụng mô hình suy luận mặc định.', + }, + embeddingModel: { + key: 'Mô hình nhúng', + tip: 'Thiết lập mô hình mặc định cho việc xử lý nhúng tài liệu của Kiến thức, cả hai phương tiện truy xuất và nhập của Kiến thức đều sử dụng mô hình nhúng này cho xử lý vector hóa. Chuyển đổi sẽ làm cho kích thước vector giữa Kiến thức được nhập và câu hỏi không nhất quán, dẫn đến việc truy xuất thất bại. Để tránh truy xuất thất bại, vui lòng không chuyển đổi mô hình này tùy ý.', + required: 'Mô hình nhúng là bắt buộc', + }, + speechToTextModel: { + key: 'Mô hình Chuyển đổi Văn bản thành Tiếng nói', + tip: 'Thiết lập mô hình mặc định cho đầu vào chuyển đổi tiếng nói thành văn bản trong cuộc trò chuyện.', + }, + ttsModel: { + key: 'Mô hình Văn bản thành Tiếng nói', + tip: 'Thiết lập mô hình mặc định cho đầu vào văn bản thành tiếng nói trong cuộc trò chuyện.', + }, + rerankModel: { + key: 'Mô hình Sắp xếp lại', + tip: 'Mô hình sắp xếp lại sẽ sắp xếp lại danh sách tài liệu ứng cử viên dựa trên sự phù hợp ngữ nghĩa với truy vấn của người dùng, cải thiện kết quả của việc xếp hạng ngữ nghĩa', + }, + quota: 'Hạn mức', + searchModel: 'Mô hình tìm kiếm', + noModelFound: 'Không tìm thấy mô hình cho {{model}}', + models: 'Mô hình', + showMoreModelProvider: 'Hiển thị thêm nhà cung cấp mô hình', + selector: { + tip: 'Mô hình này đã bị xóa. Vui lòng thêm một mô hình hoặc chọn mô hình khác.', + emptyTip: 'Không có mô hình khả dụng', + emptySetting: 'Vui lòng vào cài đặt để cấu hình', + rerankTip: 'Vui lòng thiết lập mô hình sắp xếp lại', + }, + card: { + quota: 'QUOTA', + onTrial: 'Thử nghiệm', + paid: 'Đã thanh toán', + quotaExhausted: 'Quota đã hết', + callTimes: 'Số lần gọi', + tokens: 'Tokens', + buyQuota: 'Mua Quota', + priorityUse: 'Ưu tiên sử dụng', + removeKey: 'Remove API Key', + tip: 'Ưu tiên sẽ được trao cho hạn ngạch đã thanh toán. Hạn ngạch dùng thử sẽ được sử dụng sau khi hết hạn ngạch trả phí.', + }, + item: { + deleteDesc: 'Các mô hình {{modelName}} đang được sử dụng như là các mô hình lập luận hệ thống. Một số chức năng sẽ không khả dụng sau khi loại bỏ. Vui lòng xác nhận.', + freeQuota: 'QUYỀN LỢI MIỄN PHÍ', + }, + addApiKey: 'Thêm khóa API của bạn', + invalidApiKey: 'Khóa API không hợp lệ', + encrypted: { + front: 'Khóa API CỦA BẠN sẽ được mã hóa và lưu trữ bằng', + back: ' công nghệ.', + }, + freeQuota: { + howToEarn: 'Cách kiếm', + }, + addMoreModelProvider: 'THÊM NHÀ CUNG CẤP MÔ HÌNH', + addModel: 'Thêm Mô hình', + modelsNum: '{{num}} Mô hình', + showModels: 'Hiện Mô hình', + showModelsNum: 'Hiện {{num}} Mô hình', + collapse: 'Thu gọn', + config: 'Cấu hình', + modelAndParameters: 'Mô hình và Tham số', + model: 'Mô hình', + featureSupported: '{{feature}} được hỗ trợ', + callTimes: 'Số lần gọi', + credits: 'Tín dụng Tin nhắn', + buyQuota: 'Mua Quyền lợi', + getFreeTokens: 'Nhận mã thông báo miễn phí', + priorityUsing: 'Ưu tiên sử dụng', + deprecated: 'Đã lỗi thời', + confirmDelete: 'Xác nhận xóa?', + quotaTip: 'Số lượng mã thông báo miễn phí còn lại', + loadPresets: 'Tải Cài đặt trước', + parameters: 'THAM SỐ', + }, + dataSource: { + add: 'Thêm nguồn dữ liệu', + connect: 'Kết nối', + notion: { + title: 'Notion', + description: 'Sử dụng Notion như một nguồn dữ liệu cho Kiến thức.', + connectedWorkspace: 'Không gian làm việc đã kết nối', + addWorkspace: 'Thêm không gian làm việc', + connected: 'Đã kết nối', + disconnected: 'Đã ngắt kết nối', + changeAuthorizedPages: 'Thay đổi trang được ủy quyền', + pagesAuthorized: 'Các trang được ủy quyền', + sync: 'Đồng bộ', + remove: 'Xóa', + selector: { + pageSelected: 'Các trang đã chọn', + searchPages: 'Tìm kiếm trang...', + noSearchResult: 'Không có kết quả tìm kiếm', + addPages: 'Thêm trang', + preview: 'Xem trước', + }, + }, + }, + plugin: { + serpapi: { + apiKey: 'Khóa API', + apiKeyPlaceholder: 'Nhập khóa API của bạn', + keyFrom: 'Nhận khóa SerpAPI của bạn từ Trang tài khoản SerpAPI', + }, + }, + apiBasedExtension: { + title: 'Các tiện ích API cung cấp quản lý API tập trung, giúp cấu hình dễ dàng sử dụng trên các ứng dụng của Dify.', + link: 'Tìm hiểu cách phát triển Phần mở rộng API của riêng bạn.', + linkUrl: 'https://docs.dify.ai/features/extension/api_based_extension', + add: 'Thêm Phần mở rộng API', + selector: { + title: 'Phần mở rộng API', + placeholder: 'Vui lòng chọn phần mở rộng API', + manage: 'Quản lý Phần mở rộng API', + }, + modal: { + title: 'Thêm Phần mở rộng API', + editTitle: 'Chỉnh sửa Phần mở rộng API', + name: { + title: 'Tên', + placeholder: 'Vui lòng nhập tên', + }, + apiEndpoint: { + title: 'Điểm cuối API', + placeholder: 'Vui lòng nhập điểm cuối API', + }, + apiKey: { + title: 'Khóa API', + placeholder: 'Vui lòng nhập khóa API', + lengthError: 'Độ dài khóa API không được nhỏ hơn 5 ký tự', + }, + }, + type: 'Loại', + }, + about: { + changeLog: 'Nhật ký thay đổi', + updateNow: 'Cập nhật ngay', + nowAvailable: 'Dify {{version}} hiện đã có sẵn.', + latestAvailable: 'Dify {{version}} là phiên bản mới nhất hiện có.', + }, + appMenus: { + overview: 'Tổng quan', + promptEng: 'Orchestrate', + apiAccess: 'Truy cập API', + logAndAnn: 'Nhật ký & Thông báo', + }, + environment: { + testing: 'TESTING', + development: 'DEVELOPMENT', + }, + appModes: { + completionApp: 'Ứng dụng Tạo văn bản', + chatApp: 'Ứng dụng Trò chuyện', + }, + datasetMenus: { + documents: 'Tài liệu', + hitTesting: 'Kiểm tra truy vấn', + settings: 'Cài đặt', + emptyTip: 'Kiến thức chưa được liên kết, vui lòng đi đến ứng dụng hoặc plug-in để hoàn thành liên kết.', + viewDoc: 'Xem tài liệu', + relatedApp: 'các ứng dụng liên kết', + }, + voiceInput: { + speaking: 'Hãy nói...', + converting: 'Chuyển đổi thành văn bản...', + notAllow: 'micro không được ủy quyền', + }, + modelName: { + 'gpt-3.5-turbo': 'GPT-3.5-Turbo', + 'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K', + 'gpt-4': 'GPT-4', + 'gpt-4-32k': 'GPT-4-32K', + 'text-davinci-003': 'Text-Davinci-003', + 'text-embedding-ada-002': 'Text-Embedding-Ada-002', + 'whisper-1': 'Whisper-1', + 'claude-instant-1': 'Claude-Instant', + 'claude-2': 'Claude-2', + }, + chat: { + renameConversation: 'Đổi tên Cuộc trò chuyện', + conversationName: 'Tên cuộc trò chuyện', + conversationNamePlaceholder: 'Vui lòng nhập tên cuộc trò chuyện', + conversationNameCanNotEmpty: 'Yêu cầu nhập tên cuộc trò chuyện', + citation: { + title: 'THAM KHẢO', + linkToDataset: 'Liên kết tới Kiến thức', + characters: 'Ký tự:', + hitCount: 'Số lượt truy xuất:', + vectorHash: 'Vector hash:', + hitScore: 'Điểm truy xuất:', + }, + }, + promptEditor: { + placeholder: 'Viết từ khóa của bạn ở đây, nhập \'{\' để chèn một biến, nhập \'/\' để chèn một khối nội dung nhắc nhở', + context: { + item: { + title: 'Bối cảnh', + desc: 'Chèn mẫu bối cảnh', + }, + modal: { + title: '{{num}} Kiến thức trong Bối cảnh', + add: 'Thêm Bối cảnh', + footer: 'Bạn có thể quản lý các bối cảnh trong phần Bối cảnh bên dưới.', + }, + }, + history: { + item: { + title: 'Lịch sử Cuộc trò chuyện', + desc: 'Chèn mẫu tin nhắn lịch sử', + }, + modal: { + title: 'VÍ DỤ', + user: 'Xin chào', + assistant: 'Xin chào! Tôi có thể giúp gì cho bạn hôm nay?', + edit: 'Chỉnh sửa Tên Vai trò Cuộc trò chuyện', + }, + }, + variable: { + item: { + title: 'Biến & Công cụ Bên ngoài', + desc: 'Chèn Biến & Công cụ Bên ngoài', + }, + modal: { + add: 'Biến mới', + addTool: 'Công cụ mới', + }, + }, + query: { + item: { + title: 'Truy vấn', + desc: 'Chèn mẫu truy vấn người dùng', + }, + }, + existed: 'Đã tồn tại trong tin nhắn', + }, + imageUploader: { + uploadFromComputer: 'Tải lên từ Máy tính', + uploadFromComputerReadError: 'Đọc ảnh thất bại, vui lòng thử lại.', + uploadFromComputerUploadError: 'Tải ảnh lên thất bại, vui lòng tải lên lại.', + uploadFromComputerLimit: 'Ảnh tải lên không được vượt quá {{size}} MB', + pasteImageLink: 'Dán liên kết ảnh', + pasteImageLinkInputPlaceholder: 'Dán liên kết ảnh ở đây', + pasteImageLinkInvalid: 'Liên kết ảnh không hợp lệ', + imageUpload: 'Tải ảnh lên', + }, +} + +export default translation diff --git a/web/i18n/vi-VN/custom.ts b/web/i18n/vi-VN/custom.ts new file mode 100644 index 0000000000..b36476b62a --- /dev/null +++ b/web/i18n/vi-VN/custom.ts @@ -0,0 +1,30 @@ +const translation = { + custom: 'Tùy chỉnh', + upgradeTip: { + prefix: 'Nâng cấp gói của bạn để', + suffix: 'tùy chỉnh thương hiệu của bạn.', + }, + webapp: { + title: 'Tùy chỉnh thương hiệu WebApp', + removeBrand: 'Xóa Được hỗ trợ bởi Dify', + changeLogo: 'Thay đổi Hình ảnh Thương hiệu Được hỗ trợ bởi', + changeLogoTip: 'Định dạng SVG hoặc PNG với kích thước tối thiểu là 40x40px', + }, + app: { + title: 'Tùy chỉnh thương hiệu tiêu đề ứng dụng', + changeLogoTip: 'Định dạng SVG hoặc PNG với kích thước tối thiểu là 80x80px', + }, + upload: 'Tải lên', + uploading: 'Đang tải lên', + uploadedFail: 'Tải ảnh lên thất bại, vui lòng tải lên lại.', + change: 'Thay đổi', + apply: 'Áp dụng', + restore: 'Khôi phục Mặc định', + customize: { + contactUs: ' liên hệ với chúng tôi ', + prefix: 'Để tùy chỉnh logo thương hiệu trong ứng dụng, vui lòng', + suffix: 'để nâng cấp lên phiên bản Doanh nghiệp.', + }, +} + +export default translation diff --git a/web/i18n/vi-VN/dataset-creation.ts b/web/i18n/vi-VN/dataset-creation.ts new file mode 100644 index 0000000000..b29cd17c0b --- /dev/null +++ b/web/i18n/vi-VN/dataset-creation.ts @@ -0,0 +1,130 @@ +const translation = { + steps: { + header: { + creation: 'Tạo Kiến thức', + update: 'Thêm dữ liệu', + }, + one: 'Chọn nguồn dữ liệu', + two: 'Tiền xử lý và làm sạch văn bản', + three: 'Thực hiện và hoàn thành', + }, + error: { + unavailable: 'Kiến thức này không khả dụng', + }, + stepOne: { + filePreview: 'Xem trước tệp', + pagePreview: 'Xem trước trang', + dataSourceType: { + file: 'Nhập từ tệp văn bản', + notion: 'Đồng bộ từ Notion', + web: 'Đồng bộ từ trang web', + }, + uploader: { + title: 'Tải lên tệp văn bản', + button: 'Kéo và thả tệp, hoặc', + browse: 'Duyệt', + tip: 'Hỗ trợ {{supportTypes}}. Tối đa {{size}}MB mỗi tệp.', + validation: { + typeError: 'Loại tệp không được hỗ trợ', + size: 'Tệp quá lớn. Tối đa là {{size}}MB', + count: 'Không hỗ trợ tải lên nhiều tệp', + filesNumber: 'Bạn đã đạt đến giới hạn tải lên lô của {{filesNumber}} tệp.', + }, + cancel: 'Hủy bỏ', + change: 'Thay đổi', + failed: 'Tải lên thất bại', + }, + notionSyncTitle: 'Notion chưa được kết nối', + notionSyncTip: 'Để đồng bộ với Notion, trước tiên cần thiết lập kết nối với Notion.', + connect: 'Đi đến kết nối', + button: 'tiếp theo', + emptyDatasetCreation: 'Tôi muốn tạo Kiến thức trống', + modal: { + title: 'Tạo Kiến thức trống', + tip: 'Một Kiến thức trống sẽ không chứa tài liệu nào, và bạn có thể tải lên tài liệu bất kỳ lúc nào.', + input: 'Tên Kiến thức', + placeholder: 'Vui lòng nhập', + nameNotEmpty: 'Tên không thể để trống', + nameLengthInvaild: 'Tên phải từ 1 đến 40 ký tự', + cancelButton: 'Hủy bỏ', + confirmButton: 'Tạo', + failed: 'Tạo thất bại', + }, + }, + stepTwo: { + segmentation: 'Cài đặt đoạn', + auto: 'Tự động', + autoDescription: 'Tự động thiết lập quy tắc đoạn và tiền xử lý. Người dùng không quen thuộc được khuyến nghị chọn điều này.', + custom: 'Tùy chỉnh', + customDescription: 'Tùy chỉnh quy tắc đoạn, độ dài đoạn và quy tắc tiền xử lý, v.v.', + separator: 'Bộ phận xác định đoạn', + separatorPlaceholder: 'Ví dụ, dòng mới (\\\\n) hoặc bộ phận phân cách đặc biệt (như "***")', + maxLength: 'Độ dài tối đa của đoạn', + overlap: 'Chồng lấn đoạn', + overlapTip: 'Thiết lập chồng lấn đoạn có thể duy trì sự liên quan ngữ nghĩa giữa chúng, tăng cường hiệu ứng truy xuất. Đề xuất thiết lập từ 10% đến 25% của kích thước đoạn tối đa.', + overlapCheck: 'Chồng lấn đoạn không nên lớn hơn độ dài tối đa của đoạn', + rules: 'Quy tắc tiền xử lý văn bản', + removeExtraSpaces: 'Thay thế khoảng trắng liên tục, dòng mới và tab', + removeUrlEmails: 'Xóa tất cả URL và địa chỉ email', + removeStopwords: 'Loại bỏ các từ dừng như "một", "một", "những"', + preview: 'Xác nhận & Xem trước', + reset: 'Đặt lại', + indexMode: 'Chế độ chỉ số', + qualified: 'Chất lượng cao', + recommend: 'Khuyến nghị', + qualifiedTip: 'Gọi giao diện nhúng hệ thống mặc định để xử lý để cung cấp độ chính xác cao hơn khi người dùng truy vấn.', + warning: 'Vui lòng thiết lập khóa API nhà cung cấp mô hình trước.', + click: 'Đi đến cài đặt', + economical: 'Tiết kiệm', + economicalTip: 'Sử dụng các động cơ vector ngoại tuyến, chỉ số từ khóa, v.v. để giảm chính xác mà không tốn token', + QATitle: 'Phân đoạn theo định dạng Câu hỏi & Trả lời', + QATip: 'Bật tùy chọn này sẽ tiêu tốn thêm token', + QALanguage: 'Phân đoạn bằng', + emstimateCost: 'Ước lượng', + emstimateSegment: 'Đoạn ước tính', + segmentCount: 'đoạn', + calculating: 'Đang tính toán...', + fileSource: 'Tiền xử lý tài liệu', + notionSource: 'Tiền xử lý trang', + other: 'và những ', + fileUnit: ' tệp', + notionUnit: ' trang', + previousStep: 'Bước trước', + nextStep: 'Lưu & Xử lý', + save: 'Lưu & Xử lý', + cancel: 'Hủy bỏ', + sideTipTitle: 'Tại sao phải phân đoạn và tiền xử lý?', + sideTipP1: 'Khi xử lý dữ liệu văn bản, phân đoạn và làm sạch là hai bước tiền xử lý quan trọng.', + sideTipP2: 'Phân đoạn chia nhỏ văn bản dài thành đoạn để mô hình hiểu được tốt hơn. Điều này cải thiện chất lượng và tính liên quan của kết quả mô hình.', + sideTipP3: 'Làm sạch loại bỏ các ký tự và định dạng không cần thiết, làm cho Kiến thức trở nên sạch sẽ và dễ dàng phân tích hơn.', + sideTipP4: 'Phân đoạn và làm sạch đúng cách cải thiện hiệu suất của mô hình, cung cấp kết quả chính xác và có giá trị hơn.', + previewTitle: 'Xem trước', + previewTitleButton: 'Xem trước', + previewButton: 'Chuyển sang dạng Câu hỏi & Trả lời', + previewSwitchTipStart: 'Xem trước đoạn hiện tại đang ở định dạng văn bản, chuyển sang xem trước dạng câu hỏi và trả lời sẽ', + previewSwitchTipEnd: ' tiêu tốn thêm token', + characters: 'ký tự', + indexSettedTip: 'Để thay đổi phương pháp chỉ số, vui lòng đi tới ', + retrivalSettedTip: 'Để thay đổi phương pháp chỉ số, vui lòng đi tới ', + datasetSettingLink: 'cài đặt Kiến thức.', + }, + stepThree: { + creationTitle: '🎉 Kiến thức đã được tạo', + creationContent: 'Chúng tôi đã tự động đặt tên cho Kiến thức, bạn có thể sửa đổi nó bất kỳ lúc nào', + label: 'Tên Kiến thức', + additionTitle: '🎉 Tài liệu đã được tải lên', + additionP1: 'Tài liệu đã được tải lên Kiến thức', + additionP2: ', bạn có thể tìm thấy nó trong danh sách tài liệu của Kiến thức.', + stop: 'Dừng xử lý', + resume: 'Tiếp tục xử lý', + navTo: 'Đi đến tài liệu', + sideTipTitle: 'Tiếp theo là gì', + sideTipContent: 'Sau khi tài liệu hoàn thành chỉ mục, Kiến thức có thể được tích hợp vào ứng dụng như một ngữ cảnh, bạn có thể tìm cài đặt ngữ cảnh trong trang chỉ đạo đoạn. Bạn cũng có thể tạo nó như một plugin chỉ mục ChatGPT độc lập để phát hành.', + modelTitle: 'Bạn có chắc chắn muốn dừng việc nhúng?', + modelContent: 'Nếu bạn cần tiếp tục xử lý sau này, bạn sẽ tiếp tục từ vị trí bạn đã dừng lại.', + modelButtonConfirm: 'Xác nhận', + modelButtonCancel: 'Hủy bỏ', + }, +} + +export default translation diff --git a/web/i18n/vi-VN/dataset-documents.ts b/web/i18n/vi-VN/dataset-documents.ts new file mode 100644 index 0000000000..3cf486a3c9 --- /dev/null +++ b/web/i18n/vi-VN/dataset-documents.ts @@ -0,0 +1,349 @@ +const translation = { + list: { + title: 'Tài liệu', + desc: 'Tất cả các tệp của Kiến thức được hiển thị ở đây, và toàn bộ Kiến thức có thể được liên kết với trích dẫn của Dify hoặc được lập chỉ mục thông qua plugin Chat.', + addFile: 'Thêm tệp', + addPages: 'Thêm Trang', + table: { + header: { + fileName: 'TÊN TỆP', + words: 'TỪ', + hitCount: 'SỐ LẦN TRUY VẤN', + uploadTime: 'THỜI GIAN TẢI LÊN', + status: 'TRẠNG THÁI', + action: 'HÀNH ĐỘNG', + }, + }, + action: { + uploadFile: 'Tải lên tệp mới', + settings: 'Cài đặt phân đoạn', + addButton: 'Thêm đoạn', + add: 'Thêm một đoạn', + batchAdd: 'Thêm hàng loạt', + archive: 'Lưu trữ', + unarchive: 'Khôi phục', + delete: 'Xóa', + enableWarning: 'Tệp được lưu trữ không thể được kích hoạt', + sync: 'Đồng bộ', + }, + index: { + enable: 'Kích hoạt', + disable: 'Vô hiệu hóa', + all: 'Tất cả', + enableTip: 'Tệp có thể được lập chỉ mục', + disableTip: 'Tệp không thể được lập chỉ mục', + }, + status: { + queuing: 'Đang chờ', + indexing: 'Đang lập chỉ mục', + paused: 'Tạm dừng', + error: 'Lỗi', + available: 'Có sẵn', + enabled: 'Đã kích hoạt', + disabled: 'Đã vô hiệu hóa', + archived: 'Đã lưu trữ', + }, + empty: { + title: 'Chưa có tài liệu', + upload: { + tip: 'Bạn có thể tải lên tệp, đồng bộ từ trang web, hoặc từ ứng dụng web như Notion, GitHub, v.v.', + }, + sync: { + tip: 'Dify sẽ định kỳ tải xuống tệp từ Notion của bạn và hoàn tất xử lý.', + }, + }, + delete: { + title: 'Bạn có chắc chắn muốn xóa?', + content: 'Nếu bạn cần tiếp tục xử lý sau này, bạn sẽ tiếp tục từ vị trí bạn đã dừng lại', + }, + batchModal: { + title: 'Thêm đoạn hàng loạt', + csvUploadTitle: 'Kéo và thả tệp CSV của bạn vào đây, hoặc ', + browse: 'duyệt', + tip: 'Tệp CSV phải tuân thủ cấu trúc sau:', + question: 'câu hỏi', + answer: 'trả lời', + contentTitle: 'nội dung đoạn', + content: 'nội dung', + template: 'Tải mẫu ở đây', + cancel: 'Hủy bỏ', + run: 'Chạy Hàng loạt', + runError: 'Chạy hàng loạt thất bại', + processing: 'Đang xử lý hàng loạt', + completed: 'Nhập đã hoàn thành', + error: 'Lỗi nhập', + ok: 'OK', + }, + }, + metadata: { + title: 'Siêu dữ liệu', + desc: 'Gắn nhãn siêu dữ liệu cho các tài liệu cho phép trí tuệ nhân tạo truy cập chúng một cách kịp thời và tiết lộ nguồn của các tài liệu tham chiếu cho người dùng.', + dateTimeFormat: 'D MMMM, YYYY hh:mm A', + docTypeSelectTitle: 'Vui lòng chọn loại tài liệu', + docTypeChangeTitle: 'Thay đổi loại tài liệu', + docTypeSelectWarning: + 'Nếu thay đổi loại tài liệu, các siêu dữ liệu hiện tại sẽ không được bảo toàn nữa', + firstMetaAction: 'Bắt đầu', + placeholder: { + add: 'Thêm ', + select: 'Chọn ', + }, + source: { + upload_file: 'Tải lên Tệp', + notion: 'Đồng bộ từ Notion', + github: 'Đồng bộ từ Github', + }, + type: { + book: 'Sách', + webPage: 'Trang Web', + paper: 'Bài báo', + socialMediaPost: 'Bài viết trên Mạng xã hội', + personalDocument: 'Tài liệu cá nhân', + businessDocument: 'Tài liệu doanh nghiệp', + IMChat: 'Trò chuyện qua tin nhắn', + wikipediaEntry: 'Bài viết Wikipedia', + notion: 'Đồng bộ từ Notion', + github: 'Đồng bộ từ Github', + technicalParameters: 'Tham số kỹ thuật', + }, + field: { + processRule: { + processDoc: 'Xử lý Tài liệu', + segmentRule: 'Quy tắc phân đoạn', + segmentLength: 'Chiều dài các đoạn', + processClean: 'Quy tắc làm sạch Văn bản', + }, + book: { + title: 'Tiêu đề', + language: 'Ngôn ngữ', + author: 'Tác giả', + publisher: 'Nhà xuất bản', + publicationDate: 'Ngày xuất bản', + ISBN: 'ISBN', + category: 'Danh mục', + }, + webPage: { + title: 'Tiêu đề', + url: 'URL', + language: 'Ngôn ngữ', + authorPublisher: 'Tác giả/Nhà xuất bản', + publishDate: 'Ngày xuất bản', + topicsKeywords: 'Chủ đề/Từ khóa', + description: 'Mô tả', + }, + paper: { + title: 'Tiêu đề', + language: 'Ngôn ngữ', + author: 'Tác giả', + publishDate: 'Ngày xuất bản', + journalConferenceName: 'Tên tạp chí/Hội nghị', + volumeIssuePage: 'Số/Trang', + DOI: 'DOI', + topicsKeywords: 'Chủ đề/Từ khóa', + abstract: 'Tóm tắt', + }, + socialMediaPost: { + platform: 'Nền tảng', + authorUsername: 'Tác giả/Tên người dùng', + publishDate: 'Ngày đăng', + postURL: 'URL Bài viết', + topicsTags: 'Chủ đề/Thẻ', + }, + personalDocument: { + title: 'Tiêu đề', + author: 'Tác giả', + creationDate: 'Ngày tạo', + lastModifiedDate: 'Ngày sửa đổi cuối cùng', + documentType: 'Loại tài liệu', + tagsCategory: 'Thẻ/Danh mục', + }, + businessDocument: { + title: 'Tiêu đề', + author: 'Tác giả', + creationDate: 'Ngày tạo', + lastModifiedDate: 'Ngày sửa đổi cuối cùng', + documentType: 'Loại tài liệu', + departmentTeam: 'Phòng ban/Nhóm', + }, + IMChat: { + chatPlatform: 'Nền tảng Trò chuyện', + chatPartiesGroupName: 'Đối tác Trò chuyện/Tên nhóm', + participants: 'Tham gia viên', + startDate: 'Ngày bắt đầu', + endDate: 'Ngày kết thúc', + topicsKeywords: 'Chủ đề/Từ khóa', + fileType: 'Loại tệp', + }, + wikipediaEntry: { + title: 'Tiêu đề', + language: 'Ngôn ngữ', + webpageURL: 'URL trang web', + editorContributor: 'Biên tập viên/Đóng góp viên', + lastEditDate: 'Ngày chỉnh sửa cuối cùng', + summaryIntroduction: 'Tóm tắt/Giới thiệu', + }, + notion: { + title: 'Tiêu đề', + language: 'Ngôn ngữ', + author: 'Tác giả', + createdTime: 'Thời gian tạo', + lastModifiedTime: 'Thời gian chỉnh sửa cuối cùng', + url: 'URL', + tag: 'Thẻ', + description: 'Mô tả', + }, + github: { + repoName: 'Tên kho lưu trữ', + repoDesc: 'Mô tả kho lưu trữ', + repoOwner: 'Chủ sở hữu kho lưu trữ', + fileName: 'Tên tệp', + filePath: 'Đường dẫn tệp', + programmingLang: 'Ngôn ngữ lập trình', + url: 'URL', + license: 'Giấy phép', + lastCommitTime: 'Thời gian commit cuối cùng', + lastCommitAuthor: 'Tác giả commit cuối cùng', + }, + originInfo: { + originalFilename: 'Tên tệp gốc', + originalFileSize: 'Kích thước tệp gốc', + uploadDate: 'Ngày tải lên', + lastUpdateDate: 'Ngày cập nhật cuối cùng', + source: 'Nguồn', + }, + technicalParameters: { + segmentSpecification: 'Đặc tả các đoạn', + segmentLength: 'Chiều dài các đoạn', + avgParagraphLength: 'Độ dài trung bình của đoạn', + paragraphs: 'Các đoạn', + hitCount: 'Số lần truy vấn', + embeddingTime: 'Thời gian nhúng', + embeddedSpend: 'Chi phí nhúng', + }, + }, + languageMap: { + zh: 'Tiếng Trung', + en: 'Tiếng Anh', + es: 'Tiếng Tây Ban Nha', + fr: 'Tiếng Pháp', + de: 'Tiếng Đức', + ja: 'Tiếng Nhật', + ko: 'Tiếng Hàn', + ru: 'Tiếng Nga', + ar: 'Tiếng Ả Rập', + pt: 'Tiếng Bồ Đào Nha', + it: 'Tiếng Ý', + nl: 'Tiếng Hà Lan', + pl: 'Tiếng Ba Lan', + sv: 'Tiếng Thụy Điển', + tr: 'Tiếng Thổ Nhĩ Kỳ', + he: 'Tiếng Do Thái', + hi: 'Tiếng Hindi', + da: 'Tiếng Đan Mạch', + fi: 'Tiếng Phần Lan', + no: 'Tiếng Na Uy', + hu: 'Tiếng Hungary', + el: 'Tiếng Hy Lạp', + cs: 'Tiếng Séc', + th: 'Tiếng Thái', + id: 'Tiếng Indonesia', + }, + categoryMap: { + book: { + fiction: 'Hư cấu', + biography: 'Tiểu sử', + history: 'Lịch sử', + science: 'Khoa học', + technology: 'Công nghệ', + education: 'Giáo dục', + philosophy: 'Triết học', + religion: 'Tôn giáo', + socialSciences: 'Khoa học xã hội', + art: 'Nghệ thuật', + travel: 'Du lịch', + health: 'Sức khỏe', + selfHelp: 'Tự giúp bản thân', + businessEconomics: 'Kinh doanh và kinh tế', + cooking: 'Nấu ăn', + childrenYoungAdults: 'Trẻ em và thanh thiếu niên', + comicsGraphicNovels: 'Truyện tranh và tiểu thuyết đồ họa', + poetry: 'Thơ', + drama: 'Kịch', + other: 'Khác', + }, + personalDoc: { + notes: 'Ghi chú', + blogDraft: 'Nháp Blog', + diary: 'Nhật ký', + researchReport: 'Báo cáo nghiên cứu', + bookExcerpt: 'Trích đoạn sách', + schedule: 'Lịch trình', + list: 'Danh sách', + projectOverview: 'Tổng quan dự án', + photoCollection: 'Bộ sưu tập ảnh', + creativeWriting: 'Viết sáng tạo', + codeSnippet: 'Đoạn mã', + designDraft: 'Bản dựng thiết kế', + personalResume: 'Sơ yếu lý lịch cá nhân', + other: 'Khác', + }, + businessDoc: { + meetingMinutes: 'Biên bản cuộc họp', + researchReport: 'Báo cáo nghiên cứu', + proposal: 'Đề xuất', + employeeHandbook: 'Sổ tay nhân viên', + trainingMaterials: 'Tài liệu đào tạo', + requirementsDocument: 'Tài liệu yêu cầu', + designDocument: 'Tài liệu thiết kế', + productSpecification: 'Thông số sản phẩm', + financialReport: 'Báo cáo tài chính', + marketAnalysis: 'Phân tích thị trường', + projectPlan: 'Kế hoạch dự án', + teamStructure: 'Cấu trúc nhóm', + policiesProcedures: 'Chính sách và quy trình', + contractsAgreements: 'Hợp đồng và thoả thuận', + emailCorrespondence: 'Thư tín', + other: 'Khác', + }, + }, + }, + embedding: { + processing: 'Đang nhúng...', + paused: 'Đã tạm dừng việc nhúng', + completed: 'Hoàn tất việc nhúng', + error: 'Lỗi khi nhúng', + docName: 'Đang xử lý văn bản', + mode: 'Quy tắc phân đoạn', + segmentLength: 'Chiều dài các đoạn', + textCleaning: 'Định nghĩa và làm sạch Văn bản', + segments: 'Đoạn', + highQuality: 'Chế độ chất lượng cao', + economy: 'Chế độ tiết kiệm', + estimate: 'Ước lượng tiêu thụ', + stop: 'Dừng xử lý', + resume: 'Tiếp tục xử lý', + automatic: 'Tự động', + custom: 'Tùy chỉnh', + previewTip: 'Xem trước đoạn sẽ có sẵn sau khi việc nhúng hoàn tất', + }, + segment: { + paragraphs: 'Đoạn', + keywords: 'Từ khóa', + addKeyWord: 'Thêm từ khóa', + keywordError: 'Độ dài tối đa của từ khóa là 20', + characters: 'ký tự', + hitCount: 'Số lần truy vấn', + vectorHash: 'Băm vector: ', + questionPlaceholder: 'thêm câu hỏi ở đây', + questionEmpty: 'Câu hỏi không thể trống', + answerPlaceholder: 'thêm câu trả lời ở đây', + answerEmpty: 'Câu trả lời không thể trống', + contentPlaceholder: 'thêm nội dung ở đây', + contentEmpty: 'Nội dung không thể trống', + newTextSegment: 'Đoạn văn mới', + newQaSegment: 'Đoạn câu hỏi & trả lời mới', + delete: 'Xóa đoạn này?', + }, +} + +export default translation diff --git a/web/i18n/vi-VN/dataset-hit-testing.ts b/web/i18n/vi-VN/dataset-hit-testing.ts new file mode 100644 index 0000000000..044e34ab5f --- /dev/null +++ b/web/i18n/vi-VN/dataset-hit-testing.ts @@ -0,0 +1,28 @@ +const translation = { + title: 'Kiểm Tra Truy Vấn', + desc: 'Kiểm tra hiệu ứng đánh trúng của Kiến thức dựa trên văn bản truy vấn đã cho.', + dateTimeFormat: 'MM/DD/YYYY hh:mm A', + recents: 'Gần đây', + table: { + header: { + source: 'Nguồn', + text: 'Văn bản', + time: 'Thời gian', + }, + }, + input: { + title: 'Văn bản nguồn', + placeholder: 'Vui lòng nhập một văn bản, một câu khẳng định ngắn được khuyến nghị.', + countWarning: 'Tối đa 200 ký tự.', + indexWarning: 'Chỉ có trong Kiến thức chất lượng cao.', + testing: 'Kiểm tra', + }, + hit: { + title: 'RETRIEVAL PARAGRAPHS', + emptyTip: 'Kết quả Kiểm Tra Truy Vấn sẽ hiển thị ở đây', + }, + noRecentTip: 'Không có kết quả truy vấn gần đây ở đây', + viewChart: 'Xem VECTOR CHART', +} + +export default translation diff --git a/web/i18n/vi-VN/dataset-settings.ts b/web/i18n/vi-VN/dataset-settings.ts new file mode 100644 index 0000000000..87cf320bfa --- /dev/null +++ b/web/i18n/vi-VN/dataset-settings.ts @@ -0,0 +1,33 @@ +const translation = { + title: 'Cài đặt Kiến thức', + desc: 'Ở đây, bạn có thể sửa đổi các thuộc tính và phương pháp làm việc của Kiến thức.', + form: { + name: 'Tên Kiến thức', + namePlaceholder: 'Vui lòng nhập tên Kiến thức', + nameError: 'Tên không thể trống', + desc: 'Mô tả Kiến thức', + descInfo: 'Vui lòng viết mô tả văn bản rõ ràng để chỉ rõ nội dung của Kiến thức. Mô tả này sẽ được sử dụng làm cơ sở cho việc kết hợp khi lựa chọn từ nhiều Kiến thức cho sự suy luận.', + descPlaceholder: 'Miêu tả những gì có trong Kiến thức này. Một mô tả chi tiết cho phép AI truy cập nội dung của Kiến thức một cách kịp thời. Nếu trống, Dify sẽ sử dụng chiến lược hit mặc định.', + descWrite: 'Tìm hiểu cách viết mô tả Kiến thức tốt.', + permissions: 'Quyền hạn', + permissionsOnlyMe: 'Chỉ mình tôi', + permissionsAllMember: 'Tất cả thành viên nhóm', + indexMethod: 'Phương pháp chỉ mục', + indexMethodHighQuality: 'Chất lượng cao', + indexMethodHighQualityTip: 'Gọi giao diện nhúng của OpenAI để xử lý để cung cấp độ chính xác cao hơn khi người dùng truy vấn.', + indexMethodEconomy: 'Tiết kiệm', + indexMethodEconomyTip: 'Sử dụng các công cụ nhúng vector ngoại tuyến, chỉ mục từ khóa, v.v. để giảm độ chính xác mà không cần chi tiêu token', + embeddingModel: 'Mô hình nhúng', + embeddingModelTip: 'Để thay đổi mô hình nhúng, vui lòng đi tới ', + embeddingModelTipLink: 'Cài đặt', + retrievalSetting: { + title: 'Cài đặt truy vấn', + learnMore: 'Tìm hiểu thêm', + description: ' về phương pháp truy vấn.', + longDescription: ' về phương pháp truy vấn, bạn có thể thay đổi điều này bất kỳ lúc nào trong cài đặt Kiến thức.', + }, + save: 'Lưu', + }, +} + +export default translation diff --git a/web/i18n/vi-VN/dataset.ts b/web/i18n/vi-VN/dataset.ts new file mode 100644 index 0000000000..90b46a6c2b --- /dev/null +++ b/web/i18n/vi-VN/dataset.ts @@ -0,0 +1,47 @@ +const translation = { + knowledge: 'Kiến thức', + documentCount: ' tài liệu', + wordCount: 'k từ', + appCount: ' ứng dụng liên kết', + createDataset: 'Tạo Kiến thức', + createDatasetIntro: 'Nhập dữ liệu văn bản của bạn hoặc viết dữ liệu theo thời gian thực qua Webhook để tăng cường ngữ cảnh LLM.', + deleteDatasetConfirmTitle: 'Xóa Kiến thức này?', + deleteDatasetConfirmContent: + 'Xóa Kiến thức là không thể đảo ngược. Người dùng sẽ không còn có khả năng truy cập Kiến thức của bạn nữa, và tất cả các cấu hình và nhật ký nhắc nhở sẽ bị xóa vĩnh viễn.', + datasetDeleted: 'Kiến thức đã bị xóa', + datasetDeleteFailed: 'Xóa Kiến thức không thành công', + didYouKnow: 'Bạn đã biết chưa?', + intro1: 'Kiến thức có thể được tích hợp vào ứng dụng Dify ', + intro2: 'như một ngữ cảnh', + intro3: ',', + intro4: 'hoặc nó ', + intro5: 'có thể được tạo', + intro6: ' dưới dạng một phần cắm chỉ mục ChatGPT độc lập để xuất bản', + unavailable: 'Không khả dụng', + unavailableTip: 'Mô hình nhúng không khả dụng, mô hình nhúng mặc định cần được cấu hình', + datasets: 'KIẾN THỨC', + datasetsApi: 'API', + retrieval: { + semantic_search: { + title: 'Tìm kiếm Vector', + description: 'Tạo các nhúng truy vấn và tìm kiếm phần văn bản giống nhất với biểu diễn vector của nó.', + }, + full_text_search: { + title: 'Tìm kiếm Toàn văn bản', + description: 'Chỉ mục tất cả các thuật ngữ trong tài liệu, cho phép người dùng tìm kiếm bất kỳ thuật ngữ nào và truy xuất phần văn bản liên quan chứa các thuật ngữ đó.', + }, + hybrid_search: { + title: 'Tìm kiếm Hybrid', + description: 'Thực hiện tìm kiếm toàn văn bản và tìm kiếm vector đồng thời, sắp xếp lại để chọn lựa phù hợp nhất với truy vấn của người dùng. Cấu hình của API mô hình Rerank là cần thiết.', + recommend: 'Gợi ý', + }, + invertedIndex: { + title: 'Chỉ mục Nghịch đảo', + description: 'Chỉ mục Nghịch đảo là một cấu trúc được sử dụng cho việc truy xuất hiệu quả. Tổ chức theo thuật ngữ, mỗi thuật ngữ trỏ đến tài liệu hoặc trang web chứa nó.', + }, + change: 'Thay đổi', + changeRetrievalMethod: 'Thay đổi phương pháp truy xuất', + }, +} + +export default translation diff --git a/web/i18n/vi-VN/explore.ts b/web/i18n/vi-VN/explore.ts new file mode 100644 index 0000000000..eb71385f9f --- /dev/null +++ b/web/i18n/vi-VN/explore.ts @@ -0,0 +1,41 @@ +const translation = { + title: 'Khám phá', + sidebar: { + discovery: 'Khám phá', + chat: 'Chat', + workspace: 'Kho lưu trữ', + action: { + pin: 'Ghim', + unpin: 'Bỏ ghim', + rename: 'Đổi tên', + delete: 'Xóa', + }, + delete: { + title: 'Xóa ứng dụng', + content: 'Bạn có chắc chắn muốn xóa ứng dụng này không?', + }, + }, + apps: { + title: 'Khám phá Ứng dụng bởi Dify', + description: 'Sử dụng ngay các ứng dụng mẫu này hoặc tùy chỉnh các ứng dụng của bạn dựa trên các mẫu.', + allCategories: 'Tất cả Danh mục', + }, + appCard: { + addToWorkspace: 'Thêm vào Kho lưu trữ', + customize: 'Tùy chỉnh', + }, + appCustomize: { + title: 'Tạo ứng dụng từ {{name}}', + subTitle: 'Biểu tượng và tên ứng dụng', + nameRequired: 'Tên ứng dụng là bắt buộc', + }, + category: { + Assistant: 'Trợ lý', + Writing: 'Viết', + Translate: 'Dịch', + Programming: 'Lập trình', + HR: 'Nhân sự', + }, +} + +export default translation diff --git a/web/i18n/vi-VN/layout.ts b/web/i18n/vi-VN/layout.ts new file mode 100644 index 0000000000..928649474b --- /dev/null +++ b/web/i18n/vi-VN/layout.ts @@ -0,0 +1,4 @@ +const translation = { +} + +export default translation diff --git a/web/i18n/vi-VN/login.ts b/web/i18n/vi-VN/login.ts new file mode 100644 index 0000000000..9f60027aa9 --- /dev/null +++ b/web/i18n/vi-VN/login.ts @@ -0,0 +1,59 @@ +const translation = { + pageTitle: 'Xin chào, hãy bắt đầu!👋', + welcome: 'Chào mừng bạn đến với Dify, vui lòng đăng nhập để tiếp tục.', + email: 'Địa chỉ Email', + emailPlaceholder: 'Email của bạn', + password: 'Mật khẩu', + passwordPlaceholder: 'Mật khẩu của bạn', + name: 'Tên người dùng', + namePlaceholder: 'Tên người dùng của bạn', + forget: 'Quên mật khẩu?', + signBtn: 'Đăng nhập', + installBtn: 'Cài đặt', + setAdminAccount: 'Thiết lập tài khoản quản trị', + setAdminAccountDesc: 'Quyền tối đa cho tài khoản quản trị, có thể được sử dụng để tạo ứng dụng và quản lý các nhà cung cấp LLM, v.v.', + createAndSignIn: 'Tạo và đăng nhập', + oneMoreStep: 'Một bước nữa', + createSample: 'Dựa trên thông tin này, chúng tôi sẽ tạo một ứng dụng mẫu cho bạn', + invitationCode: 'Mã mời', + invitationCodePlaceholder: 'Mã mời của bạn', + interfaceLanguage: 'Ngôn ngữ giao diện', + timezone: 'Múi giờ', + go: 'Đi đến Dify', + sendUsMail: 'Gửi email giới thiệu của bạn cho chúng tôi, và chúng tôi sẽ xử lý yêu cầu mời.', + acceptPP: 'Tôi đã đọc và chấp nhận chính sách bảo mật', + reset: 'Vui lòng chạy lệnh sau để đặt lại mật khẩu của bạn', + withGitHub: 'Tiếp tục với GitHub', + withGoogle: 'Tiếp tục với Google', + rightTitle: 'Mở khóa tiềm năng đầy đủ của LLM', + rightDesc: 'Dễ dàng xây dựng ứng dụng AI hấp dẫn mắt, có thể vận hành và cải thiện được.', + tos: 'Điều khoản dịch vụ', + pp: 'Chính sách bảo mật', + tosDesc: 'Bằng cách đăng ký, bạn đồng ý với', + donthave: 'Chưa có?', + invalidInvitationCode: 'Mã mời không hợp lệ', + accountAlreadyInited: 'Tài khoản đã được khởi tạo', + error: { + emailEmpty: 'Địa chỉ Email là bắt buộc', + emailInValid: 'Vui lòng nhập một địa chỉ email hợp lệ', + nameEmpty: 'Tên là bắt buộc', + passwordEmpty: 'Mật khẩu là bắt buộc', + passwordInvalid: 'Mật khẩu phải chứa chữ và số, và độ dài phải lớn hơn 8', + }, + license: { + tip: 'Trước khi bắt đầu Phiên bản Cộng đồng của Dify, hãy đọc', + link: 'Giấy phép mã nguồn mở trên GitHub', + }, + join: 'Tham gia', + joinTipStart: 'Mời bạn tham gia', + joinTipEnd: 'đội tại Dify', + invalid: 'Liên kết đã hết hạn', + explore: 'Khám phá Dify', + activatedTipStart: 'Bạn đã tham gia', + activatedTipEnd: 'đội', + activated: 'Đăng nhập ngay', + adminInitPassword: 'Mật khẩu khởi tạo quản trị viên', + validate: 'Xác thực', +} + +export default translation diff --git a/web/i18n/vi-VN/register.ts b/web/i18n/vi-VN/register.ts new file mode 100644 index 0000000000..928649474b --- /dev/null +++ b/web/i18n/vi-VN/register.ts @@ -0,0 +1,4 @@ +const translation = { +} + +export default translation diff --git a/web/i18n/vi-VN/share-app.ts b/web/i18n/vi-VN/share-app.ts new file mode 100644 index 0000000000..14fc638fb3 --- /dev/null +++ b/web/i18n/vi-VN/share-app.ts @@ -0,0 +1,74 @@ +const translation = { + common: { + welcome: 'Chào mừng đến với', + appUnavailable: 'Ứng dụng không khả dụng', + appUnkonwError: 'Ứng dụng không khả dụng', + }, + chat: { + newChat: 'Trò chuyện mới', + pinnedTitle: 'Đã ghim', + unpinnedTitle: 'Trò chuyện', + newChatDefaultName: 'Cuộc trò chuyện mới', + resetChat: 'Đặt lại cuộc trò chuyện', + powerBy: 'Được cung cấp bởi', + prompt: 'Lời nhắc', + privatePromptConfigTitle: 'Cài đặt cuộc trò chuyện', + publicPromptConfigTitle: 'Lời nhắc ban đầu', + configStatusDes: 'Trước khi bắt đầu, bạn có thể chỉnh sửa cài đặt cuộc trò chuyện', + configDisabled: + 'Cài đặt của phiên trước đã được sử dụng cho phiên này.', + startChat: 'Bắt đầu trò chuyện', + privacyPolicyLeft: + 'Vui lòng đọc ', + privacyPolicyMiddle: + 'chính sách bảo mật', + privacyPolicyRight: + ' được cung cấp bởi nhà phát triển ứng dụng.', + deleteConversation: { + title: 'Xóa cuộc trò chuyện', + content: 'Bạn có chắc muốn xóa cuộc trò chuyện này không?', + }, + tryToSolve: 'Thử giải quyết', + temporarySystemIssue: 'Xin lỗi, có sự cố tạm thời của hệ thống.', + }, + generation: { + tabs: { + create: 'Chạy Một lần', + batch: 'Chạy Theo Lô', + saved: 'Đã Lưu', + }, + savedNoData: { + title: 'Bạn chưa lưu kết quả nào!', + description: 'Bắt đầu tạo nội dung và tìm kết quả đã lưu của bạn ở đây.', + startCreateContent: 'Bắt đầu tạo nội dung', + }, + title: 'Hoàn Thiện AI', + queryTitle: 'Nội dung truy vấn', + completionResult: 'Kết quả hoàn thiện', + queryPlaceholder: 'Viết nội dung truy vấn của bạn...', + run: 'Thực thi', + copy: 'Sao chép', + resultTitle: 'Hoàn Thiện AI', + noData: 'AI sẽ đưa ra điều bạn muốn ở đây.', + csvUploadTitle: 'Kéo và thả tệp CSV của bạn vào đây, hoặc ', + browse: 'duyệt', + csvStructureTitle: 'Tệp CSV phải tuân thủ cấu trúc sau:', + downloadTemplate: 'Tải xuống mẫu tại đây', + field: 'Trường', + batchFailed: { + info: '{{num}} thực thi thất bại', + retry: 'Thử lại', + outputPlaceholder: 'Không có nội dung đầu ra', + }, + errorMsg: { + empty: 'Vui lòng nhập nội dung vào tệp đã tải lên.', + fileStructNotMatch: 'Tệp CSV tải lên không khớp cấu trúc.', + emptyLine: 'Hàng {{rowIndex}} trống', + invalidLine: 'Hàng {{rowIndex}}: {{varName}} không thể để trống', + moreThanMaxLengthLine: 'Hàng {{rowIndex}}: {{varName}} không thể chứa nhiều hơn {{maxLength}} ký tự', + atLeastOne: 'Vui lòng nhập ít nhất một hàng vào tệp đã tải lên.', + }, + }, +} + +export default translation diff --git a/web/i18n/vi-VN/tools.ts b/web/i18n/vi-VN/tools.ts new file mode 100644 index 0000000000..20266953ee --- /dev/null +++ b/web/i18n/vi-VN/tools.ts @@ -0,0 +1,115 @@ +const translation = { + title: 'Công cụ', + createCustomTool: 'Tạo Công cụ Tùy chỉnh', + type: { + all: 'Tất cả', + builtIn: 'Tích hợp sẵn', + custom: 'Tùy chỉnh', + }, + contribute: { + line1: 'Tôi quan tâm đến việc ', + line2: 'đóng góp công cụ cho Dify.', + viewGuide: 'Xem hướng dẫn', + }, + author: 'Bởi', + auth: { + unauthorized: 'Chưa xác thực', + authorized: 'Đã xác thực', + setup: 'Thiết lập xác thực để sử dụng', + setupModalTitle: 'Thiết lập Xác thực', + setupModalTitleDescription: 'Sau khi cấu hình thông tin đăng nhập, tất cả các thành viên trong không gian làm việc có thể sử dụng công cụ này khi triển khai ứng dụng.', + }, + includeToolNum: 'Bao gồm {{num}} công cụ', + addTool: 'Thêm Công cụ', + createTool: { + title: 'Tạo Công cụ Tùy chỉnh', + editAction: 'Cấu hình', + editTitle: 'Chỉnh sửa Công cụ Tùy chỉnh', + name: 'Tên', + toolNamePlaceHolder: 'Nhập tên công cụ', + schema: 'Schema', + schemaPlaceHolder: 'Nhập schema OpenAPI của bạn vào đây', + viewSchemaSpec: 'Xem Chi tiết OpenAPI-Swagger', + importFromUrl: 'Nhập từ URL', + importFromUrlPlaceHolder: 'https://...', + urlError: 'Vui lòng nhập URL hợp lệ', + examples: 'Ví dụ', + exampleOptions: { + json: 'Thời tiết (JSON)', + yaml: 'Pet Store (YAML)', + blankTemplate: 'Mẫu Trống', + }, + availableTools: { + title: 'Công cụ Hiện có', + name: 'Tên', + description: 'Mô tả', + method: 'Phương thức', + path: 'Đường dẫn', + action: 'Hành động', + test: 'Kiểm tra', + }, + authMethod: { + title: 'Phương thức Xác thực', + type: 'Loại xác thực', + keyTooltip: 'Khóa Tiêu đề HTTP, Bạn có thể để trống nếu không biết là gì hoặc đặt nó thành một giá trị tùy chỉnh', + types: { + none: 'Không', + api_key: 'Khóa API', + apiKeyPlaceholder: 'Tên tiêu đề HTTP cho Khóa API', + apiValuePlaceholder: 'Nhập Khóa API', + }, + key: 'Khóa', + value: 'Giá trị', + }, + authHeaderPrefix: { + title: 'Loại Xác thực', + types: { + basic: 'Cơ bản', + bearer: 'Bearer', + custom: 'Tùy chỉnh', + }, + }, + privacyPolicy: 'Chính sách bảo mật', + privacyPolicyPlaceholder: 'Vui lòng nhập chính sách bảo mật', + }, + test: { + title: 'Kiểm tra', + parametersValue: 'Tham số & Giá trị', + parameters: 'Tham số', + value: 'Giá trị', + testResult: 'Kết quả Kiểm tra', + testResultPlaceholder: 'Kết quả kiểm tra sẽ hiển thị ở đây', + }, + thought: { + using: 'Sử dụng', + used: 'Đã sử dụng', + requestTitle: 'Yêu cầu đến', + responseTitle: 'Phản hồi từ', + }, + setBuiltInTools: { + info: 'Thông tin', + setting: 'Cài đặt', + toolDescription: 'Mô tả Công cụ', + parameters: 'Tham số', + string: 'chuỗi', + number: 'số', + required: 'Bắt buộc', + infoAndSetting: 'Thông tin & Cài đặt', + }, + noCustomTool: { + title: 'Không có công cụ tùy chỉnh!', + content: 'Thêm và quản lý các công cụ tùy chỉnh của bạn ở đây để xây dựng ứng dụng AI.', + createTool: 'Tạo Công cụ', + }, + noSearchRes: { + title: 'Xin lỗi, không có kết quả!', + content: 'Chúng tôi không thể tìm thấy bất kỳ công cụ nào phù hợp với tìm kiếm của bạn.', + reset: 'Thiết lập lại Tìm kiếm', + }, + builtInPromptTitle: 'Lời nhắc', + toolRemoved: 'Công cụ đã được loại bỏ', + notAuthorized: 'Công cụ chưa được xác thực', + howToGet: 'Cách nhận', +} + +export default translation