Carlos,
So I said it's a workaround method (if there is no other way), and didn't say it is exactly the same implementation mechanism.
The browser UI language is usually the language of the operating system or specified by the browser's startup parameter.
navigator.language(s) is also usually the languages of the operating system by default and users can customize them in the browser settings(chrome://settings/languages). This is also used for the Accept-Language HTTP header.
Although navigator.language may be different from the browser UI language, it is still an acceptable language for users.
Compared with the front pages, the service worker or background page usually requires a small number of messages. So developers can write messages in JS code directly if they don't use chrome.i18n.getMessage() .
By the way, chrome.i18n.getMessage() can't support passing a preferred language as a parameter. If you want to let users change your extension's language independently (don't change browser UI language or OS language), you can't rely on chrome.i18n.getMessage().