GithubHelp home page GithubHelp logo

bookfere / ebook-translator-calibre-plugin Goto Github PK

View Code? Open in Web Editor NEW
1.4K 11.0 91.0 2.16 MB

A Calibre plugin to translate ebook into a specified language.

Home Page: https://translator.bookfere.com

License: GNU General Public License v3.0

Python 99.43% HTML 0.57%
calibre translate chatgpt deepl ebook google kindle bilingual epub translator

ebook-translator-calibre-plugin's Introduction

English · 简体中文


Ebook Translator (a Calibre plugin)

Ebook Translator Calibre Plugin

A Calibre plugin to translate ebook into a specified language.

Plugin Homepage: https://translator.bookfere.com

Translation illustration


Features

  • Support both "Advanced Mode" and "Batch Mode" for different usage situations.
  • Support languages supported by the selected translation engine (e.g. Google Translate supports 134 languages)
  • Support multiple translation engines, including Google Translate, ChatGPT, Gemini, DeepL, etc.
  • Support custom translation engines (you can configure to parse response in JSON or XML format)
  • Support all ebook formats supported by Calibre (48 input formats, 20 output formats), as well as additional formats such as .srt
  • Support to translate more than one ebooks. The translation process of each book is carried out simultaneously without affecting one another
  • Support caching translated content, with no need to re-translate after request failure or network interruption
  • Provide a large number of customization settings, such as saving translated ebooks to Calibre library or designated location

Manual


Links


License

GNU General Public License v3.0

ebook-translator-calibre-plugin's People

Contributors

andy-ao avatar beckydtp avatar bookfere avatar kaitul avatar miipop avatar wanghaosjtu avatar wangshuihua avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ebook-translator-calibre-plugin's Issues

use of glossaries

I think it could be very interesting to implement glossaries for translations.
For example in Spanish the word "cabo" has two possible meanings "end of a rope" and "military rank". If what I am translating is a nautical work, I should be able to choose the first one and not the second one. A clear example is the novels of Honor Harrington, which have naval themes and very specific terminology. A glossary would allow all the novels to be translated with the same terminology.
I propose that the "glossary file" contain word pairs that are substituted and can also include the specific options to exclude certain content (and future posibilities), as if it were a configuration file for how to do the translation.
This does not mean that you have to worry about the graphics part of creating the file as it would be a text file. Only to could select the file.
There are many book series that would benefit from this possibility and users could exchange these files.

View deepl free remains quote.

Hi
Could be posible to connect to deepl and view who many characters have i remain in my quote and compare with the book to know i i have enought to translate the book?

"Deepl api free" has only 500.000 characters in quote and could be very usefull to know this data prior to translate and anticipate the posible fail.

请求添加epub文本翻译后的ai润色功能和给chat gpt自定义设置prompt以提高翻译成品的质量,与适配开发sigil版的插件

请求添加epub文本翻译后的ai润色功能和给chat gpt自定义设置prompt以提高翻译成品的质量,与适配开发sigil版的插件。翻译后的润色功能在文本翻译出的成品和阅读质量上会有很大的提升。此外还可以添加选择需要翻译文本的翻译范围。望开发者可以考虑一下我的建议。同时也祝开发者项目顺利开发,一帆风顺!可以帮助到更多需要的朋友@bookfere

自定义彩云小译翻译引擎错误

作者您好,我在根据您给出的示例和结合彩云小译的API文档,设置了以下规则,但是在测试中提示“无法解析返回的响应。原始数据:HTTP Error 401: UNAUTHORIZED”,在实际使用中提示“无法从翻译引擎API获取数据。”,麻烦您帮我看下设置的引擎内容是哪里出错可以吗?

以下为自定义彩云小译翻译引擎json内容:

{
    "name": "彩云小译",
    "languages": {
        "source": {
            "日文": "ja"
        },
        "target": {
            "中文": "zh"
        }
    },
    "request": {
        "url": "http://api.interpreter.caiyunai.com/v1/translator",
        "method": "POST",
        "headers": {
            "Content-Type": "application/json",
            "X-Authorization": "token  xxx"
        },
        "data": {
            "source": "ja",
            "trans_type": "auto2zh",
            "text": "<text>"
        }
    },
    "response": "json.loads(response.text)['target']"
}

以下为彩云小译给出的两个API示例,均为使用python调用API:

其一:

import requests
import json
 
url = "http://api.interpreter.caiyunai.com/v1/translator"
 
token = "xxx"
 
payload = {
        "source" : ["Lingocloud is the best translation service.", 
                     "ColorfulClouds Weather is the best weather service."], 
        "trans_type" : "en2zh",
        "request_id" : "demo",
        }
 
headers = {
        'content-type': "application/json",
        'x-authorization': "token " + token,
}
 
response = requests.request("POST", url, data=json.dumps(payload), headers=headers)
 
print(response.text)
print(json.loads(response.text)['target'][0])
print(json.loads(response.text)['target'][1])

其二:

import json

import requests


def tranlate(source, direction):
    url = "http://api.interpreter.caiyunai.com/v1/translator"

    # WARNING, this token is a test token for new developers,
    # and it should be replaced by your token
    token = "YOUR_TOKEN"

    payload = {
        "source": source,
        "trans_type": direction,
        "request_id": "demo",
        "detect": True,
    }

    headers = {
        "content-type": "application/json",
        "x-authorization": "token " + token,
    }

    response = requests.request("POST", url, data=json.dumps(payload), headers=headers)

    return json.loads(response.text)["target"]


source = ["Lingocloud is the best translation service.", "彩云小译は最高の翻訳サービスです"]
target = tranlate(source, "auto2zh")

print(target)

我并没有编程基础,json的修改也是借助ChatGpt镜像站进行的,所以如果我的提问出现了常识性的错误请见谅和指正,谢谢。

Enhance cache to store pre-translated text, not just md5

The current cache structure stores only the md5 of the pre-translated content and the response from the translator. This makes it difficult to identify mis-translations and manually correct them. It also lacks a column indicating the target language, making it inflexible for multi-language projects.

