Skip to content

Commit

Permalink
feat: added Ukrainian language support (#2473)
Browse files Browse the repository at this point in the history
  • Loading branch information
holyCowMp3 authored Feb 19, 2024
1 parent 4cf4756 commit 61e4bba
Show file tree
Hide file tree
Showing 23 changed files with 2,529 additions and 6 deletions.
145 changes: 141 additions & 4 deletions api/constants/languages.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@

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']
languages = ['en-US', 'zh-Hans', 'pt-BR', 'es-ES', 'fr-FR', 'de-DE', 'ja-JP', 'ko-KR', 'ru-RU', 'it-IT', 'uk-UA']

language_timezone_mapping = {
'en-US': 'America/New_York',
Expand All @@ -16,8 +15,10 @@
'ko-KR': 'Asia/Seoul',
'ru-RU': 'Europe/Moscow',
'it-IT': 'Europe/Rome',
'uk-UA': 'Europe/Kyiv',
}


def supported_language(lang):
if lang in languages:
return lang
Expand All @@ -26,6 +27,7 @@ def supported_language(lang):
.format(lang=lang))
raise ValueError(error)


user_input_form_template = {
"en-US": [
{
Expand Down Expand Up @@ -67,6 +69,16 @@ def supported_language(lang):
}
}
],
"ua-UK": [
{
"paragraph": {
"label": "Запит",
"variable": "default_input",
"required": False,
"default": ""
}
}
],
}

