Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Итоговое упражнение — «Всё вместе»

В этом упражнении вы добавите в Chromium совершенно новую функцию, объединив всё, что уже изучили.

Задание от отдела продуктов

В отдалённом тропическом лесу обнаружено сообщество пикси. Важно как можно скорее доставить им Chromium for Pixies.

Требование — перевести все строки интерфейса Chromium на язык пикси.

Ждать нормальных переводов времени нет, но, к счастью, язык пикси очень близок к английскому, и выяснилось, что есть крейт на Rust, который выполняет такой перевод.

Фактически вы уже подключили этот крейт в предыдущем упражнении.

(Разумеется, настоящий перевод Chrome требует огромной внимательности и тщательности. Не выпускайте это!)

Шаги

Измените ResourceBundle::MaybeMangleLocalizedString так, чтобы она преобразовывала все строки через uwuify перед выводом. В этой специальной сборке Chromium это должно делаться всегда, независимо от значения mangle_localized_strings_.

Если вы всё сделали правильно во всех этих упражнениях, поздравляем: вы создали Chrome для пикси!

Chromium UI screenshot with uwu language
Students will likely need some hints here. Hints include:
  • UTF-16 и UTF-8. Студенты должны понимать, что строки Rust всегда в UTF-8, и обычно решают, что лучше выполнять преобразование на стороне C++ с помощью base::UTF16ToUTF8 и обратно.
  • Если студенты решат выполнять преобразование на стороне Rust, им нужно будет рассмотреть String::from_utf16, обработку ошибок и то, какие типы, поддерживаемые CXX, могут передавать много значений u16.
  • Студенты могут по-разному спроектировать границу C++/Rust, например принимать и возвращать строки по значению или брать изменяемую ссылку на строку. Если используется изменяемая ссылка, CXX, вероятно, скажет студенту, что нужно использовать Pin. Возможно, вам придётся объяснить, что делает Pin, и затем объяснить, зачем CXX нужен Pin для изменяемых ссылок на данные C++: дело в том, что данные C++ нельзя перемещать, как данные Rust, потому что они могут содержать самоссылающиеся указатели.
  • Цели C++, содержащей ResourceBundle::MaybeMangleLocalizedString, понадобится зависимость от цели rust_static_library. Студент, вероятно, уже это сделал.
  • Цели rust_static_library понадобится зависимость от //third_party/rust/uwuify/v0_2:lib.