в моей теме я хочу определить серию пользовательских типов сообщения и пользовательского taxonomies, каждый имеющий его собственный специализированный краткий заголовок; основной язык моей темы является английским, поэтому краткие заголовки будут на английском языке
например, в то время как определение краткого заголовка пользовательского сообщения вводит "продукт" args:
'rewrite' => array( 'slug' => 'product' ),
там какой-либо путь состоит в том, чтобы перевести "краткий заголовок" через po/mo файлы? могу я помещать его как:
'rewrite' => array( 'slug' => __('product', 'mytextdomain') )
или это не будет работать? что существующая практика должна локализовать краткие заголовки?
Я не попытался бы локализовать Ваши краткие заголовки. Вместо этого почему бы не дать Вашим пользователям опцию изменить их путем добавления другого поля к странице настроек постоянной ссылки?
Рычаг в load-options-permalink.php
и настроенный некоторые вещи поймать $_POST
данные для сохранения краткого заголовка. Также добавьте поле настроек к странице.
<?php
add_action( 'load-options-permalink.php', 'wpse30021_load_permalinks' );
function wpse30021_load_permalinks()
{
if( isset( $_POST['wpse30021_cpt_base'] ) )
{
update_option( 'wpse30021_cpt_base', sanitize_title_with_dashes( $_POST['wpse30021_cpt_base'] ) );
}
// Add a settings field to the permalink page
add_settings_field( 'wpse30021_cpt_base', __( 'CPT Base' ), 'wpse30021_field_callback', 'permalink', 'optional' );
}
Затем вызов назад функционирует для поля настроек:
<?php
function wpse30021_field_callback()
{
$value = get_option( 'wpse30021_cpt_base' );
echo '<input type="text" value="' . esc_attr( $value ) . '" name="wpse30021_cpt_base" id="wpse30021_cpt_base" class="regular-text" />';
}
Затем, когда Вы регистрируете свой тип сообщения, захватываете краткий заголовок с get_option
. Если это не там, используйте свое значение по умолчанию.
<?php
add_action( 'init', 'wpse30021_register_post_type' );
function wpse30021_register_post_type()
{
$slug = get_option( 'wpse30021_cpt_base' );
if( ! $slug ) $slug = 'your-default-slug';
// register your post type, reference $slug for the rewrite
$args['rewrite'] = array( 'slug' => $slug );
// Obviously you probably need more $args than one....
register_post_type( 'wpse30021_pt', $args );
}
Вот полевая часть настроек как плагин https://gist.github.com/1275867
Править: Другая опция
Вы могли также изменить краткий заголовок на основе того, что определяется в WPLANG
постоянный.
Просто запишите быструю функцию, которая содержит данные...
<?php
function wpse30021_get_slug()
{
// return a default slug
if( ! defined( 'WPLANG' ) || ! WPLANG || 'en_US' == WPLANG ) return 'press';
// array of slug data
$slugs = array(
'fr_FR' => 'presse',
'es_ES' => 'prensa'
// etc.
);
return $slugs[WPLANG];
}
Затем получите краткий заголовок, где Вы регистрируете свой пользовательский тип сообщения.
<?php
add_action( 'init', 'wpse30021_register_post_type' );
function wpse30021_register_post_type()
{
$slug = wpse30021_get_slug();
// register your post type, reference $slug for the rewrite
$args['rewrite'] = array( 'slug' => $slug );
// Obviously you probably need more $args than one....
register_post_type( 'wpse30021_pt', $args );
}
Наилучший вариант, IMO, состоял бы в том, чтобы оба дать пользователю опцию и обеспечить твердые значения по умолчанию:
<?php
add_action( 'init', 'wpse30021_register_post_type' );
function wpse30021_register_post_type()
{
$slug = get_option( 'wpse30021_cpt_base' );
// They didn't set up an option, get the default
if( ! $slug ) $slug = wpse30021_get_slug();
// register your post type, reference $slug for the rewrite
$args['rewrite'] = array( 'slug' => $slug );
// Obviously you probably need more $args than one....
register_post_type( 'wpse30021_pt', $args );
}
Если это, doest не работают, Почему не Вы просто простой делаете:
$post_slug= __('product', 'mytextdomain');
'rewrite' => array( 'slug' => $post_slug );
Я делаю точно, что в теме мы разрабатываем. Это доступно на 5 отличных языках, и каждый язык имеет переведенный набор категорий. Первый компонент URL в теме анализируется для определения, какой язык используется в формате языка страны:
/uk-en
/fr-fr
/it-it
И затем переведенные категории анализируются как дальнейшие компоненты URL.
URL анализируется в parse_request
фаза:
function my_parse_request( $wp ) {
$path = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );
$components = preg_split('|/|', $path, null, PREG_SPLIT_NO_EMPTY );
// Determine language from $components[0]
$language = array_shift( $components );
...
// Load translations file...
$mofile = get_stylesheet_directory()."/$language.mo";
load_textdomain( 'mydomain', $mofile );
...
// Determine category from $components[0]
if( __( 'some-category', 'mydomain' ) == $components[0] )
$wp->query_vars['category'] = 'some-category';
...
}
add_action( 'parse_request', 'my_parse_request' );
Этот пример лишен необходимых проверок, но предназначен только как пример.
Существуют недостатки к этому подходу, конечно, но он позволяет естественные URL на всех языках. Основные недостатки, которые я вижу:
1) Это не использует механизм постоянной ссылки. Это могло, вероятно, быть расширено так, чтобы надлежащие правила постоянной ссылки для всех языков были сгенерированы, и parse_request не будет необходим, но сделать это для всех языков включило бы загрузку той файл MO за другим в цикле, и я не знаю, как хорошо поддерживаемый, который является.
2) Если переводчик изменяет краткий заголовок, то ссылки делаются недействительным.
Я рекомендовал бы не делать краткие заголовки переводимыми.
Перевод для стоящего с пользователем контента сайта. Краткие заголовки используются внутренне и только незначительно "общедоступны" через URL, переписывает - и URL не должны быть переводимы, также.
Так: оставьте свои краткие заголовки в покое, поскольку Вы определяете их. Только сделайте переводимые строки, которые предназначаются для всеобщего использования.
wpse30021
? – Naoise Golden 17.10.2011, 12:29