标签: gettext

使用gettext而不是QObject.tr()来优化PyQt4应用程序的本地化的优缺点?

我有几个用PyQt4编写的应用程序,我使用标准的Python gettext库来实现GUI的国际化和本地化.它对我有用.但我之所以选择gettext只是因为我已经掌握了gettext的使用知识和经验,而且没有使用Qt4 tr()方法的经验.

现在我想更好地比较这两种方法,并通过使用gettext而不是QObject.tr来理解我所缺少的内容,并且有没有任何严重的原因我不应该将gettext用于Qt4/PyQt4应用程序?

在我的理解中,使用gettext的优点是:

  • GNU gettext很成熟,似乎在GNU/Linux世界中是标准的事实.
  • PO文件有足够的特殊编辑器来简化翻译人员的工作,尽管PO模板的文本性质并不是绝对必要的.
  • 甚至还有可用于协作翻译的Web服务.
  • gettext是标准的Python库,所以我不需要安装任何特殊的东西来在运行时使用它.
  • 它通过ngettext()非常好地支持单数/复数形式选择.

我认为QObject.tr()的优点:

  • 这是Qt4/PyQt4的原生技术,所以它可能会更好/更快(尽管我没有数据可以证明).
  • 要翻译的消息可能有其他上下文信息,这将有助于翻译人员选择谐音词的最佳变体,例如,英文单词"Letter"可以翻译为"Character","Mail"或甚至是"Paper size"的类型,具体取决于实际情况.

我认为QObject.tr()vs gettext的缺点:

  • 我没有在Qt文档中找到如何支持单数/复数选择.
  • Qt4 TS翻译模板采用XML格式,因此无需特殊编辑器(QT Linguist)即可编辑更复杂,似乎没有其他第三方解决方案或Web服务.因此,翻译人员需要学习新工具(如果他们已经熟悉PO工具).

但是上面的所有项目都不够严谨,无法明确表示任何工具都比其他工具更好.而且我不想对更好的事情展开火焰战争,因为它非常主观.我只是想知道我错过了QObject.tr()vs gettext的优点和缺点.

localization gettext internationalization pyqt4

8
推荐指数
1
解决办法
2231
查看次数

使用gettext和Locale :: TextDomain在Perl中进行本地化,如果Locale :: TextDomain不可用则使用回退

在" 关于国际化的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联机帮助页的以下片段:

概要

use Locale::TextDomain ('my-package', @locale_dirs);

use Locale::TextDomain qw (my-package);
Run Code Online (Sandbox Code Playgroud)

用法

至关重要的是要记住您使用"概要"部分中指定的Locale :: TextDomain(3),这意味着您必须使用它,而不是需要它.与其他模块相比,该模块的行为完全不同.

您能否告诉我如何检测目标系统上是否存在libintl-perl,以及如果未安装虚拟防护实现,如何提供?或者举例说明这样做的程序/模块?

perl localization gettext internationalization

8
推荐指数
1
解决办法
2741
查看次数

如何在对大文本值进行小编辑时有效地使用gettext PO文件

寻找有关如何在对大型msgid值进行小编辑时有效使用gettext PO文件的提示和/或工具.

示例:我们有许多存储在PO消息目录文件中的多句/多段消息.如果我们对一条消息做了一个非常小的改动,也许编辑一个句子甚至纠正标点符号,我们在运行msgmerge实用程序时会丢失原始翻译.

我们的译员不是从头开始重新翻译长消息(已经通过编辑审批流程),而是返回其PO文件的备份副本,并手动搜索最后一个msgid/msgstr翻译对的文本当前的msgid值以查看已更改的内容,然后复制并粘贴最后一个转换,然后编辑它们以反映更新的msgid值.

这是很多工作!当然必须有更好的方法来处理这种类型的工作流程?

有没有一种最佳实践的方式归档和发现以前的翻译不再在PO文件?我想到的一个想法是存储唯一的MSG ID在我们的信息的文本或在我们之前的消息,并使用这个ID来检索审查以前MSGID/msgstr翻译对的意见.或者是否有PO编辑或在线服务使这一过程更有效率?

谢谢你,马尔科姆

diff gettext internationalization

8
推荐指数
2
解决办法
1964
查看次数

WebDriver getText抛出异常

好吧,我完全无能为力:我在页面上有表格,其中每行的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)

java selenium exception webdriver gettext

8
推荐指数
1
解决办法
1791
查看次数

gettext是在php中本地化网站的最佳方式吗?(只需要轻微的本地化)

gettext是在php中本地化网站的最佳方式吗?我没有使用任何框架,翻译的单词不多,只有两个略有不同的英文版本.

php localization gettext

8
推荐指数
2
解决办法
3784
查看次数

使用gettext和.po文件时组合键和全文

我正在查看gettext.po创建多语言应用程序的文件.我的理解是.po文件msgid中的来源msgstr是翻译.因此,我看到两种定义方式msgid:

使用全文(例如"My name is %s.\n")具有以下优点:

  • 在打电话时gettext你可以清楚地看到即将翻译的内容
  • 翻译.po文件更容易,因为它们包含要翻译的实际内容

使用my-name %s具有以下优点的密钥(例如):

  • 当源文本很长时(例如关于公司的段落),gettext调用更简洁,使您的视图更清晰
  • 更容易维护多个.po文件和视图,因为密钥不太可能更改(例如,密钥的company-description变化远不如实际的公司描述)

因此我的问题:
有没有一种方法可以使用gettext.po文件,它们可以结合两种方法的优点,即: -
用于gettext调用的密钥用于
翻译者查看需要翻译的全文?

localization gettext internationalization po

8
推荐指数
2
解决办法
1995
查看次数

Django JavaScript翻译不起作用

我试图按照指南进行操作,但还不够清楚.

  1. 我把它添加到我的urls.py中

    urlpatterns = patterns('',
        (r'^jsi18n/(?P<packages>\S+?)/$', 'django.views.i18n.javascript_catalog'),
    )
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用以下命令生成lang文件:

    django-admin.py makemessages -d djangojs -l fr
    
    Run Code Online (Sandbox Code Playgroud)

root_folder/locale/fr/LC_MESSAGES现在包含django.podjangojs.poalert(gettext('this is to be translated'));在我的js文件之一是在回升djangojs.po.

  1. 我跑了django-admin.py compilemessages并重新启动了服务器.

  2. 将此添加到我的base.html:

    <script type="text/javascript" src="{% url 'django.views.i18n.javascript_catalog' 'locale' %}" >< /script >
    
    Run Code Online (Sandbox Code Playgroud)

请注意,我添加了"locale"以避免在动态加载翻译时未传递包名称的例外.

  1. /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?

python django translation gettext

8
推荐指数
2
解决办法
8039
查看次数

当gettext安装_时,如何避免flake8的"F821未定义名称'_'"?

问题概述:

在我的项目的主脚本中,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)

python gettext python-3.x pyflakes flake8

8
推荐指数
1
解决办法
6202
查看次数

django:gettext和胁迫unicode

我的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)

谁能解释我,我做错了什么?

python django unicode gettext

7
推荐指数
1
解决办法
6810
查看次数

PHP gettext:并非所有字符串都被翻译

我有这两个相邻的代码行:

<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服务器.关于可能出现什么问题的任何想法?

php gettext

7
推荐指数
1
解决办法
903
查看次数