只需使用翻译文件!

只需使用翻译文件!

哪些文件与生成窗口标题有关?例如,如果您打开 Rhythmbox,您会看到程序名称作为窗口标题。但它不是由文件生成的.desktop。我需要编辑哪些文件才能将文本添加到应用程序的标题中?我希望更改是永久的

我使用带有 GNOME 3.16 的 Ubuntu GNOME 15.04。

答案1

初始名称通常由应用程序本身(内部代码)设置。但是您可以更改它,例如通过使用xdotool,但您必须先安装它:

sudo apt-get install xdotool

然后,一旦安装完成,您可以通过以下命令设置另一个窗口名称:

xdotool search --name "Unity LauncherSwitcher" set_window --name "Monkey"

这将改变:

在此处输入图片描述

进入:

在此处输入图片描述

笔记

如您所见,存在以下命令:

xdotool search --name "<current_name>" set_window --name "<new_name>"

必须<current_name>完全匹配。


编辑或者

从您的评论中,我了解到上述命令不起作用。我用不同的应用程序测试了它,并且它起作用了...

但出于我无法理解的原因,不是Rhytmbox(!!可能是个错误)

另一种方法是使用wmctrl,您也必须安装:

sudo apt-get install wmctrl

然后使用命令:

xprop -id "$(wmctrl -l | grep 'Rhythmbox' | awk '{ print $1 }')" -set WM_NAME "Music"

我已成功测试Rhythmbox

在此处输入图片描述

在此处输入图片描述

使更改永久生效吗?

如上所述,默认窗口名称是在应用程序代码中定义的。

改变默认窗口标题需要更改代码。可以做到如果代码可用,但在许多情况下需要重新编译,并且取决于所使用的语言等。我认为,一般性说明是完全不可能的,并且超出了 AU 的范围。


编辑2

通过单个文件灵活地管理/设置每个应用程序的自定义窗口名称

在您的原始问题中,您想知道是否有某种文件可以设置特定应用程序的新窗口的标题。正如所解释的那样,情况并非如此,但是,它被创建。

在下面的设置中,您可以非常轻松地定义每个应用程序以新窗口的命名方式为基础。只需在~(您的主目录)中创建一个名为的文件即可window_names.txt。对于您要为其设置特定窗口名称的每个应用程序,添加一行,随后添加应用程序和所需的窗口名称:

一个文本文件,定义每个应用程序的窗口名称

gnome-terminal Monkey eats
gedit Banana
rhythmbox if he runs out of peanuts

在此处输入图片描述

解释

该设置包含一个简单的背景脚本。该脚本非常轻量,因此不会对性能产生任何明显的影响。

脚本启动后,它会读取文件~/window_names.txt并加载每个应用程序的设置。然后它会关注创建的窗口。如果出现属于文件中定义的某个应用程序的窗口,它会相应地设置窗口名称。

如何设置

  1. 该脚本同时使用了wmctrlxdotool

    sudo apt-get install wmctrl
    sudo apt-get install xdotool
    
  2. 将脚本复制到空文件中,另存为setwindowname.py

  3. 创建文件~/window_names.txt(准确命名window_names.txt),按以下格式添加您的应用程序:

    <application> <window_name>
    

    例如

    gedit Text editor
    

    窗口名称可能包含空格。

  4. 使用以下命令从终端测试运行脚本:

    python3 /path/to/setwindowname.py
    
  5. 如果一切正常,请将其添加到启动应用程序:Dash > 启动应用程序 > 添加

    请注意,在某些情况下,如果在桌面尚未完全加载时启动脚本,则脚本可能会中断。如果是这种情况,则要添加到启动应用程序的命令将是:

    /bin/bash -c "sleep 15&&python3 /path/to/setwindowname.py"
    

剧本

#!/usr/bin/env python3
import subprocess
import time
import os

f = os.environ["HOME"]+"/"+"window_names.txt"

change = []
lines = open(f).read().splitlines()
for l in lines:
    try:
        change.append([l.split()[0], (" ").join(l.split()[1:])])
    except IndexError:
        pass

get = lambda cmd: subprocess.check_output(cmd).decode("utf-8").strip()
curr_1 = []

while True:
    try:
        curr_2 = get(["wmctrl", "-lp"]).splitlines()
        new = [w for w in curr_2 if not w in curr_1]
        for item in new:
            line = item.split(); pid = line[2]
            procs = get(["ps", "-e"]).splitlines()
            match = [l for l in procs if pid in l][0]
            for app in [app for app in change if app[0] in match]:
                subprocess.Popen(["xdotool", "set_window", "--name", app[1], line[0]])
        curr_1 = curr_2
        time.sleep(0.3)
    except:
        pass

笔记

  • 如果文件~/window_names.txt被编辑,则需要重新启动脚本。
  • 无论应用程序如何启动,它都能正常工作;当应用程序从终端 / 和 或 使用 运行时,它也能正常工作sudo
  • 它不会干扰右键单击选项任何应用。
  • 该脚本还“维护”窗口名称;如果另一个进程随后更改了窗口名称(打开选项卡、更改目录等),则脚本会将该窗口视为“新窗口”并维护您选择的窗口名称。

