Новое в Symfony 2.6: Прощай, ICU компонент

Если вы являетесь разработчиком на Symfony, вы, вероятно, в курсе печально известной проблемы в Intl при установке или развертывании приложений Symfony.

Следующее сообщение об ошибке является обычным ее симптомом:

Installing dependencies (including require-dev) from lock file
Your requirements could not be resolved to an installable set of packages.

Problem 1
  - Installation request for symfony/icu v1.2.x -> satisfiable by symfony/icu[v1.2.x].
  - symfony/icu v1.2.x requires lib-icu >=4.4 -> the requested linked library icu
    has the wrong version installed or is missing from your system, make sure to
    have the extension providing it.
Problem 2
  - symfony/icu v1.2.x requires lib-icu >=4.4 -> the requested linked library icu
    has the wrong version installed or is missing from your system, make sure to
    have the extension providing it.
  - symfony/intl v2.5.0 requires symfony/icu ~1.0-RC -> satisfiable by symfony/icu[v1.2.x].
  - Installation request for symfony/intl v2.5.0 -> satisfiable by symfony/intl[v2.5.0].

Хорошей новостью в том, что в Symfony 2.6 эта проблема исчезнет навсегда. Не имеет значения, как вы установили PHP или вашу конкретную операционную систему, вы никогда не увидите эту ошибку снова. Кроме того, как эта проблема была настолько раздражающей, что мы решили внести изменения и в предыдущие версии Symfony. Это означает, что вы больше не увидите эту проблему снова в новых версиях Symfony 2.3 и 2.5. Вопрос пока останется не решенным для Symfony 2.4, потому что эта версия больше не поддерживается.

Общая картина инернационализации Symfony

Чтобы лучше понять причину этой проблемы и ее решения важно представить общую картину проектов и систем, в нее вовлеченных:

  • Проект CLDR собирает и сохраняет данные интернационализации, например, названия стран и языка, валюты метаданных, количество форматов, почтовый индекс и номер телефона форматов. Данные CLDR используется во всех смартфонах, операционных систем и важных программных приложений, разработанных такими компаниями, как Apple, Google, Microsoft и IBM.
  • Проект ICU использует данные CLDR и строит C и Java-классы по поверх них, такие как NumberFormatter, IntlDateFormatter, Collator и ResourceBundle.
  • Расширение интернационализации PHP делает некоторые классы ICU доступными в PHP, но не ограничивается данными CLDR. Он использует данные, установленные в системе (которая не зависит от PHP).
  • Компонент Symfony Icu включает в себя все данные CLDR, потому что Symfony необходим доступ к данным в любом месте, независимо от конфигурации системы. Мы даже предложили различные версии: если у вас не было установлено расширение intl, вы должны были установить Icu 1.0.x, который поставляется как набор .php файлов. С расширением intl, вы должны были использовать версии 1.1.x или 1.2.x, в которых данные поставляется, как двоичные файлы, считываемые с помощью класса ResourceBundle.
  • Компонент интернационализации Symfony делает две вещи: во-первых, он обеспечивает доступ к данным компонента Icu Intl::get*Bundle()->get*()). Во-вторых, она обеспечивает частичную реализацию PHP для некоторых классов ICU (NumberFormatter), которые можно использовать, когда расширение intl не установлено.

Понимание решения

Для того чтобы решить эту проблему,  Intl компонент теперь включает в себя все данные CLDR. Как следствие, компонент Icu теперь является устаревшим, поскольку в нем больше нет необходимости.

Кроме того, если у вас нет установленного расширения intl, до настоящего момента вы могли получить доступ только к данным CLDR на английском языке. Теперь, вы можете получить доступ ко всем данным для всех языков, независимо от того, установлен ли intl или нет.

Учитывая большое количество информации, содержащейся в данных CLDR, вас может обеспокоить перспектива увеличения общего размера установки Symfony при загрузке. Но даже если данные хранятся в JSON, а не в двоичном формате, общий размер сжатого файла примерно 2 Мб.

 

Источник: http://symfony.com/blog/new-in-symfony-2-6-farewell-to-icu-component

Добавить комментарий

Ваш адрес email не будет опубликован.

двадцать − 12 =