我有几个用PyQt4编写的应用程序,我使用标准的Python gettext库来实现GUI的国际化和本地化.它对我有用.但我之所以选择gettext只是因为我已经掌握了gettext的使用知识和经验,而且没有使用Qt4 tr()方法的经验.
现在我想更好地比较这两种方法,并通过使用gettext而不是QObject.tr来理解我所缺少的内容,并且有没有任何严重的原因我不应该将gettext用于Qt4/PyQt4应用程序?
在我的理解中,使用gettext的优点是:
我认为QObject.tr()的优点:
我认为QObject.tr()vs gettext的缺点:
但是上面的所有项目都不够严谨,无法明确表示任何工具都比其他工具更好.而且我不想对更好的事情展开火焰战争,因为它非常主观.我只是想知道我错过了QObject.tr()vs gettext的优点和缺点.
在" 关于国际化的Perl中的状态 "建议使用博客帖子从2009年4月26日地点:: TextDomain模块从在Perl本地化/国际化的libintl-perl的分布.此外,我必须使用gettext,并且Locale :: Messages/Locale :: TextDomain中的gettext支持比Locale :: Maketext中的gettext仿真更自然.
GNU gettext手册中" 15其他编程语言 " 一章中的" 15.5.18 Perl " 小节说:
- 可移植性
- 该
libintl-perl软件包与平台无关,但不属于Perl核心.如果目标系统上没有安装软件包,程序员负责提供所需功能的虚拟实现.
但是examples/hello-perlgettext源中的两个示例都没有(一个使用较低级别的Locale :: Messages,一个使用更高级别的Locale :: TextDomain)包括检测包是否安装在目标系统上,如果不是,则提供虚拟实现.
什么是复杂的问题(关于检测是否安装了包)是Locale :: TextDomain联机帮助页的以下片段:
概要
Run Code Online (Sandbox Code Playgroud)use Locale::TextDomain ('my-package', @locale_dirs); use Locale::TextDomain qw (my-package);用法
至关重要的是要记住您使用"概要"部分中指定的Locale :: TextDomain(3),这意味着您必须使用它,而不是需要它.与其他模块相比,该模块的行为完全不同.
您能否告诉我如何检测目标系统上是否存在libintl-perl,以及如果未安装虚拟防护实现,如何提供?或者举例说明这样做的程序/模块?
寻找有关如何在对大型msgid值进行小编辑时有效使用gettext PO文件的提示和/或工具.
示例:我们有许多存储在PO消息目录文件中的多句/多段消息.如果我们对一条消息做了一个非常小的改动,也许编辑一个句子甚至纠正标点符号,我们在运行msgmerge实用程序时会丢失原始翻译.
我们的译员不是从头开始重新翻译长消息(已经通过编辑审批流程),而是返回其PO文件的备份副本,并手动搜索最后一个msgid/msgstr翻译对的文本当前的msgid值以查看已更改的内容,然后复制并粘贴最后一个转换,然后编辑它们以反映更新的msgid值.
这是很多工作!当然必须有更好的方法来处理这种类型的工作流程?
有没有一种最佳实践的方式归档和发现以前的翻译不再在PO文件?我想到的一个想法是存储唯一的MSG ID在我们的信息的文本或在我们之前的消息,并使用这个ID来检索审查以前MSGID/msgstr翻译对的意见.或者是否有PO编辑或在线服务使这一过程更有效率?
谢谢你,马尔科姆
好吧,我完全无能为力:我在页面上有表格,其中每行的CSS ID增加1.我正在这样的表格中搜索拍卖ID,并将其与我之前通过Selenium测试输入的拍卖相匹配.所以我的代码是这样的:
int i = 0;
Boolean stillHaveSomethingToSearch = true;
Boolean foundit = false;
while (stillHaveSomethingToSearch){
idConstructor = "mainForm:aucPanelId:0:listOfAuctions:"+i;
try{
auctionRow = driver.findElement(By.id(idConstructor));
} catch (NoSuchElementException e){
stillHaveSomethingToSearch = false;
}
if (stillHaveSomethingToSearch) {
foundAuctionID = auctionRow.getText();
System.out.println("foundAuctionID = " + foundAuctionID);
if (auctionID.equals(foundAuctionID)){
stillHaveSomethingToSearch = false;
foundit = true;
}
}
i++;
}
if (foundit){
auctionRow.click();
}
Run Code Online (Sandbox Code Playgroud)
其中"auctionID"通过之前的测试发送到该方法.
auctionRow是以两个跨度表示的Webelement,其中存储了实际的auctionID
<span id="mainForm:aucPanelId:0:listOfAuctions:0">116</span>
Run Code Online (Sandbox Code Playgroud)
整行是可点击的,所以在我发送click()命令后,它会打开我发现的拍卖
奇怪的是:auctionRow.getText(); 抛出错误.
如果我将其更改为getTagName()函数,它将正确地返回"span"
如何强制它在两个跨度之间提供文本?
Stak Trace:
org.openqa.selenium.WebDriverException: (WARNING: The server did not …Run Code Online (Sandbox Code Playgroud) gettext是在php中本地化网站的最佳方式吗?我没有使用任何框架,翻译的单词不多,只有两个略有不同的英文版本.
我正在查看gettext和.po创建多语言应用程序的文件.我的理解是.po文件msgid中的来源msgstr是翻译.因此,我看到两种定义方式msgid:
使用全文(例如"My name is %s.\n")具有以下优点:
gettext你可以清楚地看到即将翻译的内容 .po文件更容易,因为它们包含要翻译的实际内容使用my-name %s具有以下优点的密钥(例如):
gettext调用更简洁,使您的视图更清晰 .po文件和视图,因为密钥不太可能更改(例如,密钥的company-description变化远不如实际的公司描述)因此我的问题是:
有没有一种方法可以使用gettext和.po文件,它们可以结合两种方法的优点,即: -
用于gettext调用的密钥用于
翻译者查看需要翻译的全文?
我试图按照指南进行操作,但还不够清楚.
我把它添加到我的urls.py中
urlpatterns = patterns('',
(r'^jsi18n/(?P<packages>\S+?)/$', 'django.views.i18n.javascript_catalog'),
)
Run Code Online (Sandbox Code Playgroud)使用以下命令生成lang文件:
django-admin.py makemessages -d djangojs -l fr
Run Code Online (Sandbox Code Playgroud)root_folder/locale/fr/LC_MESSAGES现在包含django.po与djangojs.po和alert(gettext('this is to be translated'));在我的js文件之一是在回升djangojs.po.
我跑了django-admin.py compilemessages并重新启动了服务器.
将此添加到我的base.html:
<script type="text/javascript" src="{% url 'django.views.i18n.javascript_catalog' 'locale' %}" >< /script >
Run Code Online (Sandbox Code Playgroud)请注意,我添加了"locale"以避免在动态加载翻译时未传递包名称的例外.
/jsi18n/locale/从我的浏览器访问,我得到的是Django翻译功能:
/* gettext library */
var catalog = new Array();
function pluralidx(count) { return (count == 1) ? 0 : 1; }
function gettext(msgid) {
....
Run Code Online (Sandbox Code Playgroud)为什么'这是要被翻译'没有显示,在哪个基础上它将显示一个特定的语言而不传递它的URL?
在我的项目的主脚本中,gettext安装_()在其他模块中用于翻译的函数(如in print(_('Something to translate'))).
正如文件所述:
_()函数[是]安装在Python的内置命名空间中,因此可以在应用程序的所有模块中轻松访问它.
所以,一切都运行良好.
唯一的问题:flake8显示错误(实际上由PyFlakes返回):
$ flake8 *.py
lib.py:2:12: F821 undefined name '_'
main_script.py:8:7: F821 undefined name '_'
Run Code Online (Sandbox Code Playgroud)
这是正常的,因为_在main_script.py和lib.py中确实没有定义.
.
??? lib.py
??? locale
? ??? de
? ??? LC_MESSAGES
? ??? myapp.mo
? ??? myapp.po
??? main_script.py
Run Code Online (Sandbox Code Playgroud)
lib.py包含这个:
def fct(sentence):
return _(sentence)
Run Code Online (Sandbox Code Playgroud)
和main_script.py这个:
#!/usr/bin/env python3
import gettext
import lib
gettext.translation('myapp', 'locale', ['de']).install()
print(_('A sentence'))
print(lib.fct('A sentence'))
Run Code Online (Sandbox Code Playgroud)
和myapp.po包含:
msgid ""
msgstr ""
"Project-Id-Version: …Run Code Online (Sandbox Code Playgroud) 我的django应用程序中有以下代码.
class Status(object):
def __init__(self, id, desc):
self.id = id
self.desc = desc
def __unicode__(self):
return self.desc
STATUS = Status(0, _(u"Some text"))
Run Code Online (Sandbox Code Playgroud)
当我尝试显示某些状态(甚至将其强制转换为unicode)时,我得到:
TypeError: coercing to Unicode: need string or buffer, __proxy__ found
Run Code Online (Sandbox Code Playgroud)
谁能解释我,我做错了什么?
我有这两个相邻的代码行:
<td><?php echo __('Product', 'wpsc'); ?>:</td>
<td><?php echo __('Quantity', 'wpsc'); ?>:</td>
Run Code Online (Sandbox Code Playgroud)
这些翻译在.po文件中
msgid "Product" // Translates
msgstr "Produkt"
msgid "Quantity" // does not translate
msgstr "Antall"
Run Code Online (Sandbox Code Playgroud)
一个字符串显示在网页上翻译,另一个不显示.并且,是的,我试图更改第一个的翻译并确认翻译相应地更改,因此我知道服务器读取正确的.mo文件.这是一个最新的Ubuntu服务器.关于可能出现什么问题的任何想法?