答案2

标题是由应用程序可执行文件生成的,没有简单的方法来编辑它。


应用程序打开后更改其标题:

  • 安装xdotoolsudo apt-get install xdotool
  • 使用以下方式获取应用程序的 pid pgrep myapp(即pgrep rythmbox
  • 更改窗口标题(替换HERE_THE_PID为应用程序的进程 ID):

    xdotool search --onlyvisible --pid HERE_THE_PID --name "\a\b\c" set_window --name "$new_name"
    

制作脚本来启动具有自定义标题的任何应用程序:

  • 创建一个名为 bash 脚本,change-title内容如下:

    #!/bin/bash
    
    ## The new name of the window is the first argument passed to the script:
    new_name="${1}"
    
    ## application is all arguments but the first (the title)
    application=${@:2}
    
    ## Run the app in background and in quiet mode:
    $application &> /dev/null &
    
    ## Get the pid of the app:
    app_pid=$!
    
    ## Wait until the window appears:
    until xdotool search --onlyvisible --pid $app_pid &> /dev/null; do sleep 0.01; done
    
    ## Change the window name:
    xdotool \
             search \
                    --onlyvisible \
                    --pid $app_pid \
                    --name "\a\b\c" \
             set_window \
                    --name "$new_name"
    
    ## Comment this line to run the app in background:
    wait $app_pid
    
  • 使其可执行chmod a+x change-title

  • 运行它./change-title "NewTitle" theapp --its-arguments

要使更改永久生效:

  • 运行gksudo gedit /usr/local/bin/custom-title(fx.user/local/bin/music)
  • 在文本编辑器中粘贴上述脚本并保存。
  • 跑步sudo chmod a+x /usr/local/bin/custom-title
  • 跑步gksudo gedit /usr/share/applications/rhythmbox.desktop
  • 在这个文件中,有一行(我的是行号 35)内容是:

    Exec=rhythmbox %U
    
  • 将其替换为所创建文件的名称:

    Exec=custom title (fx. Exec=music)
    
  • 将文件另存为新的 custom-name.desktop fx.music.desktop。请小心不要覆盖原始文件!

使更改对“打开方式”功能生效

  • 跑步gksudo gedit /usr/share/applications/rhythmbox-device.desktop
  • 更改rhythmbox为先前 .desktop 文件中使用的名称。
  • 保存文件。
  • 使用系统监视器或者使用以下命令终止 rhythmbox 的活动进程sudo kill rhythmbox
  • 插入您的手机/音乐播放器并按“使用(音乐应用程序)打开”以查看它是否有效。

(摘要)您应该拥有的文件概述

/usr/share/applications为了使应用程序完全正常运行,完成后应该有 3 个 .desktop 文件:

  1. music.desktop或您为应用程序指定的名称

    Exec=musicHidden=true(如果没有则添加最后一个)

  2. 节奏盒.桌面

    Exec=rhythmbox %UHidden=true

  3. rhythmbox-device.desktop

    Exec=music --select-source %U没有隐藏入口

这意味着您总是打开最后一个文件,并且标题始终如一。重置的唯一方法是使用 ALT+F2+R 刷新会话。

  1. 当然,您应该有 bash 脚本/usr/local/bin

最后说明:

  • 当我使用时--name "\a\b\c"是为了修复一个错误,不要用应用程序名称替换!
  • 如果取消注释脚本的最后一行,则脚本将直到应用程序关闭才会结束。
  • ${@:2}请求的代码中的解释@Maud Kon

    1. $@是一个存储所有位置参数的数组。
    2. ${@:2}方法:除第一个之外的所有位置参数
    3. 假设我以这种方式调用一个程序:

      awesome-program foo bar baz fooz
      
      • ${@:1}将会foo bar baz fooz
      • ${@:2}将会bar baz fooz
      • ${@:3}将会baz fooz
      • ${@:4}将会fooz
      • ${@:5}为空,因为没有更多位置参数。
    4. $@${@}${@:1}都是同一件事:所有位置参数。

    5. 在此了解有关此主题的更多信息:http://wiki.bash-hackers.org/scripting/posparams

答案3

只需使用翻译文件!

我在使用 Thunar 时遇到了这个问题:当 Compiz Scale 将 Thunar 窗口标题显示为“AnyFolder - 文件管理器”并且不必要的信息占用空间时,情况变得很烦人。

我尝试了上述方法xdotool,但wmctrl它们不是永久的,因为每次我转到另一个文件夹时,Thunar 都会更改其窗口标题。而且,每次 Thunar 更改标题时,后台都会有一个脚本将其改回,这感觉有点夸张。

一个更简单的解决方案是使用翻译文件msgfmt它随每个应用程序一起提供。您只需使用软件包中包含的工具重新编译翻译源文件即可gettext。我只是为了好玩才对 gThumb 这样做的,它也能正常工作。

1. 获取相关应用程序的源代码。
输入 或前往$ sudo apt-get source APPLICATIONhttp://packages.ubuntu.com,获取源代码并查找名为 的文件夹po,其中包含纯文本语言文件。查找您的语言。假设您来自巴西,该文件将是pt_BR.po

2. 根据需要修改文件
找到您想要删除或更改的确切窗口标题。在 Thunar 的例子中,它是“文件管理器”pt_BR.po发现

:. set window title
: ../thunar/thunar-window.c:3154 ../Thunar.desktop.in.in.h:3
: ../thunar/thunar-settings.desktop.in.h:1
msgid "File Manager"
msgstr "Gerenciador de arquivos"

msgid应用程序发送的信号 在哪里,msgstr语言包将其翻译成什么。
更改msgstr为您喜欢的任何内容,即msgstr "o_-"
我了解到,如果您像这样将翻译留空,msgstr ""应用程序将恢复为msgid。如果您希望它是“空的”,请使用空格。或一个点。或任何时髦的 ASCII 符号。

3. 获取编译器
如上所述,您需要msgfmt来自gettext包,因此您需要输入
$ sudo apt-get install gettext

4. 编译
打开终端,转到修改后的文件夹pt_BR.po,让 msgfmt 检查文件是否有错误:
$ msgfmt --check --check-accelerators=_ -o /dev/null pt_BR.po
如果没有问题,请继续编译它:
$ msgfmt -c -o pt_BR.mo pt_BR.po

5. 放置文件
看看原文是如何翻译的/usr/share/locale/您的语言/LC_MESSAGES/ 或者/usr/share/locale-langpack/您的语言/LC_MESSAGES/命名并将文件放在那里。如果两个地方都不存在,请将其放在其中一个地方,并对文件名进行一些试验:小写、驼峰式或类似 ,即gthumb.moYOUR-APP.mo
首先备份原始文件: 然后将新翻译复制到那里
$ sudo cp /usr/share/locale/YOUR_LANGUAGE/LC_MESSAGES/YOUR-APP.mo /usr/share/locale/YOUR_LANGUAGE/LC_MESSAGES/YOUR-APP.mo.BAK

$ sudo cp pt_BR.mo /usr/share/locale/YOUR_LANGUAGE/LC_MESSAGES/YOUR-APP.mo

如果 YOUR_APP 正在运行,请关闭它的所有实例。
测试一下!

暗示 如果你像我一样运行带有 EN 本地化的 Ubuntu,只需使用任何 *.po,从中删除或注释所有未更改的 msgid/msgstr 对,然后将其放入/usr/share/locale/en/LC_MESSAGES/

资料来源:
http://wiki.xfce.org/translations/translation_guidance_in_xfce

答案4

使用 wmctrl 替换(部分)窗口标题

自从我自己的答案在某些情况下,使用该应用程序的翻译文件对我来说是不够的,我在此基础上Jacob Vlijm 的解决方案并修改了他的脚本以替换窗口标题中的某些字符串。我希望可以将此发布为单独的答案。致谢雅各布·弗莱姆感谢这个想法并制定了脚本!

例如,我喜欢读Some fancy website而不是Some fancy website - Mozilla Firefox。Compiz scale 插件现在更加清晰了,因为我还删除了- File manager和其他字符串。

我做的改变:

  1. 用作//分隔符window_names.txt以允许空格
  2. 使用wmctrl而不是xdotool来修改窗口标题(因为 xdotool 不能很好地处理非 ASCII 字符):wmctrl -i -r [WindowIdentifier] -N 'new Title'
  3. 脚本中有一些额外的行来执行字符串替换等。

修改后的window_names.txt结构如下:
[process name]//[exact text to replace]//[replacement text]

firefox// - Mozilla Firefox// (whitespace!)
thunar// - File Manager// ° xyz
gedit// - gedit// - 123

经过修改的脚本:

#!/usr/bin/env python3
import subprocess
import time
import os

f = os.environ["HOME"]+"window_names.txt"

change = []
lines = open(f).read().splitlines()
for l in lines:
    try:
        change.append(l.split("//"))
    except IndexError:
        pass

get = lambda cmd: subprocess.check_output(cmd).decode("utf-8").strip()
curr_1 = []

while True:
    try:
        curr_2 = get(["wmctrl", "-lp"]).splitlines()
        new = [w for w in curr_2 if not w in curr_1]

        for item in new:
            line = item.split(None, 4)
            winID = line[0] ; pid = line[2] ; currentTitle = line[4]
            procs = get(["ps", "-e"]).splitlines()
            match = [l for l in procs if pid in l][0]
            for app in [app for app in change if app[0] in match]:
                newTitle = str.replace(currentTitle, app[1], app[2])
                subprocess.Popen(["wmctrl", "-i", "-r", winID, "-N", newTitle])
        curr_1 = curr_2
        time.sleep(0.3)
    except:
        pass

再次强调:感谢 Jacob Vlijm 提出这个想法并制定脚本!

相关内容