Рекомендации по интернационализации инструментов-скриптов

Чтобы создать инструмент-скрипт, который хорошо работает на разных языках и в разных региональных стандартах, важно следовать рекомендациям.

Избегайте распространенных проблем, связанных с региональными настройками

В исходном коде инструмента есть две функции для получения значения параметра:

  • GetParameter—Возвращает значение параметра в виде объекта.
  • GetParameterAsText—Возвращает значение параметра в виде строки.

Если тип данных является одним из следующих типов, arcpy.GetParameter - это предпочтительный метод, так как возвращаются встроенные типы Python.

  • Date (GPDate)—Возвращает объект datetime.datetime.
  • Double (GPDouble)—Возвращает тип с плавающей запятой.
  • Long (GPLong)—Возвращает целочисленный тип.

Использование GetParameter снижает вероятность ошибки обработки. Функция GetParameterAsText предпочтительнее, если тип данных не является одним из трех вышеупомянутых. Однако если требуется какая-либо обработка строки, вы должны быть осторожны, чтобы избежать ошибок и возвращаемое значение анализировалось правильно.

Избегайте представления числовых значений в виде строк при написании кода ArcPy. При представлении значения координат в виде строки вы, вероятно, столкнетесь с ошибкой при запуске кода в другом региональном стандарте. Например, если первый следующий пример используется во французской локали, код, скорее всего, даст сбой, поскольку в коде используются точки для десятичных разделителей, а в большинстве французских локалей используются запятые. Если необходимо представить числовые значения в виде строк, обратитесь к следующему разделу модуля Python locale для получения рекомендаций.

Представление числовых значений в виде строки. Это не рекомендуется.

x_coordinate = "-118.24982695975127"
y_coordinate = "34.04771282043386"

Представление числовых значений в виде числового типа.

x_coordinate = -118.24982695975127
y_coordinate = 34.04771282043386

Обработка ошибок в ArcPy

Если ваш инструмент-скрипт включает обработку ошибок для потенциальных ошибок геообработки, используйте идентификатор ошибки вместо всей строки ошибки. В сообщениях об ошибках инструмента геообработки содержимое после двоеточия переводится на разные языки.

Проверьте сообщения на наличие всей строки ошибки. Это будет работать, только если сообщения на английском языке.

try:
    arcpy.analysis.Buffer("cities", "cities_buffer", "500 meters")
except Exception:
    # Catch "ERROR 000732: Input Features: Dataset cities does not exist or is not supported"
    message = "ERROR 000732: Input Features: Dataset cities does not exist or is not supported"
    if message in arcpy.GetMessages(2):
        # Take some action

Проверьте сообщения на наличие всей строки ошибки. Этот подход работает независимо от языка или регионального стандарта. Поскольку компонент ERROR 000732 сообщения не переведен, сравнение будет действительным для всех региональных стандартов и языков.

try:
    arcpy.analysis.Buffer("cities", "cities_buffer", "500 meters")
except arcpy.ExecuteError as err:
    # Catch "ERROR 000732: Input Features: Dataset cities does not exist or is not supported"
    message_id = "ERROR 000732"
    if message_id in arcpy.GetMessages(2):
        # Take some action

Модуль Python locale

Модуль Python locale включает функции локализации, которые можно реализовать в инструменте-скрипте.

Функция locale.atof преобразует строку в число с плавающей запятой и переводит локализованные числа в нормализованный формат. Это полезно при преобразовании строк с десятичными разделителями из неанглийской локали в английскую локаль.

# Import the locale module
import locale

# Use user's default locale settings
locale.setlocale(locale.LC_ALL, '')

# These are coordinates returned assuming the user's locale is French (France).
x_coordinate = "-118,24982695975127"
y_coodinate = "34,04771282043386"

# The output is normalized.
# The following value will be -118.24982695975127 (float).
x_coord_localized = locale.atof(x_coordinate)

# The following value will be 34.04771282043386 (float).
y_coord_localized = locale.atof(y_coordinate)

Подобно locale.atof, функция locale.atoi преобразует строку в целое число и переводит локализованные числа в нормализованный формат.

# Import the locale module
import locale

# Use user's default locale settings
locale.setlocale(locale.LC_ALL, '')

num_books = "737"

num_books_localized = locale.atoi(num_books)

Избегайте разделителей с жестким кодированием, используя locale.localeconv() для идентификации десятичных разделителей и разделителей разрядов. Это гарантирует, что входные данные всегда будут иметь соответствующий региональному стандарту разделитель разрядов и десятичный разделитель.

# Import the locale module
import locale

# Use user's default locale settings
locale.setlocale(locale.LC_ALL, '')

# Obtain the current locale's separators
thousands_sep = locale.localeconv()['thousands_sep']
decimal_sep = locale.localeconv()['decimal_point']

input_linear_unit = f"2{thousands_sep}259{decimal_sep}50 Miles"

Объект SpatialReference

Объект SpatialReference может быть создан с использованием трех типов входных данных.

  • Использование "заводского" кода системы координат (или авторского кода или WKID).

    Этот метод предпочтительнее, поскольку он не зависит от регионального стандарта (это означает, что число, используемое для ссылки на эту пространственную привязку, останется одним и тем же независимо от регионального стандарта).

    # EPSG:4301 Tokyo
    sr = arcpy.SpatialReference(4301)

  • Использование канонического имени системы координат.

    Этот метод похож на использование "заводского" кода, поскольку он также не зависит от регионального стандарта.

    # EPSG:4301 Tokyo
    sr = arcpy.SpatialReference("GCS_Tokyo")
    
    # To obtain a spatial reference's canonical name, you can use the factory code along with the command below
    sr_canonical_name = arcpy.SpatialReference(4301).name

  • Использование отображаемого имени системы координат.

    Этого метода следует избегать, если код будет выполняться в разных региональных стандартах или языковых пакетах.

    # EPSG:4301 Tokyo
    sr = arcpy.SpatialReference("Tokyo")

    Ниже показан код, выполняемый в японском языковом пакете. Использование отображаемого имени пространственной привязки на английском языке не работает и возвращает ошибку. Каждый языковой пакет будет иметь уникально переведенное отображаемое имя; однако каноническое имя и "заводской" код останутся неизменными независимо от языка или регионального стандарта. Окно Python в японском языковом пакете с примером пространственной привязки