3183 字
16 分钟
我做了一个日语的“编译器”:Nihongo
「能不能省略提示词输入呢?」我想,然后我只用一天时间,做了一个AI驱动的“编译器”。

在我学习日语的时候,发现每次求助于AI的时候,都需要写一串固定的提示词。

「能不能省略提示词输入呢?」我想,然后我只用一天时间,做了一个AI驱动的“编译器”。

TIP

名称“Nihongo”源自日语「にほんご」。

安装 | インストール#

安装非常简单,只需要下载一个py源代码文件(在文末),然后配置Key和API就好了:

'''=== 在这里配置Nihongo ==='''
API_KEY           = ''  # 你的API key,千万不能泄露
API_BASE_URL      = 'https://api.deepseek.com'  # API的Base URL,默认是DeepSeek,详细请看API文档
AI_MODEL          = 'deepseek-chat'  # 使用的模型名称,默认是DeepSeek,详细请看API文档

为了更好的效果,你可以在配置文件添加一行别名,这样随时随地都可以调用:

alias nihongo "<虚拟环境(选填)> <nihongo脚本位置>"
NOTE

下文均以此别名为示例。

IMPORTANT

如果缺少所需依赖,请安装 typeropenai 库。

使用 | 使用する#

用起来很简单,和普通的编译器/解释器没太大的差别:

nihongo -h
 Usage: nihongo.py [OPTIONS] COMMAND [ARGS]...

 Nihongo是日语的“编译器”。可以通过AI对日语文本文件进行“编译”和“静态分析”等操作。

╭─ Options ──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --install-completion            Install completion for the current shell.                                              │
│ --show-completion               Show completion for the current shell, to copy it or customize the installation.       │
│ --help                -h        Show this message and exit.                                                            │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ─────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ run   将日语编译成简体中文。                                                                                           │
│ lint  逐句检查日语文本中的错误和问题。                                                                                 │
│ expl  逐句分析日语文本中的语法要点。                                                                                   │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

接下来,会以以下日语文件作示例,文件名为 temp.nhg

(日语の练习)
私は山口と言います、浅草大学の学生です。
今、ここは地下鉄の電車です、私は浅草大学に行きます。
「すみません、この電車は浅草大学駅に行きますか?」
「つぎの駅は秋葉原駅で、終点は日本中山空港駅です、浅草大学駅には行きません。」
oh no!これは私の電車じゃないです!
「つぎの駅はどのぐらいかかりますか?」
「emm...八分ぐらいです。」
ああ、時間がとても長いですね。

run#

进入存在 temp.nhg 的文件夹,然后执行以下命令,便可以开始“编译”:

nihongo run temp.nhg
(日语练习)
我叫山口,是浅草大学的学生。
现在,这里是在地铁电车上,我要去浅草大学。
“不好意思,这趟电车去浅草大学站吗?”
“下一站是秋叶原站,终点是日本中山机场站,不去浅草大学站。”
oh no!这不是我要坐的电车!
“到下一站大概要多久?”
“emm...大概八分钟。”
啊,时间好长啊。

lint#

与上面差不多的操作,执行以下命令就可以查找文件中有什么错误和问题,同时美观地呈现出来:

nihongo lint temp.nhg
1. 私は山口と言います、浅草大学の学生です。
警告:「と言います」通常用于自我介绍姓名,但更自然的说法是「と申します」或直接说「です」。此外,日语中通常用句号(。)或连
接词(で)来连接句子,而不是逗号(、)。更地道的表达是「私は山口と申します。浅草大学の学生です。」或「山口です。浅草大学の
学生です。」
--------------------------------------------------
2. 今、ここは地下鉄の電車です、私は浅草大学に行きます。
错误:「ここは地下鉄の電車です」存在语义错误。「ここ」指代地点,不能是「電車」。应改为「今、私は地下鉄の電車の中です」或「
今、ここは地下鉄の電車の中です」。
警告:句子用逗号连接显得生硬。更自然的表达是「今、地下鉄の電車の中にいます。浅草大学に向かっています。」
--------------------------------------------------
3. 「すみません、この電車は浅草大学駅に行きますか?」
警告:询问电车是否前往某站时,更地道的说法是「この電車は浅草大学駅に止まりますか?」或「浅草大学駅に行きますか?」虽然语法
正确,但「行きますか」在此语境下略显生硬。
--------------------------------------------------
4. 「つぎの駅は秋葉原駅で、終点は日本中山空港駅です、浅草大学駅には行きません。」
警告:句子结构略显生硬。更自然的表达是「次の駅は秋葉原で、終点は日本中山空港です。浅草大学駅には行きません。」注意「つぎ」
应使用汉字「次」。
--------------------------------------------------
5. oh no!これは私の電車じゃないです!
警告:「oh
no」是英语,在日语对话中通常使用「あっ!」「しまった!」等感叹词。整句更自然的表达是「あっ!これは私の電車じゃない!」
--------------------------------------------------
6. 「つぎの駅はどのぐらいかかりますか?」
警告:询问到达下一站需要多少时间时,更地道的说法是「次の駅までどのくらい(時間が)かかりますか?」或「次の駅まであとどのく
らいですか?」
--------------------------------------------------
7. 「emm...八分ぐらいです。」
警告:「emm」是英语中的犹豫词,日语中常用「ええと…」或「あの…」。数字「八」在表示分钟时通常使用阿拉伯数字或平假名「はち」
,但用汉字也可以。更自然的表达是「ええと…8分ぐらいです。」
--------------------------------------------------
8. ああ、時間がとても長いですね。
错误:「時間が長い」通常用于描述时间段本身很长(如“漫长的岁月”),不用于等待时间。描述等待时间感觉长,应使用「時間がかかる
」或「待ち時間が長い」。
警告:结合上下文,更自然的感叹是「ああ、まだ8分もかかるんですね。」或「長いなあ。」
--------------------------------------------------

