用gettext实现i18n多语言界面 转载自http://www.3snews.net/?

本文介绍如何利用Python的gettext工具实现程序界面的多语言显示。通过创建语言对应文件并结合简单的Python脚本,即可轻松实现根据系统语言自动切换界面显示语言的功能。
想在开启程序界面的时候,中文系统就出现中文,英文系统就出现英文吗?呵呵,gettext就可以实现.

过去非常向往那种风格: 选了语言,就可以用什么语言显示.以前玩anjuta的时候总是有个gettext错误,弄得我每次新建工程的时候第一件事就是关掉gettext,而且搞的好像非常神秘似的,今天才知道就是这个gettext有这种能力.

其实说起来也没什么神秘的,gettext也就是建立一个语言对应文件,必要的时候去文件中查找某国语言,然后以那种形式读出,替代原来的字符罢了.

用Python玩个简单的例子吧!其实C++什么的都有相关程序,只不过C++写起来太麻烦了,而且C++的库在Windows上是一大堆,需要下载好些依赖的dll和exe,Python才两个py文件就可以.

Python的i18n工具的存放位置在Python24\Tools\i18n目录下,一共两个msgfmt.py和pygettext.py两个文件.

现在我们先来制作语言对应文件.

运行pygettext.py会生成一个messages.pot,注意,这不是个ppt模板,是一个po文件模板.拷贝一个,改名为gb.po,其实随便改成什么都好,只要扩展名为po(其实pot也可以),用记事本打开,里面的内容如下:

# SOME DEscrīptIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2006-11-04 11:47+中国标准时间\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: ENCODING\n"
"Generated-By: pygettext.py 1.5\n"

把"Content-Type: text/plain; charset=CHARSET\n"改成
"Content-Type: text/plain; charset=gb2312\n"

把"Content-Transfer-Encoding: ENCODING\n"改成
"Content-Transfer-Encoding: cp936\n"

当然,这要看自己的情况了.gb2312是文件字符集,如果是utf8,则用utf8代替.

然后在文件后面添加msgid,msgstr对,比如添加完是这样:

# SOME DEscrīptIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2006-11-04 09:59+中国标准时间\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=gb2312\n"
"Content-Transfer-Encoding: cp936\n"
"Generated-By: pygettext.py 1.5\n"

msgid "Open"
msgstr "打开"

msgid "Edit"
msgstr "编辑"

msgid "Delete"
msgstr "删除"

msgid "Export"
msgstr "导出"

注意,第一个出现的msgid,msgstr对是文件头中的内容,不要动,否则会出问题.

好了,退出,运行dos命令:
msgfmt.py gb.po

生成一个gb.mo文件,这就是语言翻译库文件.

写个程序运行下:
import gettext
cat = gettext.GNUTranslations(open("gb.mo"))
_ = cat.gettext
print _("Open")
print _("Hello")

输出:
打开
Hello

可以看到,定义过的英文被翻译成了中文,其他的没有定义,也就还是英文输出.
### 如何使用Java编写爬虫程序抓取特定网站的数据 对于目标网站 `http://pfsc.agri.cn/#/priceMarket`,由于其可能涉及动态加载内容(如基于 JavaScript 或 Flash 的数据加载),需要考虑以下技术点: 1. **分析请求与响应**:通过浏览器开发者工具(F12)分析页面的网络请求,确定数据来源和请求格式。如果数据以 JSON 格式返回,则可以直接通过 HTTP 请求获取[^1]。 2. **处理动态加载**:如果数据由 JavaScript 动态加载,可以使用 Selenium 或其他支持 JavaScript 渲染的工具来模拟浏览器行为[^3]。 3. **解析非标准协议**:如果数据使用非标准协议(如 AMF),则需要使用相应的解析库进行处理[^4]。 以下是基于 Java 的爬虫实现示例代码,假设目标数据可以通过简单的 HTTP 请求获取: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class WebScraper { public static void main(String[] args) { try { // 目标URL String targetUrl = "http://pfsc.agri.cn/api/data"; // 假设API路径为 /api/data URL url = new URL(targetUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // 设置请求头 connection.setRequestMethod("GET"); connection.setRequestProperty("User-Agent", "Mozilla/5.0"); connection.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); // 获取响应 int responseCode = connection.getResponseCode(); if (responseCode == 200) { BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String inputLine; StringBuilder content = new StringBuilder(); while ((inputLine = in.readLine()) != null) { content.append(inputLine); } in.close(); // 输出响应内容 System.out.println(content.toString()); } else { System.out.println("Failed to retrieve data. Response Code: " + responseCode); } connection.disconnect(); } catch (Exception e) { e.printStackTrace(); } } } ``` #### 注意事项 - 如果目标网站的数据是通过动态加载生成的,上述代码可能无法直接获取到所需内容。此时可以考虑使用 Selenium 模拟浏览器操作: ```java import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class SeleniumScraper { public static void main(String[] args) { // 设置 ChromeDriver 路径 System.setProperty("webdriver.chrome.driver", "path/to/chromedriver"); WebDriver driver = new ChromeDriver(); driver.get("http://pfsc.agri.cn/#/priceMarket"); // 等待页面加载完成 try { Thread.sleep(5000); // 等待5秒确保页面加载完成 } catch (InterruptedException e) { e.printStackTrace(); } // 获取页面元素 WebElement element = driver.findElement(By.tagName("body")); String pageSource = element.getText(); // 输出页面内容 System.out.println(pageSource); // 关闭浏览器 driver.quit(); } } ``` #### 解决非标准协议问题 如果目标网站使用 AMF 协议传输数据,可以参考 Python 中的 `PyAMF` 库,寻找类似的 Java 库(如 `BlazeDS` 或 `AMFSerializer`)进行解析[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值