demo_model_templates = {
Expand Down Expand Up @@ -145,7 +157,7 @@ def supported_language(lang):
'Italian',
]
}
},{
}, {
"paragraph": {
"label": "Query",
"variable": "query",
Expand Down Expand Up @@ -272,7 +284,7 @@ def supported_language(lang):
"意大利语",
]
}
},{
}, {
"paragraph": {
"label": "文本内容",
"variable": "query",
Expand Down Expand Up @@ -323,5 +335,130 @@ def supported_language(lang):
)
}
],
'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,
},
},
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": ""
}
}
])
)
},
{
"name": "AI інтерв’юер фронтенду",
"icon": "",
"icon_background": "",
"description": "Симульований інтерв’юер фронтенду, який перевіряє рівень кваліфікації у розробці фронтенду через опитування.",
"mode": "chat",
"model_config": AppModelConfig(
provider="openai",
model_id="gpt-3.5-turbo",
configs={
"introduction": "Привіт, ласкаво просимо на наше співбесіду. Я інтерв'юер цієї технологічної компанії, і я перевірю ваші навички веб-розробки фронтенду. Далі я поставлю вам декілька технічних запитань. Будь ласка, відповідайте якомога ретельніше. ",
"prompt_template": "Ви будете грати роль інтерв'юера технологічної компанії, перевіряючи навички розробки фронтенду користувача та ставлячи 5-10 чітких технічних питань.\n\nЗверніть увагу:\n- Ставте лише одне запитання за раз.\n- Після того, як користувач відповість на запитання, ставте наступне запитання безпосередньо, не намагаючись виправити будь-які помилки, допущені кандидатом.\n- Якщо ви вважаєте, що користувач не відповів правильно на кілька питань поспіль, задайте менше запитань.\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="Привіт, ласкаво просимо на наше співбесіду. Я інтерв'юер цієї технологічної компанії, і я перевірю ваші навички веб-розробки фронтенду. Далі я поставлю вам декілька технічних запитань. Будь ласка, відповідайте якомога ретельніше. ",
suggested_questions=None,
pre_prompt="Ви будете грати роль інтерв'юера технологічної компанії, перевіряючи навички розробки фронтенду користувача та ставлячи 5-10 чітких технічних питань.\n\nЗверніть увагу:\n- Ставте лише одне запитання за раз.\n- Після того, як користувач відповість на запитання, ставте наступне запитання безпосередньо, не намагаючись виправити будь-які помилки, допущені кандидатом.\n- Якщо ви вважаєте, що користувач не відповів правильно на кілька питань поспіль, задайте менше запитань.\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
),
}
],

}
44 changes: 44 additions & 0 deletions web/i18n/i18next-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,64 +3,84 @@ import i18n from 'i18next'
import { initReactI18next } from 'react-i18next'
import commonEn from './lang/common.en'
import commonZh from './lang/common.zh'
import commonUk from './lang/common.uk' // Ukrainian import
import commonPt from './lang/common.pt' // Portuguese import
import loginEn from './lang/login.en'
import loginZh from './lang/login.zh'
import loginPt from './lang/login.pt' // Portuguese import
import loginUk from './lang/login.uk' // Ukrainian import
import registerEn from './lang/register.en'
import registerZh from './lang/register.zh'
import registerPt from './lang/register.pt' // Portuguese import
import registerUk from './lang/register.uk' // Ukrainian import
import layoutEn from './lang/layout.en'
import layoutZh from './lang/layout.zh'
import layoutPt from './lang/layout.pt' // Portuguese import
import layoutUk from './lang/layout.uk' // Ukrainian import
import appEn from './lang/app.en'
import appZh from './lang/app.zh'
import appPt from './lang/app.pt' // Portuguese import
import appUk from './lang/app.uk' // Ukrainian import
import appOverviewEn from './lang/app-overview.en'
import appOverviewZh from './lang/app-overview.zh'
import appOverviewPt from './lang/app-overview.pt' // Portuguese import
import appOverviewUk from './lang/app-overview.uk' // Ukrainian import
import appDebugEn from './lang/app-debug.en'
import appDebugZh from './lang/app-debug.zh'
import appDebugPt from './lang/app-debug.pt' // Portuguese import
import appDebugUk from './lang/app-debug.uk' // Ukrainian import
import appApiEn from './lang/app-api.en'
import appApiZh from './lang/app-api.zh'
import appApiPt from './lang/app-api.pt' // Portuguese import
import appApiUk from './lang/app-api.uk' // Ukrainian import
import appLogEn from './lang/app-log.en'
import appLogZh from './lang/app-log.zh'
import appLogPt from './lang/app-log.pt' // Portuguese import
import appLogUk from './lang/app-log.uk' // Ukrainian import
import appAnnotationEn from './lang/app-annotation.en'
import appAnnotationZh from './lang/app-annotation.zh'
import appAnnotationPt from './lang/app-annotation.pt' // Portuguese import
import appAnnotationUk from './lang/app-annotation.uk' // Ukrainian import
import shareEn from './lang/share-app.en'
import shareZh from './lang/share-app.zh'
import sharePt from './lang/share-app.pt' // Portuguese import
import shareUk from './lang/share-app.uk' // Ukrainian import
import datasetEn from './lang/dataset.en'
import datasetZh from './lang/dataset.zh'
import datasetPt from './lang/dataset.pt' // Portuguese import
import datasetUk from './lang/dataset.uk' // Ukrainian import
import datasetDocumentsEn from './lang/dataset-documents.en'
import datasetDocumentsZh from './lang/dataset-documents.zh'
import datasetDocumentsPt from './lang/dataset-documents.pt' // Portuguese import
import datasetDocumentsUk from './lang/dataset-documents.uk' // Ukrainian import
import datasetHitTestingEn from './lang/dataset-hit-testing.en'
import datasetHitTestingZh from './lang/dataset-hit-testing.zh'
import datasetHitTestingPt from './lang/dataset-hit-testing.pt' // Portuguese import
import datasetHitTestingUk from './lang/dataset-hit-testing.uk' // Ukrainian import
import datasetSettingsEn from './lang/dataset-settings.en'
import datasetSettingsZh from './lang/dataset-settings.zh'
import datasetSettingsPt from './lang/dataset-settings.pt' // Portuguese import
import datasetSettingsUk from './lang/dataset-settings.uk' // Ukrainian import
import datasetCreationEn from './lang/dataset-creation.en'
import datasetCreationZh from './lang/dataset-creation.zh'
import datasetCreationPt from './lang/dataset-creation.pt' // Portuguese import
import datasetCreationUk from './lang/dataset-creation.uk' // Ukrainian import
import exploreEn from './lang/explore.en'
import exploreZh from './lang/explore.zh'
import explorePt from './lang/explore.pt' // Portuguese import
import exploreUk from './lang/explore.uk' // Ukrainian import
import billingEn from './lang/billing.en'
import billingZh from './lang/billing.zh'
import billingPt from './lang/billing.pt' // Portuguese import
import billingUk from './lang/billing.uk' // Ukrainian import
import customEn from './lang/custom.en'
import customZh from './lang/custom.zh'
import customPt from './lang/custom.pt' // Portuguese import
import customUk from './lang/custom.uk' // Ukrainian import
import toolsEn from './lang/tools.en'
import toolsZh from './lang/tools.zh'
import toolsPt from './lang/tools.pt' // Portuguese import
import toolsUk from './lang/tools.uk' // Ukrainian import

