【已解决】手工编排翻译的po文件,使用pot文件更新后,如何才能保持原本的排序?

参与到Ubuntu的翻译中来
回复
头像
yq-ysy
论坛版主
帖子: 4326
注册时间: 2008-07-19 12:44
来自: 广西(桂)南宁(邕)
送出感谢: 0
接收感谢: 100 次

【已解决】手工编排翻译的po文件,使用pot文件更新后,如何才能保持原本的排序?

#1

帖子 yq-ysy » 2022-11-20 8:25

Blender官方提供的pot文件,一眼望去,排版似乎毫无规律,没有头绪。
于是我手工编排po文件,按Blender软件界面菜单的顺序排列各个命令的顺序,用poedit生成mo文件,放入Blender成功有效。
但是,软件更新后,pot文件也随之更新,
我手工编排翻译的po文件,用poedit并调用pot文件更新后,排版就变成pot文件的顺序了,没有保持我原本手工编辑的排序。
请问这该如何解决?
(英文不大好,不知道应该用什么关键词,搜索不到国外网友的相关问题答案。)
debug4
帖子: 49
注册时间: 2020-10-29 7:34
送出感谢: 51 次
接收感谢: 2 次

Re: 【求助】手工编排翻译的po文件,使用pot文件更新后,如何才能保持原本的排序?

#2

帖子 debug4 » 2022-11-21 0:28

这个就有点强迫症了。
不过,似乎有个变通的思路:

把自己编排的 PO,复制并重命名为 POT。
再打开你现在导入官方 POT 后,得到的乱序 PO 混合文件,导入上面的 手工 POT。不知是否可行?
头像
yq-ysy
论坛版主
帖子: 4326
注册时间: 2008-07-19 12:44
来自: 广西(桂)南宁(邕)
送出感谢: 0
接收感谢: 100 次

Re: 【求助】手工编排翻译的po文件,使用pot文件更新后,如何才能保持原本的排序?

#3

帖子 yq-ysy » 2022-11-21 11:02

debug4 写了:
2022-11-21 0:28
这个就有点强迫症了。
不过,似乎有个变通的思路:

把自己编排的 PO,复制并重命名为 POT。
再打开你现在导入官方 POT 后,得到的乱序 PO 混合文件,导入上面的 手工 POT。不知是否可行?
如果单从“排版”的角度是可行的,但这样没办法“更新”呀,这样会把最新的POT又变成我老旧的PO了。
新POT文件里有些条目是有变化的,例如“位于程序的第几行”这个数字就经常在变,有时又或增或减几个条目。
例如:

代码: 全选

——旧的PO文件——
#. :src: scripts/startup/bl_operators/wm.py:3111
#. :src: scripts/startup/bl_operators/wm.py:3142
msgctxt "Operator"
msgid "Release Notes"
msgstr "版本说明"

——新的POT文件——
——数字变了,有时是同一段多了一行或几行。
——注意,在PO和POT文件里相似的翻译(一词多义)会有好几段,如下所示。
#. :src: scripts/startup/bl_operators/wm.py:3136
#. :src: scripts/startup/bl_operators/wm.py:3176
msgctxt "Operator"
msgid "Release Notes"
msgstr ""

#. :src: scripts/startup/bl_operators/wm.py:1070
msgid "Release Notes"
msgstr ""
我也在尝试写个python脚本来更新,目前我己经实现的做法是:
(1)把旧的PO文件使用poedit调用POT文件更新,另存为新的PO文件。
(2)用Python脚本把旧的PO文件和新的PO文件分别存入两个字典。
(3)然后遍历旧字典,查询是否存在于新字典里,
如果存在就照搬写入第三个文件,如果不存在就加一个“有变化”的标记也照搬写入第三个文件。
(4)原本想:我手工修改“有变化”的就行了……
但这样做之后发现,带“有变化”标记的太多了,几百上千个,手工修改太辛苦了。

于是,现在又想:怎么样才能更详细地匹配比较“两个字典内最相似的元素的变化”?
——我不是程序员,也许我的思路不对,还有没有更好的办法?

以下是我写的python脚本:
(我连“调用对象”的用法还没搞懂,以下代码也不怕让大家见笑了。)

代码: 全选

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import os
import sys;
import codecs;
import importlib,sys
importlib.reload(sys)
import re

# 此文件是 python3 脚本,读取第一个文件(原本手工编排的po文件)和第二个文件(经过pot更新保存的新po文件),
# 第一个文件按空行提取元素,判断如果也存在于第二个文件中,则写入第三个文件;
# 如果不存在,则标明“有变化”写入第三个文件。

read_old_file = open(sys.argv[1])                        # 原本手工编排的旧po文件
read_new_file = open(sys.argv[2])                        # 经过pot更新保存的新po文件
outfile = open(sys.argv[1]+"-已更新并排序.txt","w")        # 排序后的最新po文件

i=0
old_data = {}                                            # 按空行将旧文件转换为字典
with read_old_file :
    for group in read_old_file.read().split('\n\n'):     # 按空行分割
      key = i
      i=i+1
#      group_ok = group.encode("gb18030")                 # 按 gb18030 编码,再放入字典,否则查询不出
      old_data[key] = group                               # 序号:内容
