Juntando Tudo — Exercício

Neste exercício, você vai adicionar um novo recurso completo do Chromium, juntando tudo o que você já aprendeu.

O Resumo da Gerência de Produto

Uma comunidade de duendes foi descoberta vivendo em uma floresta tropical remota. É importante que entreguemos o Chromium para Duendes a eles o mais rápido possível.

O requisito é traduzir todas as strings de IU do Chromium para o idioma dos Duendes.

Não há tempo para esperar por traduções adequadas, mas, felizmente, o idioma dos duendes é muito próximo do inglês, e descobriu-se que há um crate Rust que faz a tradução.

Na verdade, você já importou esse crate no exercício anterior.

(Obviamente, as traduções reais do Chrome exigem cuidado e diligência incríveis. Não lance isso!)

Passos

Modifique ResourceBundle::MaybeMangleLocalizedString para que ele uwuifique todas as strings antes da exibição. Nesta compilação especial do Chromium, ele deve sempre fazer isso, independentemente da configuração de mangle_localized_strings_.

Se você fez tudo certo em todos esses exercícios, parabéns, você deve ter criado o Chrome para duendes!

Chromium UI screenshot with uwu language
Students will likely need some hints here. Hints include:
  • UTF16 vs UTF8. Os alunos devem estar cientes de que as strings Rust são sempre UTF8 e provavelmente decidirão que é melhor fazer a conversão no lado C++ usando base::UTF16ToUTF8 e vice-versa.
  • Se os alunos decidirem fazer a conversão no lado Rust, eles precisarão considerar String::from_utf16, considerar o tratamento de erros e considerar quais tipos suportados pelo CXX podem transferir muitos u16s.
  • Os alunos podem projetar o limite C++/Rust de várias maneiras diferentes, por exemplo, pegando e retornando strings por valor ou pegando uma referência mutável a uma string. Se uma referência mutável for usada, o CXX provavelmente dirá ao aluno que ele precisa usar Pin. Você pode precisar explicar o que Pin faz e, em seguida, explicar por que o CXX precisa dele para referências mutáveis a dados C++: a resposta é que os dados C++ não podem ser movidos como dados Rust, porque eles podem conter ponteiros auto-referenciais.
  • O alvo C++ contendo ResourceBundle::MaybeMangleLocalizedString precisará depender de um alvo rust_static_library. O aluno provavelmente já fez isso.
  • O alvo rust_static_library precisará depender de //third_party/rust/uwuify/v0_2:lib.