Bringing It Together — Exercise

在本练习中,您将运用之前所学的全部知识,添加一项全新的 Chromium 功能。

The Brief from Product Management

在偏僻的热带雨林中,发现住着一群小精灵。我们务必尽快创建一款精灵版 Chromium,交付给他们。

要求是将 Chromium 的所有界面字符串翻译为精灵语。

由于时间紧迫,无法等待准确的翻译。但幸运的是,精灵语与英语非常接近,然后我们发现有一个 Rust crate 可以执行此翻译任务。

事实上,您已经 在上一个练习中导入了该 crate

(显然,对 Chrome 进行准确恰当的翻译,需要做到极度细致和全力以赴。请勿交付此产品!)

步骤

修改 ResourceBundle::MaybeMangleLocalizedString,在显示之前对所有字符串进行 uwu 处理。在这个特殊的 Chromium 版本中,无论 mangle_localized_strings_ 的设置如何,都应该始终执行此操作。

如果您正确完成了这些练习中的所有操作,那么恭喜您已经成功创建了一款精灵版 Chrome!

Chromium UI screenshot with uwu language
Students will likely need some hints here. Hints include:
  • UTF16 与 UTF8。学生应注意,Rust 字符串始终采用 UTF8 编码,它们可能会决定在 C++ 端使用 base::UTF16ToUTF8 进行转换,然后再进行反向转换。
  • 如果学生决定在 Rust 端进行转换,则需要考虑使用 String::from_utf16 方法,同时注意错误处理,并确定哪些 CXX 支持的类型可以传输大量 u16s
  • 学生可以通过多种方式设计 C++/Rust 边界,例如按值传递和返回字符串,或对字符串采取可变引用。如果使用可变引用,CXX 可能会提示学生需要使用 Pin 方法。您可能需要解释“Pin”的用途,以及为何 CXX 需要它来对 C++ 数据进行可变引用:原因是 C++ 数据无法像 Rust 数据那样自由移动,它可能包含自引用指针。
  • 对于包含 ResourceBundle::MaybeMangleLocalizedString 的 C++ 目标,需要依赖于 rust_static_library 目标。学生可能已经执行了此操作。
  • rust_static_library 目标需要依赖于 //third_party/rust/uwuify/v0_2:lib