I do not believe the space saving of storing md5 only warrants the loss of functionality from not also storing the plaintext. We are generally talking about a few megabytes, at most. Would it be possible to extend the cache to also store the pre-translated text? Also, it might be useful to make it more obvious where it's stored (was rather hard to find on osx)

对于标题和短语的翻译有问题

对于标题和作者没有直接翻译,而是添加了不需要的AI生成内容

例如:
T. Sekine

T. Sekine T. Sekine(关关)是日本的一位著名音乐家和作曲家。他的音乐涵盖了众多的流派,包括摇滚、流行、电子、爵士等等。他是许多**乐迷所熟悉的音乐人物之一,他的音乐风格不仅充满了创新和前卫,同时还融合了亚洲和西方的文化元素。他的代表作品包括《东京街头摇滚》、《疯狂的爱》等等。在他的音乐生涯中,他获得了无数的奖项和荣誉,同时也为许多电影和电视剧的配乐作出了杰出的贡献。

Introduction 1

简介 1 介绍:这是一篇关于狗的文章。狗已经成为人类最亲密的伙伴之一,目前在世界各地被广泛地饲养。在本文中,我们将探讨狗的起源、品种、特性和作用等方面,并了解人类与狗之间的关系。

在设置仅保留译文后,输出文件中混有部分原文和{{id_xx}}的问题

问题详情:如题,从下面的问题详情来看原文和译文并没有混杂的情况,但部分输出文件中同时出现了原文和对应的译文,另外观察到部分{{id_xx}}不连续,猜测可能是在拆分{{id_xx}}时出了问题。
输出文件:
文件1
文件2
问题截图:
issues截图
issues截图2
任务详情:

InputFormatPlugin: TXT Input running
on E:\WEB小说\Ke Yi\0016-Di 16Hua  Da Mo Fa Shi iBao Da (266)\0016-Di 16Hua  Da Mo Fa Shi iBa - Ke Yi.txt
Language not specified
Creator not specified
Building file list...
Normalizing filename cases
Rewriting HTML links
Forcing index.html into XHTML namespace
Merging user specified metadata...
Detecting structure...
Auto generated TOC with 0 entries.
Flattening CSS and remapping font sizes...
Source base font size is 12.00000pt
Removing fake margins...
Cleaning up manifest...
Trimming unused files from manifest...
Creating EPUB Output...
translating ebook content ... (this will take a while)
==============================
| Diagnosis Information
==============================
| Calibre Version: 6.18.0
| Plugin Version: v1.3.8
| Translate Engine: ChatGPT
| Source Language: 自动探测
| Target Language: Chinese (Simplified)
| Input Path: E:\WEB小说\Ke Yi\0016-Di 16Hua  Da Mo Fa Shi iBao Da (266)\0016-Di 16Hua  Da Mo Fa Shi iBa - Ke Yi.txt
| Output Path: E:/工作/翻译/非特化牧师\0016-第16話 大魔法使い爆誕 (Chinese (Simplified)).epub
==============================
开始翻译电子书内容:
==============================
全部条目:3
------------------------------
原文:第16話 大魔法使い爆誕 {{id_0}} 第16話 大魔法使い爆誕 {{id_1}} 朝、目が覚めてベッドから起き上がる。 {{id_2}} 昨日は酷い目に遭った。 {{id_3}} あのあとすぐ、夕飯を食べに一階へと降りると、酒場には沢山の人がいて、皆口々に僕の顔を見ると『よっ! 大魔法使い!』と言うのだ。 {{id_4}} どうも二階の突き当りの部屋というのは、この酒場の真上にあるらしく、何人かの冒険者が“例のアレ”を聞いていて、それを早速、帰ってきた冒険者に端から喧伝したわけだ。酒の肴にしながら。 {{id_5}} こんな娯楽のない世界だ。酒と噂話は一番の娯楽なんだろう。 {{id_6}} 僕が気がついた時には既に遅く、酒場の皆が僕の話をしていたわけで……。 {{id_7}} そして大魔法使いルークが爆誕した。 {{id_8}} まぁ冷やかされはしたが、悪い事ばかりではなかった。と、思う。 {{id_9}} 冒険者達からはダンジョンの事やら、色々な話を聞くことが出来た。こんな出来事でもなけりゃ中々話しかけられなかったと思うし、これは良かった。 {{id_10}} 冒険者も基本は気のいい人達だと分かったし。 {{id_11}} 一階に降りて宿の裏手の井戸で顔を洗い、外に出る。 {{id_12}} 今日はダンジョンに向かう事にする。場所に関してはしっかり仕入れてある。南門から出て、道沿いに少し歩けば見えるらしい。 {{id_13}} 途中、商店で果物らしきモノを数個買い、一つ残して背負袋に入れる。今から食べる朝飯用と、昼に食べる昼飯用だ。 {{id_14}} 果物をローブで軽くこすってから、かじってみる。 {{id_15}} さて、歩きながらダンジョンについておさらいしよう。 {{id_16}} ……いや、その前にこの果物は何なんだろうか。見た目は洋ナシっぽいのに味がバナナだ。甘味は薄いがマズくはない。しかし、もう少し甘味が控えめだったらバナナ風味のイモになってたかもな……。 {{id_17}} まぁいいか。ダンジョンについて考えよう。 {{id_18}} 
译文:第16集 大魔法师爆诞 {{id_0}} 第16集 大魔法师爆诞 {{id_1}} 早晨,醒来从床上起身。 {{id_2}} 昨天经历了烦人的事情。 {{id_3}} 之后,下楼去吃晚餐时,酒馆里挤满了人,每个人看到我都说“嘿!大魔法师!” {{id_4}} 看起来二楼尽头的那个房间正好在酒馆上面,一些冒险家们在听着“那个人的故事”,然后在回来时传播出去了。就在吃着饭的时候。 {{id_5}} 在这个没有娱乐的世界里,喝酒和聊八卦应该是最好的娱乐。 {{id_6}} 当我意识到的时候,酒馆里的人都在谈论我…… {{id_7}} 然后大魔法师卢克爆诞了。 {{id_8}} 虽然被嘲笑了,但也不全是坏事。我认为。 {{id_9}} 我能从冒险家们那里听到关于地牢的事情和各种各样的故事。如果没有这样的事情,我想他们是不太可能同我说话的,这是好事。 {{id_10}} 我也知道了冒险家们基本上都是好人。 {{id_11}} 下楼,在旅店后面的井边洗脸,走出去。 {{id_12}} 今天决定前往地牢。关于地点已经详细了解了。从南门出去,沿着路走一点距离就可以看到。 {{id_13}} 在途中,我在商店买了几个水果,留下一个放进背包里,早餐和午餐用。 {{id_14}} 我用长袍轻轻擦了擦水果,咬了一口。 {{id_15}} 好吧,在步行到地牢之前,我来回顾一下地牢吧。 {{id_16}} ……哎呀,在那之前,这个水果到底是什么?看起来像洋梨,但味道像香蕉。甜味不强,但也不难吃。不过,如果甜味再少点,或许会变成香蕉味的地瓜了吧……。 {{id_17}} 哎呀,算了吧。让我们考虑一下地牢吧。 {{id_18}}
------------------------------
原文:ダンジョンとは何か? という事については、実は誰もよくわかっていないらしい。昔からあるダンジョンもあれば、最近出来たダンジョンもある。何故かダンジョンが生まれて、そこでモンスターが湧く。ダンジョンのモンスターは倒されると消滅し、お金やアイテムや魔石を残す。最下層をクリアすれば何かしら得られる物がある。 {{id_19}} とまぁそんな感じだろうか。 {{id_20}} この南の村にある初心者ダンジョンと呼ばれるダンジョンは、そういうダンジョンの中でも最低難易度のダンジョンの一つ。ドロップは良くないが初心者の練習には丁度良いため、初心者には人気らしい。 {{id_21}} 門を抜け、林の中に作られた道を歩いていく。 {{id_22}} この辺りの林はしっかりと整備されていて、木が密集しないように適度に間引かれ、木の下部の枝葉は打ち払われ、下草も短く刈り取られ、遠くまで見渡せるようになっている。 {{id_23}} ここでならモンスターなどにいきなり襲われる心配も少なそうだ。 {{id_24}} 色々考えながら歩いている内にダンジョンの入り口が見えてきた。 {{id_25}} どんなものかと思ってたけど、地面からいきなりデデーンと岩の塊が突き出して、そこにぽっかり穴が空いて地下への階段が出来た……みたいな。そんな感じに見える。 {{id_26}} 要するに違和感があるのだ。 {{id_27}} 林の中の、広場のような木のない場所に、いきなり数メートルの岩があって、そこに穴が空いている。2D時代のRPGのワールドマップにある洞窟を示すマークのように、これみよがしに“ここはダンジョンですよ!”と主張している。 {{id_28}} ように見えて、違和感があるのは僕だけなのだろうか。この世界の人達は、これはこういうもの、という感じに受け入れているように見える。 {{id_29}} ダンジョンの入り口前まで来て、前を歩いていた冒険者を見送り、しばらくしてから中に入る。 {{id_30}} 中は岩肌むき出しの洞窟、という感じで、人工的な感じはない。いや、階段とかは人工的と言えるのか。とにかく、それ以外は普通の洞窟、という感じに見える。 {{id_31}} まぁ普通でも変でも、洞窟なんて入った事はないから知らないんだけど。 {{id_32}} 
译文:关于迷宫是什么,似乎没有人真正明白。一些迷宫存在已久,而有些则是近期才出现的。不知何故,迷宫出现后就会涌现出怪物。打败迷宫里的怪物后,它们就会消失,留下金钱、物品和魔石。如果能通关最深处,就可以得到一些奖励。{{id_19}}总之,大概就是这样。{{id_20}}位于这座南村的初学者迷宫,是难度最低的迷宫之一。虽然宝物不多,但对于初学者来说,是一种非常好的练习。所以深受初学者喜爱。{{id_21}}走出门,沿着在林中开辟的道路走去。{{id_22}}这片林区被做得非常整洁,适度间隔开了树木,杂草也被切短,下部枝叶也修剪得很整齐,可以远眺。所以在这里,也不用担心会被怪物偷袭。{{id_23}}随着不断思考,终于看到了迷宫的入口。{{id_24}}虽然不知道会是什么样子,但就像地面突然出现了岩石,洞穴就出现在那个洞口的地下...就像那样子。{{id_26}}总之,有种不自然的感觉。{{id_27}}在林中,有一个像广场一样没有树木的地方,突然出现了几米高的岩石,洞穴在那里。像二维时代的RPG世界地图上的洞穴标志一样,自命不凡地主张“这里是迷宫!”看起来,只有我才有这种感觉。这个世界的人们,似乎都接受了这种情况。 {{id_29}}到达迷宫入口,看着前面的冒险家走了,过了一会儿才走进去。{{id_30}}里面有暴露的岩石,感觉不人造。嗯,楼梯之类的是人造的吗?总之,看起来像个普通的洞穴。{{id_31}}好吧,因为还没进过洞穴,所以不知道什么样才算普通。{{id_32}}
------------------------------
原文:階段を一歩一歩、ゆっくりと降りる。 {{id_33}} 洞窟の中は薄暗く、道幅は四メートルぐらいで、高さは三メートルぐらいだろうか。ジメジメしたような感じもなく、空気も淀んでいるようには感じない。 {{id_34}} そのまま数メートル歩くと十字路があった。 {{id_35}} 「うーん……これは、どうしようか」 {{id_36}} ここに来て僕は、ダンジョンを舐めていたんじゃないか、という考えに至る。 {{id_37}} こういう地下迷宮なんだし、当然ながら分かれ道ぐらいあるだろう。某ゲームみたいに一本道で迷わないなんて都合の良い話はない。道が分からなくなれば無駄にさまよう事になるし、下手をすれば出られなくなる。そんな事すら思いつかなかった。 {{id_38}} もしかすると、この初心者ダンジョンならば迷っても大した事にはならないかもしれない。しかしそれに賭けてみる気にはならなかった。 {{id_39}} 今回は無理をせず、大人しくダンジョンを出て村に帰る事にした。 {{id_40}} 
译文:沿着阶梯一步步缓慢地往下走。 {{id_33}} 洞穴内光线昏暗,通道大约四米左右,高度大约三米左右。没有潮湿的感觉,空气也不感觉淀腐。 {{id_34}} 走几米后便有了十字路口。 {{id_35}} “嗯……这该怎么办呢?” {{id_36}} 到了这里我才突然想起,自己是不是太过小看迷宫了呢?这种地下迷宫自然会有分歧口。不可能像某个游戏那样走着一条路走到黑。如果迷路了,那就会在里面徒劳地徘徊,最终可能甚至进退两难。我想都没想过这些事情。 {{id_38}} 也许,在这个初学者的迷宫内迷路也没什么大不了的。但我并不想去赌那个可能性。 {{id_39}} 这次不勉强,决定听从自己的内心返回村庄。 {{id_40}}
==============================
开始转换电子书格式:
==============================
Splitting markup on page breaks and flow limits, if any...
	Looking for large trees in index.html...
	No large trees found
