feat: add Turkish language support (#13670)

### What problem does this PR solve?
RAGFlow had no Turkish language support. This PR adds Turkish (tr)
locale translations to the UI.

### Type of change
- [x] New Feature (non-breaking change which adds functionality)

### What problem does this PR solve?

Co-authored-by: Mustafa YILDIZ <mustafa.yildiz@cilek.com>
This commit is contained in:
Mustafa YILDIZ
2026-03-18 16:09:32 +03:00
committed by GitHub
parent bbd0cd80e4
commit e4d8cdaff3
21 changed files with 2747 additions and 0 deletions

View File

@ -74,6 +74,7 @@ LANGUAGE_TO_MINERU_MAP = {
'Greek': 'el',
'Hindi': 'devanagari',
'Bulgarian': 'cyrillic',
'Turkish': 'latin',
}

View File

@ -9,11 +9,13 @@ import arEG from 'antd/locale/ar_EG';
import deDE from 'antd/locale/de_DE';
import enUS from 'antd/locale/en_US';
import ru_RU from 'antd/locale/ru_RU';
import trTR from 'antd/locale/tr_TR';
import vi_VN from 'antd/locale/vi_VN';
import zhCN from 'antd/locale/zh_CN';
import zh_HK from 'antd/locale/zh_HK';
import dayjs from 'dayjs';
import 'dayjs/locale/ar';
import 'dayjs/locale/tr';
import 'dayjs/locale/zh-cn';
import advancedFormat from 'dayjs/plugin/advancedFormat';
import customParseFormat from 'dayjs/plugin/customParseFormat';
@ -57,6 +59,7 @@ const AntLanguageMap = {
'pt-BR': pt_BR,
de: deDE,
ar: arEG,
tr: trTR,
};
if (process.env.NODE_ENV === 'development') {

View File

@ -21,6 +21,7 @@ const Languages = [
'Korean',
'Vietnamese',
'Arabic',
'Turkish',
];
export const crossLanguageOptions = Languages.map((x) => ({

View File

@ -0,0 +1,154 @@
import type { Translation } from '../translation-keys.ts';
export const tr: Translation = {
collapse: 'Daralt',
expand: 'Genişlet',
fieldDescriptionPlaceholder: 'Bu alanın amacınııklayın',
fieldDelete: 'Alanı sil',
fieldDescription: 'Açıklama',
fieldDescriptionTooltip: 'Bu alanın ne temsil ettiğine dair bağlam ekleyin',
fieldNameLabel: 'Alan Adı',
fieldNamePlaceholder: 'örn. adSoyad, yaş, aktifMi',
fieldNameTooltip:
'Daha iyi okunabilirlik için camelCase kullanın (örn. adSoyad)',
fieldRequiredLabel: 'Zorunlu Alan',
fieldType: 'Alan Türü',
fieldTypeExample: 'Örnek:',
fieldTypeTooltipString: 'string: Metin',
fieldTypeTooltipNumber: 'number: Sayısal',
fieldTypeTooltipBoolean: 'boolean: Doğru/yanlış',
fieldTypeTooltipObject: 'object: İç içe JSON',
fieldTypeTooltipArray: 'array: Değer listeleri',
fieldAddNewButton: 'Alan Ekle',
fieldAddNewBadge: 'Şema Oluşturucu',
fieldAddNewCancel: 'İptal',
fieldAddNewConfirm: 'Alan Ekle',
fieldAddNewDescription: 'JSON şemanız için yeni bir alan oluşturun',
fieldAddNewLabel: 'Yeni Alan Ekle',
fieldTypeTextLabel: 'Metin',
fieldTypeTextDescription: 'Adlar, açıklamalar vb. metin değerleri için',
fieldTypeNumberLabel: 'Sayı',
fieldTypeNumberDescription: 'Ondalıklı veya tam sayılar için',
fieldTypeBooleanLabel: 'Evet/Hayır',
fieldTypeBooleanDescription: 'Doğru/yanlış değerleri için',
fieldTypeObjectLabel: 'Grup',
fieldTypeObjectDescription: 'İlgili alanları bir araya getirmek için',
fieldTypeArrayLabel: 'Liste',
fieldTypeArrayDescription: 'Öğe koleksiyonları için',
propertyDescriptionPlaceholder: 'Açıklama ekle...',
propertyDescriptionButton: 'Açıklama ekle...',
propertyRequired: 'Zorunlu',
propertyOptional: 'İsteğe bağlı',
propertyDelete: 'Alanı sil',
schemaEditorTitle: 'JSON Şema Düzenleyici',
schemaEditorToggleFullscreen: 'Tam ekranı aç/kapat',
schemaEditorEditModeVisual: 'Görsel',
schemaEditorEditModeJson: 'JSON',
arrayMinimumLabel: 'Minimum Öğe',
arrayMinimumPlaceholder: 'Minimum yok',
arrayMaximumLabel: 'Maksimum Öğe',
arrayMaximumPlaceholder: 'Maksimum yok',
arrayForceUniqueItemsLabel: 'Benzersiz öğeleri zorla',
arrayItemTypeLabel: 'Öğe Türü',
arrayValidationErrorMinMax: "'minItems' 'maxItems'ten büyük olamaz.",
arrayValidationErrorContainsMinMax:
"'minContains' 'maxContains'ten büyük olamaz.",
booleanAllowFalseLabel: 'Yanlış değere izin ver',
booleanAllowTrueLabel: 'Doğru değere izin ver',
booleanNeitherWarning: 'Uyarı: En az bir değere izin vermelisiniz.',
numberMinimumLabel: 'Minimum Değer',
numberMinimumPlaceholder: 'Minimum yok',
numberMaximumLabel: 'Maksimum Değer',
numberMaximumPlaceholder: 'Maksimum yok',
numberExclusiveMinimumLabel: 'Özel Minimum',
numberExclusiveMinimumPlaceholder: 'Özel minimum yok',
numberExclusiveMaximumLabel: 'Özel Maksimum',
numberExclusiveMaximumPlaceholder: 'Özel maksimum yok',
numberMultipleOfLabel: 'Katı',
numberMultipleOfPlaceholder: 'Herhangi',
numberAllowedValuesEnumLabel: 'İzin Verilen Değerler (enum)',
numberAllowedValuesEnumNone: 'Kısıtlı değer ayarlanmadı',
numberAllowedValuesEnumAddLabel: 'Ekle',
numberAllowedValuesEnumAddPlaceholder: 'İzin verilen değer ekle...',
numberValidationErrorMinMax:
'Minimum ve maksimum değerler tutarlı olmalıdır.',
numberValidationErrorBothExclusiveAndInclusiveMin:
"'exclusiveMinimum' ve 'minimum' aynı anda ayarlanamaz.",
numberValidationErrorBothExclusiveAndInclusiveMax:
"'exclusiveMaximum' ve 'maximum' aynı anda ayarlanamaz.",
numberValidationErrorEnumOutOfRange:
'Enum değerleri tanımlı aralık içinde olmalıdır.',
objectPropertiesNone: 'Tanımlı özellik yok',
objectValidationErrorMinMax:
"'minProperties' 'maxProperties'ten büyük olamaz.",
stringMinimumLengthLabel: 'Minimum Uzunluk',
stringMinimumLengthPlaceholder: 'Minimum yok',
stringMaximumLengthLabel: 'Maksimum Uzunluk',
stringMaximumLengthPlaceholder: 'Maksimum yok',
stringPatternLabel: 'Desen (regex)',
stringPatternPlaceholder: '^[a-zA-Z]+$',
stringFormatLabel: 'Format',
stringFormatNone: 'Yok',
stringFormatDateTime: 'Tarih-Saat',
stringFormatDate: 'Tarih',
stringFormatTime: 'Saat',
stringFormatEmail: 'E-posta',
stringFormatUri: 'URI',
stringFormatUuid: 'UUID',
stringFormatHostname: 'Ana Bilgisayar Adı',
stringFormatIpv4: 'IPv4 Adresi',
stringFormatIpv6: 'IPv6 Adresi',
stringAllowedValuesEnumLabel: 'İzin Verilen Değerler (enum)',
stringAllowedValuesEnumNone: 'Kısıtlı değer ayarlanmadı',
stringAllowedValuesEnumAddPlaceholder: 'İzin verilen değer ekle...',
stringValidationErrorLengthRange:
"'Minimum Uzunluk' 'Maksimum Uzunluk'tan büyük olamaz.",
schemaTypeArray: 'Liste',
schemaTypeBoolean: 'Evet/Hayır',
schemaTypeNumber: 'Sayı',
schemaTypeObject: 'Nesne',
schemaTypeString: 'Metin',
schemaTypeNull: 'Boş',
inferrerTitle: 'JSON Şeması Çıkar',
inferrerDescription:
'Şema oluşturmak için JSON belgenizi aşağıya yapıştırın.',
inferrerCancel: 'İptal',
inferrerGenerate: 'Şema Oluştur',
inferrerErrorInvalidJson:
'Geçersiz JSON formatı. Lütfen girdinizi kontrol edin.',
validatorTitle: 'JSON Doğrula',
validatorDescription:
'JSON belgenizi geçerli şemaya göre doğrulamak için yapıştırın. Doğrulama siz yazarken otomatik olarak gerçekleşir.',
validatorCurrentSchema: 'Geçerli Şema:',
validatorContent: "JSON'unuz:",
validatorValid: 'JSON şemaya göre geçerli!',
validatorErrorInvalidSyntax: 'Geçersiz JSON sözdizimi',
validatorErrorSchemaValidation: 'Şema doğrulama hatası',
validatorErrorCount: '{count} doğrulama hatası tespit edildi',
validatorErrorPathRoot: 'Kök',
validatorErrorLocationLineAndColumn: 'Satır {line}, Sütun {column}',
validatorErrorLocationLineOnly: 'Satır {line}',
visualizerDownloadTitle: 'Şemayı İndir',
visualizerDownloadFileName: 'schema.json',
visualizerSource: 'JSON Şema Kaynağı',
visualEditorNoFieldsHint1: 'Henüz alan tanımlanmadı',
visualEditorNoFieldsHint2: 'Başlamak için ilk alanınızı ekleyin',
typeValidationErrorNegativeLength: 'Uzunluk değerleri negatif olamaz.',
typeValidationErrorIntValue: 'Değer bir tam sayı olmalıdır.',
typeValidationErrorPositive: 'Değer pozitif olmalıdır.',
};

View File

@ -57,6 +57,7 @@ export const LanguageList = [
'Italian',
'Bulgarian',
'Arabic',
'Turkish',
];
export const LanguageMap = {
English: 'English',
@ -74,6 +75,7 @@ export const LanguageMap = {
Italian: 'Italiano',
Bulgarian: 'Български',
Arabic: 'العربية',
Turkish: 'Türkçe',
};
export enum LanguageAbbreviation {
@ -91,6 +93,7 @@ export enum LanguageAbbreviation {
It = 'it',
Bg = 'bg',
Ar = 'ar',
Tr = 'tr',
}
export const LanguageAbbreviationMap = {
@ -108,6 +111,7 @@ export const LanguageAbbreviationMap = {
[LanguageAbbreviation.It]: 'Italiano',
[LanguageAbbreviation.Bg]: 'Български',
[LanguageAbbreviation.Ar]: 'العربية',
[LanguageAbbreviation.Tr]: 'Türkçe',
};
export const LanguageTranslationMap = {
@ -136,6 +140,7 @@ export const LanguageTranslationMap = {
Ukrainian: 'uk',
Bulgarian: 'bg',
Arabic: 'ar',
Turkish: 'tr',
};
export enum FileMimeType {

View File

@ -2297,6 +2297,7 @@ export default {
russian: 'الروسية',
bulgarian: 'البلغارية',
arabic: 'العربية',
turkish: 'التركية',
},
pagination: {
total: 'الإجمالي {{total}}',

View File

@ -2382,6 +2382,7 @@ Important structured information may include: names, dates, locations, events, k
russian: 'Руски',
bulgarian: 'Български',
arabic: 'Арабски',
turkish: 'Турски',
},
pagination: {
total: 'Общо {{total}}',

View File

@ -22,6 +22,7 @@ const languageImports: Record<string, () => Promise<{ default: any }>> = {
[LanguageAbbreviation.It]: () => import('./it'),
[LanguageAbbreviation.Bg]: () => import('./bg'),
[LanguageAbbreviation.Ar]: () => import('./ar'),
[LanguageAbbreviation.Tr]: () => import('./tr'),
};
const supportedLanguageCodes: Intl.UnicodeBCP47LocaleIdentifier[] =

View File

@ -2441,6 +2441,7 @@ Wichtige strukturierte Informationen können sein: Namen, Daten, Orte, Ereigniss
russian: 'Russisch',
bulgarian: 'Bulgarisch',
arabic: 'Arabisch',
turkish: 'Türkisch',
},
pagination: {
total: 'Gesamt {{total}}',

View File

@ -37,6 +37,7 @@ export default {
italian: 'Italian',
bulgarian: 'Bulgarian',
arabic: 'Arabic',
turkish: 'Turkish',
language: 'Language',
languageMessage: 'Please input your language!',
languagePlaceholder: 'select your language',
@ -2500,6 +2501,7 @@ Important structured information may include: names, dates, locations, events, k
russian: 'Russian',
bulgarian: 'Bulgarian',
arabic: 'Arabic',
turkish: 'Turkish',
},
pagination: {
total: 'Total {{total}}',

View File

@ -943,6 +943,7 @@ export default {
russian: 'Ruso',
bulgarian: 'Búlgaro',
arabic: 'Árabe',
turkish: 'Turco',
},
},
};

View File

@ -484,6 +484,7 @@ export default {
russian: 'Russe',
bulgarian: 'Bulgare',
arabic: 'Arabe',
turkish: 'Turc',
},
setting: {
profile: 'Profil',

View File

@ -1145,6 +1145,7 @@ export default {
russian: 'Rusia',
bulgarian: 'Bulgaria',
arabic: 'Arab',
turkish: 'Turki',
},
},
};

View File

@ -1200,6 +1200,7 @@ Quanto sopra è il contenuto che devi riassumere.`,
russian: 'Russo',
bulgarian: 'Bulgaro',
arabic: 'Arabo',
turkish: 'Turco',
},
pagination: {
total: 'Totale {{total}}',

View File

@ -1207,6 +1207,7 @@ export default {
russian: 'ロシア語',
bulgarian: 'ブルガリア語',
arabic: 'アラビア語',
turkish: 'トルコ語',
},
},
};

View File

@ -1207,6 +1207,7 @@ export default {
russian: 'Russo',
bulgarian: 'Búlgaro',
arabic: 'Árabe',
turkish: 'Turco',
},
},
};

View File

@ -2046,6 +2046,7 @@ export default {
russian: 'Русский',
bulgarian: 'Болгарский',
arabic: 'Арабский',
turkish: 'Турецкий',
},
pagination: {
total: 'Всего {{total}}',

2567
web/src/locales/tr.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1255,6 +1255,7 @@ export default {
russian: 'Tiếng Nga',
bulgarian: 'Tiếng Bulgaria',
arabic: 'Tiếng Ả Rập',
turkish: 'Tiếng Thổ Nhĩ Kỳ',
},
},
};

View File

@ -1287,6 +1287,7 @@ export default {
russian: '俄語',
bulgarian: '保加利亞語',
arabic: '阿拉伯語',
turkish: '土耳其語',
},
modal: {
okText: '確認',

View File

@ -2167,6 +2167,7 @@ Tokenizer 会根据所选方式将内容存储为对应的数据结构。`,
vietnamese: '越南语',
bulgarian: '保加利亚语',
arabic: '阿拉伯语',
turkish: '土耳其语',
},
pagination: {
total: '总共 {{total}} 条',