Збираємо все докупи --- Вправа

У цій вправі ви спробуєте додати абсолютно нову функцію 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:
  • UTF16 vs UTF8. Студенти повинні знати, що рядки Rust завжди мають кодування UTF8, і, ймовірно, вирішать, що краще зробити перетворення на стороні C++ за допомогою base::UTF16ToUTF8 і навпаки.
  • Якщо студенти вирішать виконати перетворення на стороні Rust, їм потрібно буде розглянути String::from_utf16, обміркувати обробку помилок і визначити, які CXX-підтримувані типи можуть передавати багато u16s.
  • Студенти можуть створити межу між C++ і Rust кількома різними способами, наприклад, приймати і повертати рядки за значенням, або приймати мутабельне посилання на рядок. Якщо використовується мутабільне посилання, CXX, ймовірно, скаже студенту, що потрібно використовувати Pin. Можливо, вам доведеться пояснити, що робить Pin, а потім пояснити, навіщо він потрібен CXX для мутабельних посилань на дані C++: відповідь полягає у тому, що дані C++ не можна переміщувати, як дані Rust, оскільки вони можуть містити самопосилальні вказівники.
  • Ціль C++, що містить ResourceBundle::MaybeMangleLocalizedString, повинна залежати від цілі rust_static_biblioteka. Студенти, ймовірно, вже зробили це.
  • Ціль rust_static_library має залежати від //third_party/rust/uwuify/v0_2:lib.