Generating default cover
This EPUB file has no Table of Contents. Creating a default TOC
EPUB output written to E:\工作\翻译\非特化牧师\0016-第16話 大魔法使い爆誕 (Chinese (Simplified)).epub
[自动探测 > Chinese (Simplified)] 翻译 "0014-第14話 冒険者登録"
InputFormatPlugin: TXT Input running
on E:\WEB小说\Ke Yi\0014-Di 14Hua  Mao Xian Zhe Deng Lu (268)\0014-Di 14Hua  Mao Xian Zhe Den - Ke Yi.txt
Language not specified
Creator not specified
Building file list...
Normalizing filename cases
Rewriting HTML links
Forcing index.html into XHTML namespace
Merging user specified metadata...
Detecting structure...
Auto generated TOC with 0 entries.
Flattening CSS and remapping font sizes...
Source base font size is 12.00000pt
Removing fake margins...
Cleaning up manifest...
Trimming unused files from manifest...
Creating EPUB Output...
translating ebook content ... (this will take a while)
==============================
| Diagnosis Information
==============================
| Calibre Version: 6.18.0
| Plugin Version: v1.3.8
| Translate Engine: ChatGPT
| Source Language: 自动探测
| Target Language: Chinese (Simplified)
| Input Path: E:\WEB小说\Ke Yi\0014-Di 14Hua  Mao Xian Zhe Deng Lu (268)\0014-Di 14Hua  Mao Xian Zhe Den - Ke Yi.txt
| Output Path: E:/工作/翻译/非特化牧师\0014-第14話 冒険者登録 (Chinese (Simplified)).epub
==============================
开始翻译电子书内容:
==============================
全部条目:3
------------------------------
原文:第14話 冒険者登録 {{id_0}} 第14話 冒険者登録 {{id_1}} 冒険者ギルドは剣と盾のマークが入った看板が目印で、村の中心付近にあった。広さはさっきの雑貨屋とは比較にならないほど大きく、三階建になっているようだ。 {{id_2}} そもそもの話をすると、冒険者については“例のあの白い場所”にいた頃から存在は確信していた。なんたって〈ウィンドウ〉の〈アイテム〉に〈冒険者セット〉なんて言う名前のアイテムがあったんだから。だから職を探すのなら、とりあえずは冒険者になるかな、とは思っていたんだ。 {{id_3}} 冒険者ギルドの扉を開けて中に入る。 {{id_4}} 中は銀行みたいな形になっていて、長いカウンターテーブルが正面にあり、窓口が三つ並んでいる。右手側の奥にはテーブルとイスが置いてあり、レストランのようになっていた。 {{id_5}} ギルドの中を見回してみても、窓口に座っている職員が一人と、その後ろで雑務をしている何人かだけで、ほぼ人がいない。あとは冒険者風の格好をした人が何人か食事をしているだけだ。 {{id_6}} 太陽の位置を見る限り、今は昼過ぎぐらいだと思う。冒険者は仕事に出ているのだろう。 {{id_7}} 左側の受付の若い女性に声をかける。 {{id_8}} 「すみません。登録したいのですが」 {{id_9}} 「はい。新規登録の方ですね? それではこちらの記入をお願いします。文字が書けないのであれば代筆も可能ですよ」 {{id_10}} そう言って手渡されたのは色白な木片だった。 {{id_11}} この世界ではまだ紙が貴重なのかもしれない。 {{id_12}} 少し頭の中で考えてみてから「書けるので大丈夫です」と代筆を断り、テーブルに用意された羽ペンをインク壺に浸して書こうとするも、ペンが止まる。 {{id_13}} 書く項目は、名前、年齢、適性属性、特技の四つ。 {{id_14}} 年齢、適性属性、特技の三つは特に問題ないけど……名前をどうしようか。本名を書くのは転生者とバラしたくない今はちょっと考えられない。転生したのだから生まれ変わったという事なんだろうし、新しい名前がいいかな。 {{id_15}} 
译文:第14话 冒险者注册 {{id_0}} 第14话 冒险者注册 {{id_1}} 冒险者公会是以剑和盾为标志的招牌,位于村中心附近。与刚才的杂货店相比,空间要大得多,似乎有三层楼高。 {{id_2}} 实际上,从“那个白色的地方”开始,我就确认了冒险者的存在。因为在〈窗口〉的〈道具〉里有一个名为“冒险者套装”的物品。所以,如果想找工作,暂时可以考虑成为冒险者。 {{id_3}} 打开冒险者公会的门并进入。 {{id_4}} 里面形状像银行一样,正面有一个长柜台,窗口排成三排。在右手边的角落里,有一张桌子和几把椅子,像是一家餐厅。 {{id_5}} 即使在冒险者公会里看看,只有坐在窗口旁的一名员工以及在她后面做杂务的数人,几乎没有人。其他的只有几个穿着冒险者衣服的人在吃饭。 {{id_6}} 从太阳的位置来看,现在应该是中午过后的时间。冒险者们可能正在外面工作吧。 {{id_7}} 告诉左边接待的年轻女性。 {{id_8}} “对不起,我想注册。” {{id_9}} “好的。你是新注册的人吗?那么请填写这个表格。如果你不会写,我们也可以替你填写。” {{id_10}} 她递给我的是一块浅色的木板。 {{id_11}} 或许在这个世界上,纸张还很珍贵呢。 {{id_12}} 我稍微想了一下,然后拒绝了代笔,准备用桌上准备的羽毛笔沾墨水来写,但是笔却停了下来。 {{id_13}} 写的项目有姓名、年龄、合适的属性和特技四项。 {{id_14}} 年龄、合适的属性和特技三项没有特别的问题……但是,写什么名字呢?我不想泄露本名,因为我不想暴露自己是转生者这一事实。既然我重生了,我想用一个新的名字。 {{id_15}}
------------------------------
原文:んー……リスタージュと同じビショップでいいか? ……いやダメだな。暁の九人のメンバーから僕の名前が出るかもしれないし。うーん……じゃあルークにしようか、チェス繋がりで。うん、そうしよう。 {{id_16}} 名前はルーク、年齢は一五、属性は光、特技は槍。そう書いて提出する。 {{id_17}} 「えーっと、名前はルークさんですね。属性は光ですか、珍しいですねぇ。……はい、出来ました。それではギルドの事と、ギルド規約を説明しますね」 {{id_18}} と、受付の女性が説明してくれたギルド規約は単純明快だった。 {{id_19}} まずギルドランクはFから始まりSSSまであり、Fは登録した場所でしかギルドカードの効力がなく、Eになり銅製のギルドカードを得てやっと他の町でも使える正式なカードとなる。らしい。 {{id_20}} これで何か問題が起こらない限り、当面この村にいる事が確定してしまった。まぁそれは何とかなるだろう。 {{id_21}} ギルド規約は、その地域のルールを守る事。ギルドメンバー同士での争いは極力控える事。民間人に危害を加えない事。依頼は出来る限りちゃんと遂行する事、など。要するに、煩くは言わないけど常識的な事ぐらいは守っとけよ、という感じかな。 {{id_22}} まぁ細かく決めても守らせるのが大変だし、こんな身一つで稼ぐ危険な業界に入る人に煩く言っても仕方がない。妥当なところか。 {{id_23}} 「はい、それではこれがギルドカードになります。なくさないようにして下さいね」 {{id_24}} 受付嬢から渡されたのは、この村の名と僕の名前とFの文字が書かれた茶色い木片だった。それをちらっと確認してから聞きたい事を聞いておく。 {{id_25}} 「えぇっと、ここで受けられる依頼で初心者向けのものはありますか?」 {{id_26}} そう僕が聞くと、受付嬢は少し思案してから答える。 {{id_27}} 「そうですね。モンスター討伐もありますが、この村なら初心者ダンジョンですね」 {{id_28}} 「初心者ダンジョン、ですか?」 {{id_29}} 
译文:是的。那是一個簡單的迷宮,裡面有一些弱小的怪物和寶藏,非常適合初學者。如果你需要更多的信息,可以問一下我們的導遊。{{id_30}} 他們可以向你展示該地區的地圖,並告訴你需要注意的事項。{{id_31}} 好的,謝謝。那我會詢問一下導遊。
------------------------------
原文:「ええそうです。総階層数五という浅い構造で、モンスターも弱いですし、罠もありません。クリアすれば一度だけ良いアイテムも貰えますしね。ここら辺の冒険者なら一度はここのダンジョンに潜りに行きますよ」 {{id_30}} なるほど、ダンジョンか。いきなりファンタジーらしいモノが出てきた。 {{id_31}} ちょっとワクワクする。これは行ってみるべきかな。 {{id_32}} 受付嬢からダンジョンについて情報を集め、宿屋の場所もついでに聞いてからギルドを出る。 {{id_33}} ダンジョンに行ってみようか、とも思ったけど、太陽の傾きからして日没まで数時間だろうから微妙な時間だ。 {{id_34}} 明日から頑張ろう。と、ニートの働かない言い訳みたいな理屈で宿屋へと向かう事にする。 {{id_35}} と言ってもギルドの隣なんだけど。 {{id_36}} ギルドの受付嬢から紹介された宿は“森の安らぎ亭”という宿で、低ランカーに人気らしい。 {{id_37}} 
译文:「好的,听起来不错。这个迷宫只有五层,而且怪物也比较弱,也没有陷阱。通过后还可以得到一次不错的物品呢。这一带的冒险者们都会去这个迷宫潜行一次的哦。」{{id_30}} 原来是迷宫啊,突然出现了奇幻的元素呢。{{id_31}} 有点兴奋啊,难道要去探险吗?{{id_32}} 在接待员那里打听了一下迷宫的信息,顺便问了一下旅馆的位置,然后离开了公会。{{id_33}} 虽然也想去迷宫看看,但日落前还有几个小时,时间有点尴尬。{{id_34}} 那就明天再努力吧。于是就像躲避工作的宅男一样,去了旅馆。{{id_35}} 话说旅馆就在公会旁边啊。{{id_36}} 接待员介绍的旅馆叫“森林安宁旅”,很受低级别冒险者的欢迎。{{id_37}}
==============================
开始转换电子书格式:
==============================
Splitting markup on page breaks and flow limits, if any...
	Looking for large trees in index.html...
	No large trees found