const resources = {
'en-US': {
Expand Down Expand Up @@ -144,6 +164,30 @@ const resources = {
tools: toolsPt,
},
},
'uk-UA': {
translation: {
common: commonUk,
layout: layoutUk,
login: loginUk,
register: registerUk,
app: appUk,
appOverview: appOverviewUk,
appDebug: appDebugUk,
appApi: appApiUk,
appLog: appLogUk,
appAnnotation: appAnnotationUk,
share: shareUk,
dataset: datasetUk,
datasetDocuments: datasetDocumentsUk,
datasetHitTesting: datasetHitTestingUk,
datasetSettings: datasetSettingsUk,
datasetCreation: datasetCreationUk,
explore: exploreUk,
billing: billingUk,
custom: customUk,
tools: toolsUk,
},
},
}

i18n.use(initReactI18next)
Expand Down
87 changes: 87 additions & 0 deletions web/i18n/lang/app-annotation.uk.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
const translation = {
title: 'Анотації',
name: 'Відповідь на анотацію',
editBy: 'Відповідь відредагована {{author}}',
noData: {
title: 'Немає анотацій',
description: 'Ви можете редагувати анотації під час налагодження програми або імпортувати анотації гуртом тут для отримання високоякісної відповіді.',
},
table: {
header: {
question: 'запитання',
answer: 'відповідь',
createdAt: 'створено у',
hits: 'переглядів',
actions: 'дії',
addAnnotation: 'Додати анотацію',
bulkImport: 'Масовий імпорт',
bulkExport: 'Масовий експорт',
clearAll: 'Очистити всі анотації',
},
},
editModal: {
title: 'Редагувати відповідь на анотацію',
queryName: 'Запит користувача',
answerName: 'Бот-оповідач',
yourAnswer: 'Ваша відповідь',
answerPlaceholder: 'Введіть свою відповідь тут',
yourQuery: 'Ваш запит',
queryPlaceholder: 'Введіть свій запит тут',
removeThisCache: 'Видалити цю анотацію',
createdAt: 'Створено у',
},
addModal: {
title: 'Додати відповідь на анотацію',
queryName: 'Запитання',
answerName: 'Відповідь',
answerPlaceholder: 'Введіть відповідь тут',
queryPlaceholder: 'Введіть запит тут',
createNext: 'Додати ще одну анотовану відповідь',
},
batchModal: {
title: 'Масовий імпорт',
csvUploadTitle: 'Перетягніть файл CSV сюди або',
browse: 'огляд',
tip: 'Файл CSV повинен відповідати такій структурі:',
question: 'запитання',
answer: 'відповідь',
contentTitle: 'вміст частини',
content: 'вміст',
template: 'Завантажте шаблон тут',
cancel: 'Скасувати',
run: 'Запустити партію',
runError: 'Не вдалося запустити партію',
processing: 'У пакетній обробці',
completed: 'Імпорт завершено',
error: 'Помилка імпорту',
ok: 'ОК',
},
errorMessage: {
answerRequired: 'Відповідь обов’язкова',
queryRequired: 'Запитання обов’язкове',
},
viewModal: {
annotatedResponse: 'Відповідь на анотацію',
hitHistory: 'Історія переглядів',
hit: 'Перегляд',
hits: 'Переглядів',
noHitHistory: 'Історії переглядів немає',
},
hitHistoryTable: {
query: 'Запит',
match: 'Збіг',
response: 'Відповідь',
source: 'Джерело',
score: 'Бал',
time: 'Час',
},
initSetup: {
title: 'Початкова настройка відповіді на анотацію',
configTitle: 'Налаштування відповіді на анотацію',
confirmBtn: 'Зберегти та ввімкнути',
configConfirmBtn: 'Зберегти',
},
embeddingModelSwitchTip: 'Модель векторизації тексту анотації, перемикання моделей буде повторно вбудовано, що призведе до додаткових витрат.',
}

export default translation
Loading

0 comments on commit 61e4bba

Please sign in to comment.