i18n: 新增自动i18n脚本。新增阿拉伯文,希腊文,西班牙文,法文,葡萄牙文翻译 (#3792)

* added auto i18n script. added arab, greek, spanish, france, portuguese translation

* remove arabian
This commit is contained in:
z-zeechung 2025-03-22 22:20:09 +08:00 committed by GitHub
parent d56774fd59
commit 13747a585a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 4999 additions and 39 deletions

122
scripts/update-i18n.ts Normal file
View File

@ -0,0 +1,122 @@
/**
* OCOOL_API_KEY=sk-abcxxxxxxxxxxxxxxxxxxxxxxx123 ts-node scripts/update-i18n.ts
*/
// OCOOL API KEY
const OCOOL_API_KEY = process.env.OCOOL_API_KEY;
const INDEX = [
// 语言的名称 代码 用来翻译的模型
{name: "France", code: "fr-fr", model: "qwen2.5-32b-instruct"},
{name: "Spanish", code: "es-es", model: "qwen2.5-32b-instruct"},
{name: "Portuguese", code: "pt-pt", model: "qwen2.5-72b-instruct"},
{name: "Greek", code: "el-gr", model: "qwen-turbo" },
]
const fs = require("fs");
import OpenAI from "openai";
const zh = JSON.parse(fs.readFileSync("src/renderer/src/i18n/locales/zh-cn.json", 'utf8')) as object
const openai = new OpenAI({
apiKey: OCOOL_API_KEY,
baseURL: "https://one.ocoolai.com/v1"
});
// 递归遍历翻译
async function translate(zh:object, obj:object, target: string, model:string, updateFile){
const texts: {[key:string]:string} = {}
for(let e in zh){
if(typeof zh[e]=="object"){ // 遍历下一层
if(!obj[e] || typeof obj[e]!="object") obj[e] = {}
await translate(zh[e], obj[e], target, model, updateFile)
}else{
// 加入到本层待翻译列表
if(!obj[e] || typeof obj[e]!="string"){
texts[e] = zh[e]
}
}
}
if(Object.keys(texts).length>0){
const completion = await openai.chat.completions.create({
model: model,
response_format: {type:"json_object"},
messages: [
{role:"user", content:`
You are a robot specifically designed for translation tasks. As a model that has been extensively fine-tuned on Russian language corpora, you are proficient in using the Russian language.
Now, please output the translation based on the input content. The input will include both Chinese and English key values, and you should output the corresponding key values in the Russian language.
When translating, ensure that no key value is omitted, and maintain the accuracy and fluency of the translation. Pay attention to the capitalization rules in the output to match the source text, and especially pay attention to whether to capitalize the first letter of each word except for prepositions. For strings containing \`{{value}}\`, ensure that the format is not disrupted.
Output in JSON.
######################################################
INPUT
######################################################
${JSON.stringify({
"confirm": "确定要备份数据吗?",
"select_model": "选择模型",
"title": "文件",
"deeply_thought": "已深度思考(用时 {{secounds}} 秒)",
})}
######################################################
MAKE SURE TO OUTPUT IN Russian. DO NOT OUTPUT IN UNSPECIFIED LANGUAGE.
######################################################
`},
{role:"assistant", content:JSON.stringify({
"confirm": "Подтвердите резервное копирование данных?",
"select_model": "Выберите Модель",
"title": "Файл",
"deeply_thought": "Глубоко продумано (заняло {{seconds}} секунд)"
})},
{role:"user", content:`
You are a robot specifically designed for translation tasks. As a model that has been extensively fine-tuned on ${target} language corpora, you are proficient in using the ${target} language.
Now, please output the translation based on the input content. The input will include both Chinese and English key values, and you should output the corresponding key values in the ${target} language.
When translating, ensure that no key value is omitted, and maintain the accuracy and fluency of the translation. Pay attention to the capitalization rules in the output to match the source text, and especially pay attention to whether to capitalize the first letter of each word except for prepositions. For strings containing \`{{value}}\`, ensure that the format is not disrupted.
Output in JSON.
######################################################
INPUT
######################################################
${JSON.stringify(texts)}
######################################################
MAKE SURE TO OUTPUT IN ${target}. DO NOT OUTPUT IN UNSPECIFIED LANGUAGE.
######################################################
`}
]
})
// 添加翻译后的键值,并打印错译漏译内容
try{
const result = JSON.parse(completion.choices[0].message.content!)
for(let e in texts){
if(result[e] && typeof result[e] === 'string'){
obj[e] = result[e]
}else{
console.log("[warning]", `missing value "${e}" in ${target} translation`)
}
}
}catch(e){
console.log("[error]", e)
for(let e in texts){
console.log("[warning]", `missing value "${e}" in ${target} translation`)
}
}
}
// 删除多余的键值
for(let e in obj){
if(!zh[e]){
delete obj[e]
}
}
// 更新文件
updateFile()
}
(async ()=>{
for(let {name, code, model} of INDEX){
const obj = fs.existsSync(`src/renderer/src/i18n/locales/${code}.json`)
? JSON.parse(fs.readFileSync(`src/renderer/src/i18n/locales/${code}.json`, 'utf8'))
: {}
await translate(zh, obj, name, model, ()=>{
fs.writeFileSync(`src/renderer/src/i18n/locales/${code}.json`, JSON.stringify(obj, null, 4), 'utf8')
})
}
})()

View File

@ -1,18 +1,25 @@
import i18n from 'i18next' import i18n from 'i18next'
import { initReactI18next } from 'react-i18next' import { initReactI18next } from 'react-i18next'
import elGR from './locales/el-gr.json'
import enUS from './locales/en-us.json' import enUS from './locales/en-us.json'
import esES from './locales/es-es.json'
import frFR from './locales/fr-fr.json'
import jaJP from './locales/ja-jp.json' import jaJP from './locales/ja-jp.json'
import ptPT from './locales/pt-pt.json'
import ruRU from './locales/ru-ru.json' import ruRU from './locales/ru-ru.json'
import zhCN from './locales/zh-cn.json' import zhCN from './locales/zh-cn.json'
import zhTW from './locales/zh-tw.json' import zhTW from './locales/zh-tw.json'
const resources = { const resources = {
'el-GR': elGR,
'en-US': enUS, 'en-US': enUS,
'es-ES': esES,
'fr-FR': frFR,
'ja-JP': jaJP,
'pt-PT': ptPT,
'ru-RU': ruRU,
'zh-CN': zhCN, 'zh-CN': zhCN,
'zh-TW': zhTW, 'zh-TW': zhTW,
'ja-JP': jaJP,
'ru-RU': ruRU
} }
export const getLanguage = () => { export const getLanguage = () => {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,250 +1,390 @@
export type GroupTranslations = { export type GroupTranslations = {
[key: string]: { [key: string]: {
'el-GR': string
'en-US': string 'en-US': string
'es-ES': string
'fr-FR': string
'zh-CN': string 'zh-CN': string
'zh-TW': string 'zh-TW': string
'ru-RU': string 'ru-RU': string
'ja-JP': string 'ja-JP': string
'pt-PT': string
} }
} }
export const groupTranslations: GroupTranslations = { export const groupTranslations: GroupTranslations = {
: { : {
'el-GR': 'Τα δικά μου',
'en-US': 'My Agents', 'en-US': 'My Agents',
'es-ES': 'Mis agentes',
'fr-FR': 'Mes agents',
'zh-CN': '我的', 'zh-CN': '我的',
'zh-TW': '我的', 'zh-TW': '我的',
'ru-RU': 'Мои агенты', 'ru-RU': 'Мои агенты',
'ja-JP': '私のエージェント' 'ja-JP': '私のエージェント',
'pt-PT': 'Meus Agentes'
}, },
: { : {
'el-GR': 'Επαγγελμα',
'en-US': 'Career', 'en-US': 'Career',
'es-ES': 'Profesional',
'fr-FR': 'Professionnel',
'zh-CN': '职业', 'zh-CN': '职业',
'zh-TW': '職業', 'zh-TW': '職業',
'ru-RU': 'Карьера', 'ru-RU': 'Карьера',
'ja-JP': 'キャリア' 'ja-JP': 'キャリア',
'pt-PT': 'Profissional'
}, },
: { : {
'el-GR': 'Εμπορικός',
'en-US': 'Business', 'en-US': 'Business',
'es-ES': 'Negocio',
'fr-FR': 'Commercial',
'zh-CN': '商业', 'zh-CN': '商业',
'zh-TW': '商業', 'zh-TW': '商業',
'ru-RU': 'Бизнес', 'ru-RU': 'Бизнес',
'ja-JP': 'ビジネス' 'ja-JP': 'ビジネス',
'pt-PT': 'Negócio'
}, },
: { : {
'el-GR': 'Εργαλεία',
'en-US': 'Tools', 'en-US': 'Tools',
'es-ES': 'Herramientas',
'fr-FR': 'Outils',
'zh-CN': '工具', 'zh-CN': '工具',
'zh-TW': '工具', 'zh-TW': '工具',
'ru-RU': 'Инструменты', 'ru-RU': 'Инструменты',
'ja-JP': 'ツール' 'ja-JP': 'ツール',
'pt-PT': 'Ferramentas'
}, },
: { : {
'el-GR': 'Γλώσσα',
'en-US': 'Language', 'en-US': 'Language',
'es-ES': 'Idioma',
'fr-FR': 'Langue',
'zh-CN': '语言', 'zh-CN': '语言',
'zh-TW': '語言', 'zh-TW': '語言',
'ru-RU': 'Язык', 'ru-RU': 'Язык',
'ja-JP': '言語' 'ja-JP': '言語',
'pt-PT': 'Idioma'
}, },
: { : {
'el-GR': 'Γραφείο',
'en-US': 'Office', 'en-US': 'Office',
'es-ES': 'Oficina',
'fr-FR': 'Bureau',
'zh-CN': '办公', 'zh-CN': '办公',
'zh-TW': '辦公', 'zh-TW': '辦公',
'ru-RU': 'Офис', 'ru-RU': 'Офис',
'ja-JP': 'オフィス' 'ja-JP': 'オフィス',
'pt-PT': 'Escritório'
}, },
: { : {
'el-GR': 'Γενικά',
'en-US': 'General', 'en-US': 'General',
'es-ES': 'General',
'fr-FR': 'Général',
'zh-CN': '通用', 'zh-CN': '通用',
'zh-TW': '通用', 'zh-TW': '通用',
'ru-RU': 'Общее', 'ru-RU': 'Общее',
'ja-JP': '一般' 'ja-JP': '一般',
'pt-PT': 'Geral'
}, },
: { : {
'el-GR': 'Γράφημα',
'en-US': 'Writing', 'en-US': 'Writing',
'es-ES': 'Escritura',
'fr-FR': 'Écriture',
'zh-CN': '写作', 'zh-CN': '写作',
'zh-TW': '寫作', 'zh-TW': '寫作',
'ru-RU': 'Письмо', 'ru-RU': 'Письмо',
'ja-JP': '書き込み' 'ja-JP': '書き込み',
'pt-PT': 'Escrita'
}, },
: { : {
'el-GR': 'Επιλεγμένο',
'en-US': 'Featured', 'en-US': 'Featured',
'es-ES': 'Destacado',
'fr-FR': 'Sélection',
'zh-CN': '精选', 'zh-CN': '精选',
'zh-TW': '精選', 'zh-TW': '精選',
'ru-RU': 'Избранное', 'ru-RU': 'Избранное',
'ja-JP': '特集' 'ja-JP': '特集',
'pt-PT': 'Destaque'
}, },
: { : {
'el-GR': 'Προγραμματισμός',
'en-US': 'Programming', 'en-US': 'Programming',
'es-ES': 'Programación',
'fr-FR': 'Programmation',
'zh-CN': '编程', 'zh-CN': '编程',
'zh-TW': '編程', 'zh-TW': '編程',
'ru-RU': 'Программирование', 'ru-RU': 'Программирование',
'ja-JP': 'プログラミング' 'ja-JP': 'プログラミング',
'pt-PT': 'Programação'
}, },
: { : {
'el-GR': 'Αίσθημα',
'en-US': 'Emotion', 'en-US': 'Emotion',
'es-ES': 'Emoción',
'fr-FR': 'Émotion',
'zh-CN': '情感', 'zh-CN': '情感',
'zh-TW': '情感', 'zh-TW': '情感',
'ru-RU': 'Эмоции', 'ru-RU': 'Эмоции',
'ja-JP': '感情' 'ja-JP': '感情',
'pt-PT': 'Emoção'
}, },
: { : {
'el-GR': 'Εκπαίδευση',
'en-US': 'Education', 'en-US': 'Education',
'es-ES': 'Educación',
'fr-FR': 'Éducation',
'zh-CN': '教育', 'zh-CN': '教育',
'zh-TW': '教育', 'zh-TW': '教育',
'ru-RU': 'Образование', 'ru-RU': 'Образование',
'ja-JP': '教育' 'ja-JP': '教育',
'pt-PT': 'Educação'
}, },
: { : {
'el-GR': 'Κreativiteit',
'en-US': 'Creative', 'en-US': 'Creative',
'es-ES': 'Creativo',
'fr-FR': 'Créatif',
'zh-CN': '创意', 'zh-CN': '创意',
'zh-TW': '創意', 'zh-TW': '創意',
'ru-RU': 'Креатив', 'ru-RU': 'Креатив',
'ja-JP': 'クリエイティブ' 'ja-JP': 'クリエイティブ',
'pt-PT': 'Criativo'
}, },
: { : {
'el-GR': 'Ακαδημικός',
'en-US': 'Academic', 'en-US': 'Academic',
'es-ES': 'Académico',
'fr-FR': 'Académique',
'zh-CN': '学术', 'zh-CN': '学术',
'zh-TW': '學術', 'zh-TW': '學術',
'ru-RU': 'Академический', 'ru-RU': 'Академический',
'ja-JP': 'アカデミック' 'ja-JP': 'アカデミック',
'pt-PT': 'Académico'
}, },
: { : {
'el-GR': 'Δημιουργικό',
'en-US': 'Design', 'en-US': 'Design',
'es-ES': 'Diseño',
'fr-FR': 'Design',
'zh-CN': '设计', 'zh-CN': '设计',
'zh-TW': '設計', 'zh-TW': '設計',
'ru-RU': 'Дизайн', 'ru-RU': 'Дизайн',
'ja-JP': 'デザイン' 'ja-JP': 'デザイン',
'pt-PT': 'Design'
}, },
: { : {
'el-GR': 'Τέχνη',
'en-US': 'Art', 'en-US': 'Art',
'es-ES': 'Arte',
'fr-FR': 'Art',
'zh-CN': '艺术', 'zh-CN': '艺术',
'zh-TW': '藝術', 'zh-TW': '藝術',
'ru-RU': 'Искусство', 'ru-RU': 'Искусство',
'ja-JP': 'アート' 'ja-JP': 'アート',
'pt-PT': 'Arte'
}, },
: { : {
'el-GR': 'Αναψυχή',
'en-US': 'Entertainment', 'en-US': 'Entertainment',
'es-ES': 'Entretenimiento',
'fr-FR': 'Divertissement',
'zh-CN': '娱乐', 'zh-CN': '娱乐',
'zh-TW': '娛樂', 'zh-TW': '娛樂',
'ru-RU': 'Развлечения', 'ru-RU': 'Развлечения',
'ja-JP': 'エンターテイメント' 'ja-JP': 'エンターテイメント',
'pt-PT': 'Entretenimento'
}, },
: { : {
'el-GR': 'Ζωή',
'en-US': 'Life', 'en-US': 'Life',
'es-ES': 'Vida',
'fr-FR': 'Vie',
'zh-CN': '生活', 'zh-CN': '生活',
'zh-TW': '生活', 'zh-TW': '生活',
'ru-RU': 'Жизнь', 'ru-RU': 'Жизнь',
'ja-JP': '生活' 'ja-JP': '生活',
'pt-PT': 'Vida'
}, },
: { : {
'el-GR': 'Υγεία',
'en-US': 'Medical', 'en-US': 'Medical',
'es-ES': 'Médico',
'fr-FR': 'Médical',
'zh-CN': '医疗', 'zh-CN': '医疗',
'zh-TW': '醫療', 'zh-TW': '醫療',
'ru-RU': 'Медицина', 'ru-RU': 'Медицина',
'ja-JP': '医療' 'ja-JP': '医療',
'pt-PT': 'Saúde'
}, },
: { : {
'el-GR': 'Παιχνίδια',
'en-US': 'Games', 'en-US': 'Games',
'es-ES': 'Juegos',
'fr-FR': 'Jeux',
'zh-CN': '游戏', 'zh-CN': '游戏',
'zh-TW': '遊戲', 'zh-TW': '遊戲',
'ru-RU': 'Игры', 'ru-RU': 'Игры',
'ja-JP': 'ゲーム' 'ja-JP': 'ゲーム',
'pt-PT': 'Jogos'
}, },
: { : {
'el-GR': 'Γραφήματα',
'en-US': 'Translation', 'en-US': 'Translation',
'es-ES': 'Traducción',
'fr-FR': 'Traduction',
'zh-CN': '翻译', 'zh-CN': '翻译',
'zh-TW': '翻譯', 'zh-TW': '翻譯',
'ru-RU': 'Перевод', 'ru-RU': 'Перевод',
'ja-JP': '翻訳' 'ja-JP': '翻訳',
'pt-PT': 'Tradução'
}, },
: { : {
'el-GR': 'Μουσική',
'en-US': 'Music', 'en-US': 'Music',
'es-ES': 'Música',
'fr-FR': 'Musique',
'zh-CN': '音乐', 'zh-CN': '音乐',
'zh-TW': '音樂', 'zh-TW': '音樂',
'ru-RU': 'Музыка', 'ru-RU': 'Музыка',
'ja-JP': '音楽' 'ja-JP': '音楽',
'pt-PT': 'Música'
}, },
: { : {
'el-GR': 'Αξιολόγηση',
'en-US': 'Review', 'en-US': 'Review',
'es-ES': 'Revisión',
'fr-FR': 'Avis',
'zh-CN': '点评', 'zh-CN': '点评',
'zh-TW': '點評', 'zh-TW': '點評',
'ru-RU': 'Обзор', 'ru-RU': 'Обзор',
'ja-JP': 'レビュー' 'ja-JP': 'レビュー',
'pt-PT': 'Revisão'
}, },
: { : {
'el-GR': 'Γραφήματα',
'en-US': 'Copywriting', 'en-US': 'Copywriting',
'es-ES': 'Redacción',
'fr-FR': 'Rédaction',
'zh-CN': '文案', 'zh-CN': '文案',
'zh-TW': '文案', 'zh-TW': '文案',
'ru-RU': 'Копирайтинг', 'ru-RU': 'Копирайтинг',
'ja-JP': 'コピーライティング' 'ja-JP': 'コピーライティング',
'pt-PT': 'Escrita'
}, },
: { : {
'el-GR': 'Εγκυκλοπαίδεια',
'en-US': 'Encyclopedia', 'en-US': 'Encyclopedia',
'es-ES': 'Enciclopedia',
'fr-FR': 'Encyclopédie',
'zh-CN': '百科', 'zh-CN': '百科',
'zh-TW': '百科', 'zh-TW': '百科',
'ru-RU': 'Энциклопедия', 'ru-RU': 'Энциклопедия',
'ja-JP': '百科事典' 'ja-JP': '百科事典',
'pt-PT': 'Enciclopédia'
}, },
: { : {
'el-GR': 'Υγεία',
'en-US': 'Health', 'en-US': 'Health',
'es-ES': 'Salud',
'fr-FR': 'Santé',
'zh-CN': '健康', 'zh-CN': '健康',
'zh-TW': '健康', 'zh-TW': '健康',
'ru-RU': 'Здоровье', 'ru-RU': 'Здоровье',
'ja-JP': '健康' 'ja-JP': '健康',
'pt-PT': 'Saúde'
}, },
: { : {
'el-GR': 'Μάρκετινγκ',
'en-US': 'Marketing', 'en-US': 'Marketing',
'es-ES': 'Marketing',
'fr-FR': 'Marketing',
'zh-CN': '营销', 'zh-CN': '营销',
'zh-TW': '營銷', 'zh-TW': '營銷',
'ru-RU': 'Маркетинг', 'ru-RU': 'Маркетинг',
'ja-JP': 'マーケティング' 'ja-JP': 'マーケティング',
'pt-PT': 'Marketing'
}, },
: { : {
'el-GR': 'Επιστήμη',
'en-US': 'Science', 'en-US': 'Science',
'es-ES': 'Ciencia',
'fr-FR': 'Science',
'zh-CN': '科学', 'zh-CN': '科学',
'zh-TW': '科學', 'zh-TW': '科學',
'ru-RU': 'Наука', 'ru-RU': 'Наука',
'ja-JP': '科学' 'ja-JP': '科学',
'pt-PT': 'Ciência'
}, },
: { : {
'el-GR': 'Ανάλυση',
'en-US': 'Analysis', 'en-US': 'Analysis',
'es-ES': 'Análisis',
'fr-FR': 'Analyse',
'zh-CN': '分析', 'zh-CN': '分析',
'zh-TW': '分析', 'zh-TW': '分析',
'ru-RU': 'Анализ', 'ru-RU': 'Анализ',
'ja-JP': '分析' 'ja-JP': '分析',
'pt-PT': 'Análise'
}, },
: { : {
'el-GR': 'Νόμος',
'en-US': 'Legal', 'en-US': 'Legal',
'es-ES': 'Legal',
'fr-FR': 'Légal',
'zh-CN': '法律', 'zh-CN': '法律',
'zh-TW': '法律', 'zh-TW': '法律',
'ru-RU': 'Право', 'ru-RU': 'Право',
'ja-JP': '法律' 'ja-JP': '法律',
'pt-PT': 'Legal'
}, },
: { : {
'el-GR': 'Συμβουλή',
'en-US': 'Consulting', 'en-US': 'Consulting',
'es-ES': 'Consultoría',
'fr-FR': 'Consultation',
'zh-CN': '咨询', 'zh-CN': '咨询',
'zh-TW': '諮詢', 'zh-TW': '諮詢',
'ru-RU': 'Консалтинг', 'ru-RU': 'Консалтинг',
'ja-JP': 'コンサルティング' 'ja-JP': 'コンサルティング',
'pt-PT': 'Consultoria'
}, },
: { : {
'el-GR': 'Φορολογία',
'en-US': 'Finance', 'en-US': 'Finance',
'es-ES': 'Finanzas',
'fr-FR': 'Finance',
'zh-CN': '金融', 'zh-CN': '金融',
'zh-TW': '金融', 'zh-TW': '金融',
'ru-RU': 'Финансы', 'ru-RU': 'Финансы',
'ja-JP': '金融' 'ja-JP': '金融',
'pt-PT': 'Finanças'
}, },
: { : {
'el-GR': 'Τουρισμός',
'en-US': 'Travel', 'en-US': 'Travel',
'es-ES': 'Viajes',
'fr-FR': 'Voyages',
'zh-CN': '旅游', 'zh-CN': '旅游',
'zh-TW': '旅遊', 'zh-TW': '旅遊',
'ru-RU': 'Путешествия', 'ru-RU': 'Путешествия',
'ja-JP': '旅行' 'ja-JP': '旅行',
'pt-PT': 'Viagens'
}, },
: { : {
'el-GR': 'Διοίκηση',
'en-US': 'Management', 'en-US': 'Management',
'es-ES': 'Gestión',
'fr-FR': 'Gestion',
'zh-CN': '管理', 'zh-CN': '管理',
'zh-TW': '管理', 'zh-TW': '管理',
'ru-RU': 'Управление', 'ru-RU': 'Управление',
'ja-JP': '管理' 'ja-JP': '管理',
'pt-PT': 'Gestão'
} }
} }

View File

@ -96,8 +96,12 @@ const GeneralSettings: FC = () => {
const languagesOptions: { value: LanguageVarious; label: string; flag: string }[] = [ const languagesOptions: { value: LanguageVarious; label: string; flag: string }[] = [
{ value: 'zh-CN', label: '中文', flag: '🇨🇳' }, { value: 'zh-CN', label: '中文', flag: '🇨🇳' },
{ value: 'zh-TW', label: '中文(繁体)', flag: '🇭🇰' }, { value: 'zh-TW', label: '中文(繁体)', flag: '🇭🇰' },
{ value: 'el-GR', label: 'Ελληνικά', flag: '🇬🇷' },
{ value: 'en-US', label: 'English', flag: '🇺🇸' }, { value: 'en-US', label: 'English', flag: '🇺🇸' },
{ value: 'es-ES', label: 'Español', flag: '🇪🇸' },
{ value: 'fr-FR', label: 'Français', flag: '🇫🇷' },
{ value: 'ja-JP', label: '日本語', flag: '🇯🇵' }, { value: 'ja-JP', label: '日本語', flag: '🇯🇵' },
{ value: 'pt-PT', label: 'Português', flag: '🇵🇹' },
{ value: 'ru-RU', label: 'Русский', flag: '🇷🇺' } { value: 'ru-RU', label: 'Русский', flag: '🇷🇺' }
] ]

View File

@ -199,9 +199,9 @@ export enum ThemeMode {
auto = 'auto' auto = 'auto'
} }
export type LanguageVarious = 'zh-CN' | 'zh-TW' | 'en-US' | 'ru-RU' | 'ja-JP' export type LanguageVarious = 'zh-CN' | 'zh-TW' | 'el-GR' | 'en-US' | 'es-ES' | 'fr-FR' | 'ja-JP' | 'pt-PT' | 'ru-RU'
export type TranslateLanguageVarious = 'chinese' | 'chinese-traditional' | 'english' | 'japanese' | 'russian' export type TranslateLanguageVarious = 'chinese' | 'chinese-traditional' | 'greek' | 'english' | 'spanish' | 'french' | 'japanese' | 'portuguese' | 'russian'
export type CodeStyleVarious = BuiltinTheme | 'auto' export type CodeStyleVarious = BuiltinTheme | 'auto'