Generating default cover
This EPUB file has no Table of Contents. Creating a default TOC
EPUB output written to E:\工作\翻译\非特化牧师\0014-第14話 冒険者登録 (Chinese (Simplified)).epub

DeepL authentication key not working

Hi!

I added my DeepL authentication key, but when I test it (either selecting DeepL or DeepL (Pro), I get the following error: Can not parse returned response. Raw data: HTTP Error 403: Forbidden

What could be the problem?

能否将序号数字这些排除翻译?

由于在国内,网络信号不是很好,看日志很多~“原文:5.1.1”这样的数字都要走一遍接口进行翻译,有时候网络不好还要重试好几遍,然后返回的结果还是“5.1.1”,这样就造成了大量的时间浪费,我翻译了一篇150多页的,有6004个翻译项目,估算了下,需要近一天的时间??

两个建议

反应几个问题
1.翻译完成后,原本设置保存文件的位置并没有找到已翻译的文件,会丢失。比如保存位置为桌面,实际桌面只有一个0字节的同名文件。
2.希望翻译完成之后,能够翻译内容单独输出,删除原文件内容,而不是用英文中文夹杂在一起。
以上两点。谢谢。

Deepl feature request

There is a parameter called html_handling in Deepl that allows translation without disturbing the book's markup structure. It would be great if you could add it.

Thanks.

error: bad escape \H at position 74

I use a plugin to translate a book:Laravel: Up & Running

  • calibre:6.17.0
  • Plugin: v1.3.7

Traceback (most recent call last):
  File "sre_parse.py", line 1039, in parse_template
KeyError: '\\H'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "runpy.py", line 196, in _run_module_as_main
  File "runpy.py", line 86, in _run_code
  File "site.py", line 41, in <module>
  File "site.py", line 37, in main
  File "calibre/utils/ipc/worker.py", line 215, in main
  File "calibre/utils/ipc/worker.py", line 150, in arbitrary_n
  File "calibre_plugins.ebook_translator.convertion", line 123, in convert_book
  File "calibre/ebooks/conversion/plumber.py", line 1281, in run
  File "calibre_plugins.ebook_translator.convertion", line 119, in convert
  File "calibre_plugins.ebook_translator.translation", line 140, in handle
  File "calibre_plugins.ebook_translator.element", line 119, in apply_translation
  File "calibre_plugins.ebook_translator.element", line 51, in add_translation
  File "re.py", line 209, in sub
  File "re.py", line 326, in _subx
  File "re.py", line 317, in _compile_repl
  File "sre_parse.py", line 1042, in parse_template
re.error: bad escape \H at position 74

log:job.log

Multiple api keys | Deepl

I have multiple deepl free api keys and I would like to use them in a way that they are automatically activated as they run out of limits. can you make this enhancement?

Thank you for your time.

[bug]2.0.0及以后的版本中,在插件设置页面点击保存会导致刚新建的自定义翻译引擎从配置文件中消失

问题描述:
新建一个自定义翻译引擎,保存,设置中选择好刚才新建的翻译引擎,并设置好偏好语言,保存,关闭插件设置页面,再打开插件设置,发现翻译引擎列表中没有刚才新建的翻译引擎,但偏好语言设置却保留了下来。关闭插件和calibre,重新打开calibre,点击插件的设置后弹出如下错误

calibre, version 6.19.1
错误: 未处理的异常: <b>TypeError</b>:SourceLang.refresh[dict, str, bool].emit(): argument 1 has unexpected type 'NoneType'

calibre 6.19.1  embedded-python: True
Linux-6.3.5-201.fsync.fc37.x86_64-x86_64-with-glibc2.35 Linux ('64bit', 'ELF')
('Linux', '6.3.5-201.fsync.fc37.x86_64', '#1 SMP PREEMPT_DYNAMIC Thu Jun  1 09:31:01 UTC 2023')
Python 3.10.1
Interface language: zh_CN
Successfully initialized third party plugins: Chinese Text Conversion (3, 0, 1) && Ebook Translator (2, 0, 0) && EpubSplit (3, 6, 0)
Traceback (most recent call last):
  File "calibre_plugins.ebook_translator.ui", line 115, in show_setting
    window = TranslationSetting(self, self.gui, self.icon)
  File "calibre_plugins.ebook_translator.setting", line 51, in __init__
    self.main_layout()
  File "calibre_plugins.ebook_translator.setting", line 58, in main_layout
    tab_2 = self.tabs.addTab(self.layout_engine(), _('Engine'))
  File "calibre_plugins.ebook_translator.setting", line 89, in scroll_widget
    scroll_area.setWidget(func(self))
  File "calibre_plugins.ebook_translator.setting", line 527, in layout_engine
    choose_default_engine(default_index)
  File "calibre_plugins.ebook_translator.setting", line 515, in choose_default_engine
    self.source_lang.refresh.emit(
TypeError: SourceLang.refresh[dict, str, bool].emit(): argument 1 has unexpected type 'NoneType'

通过跟踪查看插件的配置文件发现,在刚添加完翻译引擎时,引擎设置确实正常保存了,但如果在关闭设置页面前点击设置页面的保存按钮,刚添加完的翻译引擎就从配置文件中消失了,此时如果查看自定义页面也会发现自定义引擎列表中没有刚添加的引擎选项。

How can I exclude eg. code examples and/or tables from translation?

I've tried to use the exclude context tools to ensure the plugin doesn't try to translate code, but it doesn't seem to work. I've tried regex, all combinations I can think of. For example, with the structure

<table class="processedcode">
  <tr>
    <td class="codeinfo">​<span class="codeprefix">1:&nbsp;</span></td>
    <td class="codeline">puts 1.0 + 2.0 </td>
  </tr>
  <tr>
    <td class="codeinfo">​<span class="codeprefix">2:&nbsp;</span></td>
    <td class="codeline">puts 2.0 * 3.0</td>
  </tr>
  <tr>
    <td class="codeinfo">​<span class="codeprefix">3:&nbsp;</span></td>
    <td class="codeline">puts 5.0 - 8.0</td>
  </tr>
  <tr>
    <td class="codeinfo">​<span class="codeprefix">4:&nbsp;</span></td>
    <td class="codeline">puts 9.0 / 2.0</td>
  </tr>
</table>

There's nothing I have been able to do to avoid all of this being submitted for translation - with nonsensical results. I have also tried using a glossary for certain programming symbols and it seems to be ignored. I would have thought that simply adding code as an exclude in HTML elements would do the trick, but it does nothing.

Any advice?

And also, which takes precedence, the cache or the ignore/glossary settings? Another possibility is that it has cached all the (erroneous) code translations and is skipping all the rules I'm trying to add. I see it's sqlite so I actually should be able to just load it and edit - could its location be output in the job log?

AttributeError: 'NoneType' object has no attribute 'tail'

  1. Calibre 6.17 +
  2. Error always pop-up for specific ePUB.
  3. Checked with https://www.epubvalidation.com/ epub seems correct:
The Result of the submitted file:
Filename: *******.epub

Validating using EPUB version 3.2 rules.
No errors or warnings detected.
Messages: 0 fatals / 0 errors / 0 warnings / 0 infos

EPUBCheck completed

Error Log:

Traceback (most recent call last):
  File "runpy.py", line 196, in _run_module_as_main
  File "runpy.py", line 86, in _run_code
  File "site.py", line 41, in <module>
  File "site.py", line 37, in main
  File "calibre/utils/ipc/worker.py", line 215, in main
  File "calibre/utils/ipc/worker.py", line 150, in arbitrary_n
  File "calibre_plugins.ebook_translator.convertion", line 124, in convert_book
  File "calibre/ebooks/conversion/plumber.py", line 1281, in run
  File "calibre_plugins.ebook_translator.convertion", line 120, in convert
  File "calibre_plugins.ebook_translator.translation", line 107, in handle
  File "calibre_plugins.ebook_translator.element", line 86, in get_original
  File "calibre_plugins.ebook_translator.element", line 29, in get_content
AttributeError: 'NoneType' object has no attribute 'tail'

Delay between translations

I'm using DeepL X
https://github.com/OwO-Network/DeepLX

After some time translating, the plugin gives an error because deepl says that too many translation attempts have been made.
Could you implement a delay between translations?
Maybe two fields, so that if you fill in the first one, it will be a fixed delay value and if you fill in the second one too, it will be a random value between the first and the second one.

DeepL X problem

Hi!

Playing around DeepL X I could get it working as a small python code. Using this code returns to me HTTP Error 400: Bad Request in Calibre, and a 404 error in the DeepLX:

{
    "name": "DeepLX",
    "languages": {
        "source": {
            "Source Language": "DE"
        },
        "target": {
            "Target Language": "EN-GB"
        }
    },
    "request": {
        "url": "http://127.0.0.1:1188/translate",
        "method": "POST",
        "data": {
            "text": "<text>",
            "source": "DE",
            "target": "EN-GB"
        }
    },
    "response": "response"
}

Recover translation fail due to "HTTP Error 429: Too Many Requests"

Hi.

Some times using Google or DeepL free, i get the error "HTTP Error 429: Too Many Requests".
I know....I know it's my fault to want to translate a lot.

But, It might be possible when this happens that in the next translation process of this book I ask for a new start or do I continue the previous translation? In this way it could be possible to translate a book several times.

Also, I think it could also be interesting that when this error's happens, it could be possible to set a time interval (for example hours) to automatically continue the translation.

The log is:

Original: Mike was born on 5 March 1942. He sold his first article in 1957, his first short story in 1959 and his first book in 1962.
Traceback (most recent call last):
File "calibre_plugins.ebook_translator.engines.base", line 89, in get_result.
File "mechanize_mechanize.py", line 257, in open
File "mechanize_mechanize.py", line 313, in _mech_open
mechanize._response.get_seek_wrapper_class..httperror_seek_wrapper: HTTP Error 429: Too Many Requests
The translation engine API data could not be retrieved.
Will try again in 5 seconds.
Retrying... (timeout is 300 seconds).
Traceback (most recent call last):
File "calibre_plugins.ebook_translator.engines.base", line 89, in get_result.
File "mechanize_mechanize.py", line 257, in open
File "mechanize_mechanize.py", line 313, in _mech_open
mechanize._response.get_seek_wrapper_class..httperror_seek_wrapper: HTTP Error 429: Too Many Requests

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "calibre_plugins.ebook_translator.translation", line 65, in _translate_text
File "calibre_plugins.ebook_translator.engines.google", line 25, in translate
File "calibre_plugins.ebook_translator.engines.base", line 100, in get_result
Exception: Could not parse the returned response. Raw Data: HTTP Error 429: Too Many Requests

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "calibre_plugins.ebook_translator.engines.base", line 89, in get_result
File "mechanize_mechanize.py", line 257, in open
File "mechanize_mechanize.py", line 313, in _mech_open
mechanize._response.get_seek_wrapper_class..httperror_seek_wrapper: HTTP Error 429: Too Many Requests
Could not retrieve data from the translation engine API.
Will try again in 10 seconds.
Retrying... (timeout is 300 seconds).
Traceback (most recent call last):
File "calibre_plugins.ebook_translator.engines.base", line 89, in get_result.
File "mechanize_mechanize.py", line 257, in open
File "mechanize_mechanize.py", line 313, in _mech_open
mechanize._response.get_seek_wrapper_class..httperror_seek_wrapper: HTTP Error 429: Too Many Requests

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "calibre_plugins.ebook_translator.translation", line 65, in _translate_text
File "calibre_plugins.ebook_translator.engines.google", line 25, in translate
File "calibre_plugins.ebook_translator.engines.base", line 100, in get_result
Exception: Could not parse the returned response. Raw Data: HTTP Error 429: Too Many Requests

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "calibre_plugins.ebook_translator.engines.base", line 89, in get_result
File "mechanize_mechanize.py", line 257, in open
File "mechanize_mechanize.py", line 313, in _mech_open
mechanize._response.get_seek_wrapper_class..httperror_seek_wrapper: HTTP Error 429: Too Many Requests

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "calibre_plugins.ebook_translator.translation", line 65, in _translate_text
File "calibre_plugins.ebook_translator.engines.google", line 25, in translate
File "calibre_plugins.ebook_translator.engines.base", line 100, in get_result
Exception: Could not parse the returned response. Raw Data: HTTP Error 429: Too Many Requests

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "calibre_plugins.ebook_translator.engines.base", line 89, in get_result
File "mechanize_mechanize.py", line 257, in open
File "mechanize_mechanize.py", line 313, in _mech_open
mechanize._response.get_seek_wrapper_class..httperror_seek_wrapper: HTTP Error 429: Too Many Requests
The translation engine API data could not be retrieved.
Will try again in 30 seconds.

能否开发成多线程模式,以提高翻译速度?

感谢作者的开发,非常好的工具。
但是能不能开发多线程,这个比谷歌官方文档翻译速度慢太多了,看任务显示详情似乎用的是单线程,能否开发成多线程模式?否则完全无法用作实际生产,因为速度甚至跟不上人工翻译。谢谢!

添加对腾讯翻译API的支持(腾讯翻译API的一些有用特性无法通过自定义翻译引擎支持)

腾讯翻译API提供了文本翻译批量文本翻译两个API,以下是我阅读API文档时发现的这两个API各自的一些特性以及一些想法:

  1. 文本翻译API:可选的UntranslatedText参数,用来标记不希望被翻译的文本内容,这个参数可以考虑和词汇表功能结合使用,减少对原文内容的处理,进而减少因此造成的对翻译结果的影响,毕竟API文档里也说了非常规翻译文本可能会翻译失败。缺点时每次请求只支持配置一个不被翻译的单词,如果一段中出现多个需要处理的单词,可以考虑根据词汇表中的顺序优先处理顺序靠前的单词。

  2. 批量文本翻译API:请求中的SourceTextList字段是一个字符串数组,响应中的TargetTextList字段也是一个数组。该API应用在在处理合并翻译的场景时无需再添加标记,进而减少额度的使用,也不用担心标记影响翻译,缺点是不支持UntranslatedText参数。

这两个API不同场景下各有优劣,可以考虑分别实现。

Possible to translate larger sections at a time?

Is there a way to translate larger portions of the text at once, rather than line by line? It seems like the translations would be more accurate if there is more context available, particularly for the ChatGPT option.

Dialogue especially can have issues because the translation engine doesn't know who is speaking or how the line works in the context of the full conversation.

[bug]<ruby>,<rb>和<rt>标签处理错误的问题

在高级模式中测试时发现<ruby>,<rb><rt>标签的处理有问题,这几个标签一般一起使用,用于给文字提供注释或读音,常见于日语出版物。(例子
EPUB文件中原文的代码是这样的:

「では、<ruby><rb>神凪</rb><rp>(</rp><rt>かんなぎ</rt><rp>)</rp></ruby>殿。<ruby><rb>例</rb><rp>(</rp><rt>・</rt><rp>)</rp></ruby><ruby><rb>の</rb><rp>(</rp><rt>・</rt><rp>)</rp></ruby><ruby><rb>計</rb><rp>(</rp><rt>・</rt><rp>)</rp></ruby><ruby><rb>画</rb><rp>(</rp><rt>・</rt><rp>)</rp></ruby>を実行する、ということでよろしいですね?」

而在高级模式中看到的原文中是这样的:

「では、神凪()殿。例()の()計()画()を実行する、ということでよろしいですね?」

可以看到作为格式一部分的括号被错误地当成了段落内容的一部分,注音部分也被丢弃了(把注音丢弃掉倒也没有什么问题)。

Fix empty content 修复分割空白内容导致停止

首先,十分感谢作者的工作。由于我在使用的过程发现一个问题。
在翻译一本书的时候会出现分割空白的情况导致停止。(Patrick Henry Winston - Make It Clear_ Speak and Write to Persuade and Inform-MIT Press (2020) ),可以参考我的代码修复分割空白,当时是简单跟着报错修复的,作者应该会有更好的方法。

使用chatgpt翻译txt文档结果只翻译很少部分文字

下午测试了一个txt文本,大概5000字符,一整大段。
可能是高峰时段缘故,进度一直很慢,可以从日志看出下面提示:
无法从翻译引擎API获取数据。
5 秒后重试。
正在重试 ...(300秒后超时)
无法从翻译引擎API获取数据。
10 秒后重试。
正在重试 ...(300秒后超时)
无法从翻译引擎API获取数据。
30 秒后重试。
正在重试 ...(300秒后超时)

最后终于输出,但是最后仅仅翻译了一小段,然后就提示翻译完成:译文:我不觉得我准备好去那里了,因为现在大型语言模型与物理世界没有联系。它们只是通过预测一个词将跟随另一个词的方式工作,但它们没有运动控制,它们不会行动在世界上,它们不会感知世界。也许一旦我们掌握了这个,人工智能研究就应该停止一段时间,这是一种谨慎的态度。在我看来,弗洛伊德是一位有历史地位的心理学家,也是心理学家的培训必备内容之一,因为他显然是对心理学产生了巨大影响的人之一。然而,他的某些具体观点,比如肛门阶段、口腔阶段、原始场景、阴茎妒忌情结等等,都无法经受住检验的考验。

I can't find the translated files

I'm really sorry, but I can't find my translation file. If the path I specify is the clibre library, I can't find the new translation files. If I specify a folder, there is a file that cannot be opened. What's happening here? If this is my problem please tell me how to do it.
真的很抱歉,我找不到我的翻译文件。如果我指定的路径是 clibre 库,我找不到新的翻译文件。如果我指定一个文件夹,那么有一个文件无法打开。这是什么情况?如果这是我的问题,请告诉我该怎么做

可以指定翻译范围么?

比如word文档,指定翻译的页码范围;
epub文档,按照标题来指定范围?
pdf文档,也可以指定页码范围。

现在只能手动拆分文档,投喂给软件翻译,然后手动拼接回去

problem about output_path

Traceback (most recent call last):
File "calibre\gui2\proceed.py", line 208, in do_ask_question
File "calibre_plugins.ebook_translator.main", line 268, in
NameError: free variable 'output_path' referenced before assignment in enclosing scope

GPT-4

Can I use gpt4 now?

[bug]词汇表功能几乎无法工作

我在高级模式中测试了词汇表功能,我发现仅在只设置了1个词汇不翻译,且使用内置的翻译引擎的情况下该功能才会正常工作。如果指定1个词汇的翻译或是设置多个词汇,该功能都不工作。如果是只设置了1个词汇不翻译,然后使用我自定义的彩云翻译API翻译,那么译文中该词汇会被替换成id_xxxxxxxxx

彩云翻译试用API的自定义如下:

{
    "name": "彩云翻译API-试用",
    "languages": {
        "source": {
            "Japanese": "ja",
            "English": "en"
        },
        "target": {
            "中文": "zh"
        }
    },
    "request": {
        "url": "https://api.interpreter.caiyunai.com/v1/translator",
        "method": "POST",
        "headers": {
            "Content-Type": "application/json",
            "x-authorization": "token 3975l6lr5pcbvidl6jl2"
        },
        "data": {
            "source": "<text>",
            "trans_type": "<source>2<target>",
            "replaced": true,
            "media": "text",
            "request_id": "demo"
        }
    },
    "response": "response['target']"
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.