当前位置: 首页 > news >正文

Qt Linguist手册

概述

Qt 为将 Qt C++ 和 Qt Quick 应用程序翻译成当地语言提供了出色的支持。发布经理、翻译和开发人员可以使用 Qt 工具来完成他们的任务。

  • 发布经理对应用程序的发布负总责。通常,他们负责协调开发人员和翻译人员的工作。他们可以使用 lupdate 工具同步源代码和翻译,并使用 lrelease 工具创建运行时翻译文件,供发布的应用程序使用。
  • 翻译人员翻译人员翻译人员可以使用 Qt Linguist 工具翻译应用程序中的文本。除了启动程序和使用文本编辑器或文字处理器的能力外,不需要任何计算机知识。
  • 开发人员必须创建能够使用翻译文本的 Qt 应用程序。他们还应该帮助翻译人员识别短语出现的上下文。开发人员可以使用教程来了解他们的任务。

有关支持的语言和书写系统的更多信息,请参阅 Qt 的国际化。

发布经理

布管理器有两个工具:lupdate 和 lrelease。这些工具可以处理 qmake 项目文件,也可以直接在文件系统上运行。

创建翻译文件

翻译文件包含应用程序中所有用户可见的文本和 Ctrl 键加速符,以及这些文本的翻译。

创建翻译文件:

  1. 运行 lupdate 生成第一套翻译源 (TS) 文件,其中包含所有用户可见文本,但没有翻译。
  2. 将 TS 文件交给译员,译员使用 Qt Linguist 添加翻译。Qt 语言学家会处理任何更改或删除的源文本。
  3. 运行 lupdate,将添加到应用程序中的任何新文本纳入其中。lupdate 会将应用程序中用户可见的文本与翻译同步。它不会破坏任何数据。
  4. 要释放应用程序,请运行 lrelease 来读取 TS 文件,并生成应用程序在运行时使用的 QM 文件。

要让 lupdate 成功运行,它必须知道要生成哪些翻译文件。这些文件列在应用程序的 .pro Qt 项目文件中。

使用 lupdate

使用方法:lupdate myproject.pro lupdate 命令行工具在指定的源代码、头文件和 Qt Designer 界面文件中查找可翻译的字符串,并生成或更新 .ts 翻译文件。 要处理的文件和要更新的文件可以在命令行中设置,也可以在作为命令行参数指定的 .pro 文件中提供。

您可按以下方式为单个 QML 文件生成翻译文件:

lupdate main.qml -ts main_en.ts

要制作另一种语言(如法语)的翻译文件,可将 main_en.ts 复制到 main_fr.ts,然后翻译法语 TS 文件中的字符串。lupdate 会处理 .qrc 文件中列出的 QML 文件:

RESOURCES += qml.qrc

让 lupdate 处理所有 QML 文件:

lupdate application.qrc -ts myapp_en.ts

您还可以处理所有 QML 文件,而无需使用 .qrc 文件:

lupdate -extensions qml -ts myapp_en.ts

如果您主要处理 QML 文件,但也有包含要翻译的字符串的 C++ 代码,您可以将其添加到同一命令中:

lupdate qml.qrc filevalidator.cpp -ts myapp_en.ts

翻译文件可以在 .pro 文件中提及,但也可以不提及,只在命令行中指定翻译文件。 例如,生成用于英语和法语的 .ts 文件:

lupdate qml.qrc filevalidator.cpp -ts myapp_en.ts myapp_fr.ts

生成的翻译文件交给翻译人员,翻译人员使用 Qt Linguist 阅读文件并插入译文。

内部有翻译人员的公司可能会发现,随着应用程序的开发,定期运行 lupdate(也许每月运行一次)是非常有用的。这将使翻译工作量在项目生命周期内平均分配,并允许翻译人员同时支持多个项目。

根据需要聘用翻译的公司可能更倾向于在应用程序生命周期内只运行几次 lupdate。第一次可能是在第一个测试阶段之前。这将为译员提供大量的单块工作,而且译员发现的任何错误都可以很容易地与在初始测试阶段发现的错误混在一起。第二次和任何后续的 lupdate 运行可能会在最终测试阶段进行。

