Итоговое упражнение — «Всё вместе»
В этом упражнении вы добавите в Chromium совершенно новую функцию, объединив всё, что уже изучили.
Задание от отдела продуктов
В отдалённом тропическом лесу обнаружено сообщество пикси. Важно как можно скорее доставить им Chromium for Pixies.
Требование — перевести все строки интерфейса Chromium на язык пикси.
Ждать нормальных переводов времени нет, но, к счастью, язык пикси очень близок к английскому, и выяснилось, что есть крейт на Rust, который выполняет такой перевод.
Фактически вы уже подключили этот крейт в предыдущем упражнении.
(Разумеется, настоящий перевод Chrome требует огромной внимательности и тщательности. Не выпускайте это!)
Шаги
Измените ResourceBundle::MaybeMangleLocalizedString так, чтобы она преобразовывала все строки через uwuify перед выводом. В этой специальной сборке Chromium это должно делаться всегда, независимо от значения mangle_localized_strings_.
Если вы всё сделали правильно во всех этих упражнениях, поздравляем: вы создали Chrome для пикси!
- 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.