expl#

与上面类似,但是用于解析句子的语法成分:

nihongo expl temp.nhg
1. 私は山口と言います、浅草大学の学生です。
解释:「私」是主语,意为“我”。「は」是提示助词,用于提示主题。「山口と言います」中,「と」是表示引用或称谓的格助词,「言い
ます」是动词「言う」的礼貌形,意为“叫做”。整句意为“我叫山口”。逗号后「浅草大学の学生です」中,「の」是表示所属的格助词,「
学生です」是名词谓语句的礼貌形,意为“是学生”。整句意为“我是浅草大学的学生”。
--------------------------------------------------
2. 今、ここは地下鉄の電車です、私は浅草大学に行きます。
解释:「今」是副词,意为“现在”。「ここ」是代词,意为“这里”。「は」提示主题。「地下鉄の電車です」中,「の」表示属性,意为“
地铁的电车/地铁列车”。「です」是判断助动词的礼貌形。前半句意为“现在,这里是地铁列车”。逗号后「私は」再次提示主题「我」。「
浅草大学に」中,「に」是表示方向的格助词。「行きます」是动词「行く」的礼貌形,意为“去”。后半句意为“我要去浅草大学”。
--------------------------------------------------
3. 「すみません、この電車は浅草大学駅に行きますか?」
解释:「すみません」是寒暄语,意为“不好意思/请问”。「この」是连体词,意为“这辆”。「電車は」提示主题“电车”。「浅草大学駅に
」中,「に」表示方向。「行きますか」是「行きます」加上疑问终助词「か」,构成礼貌疑问句。整句意为“请问,这辆电车去浅草大学
站吗?”。
--------------------------------------------------
4. 「つぎの駅は秋葉原駅で、終点は日本中山空港駅です、浅草大学駅には行きません。」
解释:「つぎの駅は」中,「つぎ」意为“下一个”,「は」提示主题“下一站”。「秋葉原駅で」中,「で」是判断助动词「だ」的中顿形,
用于连接句子,意为“是”。「終点は」提示主题“终点”。「日本中山空港駅です」是判断句,意为“是日本中山机场站”。逗号后「浅草大学
駅には」中,「に」表示方向,「は」在此加强提示,有对比含义。「行きません」是「行きます」的否定形。整句意为“下一站是秋叶原
站,终点是日本中山机场站,不去浅草大学站。”。
--------------------------------------------------
5. oh no!これは私の電車じゃないです!
解释:「oh
no!」是英语感叹词。「これは」提示主题“这个”。「私の」中「の」表示所属,意为“我的”。「電車」是名词。“じゃないです”是「では
ないです」的口语形式,表示否定判断,意为“不是”。整句意为“哦不!这不是我的电车!”。
--------------------------------------------------
6. 「つぎの駅はどのぐらいかかりますか?」
解释:「つぎの駅は」提示主题“到下一站”。「どのぐらい」是疑问词,询问程度或数量,意为“大约多少”。「かかります」是动词「かか
る」,意为“花费(时间)”。「か」是疑问终助词。整句意为“到下一站要花多长时间?”。
--------------------------------------------------
7. 「emm...八分ぐらいです。」
解释:「emm...」是犹豫的语气词。「八分」意为“八分钟”。「ぐらい」是副助词,表示大概的数量,意为“左右”。「です」是礼貌判断。
整句意为“嗯…大概八分钟左右。”。
--------------------------------------------------
8. ああ、時間がとても長いですね。
解释:「ああ」是感叹词,意为“啊”。「時間が」中,「が」是主格助词,提示主语“时间”。「とても」是副词,意为“非常”。「長い」是
形容词,意为“长”。「です」是礼貌体。「ね」是终助词,表示感叹或寻求认同。整句意为“啊,时间可真长啊。”。
--------------------------------------------------

