Merge pull request #156 from storytold/bt-i18n-v2

Internationalization
This commit is contained in:
Brandon Thomas authored and GitHub committed 2023-01-21 05:30:56 -05:00
commit ec9fdd69ff
26 files changed
+193 -61

No files matched your search

@@ -23,7 +23,7 @@ export const ENGLISH_LANGUAGE: AvailableLanguage = {
// These are the languages the website has been *translated* into.
// This is *not* the list of TTS langauge categories.
export type AvailableLanguageKey = "en" | "es" | "de" | "fr" | "hi" | "id" | "it" | "ja" | "ko" | "pt" | "tr" | "vi" | "zh";
export type AvailableLanguageKey = "en" | "es" | "ar" | "de" | "fr" | "hi" | "id" | "it" | "ja" | "ko" | "pt" | "tr" | "vi" | "zh";
export const AVAILABLE_LANGUAGE_MAP: Record<AvailableLanguageKey, AvailableLanguage> = {
en: ENGLISH_LANGUAGE,
es: {
@@ -36,6 +36,15 @@ export const AVAILABLE_LANGUAGE_MAP: Record<AvailableLanguageKey, AvailableLangu
showPleaseFollowNotice: true,
showBootstrapLanguageNotice: false,
},
ar: {
language: Language.Arabic,
languageCode: "ar",
languageName: "Arabic",
languageNameLocalized: "عربي",
flags: ["🇦🇪", "🇸🇦"],
showPleaseFollowNotice: false,
showBootstrapLanguageNotice: false, // TODO
},
de: {
language: Language.German,
languageCode: "de",
@@ -108,12 +117,12 @@ export const AVAILABLE_LANGUAGE_MAP: Record<AvailableLanguageKey, AvailableLangu
showPleaseFollowNotice: true,
showBootstrapLanguageNotice: false,
},
tr: {
tr: {
language: Language.Turkish,
languageCode: "tr",
languageName: "Turkish",
languageNameLocalized: "Turkish",
flags: [],
languageNameLocalized: "Türk",
flags: ["🇹🇷"],
showPleaseFollowNotice: false,
showBootstrapLanguageNotice: true,
},
@@ -137,37 +146,17 @@ export const AVAILABLE_LANGUAGE_MAP: Record<AvailableLanguageKey, AvailableLangu
},
};
// Langauges the website has not yet been translated into
export const ARABIC_LANGUAGE: AvailableLanguage = {
language: Language.Arabic,
languageCode: "ar",
languageName: "Arabic",
languageNameLocalized: "عربي",
flags: ["🇦🇪", "🇸🇦"],
showPleaseFollowNotice: false,
showBootstrapLanguageNotice: false, // TODO
};
// Langauges the website has not yet been translated into
export const TURKISH_LANGUAGE: AvailableLanguage = {
language: Language.Turkish,
languageCode: "tr",
languageName: "Turkish",
languageNameLocalized: "Türk",
flags: ["🇹🇷"],
showPleaseFollowNotice: false,
showBootstrapLanguageNotice: false, // TODO
};
/// These are the languages TTS has been categorized into.
export type AvailableTtsLanguageKey = "en" | "es" | "it" | "de" | "fr" | "pt" | "ar" | "tr";
export const AVAILABLE_TTS_LANGUAGE_CATEGORY_MAP : Record<AvailableTtsLanguageKey, AvailableLanguage> = {
en: AVAILABLE_LANGUAGE_MAP["en"],
es: AVAILABLE_LANGUAGE_MAP["es"],
ar: ARABIC_LANGUAGE,
ar: AVAILABLE_LANGUAGE_MAP["ar"],
de: AVAILABLE_LANGUAGE_MAP["de"],
fr: AVAILABLE_LANGUAGE_MAP["fr"],
it: AVAILABLE_LANGUAGE_MAP["it"],
pt: AVAILABLE_LANGUAGE_MAP["pt"],
tr: TURKISH_LANGUAGE,
tr: AVAILABLE_LANGUAGE_MAP["tr"],
// ... additional languages the website hasn't been translated into.
}
@@ -7,6 +7,7 @@ import {
// NB: This is the new translation system design. Multiple, per-page or per-module files are easier
// to navigate and maintain than singular monolithic files. We'll gradually phase out the old system.
import * as ar from "./locales/ar";
import * as de from "./locales/de";
import * as en from "./locales/en";
import * as es from "./locales/es";
@@ -17,10 +18,12 @@ import * as it from "./locales/it";
import * as ja from "./locales/ja";
import * as ko from "./locales/ko";
import * as pt from "./locales/pt";
import * as tr from "./locales/tr";
import * as vi from "./locales/vi";
import * as zh from "./locales/zh";
const NEW_TRANSLATIONS: any = {
ar: { translation: ar },
de: { translation: de },
en: { translation: en },
es: { translation: es },
@@ -31,6 +34,7 @@ const NEW_TRANSLATIONS: any = {
ja: { translation: ja },
ko: { translation: ko },
pt: { translation: pt },
tr: { translation: tr },
vi: { translation: vi },
zh: { translation: zh },
};
@@ -168,7 +172,7 @@ const FAKEYOU_TRANSLATIONS: any = {
pages: {
// Index page
ttsList: {
buttonClear: "Claro",
buttonClear: "Borrar",
buttonSpeak: "Hablar",
errorTooManyRequests:
"<strong>¡Estás enviando demasiadas solicitudes!</strong> Reduzca la velocidad un poco. Tenemos que ralentizar un poco las cosas cuando el servidor está ocupado. ",
@@ -296,7 +300,7 @@ const FAKEYOU_TRANSLATIONS: any = {
search: "Procurar",
searchTerm: "Termo de pesquisa",
speakButton: "Falar",
clearButton: "Claro",
clearButton: "Borrar",
},
},
},
@@ -0,0 +1,11 @@
// "ar" - Arabic
// 273 million speakers (worldwide #6)
// Twitch #?
import * as notices from './notices';
import * as tts from './tts';
export {
notices,
tts,
}
@@ -0,0 +1,4 @@
{
"title": "We'll pay you to help us build voices!",
"body": "We don't have enough voices in this language yet. Please help us build your favorite characters. Join our <1 /> and we'll teach you how. We'll pay you <3 /> per voice, too!"
}
@@ -0,0 +1,5 @@
import * as HelpBootstrapLanguage from './HelpBootstrapLanguage.json';
export {
HelpBootstrapLanguage,
}
@@ -0,0 +1,28 @@
{
"form": {
"asyncLoadingDropdownValue": "أرجو الإنتظار",
"buttons": {
"clear": "محو",
"speak": "يتكلم"
},
"by": "بواسطة",
"categoryFiltersLabel": "الفئة / اللغة",
"modelSeeMoreLink": "",
"searchBarLabel": "ابحث عن صوت",
"searchHint": "ابحث عن الصوت",
"searchLabel": "يبحث",
"textInputHint": "أدخل النص الخاص بك هنا",
"voicesLabel": "صوت ({{count}} للاختيار من بينها)"
},
"formTitle": "قم بإنشاء TTS",
"languageLabel": "لغة",
"heroSection": {
"buttons": {
"cloneVoice": "استنساخ صوتي!",
"signUp": "اشتراك",
"viewPricing": "عرض التسعير"
},
"subtitle": "استخدم تقنية <strong> FakeYou </strong> الزائفة العميقة لقول أشياء مع شخصياتك المفضلة",
"title": "النص إلى الكلام"
}
}
@@ -0,0 +1,5 @@
import * as TtsModelListPage from './TtsModelListPage.json';
export {
TtsModelListPage,
}
@@ -8,16 +8,19 @@
"by": "von",
"categoryFiltersLabel": "Kategorie / Spracvon",
"modelSeeMoreLink": "Weitere Details zum Modell \"<1>{{modelName}}</1>\" von <3>{{userName}}</3>",
"searchBarLabel": "Suche nach einer Stimme",
"searchHint": "Suchbegriff",
"searchLabel": "Suche",
"textInputHint": "Eingang...",
"voicesLabel": "Stimme ({{count}} zur Auswahl)"
},
"formTitle": "TTS erstellen",
"languageLabel": "Sprache",
"heroSection": {
"buttons": {
"cloneVoice": "Klonen Sie meine Stimme!",
"signUp": "Anmelden"
"signUp": "Anmelden",
"viewPricing": "Preise anzeigen"
},
"subtitle": "Verwenden Sie die Deep-Fake-Technologie von <strong>FakeYou</strong>, um Dinge mit Ihren Lieblingsfiguren zu sagen",
"title": "Text zu Sprache"
@@ -8,16 +8,19 @@
"by": "by",
"categoryFiltersLabel": "Category / Language",
"modelSeeMoreLink": "See more details about the \"<1>{{modelName}}</1>\" model by <3>{{userName}}</3>",
"searchBarLabel": "Search for a Voice",
"searchHint": "Search for Voice",
"searchLabel": "Search",
"textInputHint": "Textual shenanigans go here...",
"voicesLabel": "Voice ({{count}} to choose from)"
},
"formTitle": "Create TTS",
"languageLabel": "Language",
"heroSection": {
"buttons": {
"cloneVoice": "Clone My Voice!",
"signUp": "Sign Up"
"signUp": "Sign Up",
"viewPricing": "View Pricing"
},
"subtitle": "Use <strong>FakeYou</strong> deep fake tech to say stuff with your favorite characters",
"title": "Text to Speech"
@@ -2,22 +2,25 @@
"form": {
"asyncLoadingDropdownValue": "Cargando...",
"buttons": {
"clear": "Claro",
"clear": "Borrar",
"speak": "Hablar"
},
"by": "por",
"categoryFiltersLabel": "Categoría / Idioma",
"modelSeeMoreLink": "Ver más detalles sobre el modelo \"<1>{{modelName}}</1>\" de <3>{{userName}}</3>",
"searchBarLabel": "Buscar una voz",
"searchHint": "Término de búsqueda",
"searchLabel": "Búsqueda",
"textInputHint": "Las travesuras de texto van aquí...",
"voicesLabel": "Voz ({{count}} para elegir)"
},
"formTitle": "Crear mensaje de texto",
"languageLabel": "Idioma",
"heroSection": {
"buttons": {
"cloneVoice": "Clonar mi Voz!",
"signUp": "Inscribirse"
"signUp": "Inscribirse",
"viewPricing": "Ver precios"
},
"subtitle": "Usa <strong>FakeYou</strong> tecnología falsa profunda para decir cosas con tus personajes favoritos",
"title": "Texto a Voz"
@@ -8,16 +8,19 @@
"by": "par",
"categoryFiltersLabel": "Catégorie / Langue",
"modelSeeMoreLink": "Voir plus de détails sur le modèle \"<1>{{modelName}}</1>\" par <3>{{userName}}</3>",
"searchBarLabel": "Rechercher une voix",
"searchHint": "Terme de recherche",
"searchLabel": "Chercher",
"textInputHint": "Texte de saisie...",
"voicesLabel": "Voix ({{count}} au choix)"
},
"formTitle": "Créer une synthèse vocale",
"languageLabel": "Langue",
"heroSection": {
"buttons": {
"cloneVoice": "Clonez ma voix!",
"signUp": "S'inscrire"
"signUp": "S'inscrire",
"viewPricing": "Voir les prix"
},
"subtitle": "Utilisez <strong>FakeYou</strong> deep fake tech pour dire des trucs avec vos personnages préférés",
"title": "Texte pour parler"
@@ -8,16 +8,19 @@
"by": "द्वारा",
"categoryFiltersLabel": "श्रेणी / भाषा",
"modelSeeMoreLink": "<3>{{userName}}</3> के \"<1>{{modelName}}</1>\" मॉडल के बारे में अधिक विवरण देखें",
"searchBarLabel": "एक आवाज खोजें",
"searchHint": "शब्द को खोजें",
"searchLabel": "तलाशी",
"textInputHint": "यहां टेक्स्ट इनपुट करें",
"voicesLabel": "आवाज ({{count}} चुनने के लिए)"
},
"formTitle": "Create TTS",
"formTitle": "टीटीएस बनाएं",
"languageLabel": "भाषा",
"heroSection": {
"buttons": {
"cloneVoice": "क्लोन माय वॉयस",
"signUp": "साइन अप करें"
"signUp": "साइन अप करें",
"viewPricing": "मूल्य निर्धारण देखें"
},
"subtitle": "अपने पसंदीदा पात्रों के साथ बातें कहने के लिए <strong>FakeYou</strong> गहरी नकली तकनीक का उपयोग करें",
"title": "लिखे हुए को बोलने में बदलना"
@@ -8,16 +8,19 @@
"by": "oleh",
"categoryFiltersLabel": "Kategori / Bahasa",
"modelSeeMoreLink": "Lihat detail selengkapnya tentang model \"<1>{{modelName}}</1>\" oleh <3>{{userName}}</3>",
"searchBarLabel": "Cari Suara",
"searchHint": "Istilah Pencarian",
"searchLabel": "Mencari",
"textInputHint": "Masukan teks",
"voicesLabel": "Suara ({{count}} untuk dipilih)"
},
"formTitle": "Buat TTS",
"languageLabel": "Bahasa",
"heroSection": {
"buttons": {
"cloneVoice": "Klon suara saya",
"signUp": "Daftar"
"signUp": "Daftar",
"viewPricing": "Lihat Harga"
},
"subtitle": "Gunakan teknologi palsu mendalam <strong>FakeYou</strong> untuk mengatakan hal-hal dengan karakter favorit Anda",
"title": "Teks pidato"
@@ -1,25 +1,26 @@
{
"form": {
"asyncLoadingDropdownValue": "Loading...",
"asyncLoadingDropdownValue": "Caricamento...",
"buttons": {
"clear": "Clear",
"speak": "Speak"
"clear": "Ripristina",
"speak": "Parlare"
},
"by": "by",
"by": "per",
"categoryFiltersLabel": "Category / Langauge",
"modelSeeMoreLink": "See more details about the \"<1>{{modelName}}</1>\" model by <3>{{userName}}</3>",
"searchBarLabel": "Cerca una voce",
"searchHint": "Search for Voice",
"searchLabel": "Search",
"textInputHint": "Textual shenanigans go here...",
"searchLabel": "Ricerca",
"textInputHint": "Inserisci qui il testo da generare",
"voicesLabel": "Voice ({{count}} to choose from)"
},
"formTitle": "Create TTS",
"formTitle": "Crea TTS",
"heroSection": {
"buttons": {
"cloneVoice": "Clone My Voice!",
"signUp": "Sign Up"
"cloneVoice": "Clona la mia Voce!",
"signUp": "Registrarsi"
},
"subtitle": "Use <strong>FakeYou</strong> deep fake tech to say stuff with your favorite characters",
"title": "Text to Speech"
"subtitle": "Usa la tecnologia deep fake di <strong>FakeYou</strong> per dire cose con i tuoi personaggi preferiti",
"title": "Testo alla Voce"
}
}
@@ -8,16 +8,19 @@
"by": "の",
"categoryFiltersLabel": "カテゴリ/言語",
"modelSeeMoreLink": "<3>{{userName}}</3>による\"<1>{{modelName}}</1>\"モデルの詳細をご覧ください",
"searchBarLabel": "声を探す",
"searchHint": "検索語",
"searchLabel": "探す",
"textInputHint": "ここに言うテキストを入力してください",
"voicesLabel": "音声({{count}}から選択)"
},
"formTitle": "TTSを作成する",
"languageLabel": "言語",
"heroSection": {
"buttons": {
"cloneVoice": "私の声を複製する",
"signUp": "サインアップ"
"signUp": "サインアップ",
"viewPricing": "価格を見る"
},
"subtitle": "<strong>FakeYou</ strong>ディープフェイクテックを使用して、お気に入りのキャラクターと話します",
"title": "テキスト読み上げ"
@@ -8,16 +8,19 @@
"by": "의",
"categoryFiltersLabel": "카테고리 / 언어",
"modelSeeMoreLink": "<3>{{userName}}</3>의 \"<1>{{modelName}}</1>\" 모델에 대한 자세한 내용 보기",
"searchBarLabel": "음성 검색",
"searchHint": "검색어",
"searchLabel": "검색",
"textInputHint": "여기에 텍스트를 입력하세요",
"voicesLabel": "음성({{count}}개 중에서 선택)"
},
"formTitle": "TTS 생성",
"languageLabel": "언어",
"heroSection": {
"buttons": {
"cloneVoice": "내 목소리를 복제하십시오!",
"signUp": "가입하기"
"signUp": "가입하기",
"viewPricing": "가격 보기"
},
"subtitle": "<strong>FakeYou</strong> 딥 페이크 기술을 사용하여 좋아하는 캐릭터와 함께 말하세요.",
"title": "텍스트 음성 변환"
@@ -8,16 +8,19 @@
"by": "de",
"categoryFiltersLabel": "Categoria / Idioma",
"modelSeeMoreLink": "Veja mais detalhes sobre o modelo \"<1>{{modelName}}</1>\" de <3>{{userName}}</3>",
"searchBarLabel": "Procurar uma voz",
"searchHint": "Termo de pesquisa",
"searchLabel": "Procurar",
"textInputHint": "Insira o texto aqui",
"voicesLabel": "Voz ({{count}} para escolher)"
},
"formTitle": "Criar TTS",
"languageLabel": "Linguagem",
"heroSection": {
"buttons": {
"cloneVoice": "Clonar minha voz!",
"signUp": "Inscrever-se"
"signUp": "Inscrever-se",
"viewPricing": "Ver preços"
},
"subtitle": "Use a tecnologia deepfake do <strong>FakeYou</strong> para dizer coisas com seus personagens favoritos",
"title": "Texto para fala"
@@ -0,0 +1,11 @@
// "tr" - Turkish
// 78 million speakers (worldwide #18)
// Twitch #?
import * as notices from './notices';
import * as tts from './tts';
export {
notices,
tts,
}
@@ -0,0 +1,4 @@
{
"title": "We'll pay you to help us build voices!",
"body": "We don't have enough voices in this language yet. Please help us build your favorite characters. Join our <1 /> and we'll teach you how. We'll pay you <3 /> per voice, too!"
}
@@ -0,0 +1,5 @@
import * as HelpBootstrapLanguage from './HelpBootstrapLanguage.json';
export {
HelpBootstrapLanguage,
}
@@ -0,0 +1,28 @@
{
"form": {
"asyncLoadingDropdownValue": "Lütfen bekle...",
"buttons": {
"clear": "Sil",
"speak": "Konuşmak"
},
"by": "'ye göre",
"categoryFiltersLabel": "Kategori / Dil",
"modelSeeMoreLink": "<3>{{userName}}</3> tarafından \"<1>{{modelName}}</1>\" modeli hakkında daha fazla ayrıntıya bakın",
"searchBarLabel": "Ses Ara",
"searchHint": "Ses Ara",
"searchLabel": "Arama",
"textInputHint": "Burada oluşturulacak metni girin",
"voicesLabel": "Ses (seçim için {{count}})"
},
"formTitle": "TTS oluştur",
"languageLabel": "Dil",
"heroSection": {
"buttons": {
"cloneVoice": "Sesimi klonla!",
"signUp": "üye olmak",
"viewPricing": "Fiyatlandırmayı Görüntüle"
},
"subtitle": "En sevdiğiniz karakterlerle bir şeyler söylemek için <strong>FakeYou</strong> derin sahte teknolojisini kullanın",
"title": "Konuşma metni"
}
}
@@ -0,0 +1,5 @@
import * as TtsModelListPage from './TtsModelListPage.json';
export {
TtsModelListPage,
}
@@ -8,16 +8,19 @@
"by": "của",
"categoryFiltersLabel": "Thể loại / Ngôn ngữ",
"modelSeeMoreLink": "Xem thêm chi tiết về mô hình \"<1>{{modelName}}</1>\" của <3>{{userName}}</3>",
"searchBarLabel": "Tìm kiếm một giọng nói",
"searchHint": "Cụm từ tìm kiếm",
"searchLabel": "Tìm kiếm",
"textInputHint": "Nhập văn bản tại đây",
"voicesLabel": "Giọng nói ({{count}} để chọn)"
},
"formTitle": "Tạo TTS",
"languageLabel": "Ngôn ngữ",
"heroSection": {
"buttons": {
"cloneVoice": "Sao chép giọng nói của tôi!",
"signUp": "Đăng ký"
"signUp": "Đăng ký",
"viewPricing": "Xem giá"
},
"subtitle": "Sử dụng công nghệ giả sâu <strong>FakeYou</strong> để nói nội dung với các nhân vật yêu thích của bạn",
"title": "Chuyển văn bản thành giọng nói"
@@ -8,16 +8,19 @@
"by": "的",
"categoryFiltersLabel": "类别/语言",
"modelSeeMoreLink": "查看 <3>{{userName}}</3> 的\"<1>{{modelName}}</1>\"模型的更多详细信息",
"searchBarLabel": "搜索语音",
"searchHint": "搜索词",
"searchLabel": "搜索",
"textInputHint": "此处输入文字",
"voicesLabel": "语音({{count}} 个可供选择)"
},
"formTitle": "创建 TTS",
"languageLabel": "语言",
"heroSection": {
"buttons": {
"cloneVoice": "克隆我的声音!",
"signUp": "注册"
"signUp": "注册",
"viewPricing": "查看定价"
},
"subtitle": "使用 <strong>FakeYou</strong> 深度伪造技术与您最喜欢的角色说话",
"title": "文字转语音"
@@ -316,7 +316,7 @@ function TtsModelListPage(props: Props) {
>
<div className="flex-grow-1">
<p>
Model by{" "}
Voice by{" "}
<Link
to={profileLink}
onClick={ () => { Analytics.ttsClickModelCreatorLink() } }
@@ -330,13 +330,10 @@ function TtsModelListPage(props: Props) {
/>
</Link>{" "}
| <FontAwesomeIcon icon={faGlobe} className="me-2" />
Language: <span className="fw-semibold">{modelLanguage.languageName}</span> {/*| Use count:{" "}
{t("tts.TtsModelListPage.languageLabel")}: <span className="fw-semibold">{modelLanguage.languageName}</span> {/*| Use count:{" "}
<span className="fw-semibold">616400</span>*/}
</p>
</div>
{/* <Trans i18nKey="tts.TtsModelListPage.form.modelSeeMoreLink">
See more details
</Trans> */}
<div className="fw-medium">
<span>See more details</span>
<FontAwesomeIcon icon={faChevronRight} className="ms-2" />
@@ -462,7 +459,9 @@ function TtsModelListPage(props: Props) {
>
<div>
<div className="d-flex gap-2">
<label className="sub-title">Search for a Voice</label>
<label className="sub-title">
{t("tts.TtsModelListPage.form.searchBarLabel")}
</label>
{/*<a href="/" className="ms-1">
<FontAwesomeIcon icon={faShuffle} />
</a>*/}
@@ -68,7 +68,7 @@ export function TtsPageHero(props: Props) {
>
<button type="button" className="btn btn-secondary w-100">
<FontAwesomeIcon icon={faStar} className="me-2" />
View Pricing
{t("tts.TtsModelListPage.heroSection.buttons.viewPricing")}
</button>
</Link>
</>