lupdate 还可以处理本地化交换文件格式(XLIFF)格式的文件;这种格式的文件通常以 .xlf 后缀结尾。

注意:XLIFF 格式文件的最低支持版本为 1.1。不支持 XLIFF 1.0 版本的文件。

向 lupdate 传递 -help 选项可查看支持的选项。

Qt Linguist 还能导入和导出 XLIFF 文件。更多信息,请参阅 “翻译器 ”部分。

使用 lrelease

使用方法: lrelease myproject.pro

lrelease 命令行工具可从 TS 文件生成 QM 文件。QM 文件格式是一种紧凑的二进制格式,供本地化应用程序使用。它能为翻译提供极快的查找速度。lrelease 处理的 TS 文件可以在命令行中指定,也可以通过 Qt .pro 项目文件间接提供。

从初始测试版本到最终发布版本,只要应用程序要发布,就会运行该工具。如果没有创建 QM 文件,例如因为在进行任何翻译之前需要发布 alpha 版本,那么应用程序将完全可以使用开发人员在源文件中放置的文本运行。一旦有了 QM 文件,程序就会自动检测并使用它们。

lrelease 也可以在不指定 .pro 文件的情况下运行:

lrelease.exe main_en.ts languages\main_fr.ts

向 lrelease 传递 -help 选项可查看支持的选项。

缺失翻译

lupdate 和 lrelease 均可用于不完整的 TS 翻译源文件。 缺失的翻译将在运行时用母语短语替换。

开发人员

在 Qt 应用程序中,对多语言的支持非常简单,几乎不会增加开发人员的工作量。

Qt 在创建每个窗口时都会为其翻译短语,从而将使用翻译的性能成本降至最低。在大多数应用程序中,主窗口只创建一次。对话框通常只创建一次,然后根据需要显示或隐藏。一旦完成初始翻译,翻译后的窗口就不会再有运行时开销。只有那些创建、销毁和后续创建的窗口才会产生翻译性能成本。

使用 Qt 可以创建可在运行时切换语言的应用程序,但需要一定的开发人员干预,当然也会产生一些运行时性能成本。

在 Qt 项目文件中指定翻译源

要使发布管理器能使用 lupdate 和 lrelease,请指定一个 .pro Qt 项目文件。在项目文件的 TRANSLATIONS 部分,必须为母语之外的每种语言指定一个条目。典型的条目如下:

TRANSLATIONS = arrowpad_fr.ts \arrowpad_nl.ts

在翻译文件名中使用本地语言有助于确定在运行时加载哪种语言。 更多信息,请参阅 QLocale。 lupdate 工具可从应用程序中提取用户界面字符串。 它读取应用程序的 .pro 文件,以确定哪些源文件包含要翻译的文本。 这意味着您的源文件必须列在 .pro 文件的 SOURCES 或 HEADERS 项中,或者列在 RESOURCE 项中的资源文件中。 如果您的文件没有列出,其中的文本将无法找到。 包含四个翻译源文件的完整 .pro 文件示例:

HEADERS         = main-dlg.h \options-dlg.h
SOURCES         = main-dlg.cpp \options-dlg.cpp \main.cpp
FORMS           = search-dlg.ui
TRANSLATIONS    = superapp_dk.ts \superapp_fi.ts \superapp_no.ts \superapp_se.ts

lupdate 默认将所有源代码编码为 UTF-8。 有 BOM(字节序标记)的文件也可以用 UTF-16 或 UTF-32 编码。 将 qmake 变量 CODECFORSRC 设为 UTF-16,可将无 BOM 的文件解析为 UTF-16。 不过,有些编辑器(如 Visual Studio)默认使用不同的编码。 避免编码问题的方法之一是将源代码限制为 ASCII 编码,并对包含其他字符的可翻译字符串使用转义序列:

label->setText(tr("F\374r \310lise"));

应用程序国际化