源代码:nihongo.py | ソースコード#

'''=== 在这里配置Nihongo ==='''
API_KEY           = ''  # 你的API key,千万不能泄露
API_BASE_URL      = 'https://api.deepseek.com'  # API的Base URL,默认是DeepSeek,详细请看API文档
AI_MODEL          = 'deepseek-chat'  # 使用的模型名称,默认是DeepSeek,详细请看API文档


'''=== 初始化 ==='''
from rich.progress     import Progress, SpinnerColumn, TextColumn
from typing_extensions import Annotated
from functools         import wraps
from openai            import OpenAI
from rich              import print
import textwrap
import typer
nihongo = typer.Typer()


'''=== 内部函数 ==='''
def call_api(pormpt):
    client = OpenAI(
        api_key  = API_KEY,
        base_url = API_BASE_URL
    )
    response = client.chat.completions.create(
        model    = AI_MODEL,
        messages = [{"role": "user", "content": pormpt},],
        stream   = False
    )
    return response.choices[0].message.content

def command_proceessed(loading_text):
    def get_func(func):
        @wraps(func)
        def execute(*args, **kwargs):
            with Progress(
                        SpinnerColumn(),
                        TextColumn("[progress.description]{task.description}"),
                        transient=True) as progress:
                progress.add_task(description=loading_text, total=None)
                func(*args, **kwargs)
        return execute
    return get_func

def get_line():
    return f'[bright_black]{'-'*50}[/bright_black]'


'''=== 命令和子命令 ==='''
@nihongo.callback(
                invoke_without_command = True,
                context_settings       = dict(help_option_names=['-h', '--help']))
def callback():
    '''
    Nihongo是日语的“编译器”。可以通过AI对日语文本文件进行“编译”和“静态分析”等操作。
    '''
    pass

@nihongo.command()
@command_proceessed(loading_text='编译中...')
def run(file_path: Annotated[str, typer.Argument(help="日语文本文件的路径")]):
    '''
    将日语编译成简体中文。
    '''
    print(call_api(textwrap.dedent(f'''
        请按照日语原文一一对应地、严谨地翻译成简体中文,同样只需要译文,不要附带其他信息。
        原文:
        {open(file_path, mode='r', encoding='UTF-8').read()}
    ''')))

@nihongo.command()
@command_proceessed(loading_text='检查中,可能需要一些时间...')
def lint(file_path: Annotated[str, typer.Argument(help="日语文本文件的路径")]):
    '''
    逐句检查日语文本中的错误和问题。
    '''
    print(call_api(textwrap.dedent(f'''
        请逐句检查日语文本有什么语法语义错误(使用错误表示)、表达不地道或生硬的地方(使用警告表示)
        如果都没有问题,就可以跳过这个句子(不显示),以每个句子列举出来,用不带Markdown的简体中文输出。
        此外,请按照以下格式输出:

        1. [b]句子原文[/b]
        [red b]错误:[/red b]语法语义的错误信息
        {get_line()}
        2. [b]句子原文[/b]
        [yellow b]警告:[/yellow b]表达不地道的警告信息
        {get_line()}
        (省略更多...)

        原文:
        {open(file_path, mode='r', encoding='UTF-8').read()}
    ''')))

@nihongo.command()
@command_proceessed(loading_text='分析中,可能需要一些时间...')
def expl(file_path: Annotated[str, typer.Argument(help="日语文本文件的路径")]):
    '''
    逐句分析日语文本中的语法要点。
    '''
    print(call_api(textwrap.dedent(f'''
        请逐句解释它的日语语法,用不带Markdown的简体中文输出。
        此外,请按照以下格式输出:

        1. [b]句子原文[/b]
        解释:解释文本
        {get_line()}
        2. [b]句子原文[/b]
        解释:解释文本
        {get_line()}
        (省略更多...)

        原文:
        {open(file_path, mode='r', encoding='UTF-8').read()}
    ''')))


'''=== 主函数 ==='''
if __name__ == '__main__':
    nihongo()
我做了一个日语的“编译器”:Nihongo
https://pinpe.top/posts/nihongo/
作者
Pinpe
发布于
2026-02-02
许可协议
CC BY-NC-SA 4.0

如果此时间过长,文中的信息可能会失去时效性,甚至不再准确。