tr 用法

 

tr是Unix系统非常实用的工具,其实用tr做到的事情,几乎都可用sed做到,你可以把tr当作是实现sed许多基本功能的sed“简体”。我认为tr是简单的“字符”处理工具,而sed是功能非常强大的“字符串”处理工具。
 
【注意】tr是单个字符处理工具,而不是字符串处理工具!
 
我自己用过比较实用的例子如下:
 
1、将文件file中出现的"abc"替换为"xyz"
 
# cat file | tr "abc" "xyz" > new_file
 
【注意】这里,凡是在file中出现的"a"字母,都替换成"x"字母,"b"字母替换为"y"字母,"c"字母替换为"z"字母。而不是将字符串"abc"替换为字符串"xyz"。
 
2、使用tr命令“统一”字母大小写
(小写 --> 大写)
# cat file | tr [a-z] [A-Z] > new_file
(大写 --> 小写)
# cat file | tr [A-Z] [a-z] > new_file
 
3、把文件中的数字0-9替换为a-j
 
# cat file | tr [0-9] [a-j] > new_file

4、删除文件file中出现的"Snail"字符
 
# cat file | tr -d "Snail" > new_file
 
【注意】这里,凡是在file文件中出现的'S','n','a','i','l'字符都会被删除!而不是紧紧删除出现的"Snail”字符串。
 
5、删除文件file中出现的换行'/n'、制表'/t'字符
 
# cat file | tr -d "/n/t" > new_file
 
不可见字符都得用转义字符来表示的,这个都是统一的。
 
6、删除“连续着的”重复字母,只保留第一个
 
# cat file | tr -s [a-zA-Z] > new_file
 
7、删除空行
 
# cat file | tr -s "/n" > new_file
 
8、删除Windows文件“造成”的'^M'字符
 
# cat file | tr -d "/r" > new_file
或者
# cat file | tr -s "/r" "/n" > new_file
 
【注意】这里-s后面是两个参数"/r"和"/n",用后者替换前者
 
9、用空格符/040替换制表符/011
 
# cat file | tr -s "/011" "/040" > new_file
 
10、把路径变量中的冒号":",替换成换行符"/n"
 
# echo $PATH | tr -s ":" "/n"

 

