我突然在以前工作的代码中遇到了一个奇怪的错误.我最近从1.9.4升级到Django 1.9.6.
在我的一个观点中,我有:
from django.contrib import messages
from django.utils.translation import ugettext_lazy as _
messages.success(request, str( _('A string with a ') +
'<a target="_blank" href="/preview/' + mymodel.hash + '">' +
_('link!') + '</a>.'), extra_tags="safehtml"
)
Run Code Online (Sandbox Code Playgroud)
这现在给出了TypeError最后一行的第二行:
Can't convert '__proxy__' object to str implicitly
Run Code Online (Sandbox Code Playgroud)
为什么?我该如何解决?
这可以通过将第二个调用包装到ugettext_lazy()in中来解决str()(即代码变为str( _('link!') ).这样做可以使视图呈现正常.现在我的问题是:为什么?整个复合字符串已经包含在内str(),正如我所说,这段代码与之前版本的django一起工作得很好.这是一个错误吗?
在用PHP制作多语言应用程序时,每个人都说gettext是最好的方法.我只是想知道为什么?
就像下面的方法一样,使用gettext效率更低?
<?PHP
//Have seperate language files for each language I add, this would be english file
function lang($phrase){
static $lang = array(
'NO_PHOTO' => 'No photo\'s available',
'NEW_MEMBER' => 'This user is new'
);
return $lang[$phrase];
}
//Then in application where there is text from the site and not from users I would do something like this
echo lang('NO_PHOTO'); // No photo's available would show here
?>
Run Code Online (Sandbox Code Playgroud) 如何.po使用xgettext使用带有单个命令的PHP文件递归编译文件?
我的PHP文件存在于层次结构中,直接xgettext命令似乎没有递归地挖掘.
使用gettext如何使具有多个数字变量的句子可以翻译?ngettext只接受一个数字作为复数参数.
以下句子中应允许的排列是"成人和儿童","成人和儿童","成人和儿童"以及"成人和儿童".
"从#AVAILABILITYFROM到#NUMADULTS成人和#NUMCHILDREN孩子的#AVAILABILITYTO"
我们正在评估Windows下的Babel 0.9.5 [1]与Python 2.6一起使用,并提出以下问题,我们通过阅读文档或谷歌搜索无法回答这些问题.
1)我想对ungettext使用_ like缩写.关于是否应该使用n_或N_,是否存在一个概念?
n_似乎不起作用.Babel不提取文本.
N_似乎部分有效.Babel像gettext一样提取文本,但不为ngettext格式化(缺少复数参数和msgstr [n].)
2)有没有办法在创建POT文件时设置如下的初始msgstr字段?
我怀疑有可能通过Babel cfg文件来实现这一点,但我一直无法找到有关Babel cfg文件格式的文档.
"Project-Id-Version:PROJECT VERSION \n""Language-Team:en_US \n"
3)有没有办法在我们的PO文件中保留"过时的"msgid/msgstr?当我使用Babel update命令时,新创建的过时字符串标有#〜前缀,但现有的过时消息字符串会被删除.
谢谢,马尔科姆
我在我的应用程序中加入了类似gettext的本地化系统,但我的翻译功能如下所示:
t($category, $string, [$plural_string, $number, $vprintf_arguments])
Run Code Online (Sandbox Code Playgroud)
我的PoEdit关键字:
t:2
t:2,3
Run Code Online (Sandbox Code Playgroud)
$string,它显然有效$string而且$plural_string- 但它不是:(它只能看到$string,所以我没有得到解析的复数形式......我该如何解决?我不想将我的函数切换到不同的参数格式,因为我喜欢这个:(
此功能也像sprintf替换:
无论如何,PoEdit不应该干扰非引用的论点,对吧?我的意思是它只会解析$ plural_string作为字符串'abc abc'
好吧,我完全无能为力:我在页面上有表格,其中每行的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) 我运行的代码如下所示:
...
$this->locale = da_DK;
...
putenv("LC_ALL=".$this->locale);
putenv('LANG='.$this->locale);
$res = setlocale(LC_ALL, $this->locale);
if($res != $this->locale){
throw new Exception("The language could not be set.");
}
bindtextdomain("domain", "./locale");
textdomain("domain");
echo setlocale(LC_MESSAGES, 0 );
echo ' ';
echo __('description');
Run Code Online (Sandbox Code Playgroud)
通过apache2运行它的结果是:
da_DK Beskrivelse
Run Code Online (Sandbox Code Playgroud)
这是我们想要的.
运行它throgh cli:
da_DK Description
Run Code Online (Sandbox Code Playgroud)
如果我们使用英语,那将是正确的.'d'在英语翻译中是大写,在源中是小写(从上下文看起来有点奇怪)
因此gettext可以工作,因为它可以翻译字符串,但不知何故,它忽略了我在脚本中更改了语言环境并从英语目录中选择了.po文件.
如果您想知道我为什么需要cli脚本上的语言环境:该脚本用于通过电子邮件发送发票.
我使用:Ubuntu 12.10,PHP 5.4.6-1ubuntu1,apache 2.2.22和gettext 0.18.1.
以下代码无效
from django.utils.translation import gettext_lazy as _
stringtest=_("First string")
stringtest= stringtest + _(" Second string")
print stringtest
Run Code Online (Sandbox Code Playgroud)
我得到以下异常:
cannot concatenate 'str' and '__proxy__' objects
Run Code Online (Sandbox Code Playgroud)
是否真的不可能将"翻译"字符串附加到自己身上?
在 Python 中,最好对有意未使用的变量使用单个下划线:
first_word, _ = 'only only is important'.split(' ', 1)
Run Code Online (Sandbox Code Playgroud)
另一方面,gettext使用下划线作为其翻译函数的短别名,如果下划线之前用于变量,则会导致冲突:
print(_('gettext will try to translate this string.'))
Run Code Online (Sandbox Code Playgroud)
问题:gettext如果在同一命名空间中使用一次性变量的名称约定是什么?