# print (old_data)                                        # 打印字典不会自动换行

i=0
new_data = {}                                            # 按空行将新文件转换为字典
with read_new_file :
    for group in read_new_file.read().split('\n\n'):     # 按空行分割
      key = i
      i=i+1
#      group_ok = group.encode("gb18030")                 # 按 gb18030 编码,再放入字典,否则查询不出
      new_data[key] = group                               # 序号:内容
# print (new_data)                                        # 打印字典不会自动换行

old_values = old_data.values()                           # 只提取字典的值
new_values = new_data.values()

for old_v in old_values:                                 # 遍历旧文件字典的值
    if old_v in new_values:                              # 判断这个值是否在新字典里,也就是“不变”
#        print (old_v)
        outfile.write(old_v+'\n\n')                      # 写入输出文件
    else:
        old_vv = old_v.split('\n')
        if old_vv[0] == "# # # ":                         # 如果是我自己手工写的“章节备注”则直接写入输出文件
            outfile.write(old_v+'\n\n')
        else:
            outfile.write('# 有变化!\n')                      # 有更新的则标注说明
            outfile.write(old_v+'\n\n')
头像
yq-ysy
论坛版主
帖子: 4326
注册时间: 2008-07-19 12:44
来自: 广西(桂)南宁(邕)
送出感谢: 0
接收感谢: 100 次

【已解决】手工编排翻译的po文件,使用pot文件更新后,如何才能保持原本的排序?

#4

帖子 yq-ysy » 2022-11-26 1:26

缺乏程序思维,就只能抱着“能解决问题就行”的态度,一步步在网上搜索,复制别人的代码来用。
调整思路,折腾了好久,总算得到一个还算能用的结果了,放上代码,留个备份。

代码: 全选

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import os
import sys;
import codecs;
import importlib,sys
importlib.reload(sys)
import re

# 此文件是 python3 脚本,读取第一个文件(原本手工编排的po文件)和第二个文件(经过editpo调用pot更新保存的新po文件),第一个文件按空行提取段落,按msg关键字比较第二个文件中相同的段落,将更新的内容写入第三个文件;其余注释照搬。
# 以后再继续做:读取同一类目的未翻译元素,也归类放在一起。

read_old_file = open(sys.argv[1])                        # 原本手工编排的旧po文件
read_new_file = open(sys.argv[2])                        # 经过pot更新保存的新po文件
outfile = open(sys.argv[1]+"-已更新并排序.txt","w")        # 排序后的最新po文件

new_data = {}                                            # 按空行将新po文件转换为字典
with read_new_file :                                     # 遍历新文件
    for group in read_new_file.read().split('\n\n'):     # 按空行分割,得到一段
        if "msgctxt" in group:
            group_half =  group.split('msgctxt')         # 如果有msgctxt,则以msgctxt分割成两部分
            key = "msgctxt"+group_half[1]
            value = group_half[0]
            new_data[key] = value                        # 以后半段为key,前半段为value写入新字典
        elif "msgid" in group:
            group_half =  group.split('msgid')           # 如果没有msgctxt,就以msgid分割成两部分
            key = "msgid"+group_half[1]
            value = group_half[0]
            new_data[key] = value                        # 以后半段为key,前半段为value写入新字典
        else:
            key = group
            new_data[key] = "纯粹的注释"                   # 如果既没有msgctxt,也没有msgctxt,就是纯粹的注释,照搬即可
#        print ("value===",new_data[key],"key===",key,"\n")       # 打印查看新字典的key和value

with read_old_file :                                     # 遍历旧文件
    for group in read_old_file.read().split('\n\n'):     # 按空行分割,得到一段
#        print ("group===",group,"\n")
        key = ""
        value = ""
        if "msgctxt" in group:
            group_half =  group.split('msgctxt')         # 如果有msgctxt,则以msgctxt分割成两部分
            key = "msgctxt"+group_half[1]
            value = str(new_data.get(key))               # 以旧文件的key,用get调取新字典value,避免查询不到时有出错提示,还要转成字符串
            outfile.write(value+key+'\n\n')              # 写入第三个文件
#            print ("value=1==",value,"key===",key,"\n")       # 打印查看新字典的key和value
        elif "msgid" in group:
            group_half =  group.split('msgid')           # 如果没有msgctxt,就以msgid分割成两部分
            key = "msgid"+group_half[1]
            value = str(new_data.get(key))               # 以旧文件的key,用get调取新字典value,避免查询不到时有出错提示,还要转成字符串
            outfile.write(value+key+'\n\n')              # 写入第三个文件
#            print ("value=2==",value,"key===",key,"\n")       # 打印查看新字典的key和value
        else:
            ref = group                                  # 如果既没有msgctxt,也没有msgctxt,就是纯粹的注释,照搬即可
#            outfile.write(ref+'\n\n')                   # 写入第三个文件,但会造成重复,原因是editpo调用pot更新保存的新po文件时,会把注释与下一段合并。
#            print ("value=3==",ref,"\n")                # 打印查看value值
#        outfile.write(value+key+'\n\n')                 # 写入第三个文件

回复