设计您的应用程序时,应使其能适应各种语言和地区,而无需进行工程修改。Qt 试图让您尽可能轻松地实现国际化。Qt 中的所有输入控件和文本绘制方法都为所有支持的语言提供内置支持。但在为应用程序编写源代码时,您仍需注意以下事项:

  • 让您的应用程序查找并加载相应的翻译文件。
  • 将用户可见文本和 Ctrl 键盘加速器标记为翻译目标。
  • 为要翻译的文本提供上下文。
  • 消除相同文本的歧义。
  • 使用编号参数 (%n) 作为参数占位符,在运行时用文本或数字替换。
  • 将数字、日期、时间和货币国际化。
  • 标记函数外的可翻译数据文本字符串。

您可以开发在同一应用程序中同时使用 C++ 和 QML 源的应用程序,甚至在两种源中都有用户界面字符串。这些工具会创建一个合并的翻译文件,而 C++ 和 QML 都能访问这些字符串。

支持 Qt 应用程序国际化的类请参阅《Qt 的国际化》。使源代码可翻译的过程在《编写用于翻译的源代码》和《Qt Quick 的国际化和本地化》中有描述。

每个需要翻译的文本都需要上下文,以帮助译员确定文本在程序中的位置。如果多个相同的文本需要不同的翻译,译员还需要一些信息来消除源文本的歧义。标记要翻译的文本将自动导致类名被用作基本的上下文信息。在某些情况下,开发人员可能需要添加其他信息来帮助翻译。

部署翻译

应用程序所需的 .qm 文件应放置在使用 QTranslator 的加载器代码可以找到的位置。一般来说,这是通过指定相对于 QCoreApplication::applicationDirPath() 的路径来实现的。

通常,应用程序会有 .qm 文件,如果使用的 Qt 版本未安装在系统上,则还需要部署 Qt 的 .qm 文件。

在 Qt 4 中,每个本地都有一个大的、单一的 .qm 文件。例如,qt_de.qm 文件包含所有库的德语翻译。

在 Qt 5 中,.qm 文件按模块拆分,有一个所谓的元目录文件,其中包含所有模块的 .qm 文件。元目录文件的名称与 Qt 4 单个 .qm 文件的名称相同,因此只要能找到所有包含的 .qm 文件,现有的加载器代码就能像以前一样工作。

不过,没有必要总是部署 Qt 5 的所有 .qm 文件。我们建议在部署步骤中使用工具 lconvert 将所需模块的 .qm 文件连接到一个与元目录文件名相匹配的文件中。例如,要为使用 Qt Core、Qt GUI 和 Qt Quick 模块的应用程序创建德语翻译文件,请运行

lconvert -o installation_folder/qt_de.qm qtbase_de.qm qtdeclarative_de.qm

教程

以下教程说明了如何为翻译准备 Qt 应用程序:

  • Hello tr() 是一个 C++ 应用程序,演示了如何创建 QTranslator 对象。它还演示了如何最简单地使用 tr() 函数来标记用户可见的源文本以进行翻译。
  • Arrow Pad是一个 C++ 应用程序,演示了如何使应用程序加载适用于当前语言的翻译文件。它还展示了 tr() 的双参数形式的使用,该形式可为翻译器提供额外信息。
  • Troll Print是一个 C++ 应用程序,演示了如何区分相同的源文本,即使它们出现在相同的上下文中。本教程还讨论了在应用程序升级时,翻译工具如何帮助最大限度地减少翻译工作。
  • 国际化是一个 Qt Quick 应用程序,演示了如何将 Qt Quick 应用程序国际化。

基于文本 ID 的翻译

文本 ID 翻译机制是一种用于国际化和本地化的 “工业级 ”系统。应用程序中的每个文本都被分配了一个唯一的标识符(文本 ID),这些标识符直接用于源代码中,以代替纯文本。这需要用户界面开发人员做更多的工作,但却使管理大量翻译文本变得更加容易。

注意:您必须在一个应用程序中只使用基于纯文本或基于文本标识符的功能。如果混合使用,最终将导致要翻译的文本不完整。

使用文本 ID 进行国际化