<think>好的,我需要回答用户关于如何在Qt中正确使用TR函数进行国际化处理的问题。首先,我得回忆一下Qt的国际化机制,特别是tr()函数的作用和使用方法。根据用户提供的引用内容,tr()函数用于标记需要翻译的文本,然后通过生成.ts文件,使用Qt Linguist进行翻译,最后生成.qm文件供应用程序加载。 首先,应该分步骤说明如何使用tr()函数。第一步是在代码中用tr()包裹所有用户可见的字符串,例如按钮的文本或标签。这时候需要确保所有字符串都是通过tr()传递的,比如`button.setText(tr("Submit"))`。同时要注意,tr()是QObject的成员函数,所以如果是在非QObject子类中使用,可能需要使用Q_DECLARE_TR_FUNCTIONS宏来声明,或者使用QCoreApplication::translate()函数。 接下来,需要说明如何生成翻译文件。用户提到使用lupdate工具提取源代码中的tr()字符串,生成.ts文件。这通常是通过在.pro文件中添加TRANSLATIONS += myapp_zh_CN.ts,然后运行lupdate命令。之后,用Qt Linguist打开.ts文件进行翻译,填写对应的目标语言字符串。完成后,使用lrelease将.ts文件编译成.qm文件。 然后,在应用程序启动时加载.qm文件。这部分需要说明如何使用QTranslator加载翻译文件,并安装到应用程序中。例如: QTranslator translator; if (translator.load("myapp_zh_CN.qm", ":/i18n")) { app.installTranslator(&translator); } 此外,需要注意的一些常见问题,比如动态字符串的处理,可能需要使用arg()方法进行参数替换,或者使用QT_TR_NOOP宏标记在数组中的字符串。还有上下文的问题,tr()函数的上下文默认是类名,但有时候可能需要指定不同的上下文,这时候可以使用QCoreApplication::translate()函数并明确指定上下文。 还要提到在非QObject派生类中使用tr()的情况,比如全局函数或静态类,需要使用Q_DECLARE_TR_FUNCTIONS来添加tr()的支持。此外,在QML中使用qsTr()而不是tr(),这也是Qt国际化的另一个部分,但用户的问题可能集中在C++部分。 最后,应该提醒用户确保在.pro文件中启用翻译支持,比如添加CONFIG += console,但可能不需要,具体取决于项目配置。同时,在代码中正确包含必要的头文件,如QTranslator和QApplication。 可能还需要提到测试翻译的方法,比如切换应用程序的语言环境,或者动态重新加载翻译文件。此外,处理复数形式可能需要使用tr()的复数形式参数,例如`tr("%n item(s)", "", count)`,这样Qt Linguist可以正确处理不同数量的复数形式。 总结下来,步骤大致分为:标记字符串、生成翻译文件、翻译、编译和加载翻译文件。同时需要注意上下文、动态字符串、非QObject类的使用,以及测试和复数处理等问题。根据用户提供的引用,尤其是引用[1][2][3][4],需要将这些内容整合成一个结构清晰的回答,并生成相关问题。</think>在Qt中使用`tr()`函数进行国际化处理需要遵循以下步骤: ### 一、标记可翻译文本 1. **在代码中使用`tr()`包裹字符串** 所有用户可见的文本(如按钮标签、窗口标题等)必须用`tr()`标记。例如: ```cpp QPushButton *button = new QPushButton(tr("Submit")); // 标记按钮文本为可翻译 ``` - **注意**:`tr()`是`QObject`的成员函数。若在非`QObject`派生类(如工具类)中使用,需通过宏`Q_DECLARE_TR_FUNCTIONS`声明支持[^3]。 2. **处理动态字符串** 若字符串包含动态内容(如变量),使用`QString::arg()`占位: ```cpp QString message = tr("File %1 not found").arg(fileName); // 动态插入文件名 ``` --- ### 二、生成翻译文件 1. **配置.pro文件** 在Qt项目文件(.pro)中添加翻译文件路径: ```pro TRANSLATIONS += myapp_zh_CN.ts # 中文翻译文件 ``` 2. **提取可翻译文本** 运行`lupdate`工具扫描代码中的`tr()`字符串并生成.ts文件: ```bash lupdate project.pro # 生成或更新.ts文件 ``` --- ### 三、翻译文本 1. **使用Qt Linguist编辑.ts文件** 打开.ts文件,逐条填写目标语言翻译(如中文): - 若未安装Linguist,可通过Qt Creator菜单操作:**工具 → 外部 → Qt语言家 → 更新翻译**[^4]。 2. **编译为.qm文件** 翻译完成后,使用`lrelease`将.ts文件编译为二进制.qm文件: ```bash lrelease project.pro # 生成.qm文件 ``` --- ### 四、加载翻译文件 在应用程序启动时加载.qm文件: ```cpp #include <QTranslator> #include <QApplication> int main(int argc, char *argv[]) { QApplication app(argc, argv); QTranslator translator; if (translator.load("myapp_zh_CN.qm", ":/i18n")) { // 从资源文件加载 app.installTranslator(&translator); // 安装翻译器 } // 创建主窗口并显示 return app.exec(); } ``` --- ### 常见问题与解决 1. **翻译未生效** - 检查.qm文件路径是否正确。 - 确保`QTranslator`对象在`QApplication`之后创建[^1]。 2. **处理复数形式** 使用`tr()`的复数参数: ```cpp tr("%n item(s)", "", itemCount); // 根据itemCount自动选择单复数形式 ``` 3. **非界面类翻译** 在静态工具类中使用`QT_TR_NOOP`宏标记字符串,后续通过`tr()`引用: ```cpp const char *messages[] = { QT_TR_NOOP("Hello"), QT_TR_NOOP("World") }; QString text = tr(messages[0]); // 实际翻译 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值