Просмотрел
, но оказалось несколько не то, что искал.
Подскажите, пожалуйста, как для мультиязычных сайтов организовать корректный вывод своих полей профиля? К примеру, заносим в поле "Заголовок" - значение "Имя". Сейчас неважно какой язык на сайте выбран - отображаться будет то значение, которое вводится в админке. Понятное дело, что в языковых файлах для перевода (*.po) это не поправить. А хотелось бы, чтобы было красиво, и если сайт в данный момент на английском языке, то отображается "Name", соответственно в "русском режиме" - "Имя". Стандартные поля WP-Recall замечательно переведены, а как быть со своими?
В данный момент на сайте стоит WPGlobus, но он не "подхватывает" "Поля профиля" из WP-Recall. Может он "виноват", и существует правильный способ решить проблему?
P.S. Переводить "на лету", как делает GTranslate не хотелось бы...
С уважением,
Андрей.
Все вкладки личного кабинета хранят свои данные в БД, поэтому локализовать их путем формирования файла локализации не выйдет, надо прогонять вкладки через фильтр rcl_tabs внутри своей функции и локализовать.
Для этого можно использовать такую конструкцию:
add_filter( 'rcl_tabs', 'tabs_translate', 10 ); function tabs_translate( $tabs) { $tabs['tab_id1']['name'] = __('Name tab 1'); $tabs['tab_id2']['name'] = __('Name tab 2'); $tabs['tab_id3']['name'] = __('Name tab 3'); return $tabs; }
т.е. перечисляете тут вкладки, которые вам требуется локализовать, где вместо tab_id1 указываете реальный идентификатор своей вкладки и наименование, которое будете использовать для вкладки внутри функции локализации.
Далее формируете, например, через poedit файл .po куда будут включены эти строки и переводите их на нужные вам языки, останется только подключить полученный файл локализации.
Если у текущей темы есть свой файл локализации, то можете вписать эту функцию в файл функций текущей темы и добавить эти строки заново просканировав папку темы через poedit
Спасибо огромное за пример! Значит я не зря стал свою обработку писать... 🙂 Кстати, я правильно понял, что если в админке в блоке надпись "Заголовок", то это соответствует 'name' из array('name'=>'Имя вкладки'), а переводить мне нужно 'Имя вкладки'?..
Меня теперь больше интересует ответ на второй вопрос.
Так как если кто-то из админов изменит порядок блоков личного кабинета, то придется все поля включать в обработку, а это уже не хорошо. 🙂
Интересно, что-то можно стандартными средствами сделать, чтобы мультиязычность не слетала после, вроде бы, стандартных манипуляций с настройками?
Заголовок поля соответствует значению name в массиве данных вкладки.
На работоспособность примера что я прислал выше никак не могут повлиять какие либо изменения настроек через админку, там игнорируется сортировка вкладок и по сути наименования для вкладок задаются именно через php-код, который вы и будете локализовать.
Продолжаем разговор... Если можно...
Ну с rcl_tabs вроде получилось у меня...
Но! Это же реально только закладки кабинета (которые, кстати, если не трогать, в настройках, замечательно работают с разными языками).
А как быть с "редактором Публикаций", к примеру (а там еще куча разных объектов у Вас)? Какие объекты надо обработать, чтобы в них языки тоже корректно отображались? Может есть документ хитрый какой?
Спасибо.
Ну, в общем-то, я раньше начал с rcl_profile_fields - из описания в этой статье я решил, что там прямо все поля можно получить...
Ну, да ладно!
А можно, Вам, в качестве хотелки, пожелать, чтобы у Вас нашлось время, средства и желание сделать стандартным функционалом, корректную работу с языками! А то - такой замечательный плагин со многих сторон, и такие мелкие пакости подкидывает. 🙂
Я поддерживаю ваше предложение.
Хотя бы чтобы например был общий глобальный массив $rcl_translate (или функция) и его, в зависимости от своих условий, пользователи могли бы легко перевести на нужный язык. Потому что каждый плагин транслитерации своими механизмами обладает - всем не угодишь, а так будет единая коллекция пользовательских фраз (те что задаются в менеджере вкладок, полях профиля, формах публикаций и т.д.)
В общем, если кому интересно сделал такие костыли. 🙂
//----- Translate profile fields--------------- add_filter('rcl_profile_fields', 'translate_profile_fields', 10); function translate_profile_fields($fields){ $local = get_bloginfo ('language'); if ($local<>'ru-RU'){ foreach ($fields as $FieldItem=>$FieldItemValue) { //echo $TabItem; //echo $TabItemValue; foreach ($FieldItemValue as $Item=>$ItemValue ) { if ($Item == 'title'){ $str = $ItemValue; switch ($ItemValue){ case 'Имя': // Dashboard WP-Recall User string $str = 'Name'; // Translate break; case 'День рождения': $str = 'Birthday'; break; } $fields[$FieldItem][$Item] =$str; } } } } return $fields; } //----- Translate Publication fields--------------- add_filter('rcl_public_form_fields', 'translate_public_form_field', 10, 2); function translate_public_form_field($fields, $formData){ $local = get_bloginfo ('language'); if ($local<>'ru-RU'){ foreach ($fields as $FieldItem=>$FieldItemValue) { //echo $TabItem; //echo $TabItemValue; foreach ($FieldItemValue as $Item=>$ItemValue ) { if ($Item == 'title'){ $str = $ItemValue; switch ($ItemValue){ case 'Заголовок': // Dashboard WP-Recall User string $str = 'Header'; // Translate break; case 'Рубрики': $str = 'Rubrics'; break; case 'Краткая запись': $str = 'Description'; break; case 'Содержание публикации': $str = 'Content'; break; case 'Медиа-загрузчик': $str = 'Media uploader'; break; case 'Миниатюра публикации': $str = 'Publication thumbnail'; break; case 'Метки': $str = 'Tags'; break; } $fields[$FieldItem][$Item] =$str; } } } } return $fields; }
Добавляется в functions.php темы.
Поскольку костыли - за красотой не гнался. Работает и ладно.
Так как я особо с PHP не разбирался, а стандартный "переводчик" __() не умеет переводить значения переменных, буду признателен за подсказки, чтобы код сделать человеческим. 🙂