* Gets a message for a given language code, from a map of messages. * @param {!Object } map * @param {?string|?Element} languageCodeOrElement * @return {?string}
(map, languageCodeOrElement)
| 8645 | * @return {?string} |
| 8646 | */ |
| 8647 | function msg(map, languageCodeOrElement) { |
| 8648 | const defaultMsg = map[DEFAULT_LANGUAGE_CODE]; |
| 8649 | |
| 8650 | // Verify params. |
| 8651 | if (typeof map !== 'object' || !languageCodeOrElement) { |
| 8652 | return defaultMsg; |
| 8653 | } |
| 8654 | |
| 8655 | // Get language code. |
| 8656 | let languageCode = |
| 8657 | typeof languageCodeOrElement === 'string' |
| 8658 | ? languageCodeOrElement |
| 8659 | : getLanguageCodeFromElement(languageCodeOrElement); |
| 8660 | |
| 8661 | // Normalize language code. |
| 8662 | languageCode = languageCode.toLowerCase(); |
| 8663 | languageCode = languageCode.replace(/_/g, '-'); |
| 8664 | |
| 8665 | // Search for a message matching the language code. |
| 8666 | // If a message can't be found, try again with a less specific language code. |
| 8667 | const languageCodeSegments = languageCode.split('-'); |
| 8668 | while (languageCodeSegments.length) { |
| 8669 | const key = languageCodeSegments.join('-'); |
| 8670 | if (key in map) { |
| 8671 | return map[key]; |
| 8672 | } |
| 8673 | |
| 8674 | // Simplify language code. |
| 8675 | // Ex: "en-US-SF" => "en-US" |
| 8676 | languageCodeSegments.pop(); |
| 8677 | } |
| 8678 | |
| 8679 | // There was an attempt. |
| 8680 | return defaultMsg; |
| 8681 | } |
| 8682 | |
| 8683 | /** |
| 8684 | * Gets a language code (ex: "en-US") from a given Element. |
no test coverage detected