| #!/usr/bin/env python |
| # Copyright 2021 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """Generates the list of locales with strings for the current platform. |
| |
| This program generates a file which solely contains a list of locales that will |
| be built for this platform in this build of Chrome (equivalently the locales |
| that we build strings for) passed in as arguments to this script. This allows us |
| to determine what locales we have strings for at runtime without checking the |
| locale data paks on the filesystem with a blocking I/O call. |
| |
| This program can be run with no arguments to run its own unit tests. The first |
| argument is the output filename, and all later arguments are interpreted as |
| locales. |
| |
| This script is run by the //ui/base:locales_list_gen build rule, passing in the |
| gn variable `locales` defined in build/config/locales.gni as arguments. |
| The generated file is then included in ui/base/l10n/l10n_util.h. |
| """ |
| |
| from __future__ import print_function |
| |
| import sys |
| |
| |
| def gen_locale(locale): # type: (str) -> str |
| """Returns the generated code for a given locale in the list.""" |
| # We assume that all locale codes have only letters, numbers and hyphens. |
| assert locale.replace('-', '').isalnum(), locale |
| # clang-format enforces a four-space indent for initializer lists. |
| return ' PLATFORM_LOCALE({locale})'.format(locale=locale) |
| |
| |
| def gen_locales(locales): # type: (list) -> str |
| """Returns the generated code for the locale list. |
| |
| The list is guaranteed to be in sorted order without duplicates. |
| |
| >>> locales = ['en-GB', 'en', 'de', 'en'] |
| >>> generated = gen_locales(locales) |
| >>> locales.pop() # remove the duplicate |
| 'en' |
| >>> locales.sort() |
| >>> index_in_generated = lambda locale: generated.index(gen_locale(locale)) |
| >>> all( |
| ... index_in_generated(prev_locale) < index_in_generated(next_locale) |
| ... for prev_locale, next_locale in zip(locales, locales[1:])) |
| True |
| """ |
| return '\n'.join(gen_locale(locale) for locale in sorted(set(locales))) |
| |
| |
| def main(): # type: () -> None |
| import doctest |
| doctest.testmod() |
| |
| if len(sys.argv) < 2: |
| print('{}: only ran tests'.format(sys.argv[0])) |
| return |
| |
| output = gen_locales(sys.argv[2:]) |
| with open(sys.argv[1], 'w') as f: |
| f.write(output) |
| |
| |
| if __name__ == '__main__': |
| main() |