Описание

среда, 24 апреля 2013 г.

Locale hell

Если вы столкнулись с ошибкой:
terminate called after throwing an instance of 'std::runtime_error'
what(): locale::facet::_S_create_c_locale name not valid
То вам сюда!

Я же столкнулся с этой проблемой, когда хотел сделать mongodump/mongorestore сразу после установки MongoDB на только что развернутом новом сервере. В результате мои попытки заканчивались ошибкой упомянутой выше.

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

Чтобы узнать какая локаль сейчас указана системе для использования:
$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
Вот вывод для моей системы показывает, что указана локаль en_US.UTF-8. Чтобы посмотреть список уже скомпилированных локалей в системе:
$ locale -a
C
C.UTF-8
POSIX
Для того чтобы решить обозначенную верху ошибку, нужно либо указать системе в качестве локали для использования локаль из списка уже имеющихся на системе, либо сгенерировать недостающую локаль самостоятельно. В моем случае недостающая локаль и есть en_US.UTF-8. Генерируем локаль следующим образом:
$ sudo locale-gen en_US.UTF-8
[sudo] password: 
Generating locales...
  en_US.UTF-8... done
Generation complete.
Вот и все!

Комментариев нет:

Отправить комментарий