Доброго времени сутоке. Во время работы над админ частью одного русскоязычного ресурса, появилась необходимость, что бы вся админка была на русском языке. В самой SonataAdminBundle файлик такой есть, и это не вызвывает сложностей. Но как оказалось, подключенная к AdminBundle другой Сонатовский бандл, а именно SonataMediaBundle не обладает таким интерфейсом. Собственно появилось необходимость перевести его, так как не нашел в сети. Что из этого получилось? Прошу под кат.
Собственно сам процесс назначения текущего языка в Symfony находится в файле app/config/config.yml находим там строчку translator: { fallback: %locale% } (если закомментирована, то раскоментируйте ее). После наш путь лежит в файл app/config/parameters.yml в нем находим строчку locale: en и меняем на locale: ru. Итак, саму Symfony к русскому языку мы подготовили.
Действия, который необходимо выполнить далее. Если у вас установлена Sonata (а я предполагаю что так и есть), то у вас в папке src должна быть папка Application в ней папка Sonata и при условии включения SonataMediaBundle должна появиться папка MediaBundle. Если так и есть, то идем туда. (Если такой не возникло, спрашивайте в комментах или пиши на мыло: sin666m4a1fox@gmail.com). В папке src/Application/Sonata/MediaBundle находим папку Resources, а в ней папку translations. Собственно в ней и создаем файл SonataMediaBundle.ru.xliff с таким содержимым:
<?xml version="1.0"?> <xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2"> <file source-language="en" datatype="plaintext" original="file.ext"> <body> <trans-unit id="default"> <source>default</source> <target>По Умолчанию</target> </trans-unit> <trans-unit id="sidemenu.link_edit_media"> <source>sidemenu.link_edit_media</source> <target>Редактировать</target> </trans-unit> <trans-unit id="sidemenu.link_media_view"> <source>sidemenu.link_media_view</source> <target>Просмотр</target> </trans-unit> <trans-unit id="breadcrumb.link_media_create"> <source>breadcrumb.link_media_create</source> <target>Создать</target> </trans-unit> <trans-unit id="breadcrumb.link_media_list"> <source>breadcrumb.link_media_list</source> <target>Медиа</target> </trans-unit> <trans-unit id="breadcrumb.link_media_edit"> <source>breadcrumb.link_media_edit</source> <target>Редактировать</target> </trans-unit> <trans-unit id="breadcrumb.link_media_view"> <source>breadcrumb.link_media_view</source> <target>Просмотр</target> </trans-unit> <trans-unit id="breadcrumb.link_media_delete"> <source>breadcrumb.link_media_delete</source> <target>Удалить</target> </trans-unit> <trans-unit id="breadcrumb.link_gallery_create"> <source>breadcrumb.link_gallery_create</source> <target>Создать</target> </trans-unit> <trans-unit id="breadcrumb.link_gallery_list"> <source>breadcrumb.link_gallery_list</source> <target>Галереи</target> </trans-unit> <trans-unit id="breadcrumb.link_gallery_edit"> <source>breadcrumb.link_gallery_edit</source> <target>Редактировать</target> </trans-unit> <trans-unit id="breadcrumb.link_gallery_delete"> <source>breadcrumb.link_gallery_delete</source> <target>Удалить</target> </trans-unit> <trans-unit id="media"> <source>media</source> <target>Медиа</target> </trans-unit> <trans-unit id="gallery"> <source>gallery</source> <target>Галерея</target> </trans-unit> <trans-unit id="title_select_provider"> <source>title_select_provider</source> <target>Выбрать медиа поставщика</target> </trans-unit> <trans-unit id="no_provider_available"> <source>no_provider_available</source> <target>Поставщик не доступен</target> </trans-unit> <trans-unit id="title.media_preview"> <source>title.media_preview</source> <target>Предпросмтр</target> </trans-unit> <trans-unit id="title.media_thumbnail"> <source>title.media_thumbnail</source> <target>Миниатюра</target> </trans-unit> <trans-unit id="title.informations"> <source>title.informations</source> <target>Информация</target> </trans-unit> <trans-unit id="label.size"> <source>label.size</source> <target>Размер</target> </trans-unit> <trans-unit id="label.width"> <source>label.width</source> <target>Ширина</target> </trans-unit> <trans-unit id="label.height"> <source>label.height</source> <target>Высота</target> </trans-unit> <trans-unit id="label.content_type"> <source>label.content_type</source> <target>Тип контента</target> </trans-unit> <trans-unit id="label.copyright"> <source>label.copyright</source> <target>Лицензия</target> </trans-unit> <trans-unit id="label.author_name"> <source>label.author_name</source> <target>Автор</target> </trans-unit> <trans-unit id="label.cdn"> <source>label.cdn</source> <target>Сеть доставки контента</target> </trans-unit> <trans-unit id="label.to_be_flushed"> <source>label.to_be_flushed</source> <target>Flushable</target> </trans-unit> <trans-unit id="label.flushed_at"> <source>label.flushed_at</source> <target>Опубликовано: </target> </trans-unit> <trans-unit id="label.public_url"> <source>label.public_url</source> <target>Публичная Ссылка</target> </trans-unit> <trans-unit id="label.name"> <source>label.name</source> <target>Имя</target> </trans-unit> <trans-unit id="label.file"> <source>label.file</source> <target>Файл</target> </trans-unit> <trans-unit id="label.author"> <source>label.author</source> <target>Автор</target> </trans-unit> <trans-unit id="label.enabled"> <source>label.enabled</source> <target>Включить</target> </trans-unit> <trans-unit id="label.cdn_is_flushable"> <source>label.cdn_is_flushable</source> <target>Flush CDN</target> </trans-unit> <trans-unit id="label.video_reference"> <source>label.video_reference</source> <target>Изменить видео</target> </trans-unit> <trans-unit id="label.description"> <source>label.description</source> <target>Описание</target> </trans-unit> <trans-unit id="title.formats"> <source>title.formats</source> <target>Форматы</target> </trans-unit> <trans-unit id="label.select_context"> <source>label.select_context</source> <target>Контекст: </target> </trans-unit> <trans-unit id="label.select_provider"> <source>label.select_provider</source> <target>Тип : </target> </trans-unit> <trans-unit id="link.all_providers"> <source>link.all_providers</source> <target>Все</target> </trans-unit> <trans-unit id="sonata.media.provider.dailymotion"> <source>sonata.media.provider.dailymotion</source> <target>DailyMotion</target> </trans-unit> <trans-unit id="sonata.media.provider.youtube"> <source>sonata.media.provider.youtube</source> <target>YouTube</target> </trans-unit> <trans-unit id="sonata.media.provider.vimeo"> <source>sonata.media.provider.vimeo</source> <target>Vimeo</target> </trans-unit> <trans-unit id="sonata.media.provider.image"> <source>sonata.media.provider.image</source> <target>Изображение</target> </trans-unit> <trans-unit id="sonata.media.provider.file"> <source>sonata.media.provider.file</source> <target>Файлы</target> </trans-unit> <trans-unit id="label.protected_download_url"> <source>label.protected_download_url</source> <target>Защищенная ссылка</target> </trans-unit> <trans-unit id="description.roles_download_strategy"> <source>description.roles_download_strategy</source> <target>Медиа файлы могу быть добавленны пользователями с ролями : %roles%.</target> </trans-unit> <trans-unit id="label.protected_download_url_notice"> <source>label.protected_download_url_notice</source> <target>Предупреждения</target> </trans-unit> <trans-unit id="description.public_download_strategy"> <source>description.public_download_strategy</source> <target>Медиа файлы могут быть добавлены кем угодно.</target> </trans-unit> <trans-unit id="description.forbidden_download_strategy"> <source>description.forbidden_download_strategy</source> <target>Медиа файлы не могут быть добавленны никем.</target> </trans-unit> <trans-unit id="link.test_protected_url"> <source>link.test_protected_url</source> <target>Ссылка для скачивания</target> </trans-unit> <trans-unit id="label.edit_with_pixlr"> <source>label.edit_with_pixlr</source> <target>Редактировать файлы с помощью Pixlr</target> </trans-unit> <trans-unit id="label.pixlr_warning"> <source>label.pixlr_warning</source> <target> <![CDATA[ <span class="label important">Important</span> you are going to expose the media to an <strong>external service</strong>. <br /> If you are working on confidentiel materials, please do not use this service. ]]> </target> </trans-unit> <trans-unit id="label.pixlr_express_editor"> <source>label.pixlr_express_editor</source> <target> <![CDATA[ <strong style="color: white">Express Editor</strong> <br /> Simple interface for quick editing ]]> </target> </trans-unit> <trans-unit id="label.pixlr_advanced_editor"> <source>label.pixlr_advanced_editor</source> <target> <![CDATA[ <strong style="color: white">Advanced Editor</strong> <br /> Experimented users only ]]> </target> </trans-unit> <trans-unit id="form.label_enabled"> <source>form.label_enabled</source> <target>Включить</target> </trans-unit> <trans-unit id="form.label_media"> <source>form.label_media</source> <target>Средняя</target> </trans-unit> <trans-unit id="form.label_position"> <source>form.label_position</source> <target>Позиция</target> </trans-unit> <trans-unit id="form.label_context"> <source>form.label_context</source> <target>Контекст</target> </trans-unit> <trans-unit id="form.label_name"> <source>form.label_name</source> <target>Имя</target> </trans-unit> <trans-unit id="form.label_default_format"> <source>form.label_default_format</source> <target>Формат</target> </trans-unit> <trans-unit id="form.label_gallery_has_medias"> <source>form.label_gallery_has_medias</source> <target>Медиа</target> </trans-unit> <trans-unit id="form.label_author_name"> <source>form.label_author_name</source> <target>Автор</target> </trans-unit> <trans-unit id="form.label_cdn_is_flushable"> <source>form.label_cdn_is_flushable</source> <target>Flush CDN</target> </trans-unit> <trans-unit id="form.label_description"> <source>form.label_description</source> <target>Описание</target> </trans-unit> <trans-unit id="form.label_copyright"> <source>form.label_copyright</source> <target>Лицензия</target> </trans-unit> <trans-unit id="list.label_enabled"> <source>list.label_enabled</source> <target>Включить</target> </trans-unit> <trans-unit id="list.label_name"> <source>list.label_name</source> <target>Имя</target> </trans-unit> <trans-unit id="list.label_context"> <source>list.label_context</source> <target>Контекст</target> </trans-unit> <trans-unit id="list.label_default_format"> <source>list.label_default_format</source> <target>Формат</target> </trans-unit> <trans-unit id="list.label__action"> <source>list.label__action</source> <target>Действие</target> </trans-unit> <trans-unit id="list.label_custom"> <source>list.label_custom</source> <target>Пользовательский</target> </trans-unit> <trans-unit id="filter.label_name"> <source>filter.label_name</source> <target>Имя</target> </trans-unit> <trans-unit id="filter.label_provider_reference"> <source>filter.label_provider_reference</source> <target>Ссылка на поставщика</target> </trans-unit> <trans-unit id="filter.label_enabled"> <source>filter.label_enabled</source> <target>Включить</target> </trans-unit> <trans-unit id="filter.label_context"> <source>filter.label_context</source> <target>Контекст</target> </trans-unit> </body> </file> </xliff>
Переводил это дело сам, и где то используя google translation поэтому могут быть (а наверно и есть) ошибки, но вы вольны менять значения русской версии по своему усмотрению и по своим требованиям.
P.S. Если что то лишнее в файле затесалось, то прошу прощения, возможно строки из проекта и там засветились. Собственно вот и все. Простой способ сделать в SonataMediaBundle свой перевод кнопок и строк. Всем удачи. До новых встреч.
P.S.S Не нашел как оформить файл xliff ибо хабровский source сбрасывает и делает не реальным чтение файла. Уж простите, может кто подскажет :)
Автор: m4a1fox