做个自己用的英语词典
现在能下载到的英语词典软件,没有我想要的功能,而且不必要的功能一大堆。
作为一个会敲代码的年轻人(惭愧,目前还不敢称自己是程序员),其优势在于碰到这种情况,可以定制一个自己用的英语词典!
“毛主席说:没有条件,创造条件。”——考研数学老师说的(逃
功能
那么我想要的英语词典是什么样的呢?一个单词应该包括:
- 单词本身(不需要词性的变化)
- 音标(只要英音)
- 柯林斯高阶的英英解释。这个英英解释可有学问了:
- 每一个英英解释的句子都有一句中文翻译
- 每一个英英解释对应一个能大致表达这个解释的中文单词
- 每一个英英解释都有一个例句
- 例句也有中文翻译
- 可以修改单词的解释
- 英英解释不能修改
- 可以以单词卡片的形式快速浏览单词
等把以上功能完善了,会补充网络功能。看看会不会有其他人用吧,毕竟那么多的词,总不能让我自己一个个翻译吧....
目前想到的是:单词评论,单词修改提交到服务器词库,查看修改记录
步骤
如果要做的话,可以分为这几步:
- 找个地方获取柯林斯高阶的英英解释及例句
- 使用网络搜索把英英解释和例句翻译成中文。不知道那些在线词典们给不给力,能获取到的话就好了
- 获取对应中文词语
- 提供单词编辑功能
- 单词本导出功能
过程
1. 获取英英解释及例句:
一开始的思路是获取数据包解析,看看能不能获取柯林斯官方网站的API。这个是很早之前的想法,那时候没获取成功,现在就跳过了。
接着是下载应用商店里的词典软件,然后进入文件浏览器,把它的词库拿来用(有道词典的柯林斯释义不能下载到本地,悲伤= =)。但是我发现得到的词库不会用!它们使用的是一种文件系统,而不是简单的数据库。google了好久,未果,弃之。
前几天,偶然之间发现柯林斯官网查单词时,其URL有特点。
比如我要查 account
这个单词的时候,它的URL是这样的:
http://www.collinsdictionary.com/dictionary/english/account
这可把我乐坏了。只要把URL最后的那个单词换成我想查的单词,就能获取结果了。
于是我赶紧的把我单词表中的考研单词取出前1000多个来实验。
这些词本来是在Excel中的,因为之前为了把它导到有道单词本中,写了段脚本将其转成xml。
从柯林斯官网获取的单词经过转换后的xml是这样的:
<?xml version="1.0" encoding="utf-8"?>
<wordbook>
<item>
<word>bribe</word>
<pron>braɪb</pron>
<def def_id="0">
<en>A #bribe# is a sum of money or something valuable that one person offers or gives to another in order to persuade him or her to do something.</en>
<cn />
<cnword />
<exmp>
He was being investigated for receiving bribes.
He was accused of bribing a senior bank official.
The government bribed the workers to be quiet.
</exmp>
</def>
</item>
</wordbook>
<cn>
是英英解释的中文翻译,<cnword>
是对应的中文词语。#
包围起来的是柯林斯官方加粗的词,这里我打算在应用里面改变其颜色。
匹配这些的正则式如下:
-
单词:
http://www.collinsdictionary.com/dictionary/english/(.+?)\"
-
发音:
<span class=\" pron\".+?>(.+?)</?span
-
所有解释:
<div class=\"dictname\">COBUILD Advanced British English Dictionary</div>(.+?)<div class=\"content-box
- 柯林斯在解释中会对当前单词加粗,这里将其匹配出来以转换为用
#
包围:
<span class=\" hi\" rend=\"b\">(.+?)</span>
- 获取单个解释:
<span class=\" def\">(.+?\\.)</span>(.+?)</div>
- 获取例句:
<span> ⇒ </span>(.+?)</span>
- 去除剩余的标签:
<.+?>
- 柯林斯在解释中会对当前单词加粗,这里将其匹配出来以转换为用
以上使用了C#来操作
2. Android端查询及显示释义
本来想直接读取xml然后查询,后来发现几个xml库没有提供这种功能。是因为xml本来就不是这样使用的么= =
于是,就将xml导入到数据库里面。用的是ORMLite框架。
目前做单机版的,就这样处理了。以后如有可能,就搬到服务器上面去。
建了一张表,包含以下内容:
单词,英音,英英释义,中文释义,中文词语,例句
想想数据量不会太大,就直接冗余英音这一列了。
找了个卡片View,作为listview的item。
最终做成在主页面输入要查询的单词,点击Search之后,进入单词显示页面。
该页面上面是单词和发音,下面是Listview,每一个释义一个item。
3. Android BaseActivity (跑偏了)
之后就是做编辑功能。
一开始考虑长按Listview的项,打开上下文菜单,但是觉得这样有点麻烦。长按
这个动作我不太喜欢,而且一次只能修改一个释义。
干脆做个进入编辑状态的按钮吧。
可是要把 编辑
按钮放哪里呢?
一开始是想在页面底部做个工具栏,但是觉得太占位置了,就决定放在右上角菜单栏里面。
做完右上角菜单后(还没实现功能),想着顺便把侧滑菜单(Navigation Drawer)一起做了。
与此同时觉得在每个页面都写这两者太麻烦,干脆做个BaseActivity,让每个页面都继承这个Activity。
这一步花了一个晚上的时间啊T^T 心累。
4. 修改单词释义
编辑的按钮虽然有了,但是点击之后要怎么处理,成了一个问题。
- 直接在这个页面里,把TextView改成EditView。点击按钮后设置成可修改的状态。
- 进入另一个专门用于编辑的页面。
第一个稍微尝试了一下,好像实现起来有点麻烦。
第二个应该会简单点,但是又多了个页面。
如果可以的话,还是希望能在原来的界面上进行编辑。但是如果实在不行,就创建个新页面吧。
^^
20160829
之前把修改释义的问题解决了。拖了好久才来更新。
我是实现了点击按钮之后,可以直接修改的功能。在stackoverflow上查了不少资料。Android官方是不推荐这种做法的,但我还是强行把它实现出来了。修改之后点击保存即可保存修改到数据库里。