from typing_extensions import Self from typing import Any, Literal, Optional from pydantic import BaseModel, Field, model_validator, ValidationError from .language import ( LANGUAGE_CODES, T_LANGUAGE_CODES, LANGUAGES, T_LANGUAGES, CODE_TO_LANGUAGE, LANGUAGE_TO_CODE, ) class _Record(BaseModel): "Base Data Model For Language Learner" lang: T_LANGUAGES | str = Field(..., description="The language name.") data: str = Field(..., description="The data for the record, like `apple` is vocabulary, `How are you.` is a phrase. `I like your product! How much is this` is a sentence.") level: None = Field(None, description="The field needs to be defined in the sub data model.") # _meta: dict = Field(..., description="The field to be implement or overwrite, please do not fill this yet.") IPA: Optional[str] = Field(..., description="International Phonetic Alphabet") class Vocabulary(_Record): """ This is for word level record. Please fill the `data` field with vocabulary level input respect to the language. e.g. Chinese: "貓", "車", "醫生", "學校", "咖啡", "書" English: "Cat", "Car", "Doctor", "School", "Coffee", "Book" Japanese: "猫(ねこ)", "車(くるま)", "医者(いしゃ)", "学校(がっこう)", "コーヒー", "本(ほん)" Korean: "고양이", "차", "의사", "학교", "커피", "책" Italian: "Gatto", "Auto", "Dottore", "Scuola", "Caffè", "Libro" """ level: Literal['WORD'] class Phrase(_Record): """ This is for phrase level record. Please fill the `data` field with phrase level input respect to the language. e.g. Chinese: "你好", "謝謝你", "我愛你", "怎麼了?", "好久不見", "多少錢?" English: "Hello", "Thank you", "I love you", "What's wrong?", "Long time no see", "How much is it?" Japanese: "こんにちは", "ありがとう", "愛してる", "どうしたの?", "久しぶり(ひさしぶり)", "いくらですか?" Korean: "안녕하세요", "감사합니다", "사랑해요", "왜 그래요?", "오랜만이에요", "얼마예요?" Italian: "Ciao", "Grazie", "Ti amo", "Che succede?", "È da tanto tempo!", "Quanto costa?" """ level: Literal['PHRASE'] class Sentence(_Record): """ This is for sentence level record. Please fill the `data` field with sentence level input respect to the language. e.g. Chinese: "這是一隻可愛的貓。", "我想喝一杯咖啡。", "你住在哪裡?", "今天的天氣很好。", "你能幫助我嗎?", "我正在學習日語和韓語。" English: "This is a cute cat.", "I want to drink a cup of coffee.", "Where do you live?", "The weather is nice today.", "Can you help me?", "I am learning Japanese and Korean." Japanese: "これはかわいい猫です。", "コーヒーを一杯飲みたいです。", "どこに住んでいますか?", "今日は天気がいいです。", "手伝ってくれますか?", "日本語と韓国語を勉強しています。" Korean: "이건 귀여운 고양이예요.", "커피 한 잔 마시고 싶어요.", "어디에 살아요?", "오늘 날씨가 좋아요.", "저를 도와줄 수 있어요?", "일본어와 한국어를 공부하고 있어요." Italian: "Questo è un gatto carino.", "Voglio bere una tazza di caffè.", "Dove vivi?", "Oggi il tempo è bello.", "Puoi aiutarmi?", "Sto imparando il giapponese e il coreano." """ level: Literal['SENTENCE'] class ReadableReference(BaseModel): """ This is a reference for the foregin language. Try to let the user to understand the foregin language more easily. Please use the user native language to do this. """ name: str short_explain: str description: str = Field( ..., description="Try to describe the foreign language more comprehensively." ) class __R(BaseModel): reference: ReadableReference class R_Vocabulary(__R): foreign: Vocabulary class R_Phrase(__R): foreign: Phrase class R_Sentence(__R): foreign: Sentence