使用文本 ID 代替纯文本时,应用程序国际化的一般方法相同,但细节略有不同:

  1. 基于文本 ID 的翻译系统的函数和宏与纯文本系统不同。您可以使用 qsTrId() 函数代替 qsTr(),使用 QT_TRID_NOOP() 宏代替 QT_TR_NOOP()。
  2. 使用文本 ID 作为用户界面字符串,而不是纯文本字符串。例如,qsTrId(“id-back-not-front”)
  3. 不能使用文本 ID 指定上下文参数。如果有拼写相同但含义不同的单词,这些单词需要单独的文本 ID。例如,qsTrId(“id-back-backstep”) 将区分后步 “Back ”和对象后部 “Back”。
  4. 开发版用户界面中的 “工程英语 ”文本用 //% 注释表示。如果不包含该注释,用户界面中将显示文本 ID。这一点在带有参数的文本中尤为重要。//% 注释需要包含字符串中的参数指示符。例如,//% “文件数:%1”。
  5. 在纯文本系统中,为翻译人员提供额外信息的 //: 注释是可选的。但是,在基于文本 ID 的系统中,这些额外信息变得非常重要,因为如果没有这些额外信息,就只有文本 ID,译员可能无法在没有进一步上下文的情况下进行合理的翻译。您可以使用长的描述性文本 ID,也可以不使用注释,但注释通常更容易理解。

下面的并排代码片段比较了基于文本 ID 的翻译和基于纯文本的翻译:

text-ID-basedplain-text-based
Text {id: backTxt;//: The back of the object, not the front//% "Back"//~ Context Not related to back-steppingtext: qsTrId("id-back-not-front");
}
Text {id: backTxt;//: The back of the object, not the front//~ Context Not related to back-steppingtext: qsTr("Back","Not front")
}

使用文本 ID 进行本地化

使用文本 ID 进行本地化的过程与纯文本大致相同。 使用 lupdate 工具的方法相同,翻译都是在 .ts 文件中进行的:

lupdate <myapp>.pro

请注意,翻译文件中的源值将是文本 ID 而非纯文本。 这意味着您需要描述性很强的文本 ID,或很好的附加注释,或两者兼而有之,以确保译员做出正确的翻译。 上述基于文本 ID 的用户界面文本示例在 .ts 文件中产生了以下内容:

<message id="id-back-not-front"><source>Back</source><extracomment>The back of the object, not the front</extracomment><translation type="unfinished"></translation><extra-Context>Not related to back-stepping</extra-Context>
</message>

使用 lrelease 时,需要指定翻译文本的键基于文本 ID,而不是纯文本。 如果代码中的字符串是用 qsTr() 指定的,则没有设置 "id "属性,因此 lrelease 会忽略它们。 该命令将生成应用程序的所有编译翻译 .qm 文件:

lrelease -idbased <myapp>.pro

但是,如果给定文本没有可用的翻译(通常在开发后期才会出现这种情况),用户界面中将显示文本 ID,而不是正确的文本。 为了使应用程序在测试时更可用,可以让 lrelease 使用 "工程英语 "源文本(来自 //% 注释)作为翻译文本,并用一些指示符标记它,这样就可以看到尚未翻译的文本。 例如,该命令会生成 .qm 文件,并在未翻译文本前加上"!":

lrelease -idbased -markuntranslated ! <myapp>.pro

高级用法

对于针对大量本地语言的项目,可以删除 .pro 文件中的 TRANSLATIONS 信息,转而使用单独的脚本管理翻译。 脚本可为每个目标调用 lrelease 和 lupdate。 更新脚本可以这样编写

lupdate -recursive <project-dir> -ts <project-dir>/i18n/myapp-text_en_GB.ts
lupdate -recursive <project-dir> -ts <project-dir>/i18n/myapp-text_en_US.ts
...

生成最终 .qm 文件的脚本可以这样编写:

lrelease -idbased <project-dir>/i18n/myapp-text_en_GB.ts
lrelease -idbased <project-dir>/i18n/myapp-text_en_US.ts
...

Qt Linguist Manual

相关文章:

Qt Linguist手册

概述 Qt 为将 Qt C 和 Qt Quick 应用程序翻译成当地语言提供了出色的支持。发布经理、翻译和开发人员可以使用 Qt 工具来完成他们的任务。 发布经理对应用程序的发布负总责。通常&#xff0c;他们负责协调开发人员和翻译人员的工作。他们可以使用 lupdate 工具同步源代码和翻…...

【简介Sentinel-1】

Sentinel-1是欧洲航天局哥白尼计划&#xff08;GMES&#xff09;中的地球观测卫星&#xff0c;由Sentinel-1A和Sentinel-1B两颗卫星组成。以下是对Sentinel-1的详细介绍&#xff1a; 一、基本信息 卫星名称&#xff1a;Sentinel-1 所属计划&#xff1a;欧洲航天局哥白尼计划…...

第 17 场小白入门赛蓝桥杯

第 17 场小白入门赛 2 北伐军费 发现每次选大的更优&#xff0c;所以可以排序之后&#xff0c;先手取右边&#xff0c;后手取左边。 实际发现&#xff0c;对于 A − B A-B A−B 的结果来说&#xff0c;后手对于这个式子的贡献是 − − a i --a_i −−ai​ &#xff0c;也就…...

@antv/x6 导出图片下载,或者导出图片为base64由后端去处理。

1、导出为文件的格式&#xff0c;比如 PNG graph.exportPNG(function (dataURL) {console.log(dataURL);let img document.getElementById(img) as HTMLImageElement;img.src dataURL;},{backgroundColor: #fff,padding: [20, 20, 20, 20],quality: 1,width: graph.options.w…...

从零到精通:AI大模型的全方位学习路径解析,非常详细收藏我这一篇就够了

一、初聊大模型 1、什么是大模型&#xff1f; 大模型&#xff0c;通常指的是在人工智能领域中的大型预训练模型。你可以把它们想象成非常聪明的大脑&#xff0c;这些大脑通过阅读大量的文本、图片、声音等信息&#xff0c;学习到了世界的知识。这些大脑&#xff08;模型&…...

PowerShell脚本在自动化Windows开发工作流程中的应用

PowerShell脚本在自动化Windows开发工作流程中的应用 在当今快速迭代的软件开发环境中&#xff0c;自动化已成为提高开发效率、减少人为错误、保障项目稳定性的重要手段。特别是在Windows平台上&#xff0c;PowerShell以其强大的脚本编写能力和对系统管理的深度集成&#xff0…...

【力扣 | SQL题 | 每日四题】力扣1783,1757,1747,1623,1468,1661

昨天晚上睡着了&#xff0c;今天把昨天的每日一题给补上。 1. 力扣1783&#xff1a;大满贯数量 1.1 题目&#xff1a; 表&#xff1a;Players ------------------------- | Column Name | Type | ------------------------- | player_id | int | | player_na…...

《深入探究 C++中的函数模板特化:开启编程新境界》

在 C的广袤世界中&#xff0c;函数模板特化是一项强大而富有魅力的技术&#xff0c;它为程序员提供了更高的灵活性和效率。本文将带你深入了解 C中函数模板特化是如何实现的&#xff0c;揭开这一神秘面纱&#xff0c;让你在编程之路上更上一层楼。 一、函数模板的基础概念 在…...

RTEMS面试题汇总及参考答案

目录 RTEMS是什么?它在嵌入式系统中扮演什么角色? RTEMS的全称是什么? RTEMS的主要特点有哪些? RTEMS支持哪些处理器架构? RTEMS的可剥夺型内核和不可剥夺型内核有何不同? RTEMS 的微内核设计及其优势 RTEMS 如何实现多任务处理和调度 RTEMS 的任务调度策略有哪…...

螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习03(网络及IP规划)

3 网络及IP规划 3.1 容器连接网络初步规划 规划所有容器与虚拟机的三张网卡以macvlan的方式进行连接&#xff08;以后根据应用可以更改&#xff09;&#xff0c;在docker下创建nat、wifi、nei、wai四张网卡&#xff0c;他们和虚拟机及宿主机上NIC的相关连接参数如下表所示&am…...

BLOOM 模型的核心原理、局限与未来发展方向解析

1. 引言 1.1 BLOOM 模型概述 BLOOM&#xff08;BigScience Large Open-science Open-access Multilingual Language Model&#xff09;是一款由多个国际研究团队联合开发的大型语言模型。BLOOM 模型旨在通过先进的 Transformer 架构处理复杂的自然语言生成与理解任务。它支持…...

Kubernetes 深度洞察:重新认识 Docker 容器的奇妙世界

《Kubernetes 深度洞察:重新认识 Docker 容器的奇妙世界》 在 Kubernetes 的学习进程中,对 Docker 容器的深入理解至关重要。这一节,我们将重新认识 Docker 容器,探索其在 Kubernetes 生态系统中的关键作用。 一、Docker 容器的基本概念 Docker 容器是一种轻量级的虚拟化…...

柔性作业车间调度(FJSP)

1.1 调度问题的研究背景 生产调度是指针对一项可分解的工作(如产品制造),在尽可能满足工艺路线、资源情况、交货期等约束条件的前提下,通过下达生产指令,安排其组成部分(操作)所使用的资源、加工时间及加工的先后顺序,以获得产品制造时间或成本最优化的一项工作。 一般研究车间…...

速盾:游戏用CDN可以吗?

游戏用CDN是一种常见的解决方案&#xff0c;可以提高游戏的网络性能和加载速度。CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;能够将游戏的静态资源分布到全球各地的边缘节点上&#xff0c;使用户可以从离他们最近的节点获取游戏资源&#xf…...

《重生到现代之从零开始的C语言生活》—— 字符函数和字符串函数

字符函数和字符串函数 字符分类函数 大家知道字符是分为很多种类型的 就比如说’a’ ‘1’ A’等等&#xff0c;所以我们需要一种函数来完成字符函数的分类 这就是字符分类函数 函数需要包含头文件<ctype.h> 函数的运行规则是&#xff1a;如果符合下列参数就返回真 …...

双指针:滑动窗口

题目描述 给定两个字符串 S 和 T&#xff0c;求 S 中包含 T 所有字符的最短连续子字符串的长度&#xff0c;同时要求时间复杂度不得超过 O(n)。 输入输出样例 输入是两个字符串 S 和 T&#xff0c;输出是一个 S 字符串的子串。样例如下&#xff1a; 在这个样例中&#xff0c…...

云原生(四十八) | Nginx软件安装部署

文章目录 Nginx软件安装部署 一、Nginx软件部署步骤 二、安装与配置Nginx Nginx软件安装部署 一、Nginx软件部署步骤 第一步&#xff1a;安装 Nginx 软件 第二步&#xff1a;把 Nginx 服务添加到开机启动项 第三步&#xff1a;配置 Nginx 第四步&#xff1a;启动Nginx …...

【WPF开发】如何设置窗口背景颜色以及背景图片

在WPF中&#xff0c;可以通过设置窗口的 Background 属性来改变窗口的背景。以下是一些设置窗口背景的不同方法&#xff1a; 一、设置纯色背景 1、可以使用 SolidColorBrush 来设置窗口的背景为单一颜色。 <Window x:Class"YourNamespace.MainWindow"xmlns&quo…...

USB 3.0?USB 3.1?USB 3.2?怎么区分?

还记得小白刚接触电脑的时候&#xff0c;电脑普及的USB接口大部分是USB 2.0&#xff0c;还有少部分USB 1.0的&#xff08;现在基本上找不到了&#xff09;。 当时的电脑显示器&#xff0c;可能00后的小伙伴都没见过&#xff0c;它们大概长这样&#xff1a; 当时小白以为电脑最…...

Gitlab实战教程:打造企业级代码托管与协作平台!

目录 一、Gitlab概述1、Gitlab简介&#xff08;1&#xff09;Gitlab的定义&#xff08;2&#xff09;Gitlab与Git的关系&#xff08;3&#xff09;Gitlab的主要功能 2、Gitlab与Git的关系&#xff08;1&#xff09;Git的基本概念&#xff08;2&#xff09;Gitlab与Git的关联&am…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...