Добавьте языковой суффикс к URL-адресу, если он еще не существует (javascript)

У меня многоязычный сайт, и люди заходят по ссылкам С суффиксом URL (например, /lang/en) или БЕЗ суффикса (только URL страницы).

Теперь я хочу создать функцию переключения языка со ссылкой (с классом для запуска javascript).

Например, мой класс ссылок будет «английским», и в JS мне сначала нужно проверить, нет ли языкового суффикса в URL-адресе, прежде чем я добавлю его.

Вот что у меня есть сейчас (из другой темы):

<a class="english" href="">English</a>
<script>

$('.datalink').attr('href', function() {
return this.href + '/lang/en';

});

</script>

Это добавляет суффикс, но не проверяя, существует ли он уже, как мне проверить, существует ли он уже, и не добавлять его? или изменить его на другой язык (/lang/nl)?

ОБНОВЛЕНИЕ

На самом деле мой класс находится не на href, а на <li> вокруг него, это выглядит так:

<li class="english"><a title="English">English</a></li>

так что теперь у меня есть

$('.english >a').attr('href', function() { 
  var suffix = this.href.match(/lang\/en\/?$/i) ? "" : "/lang/en"; 
  return this.href + suffix; 
}); 

ПРИМЕЧАНИЕ Чего я хочу добиться, так это двух ссылок на каждой странице моего веб-сайта, которые будут состоять из основного URL-адреса страницы с

lang/en 

or

lang/nl

суффикс к ним. При нажатии на эти ссылки будет загружаться одна и та же страница, но с языковым суффиксом в URL-адресе, мой языковой плагин выберет этот язык.


person Mvd    schedule 12.05.2013    source источник
comment
Будет ли язык всегда en или он должен быть связан с языком, указанным в заголовке элемента?   -  person David says reinstate Monica    schedule 12.05.2013


Ответы (3)


Вы можете использовать регулярное выражение, чтобы проверить, содержит ли URL суффикс:

if (this.href.match(/lang\/en\/?$/i)) {
    /* CONTAINS THE SUFFIX */
} else {
    /* DOESN'T CONTAIN IT */
}

Способ, которым я, вероятно, сделал бы это, выглядит следующим образом:

$('.datalink').attr('href', function() {
    // suffix is blank if the URL already contains the language portion
    var suffix = this.href.match(/lang\/en\/?$/i) ? "" : "/lang/en";
    return this.href + suffix;
});
person Dave F    schedule 12.05.2013
comment
Привет Дэйв, Спасибо за ответ! Ценный фрагмент кода! Вот что я сделал из этого: $('.english').attr('href', function() { // suffix is blank if the URL already contains the language portion var suffix = this.href.match(/lang\/en\/?$/i) ? "" : "/lang/en"; return this.href + suffix; }); и тот же кусок для URL-адреса меню класса .dutch. Моя ссылка выглядит как ‹a class=english href=›English‹/a›, но при загрузке страницы с кодом в заголовке она не перезаписывает ссылку на URL+суффикс. Есть идеи, как это происходит? - person Mvd; 12.05.2013
comment
Хорошо, я обнаружил, в чем проблема: мой класс находится не в href, а в ‹li› вокруг него, это выглядит так: <li class="english"><a title="English">English</a></li> как мне адресовать href внутри ‹li› ? - person Mvd; 12.05.2013
comment
Гораздо проще - я свяжусь с вами как можно скорее - person mplungjan; 12.05.2013

Каким-то образом ни один из вышеперечисленных javascript не работал у меня, я не знаю, что я делал неправильно, но, наконец, я решил прибегнуть к php, потому что я понимаю это намного лучше. Я использую это на сайте WordPress, и я придумал следующий код (в теме functions.php), который работал для меня:

// add languages to menu
add_filter('wp_nav_menu_items','add_langs', 10, 2);

function add_langs($items, $args) 
{

    if( $args->theme_location == 'primary-menu')

$current_url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] .     $_SERVER['REQUEST_URI'];
$href = str_replace(array('/lang/en','/lang/nl'),'',$current_url);

    $english = '<li class="english"><a href="'.$href.'/lang/en">EN</a></li>';
    $nederlands = '<li class="nederlands"><a href="'.$href.'/lang/nl">NL</a></li>';
    return $items . $english . $nederlands ;

}

Это находит мое меню под названием "primary-menu" и добавляет в это меню два пункта, состоящие из ссылок $english и $nederlands.

Мне пришлось получить URL-адрес страницы с помощью $_server['HTTP_HOST'] вместо get_permalink(), потому что он каким-то образом возвращал случайный URL-адрес. первый всегда работает, и с помощью str_replace я сначала заменяю языковые дополнения, если они существуют (str_replace не требует оператора if, он всегда проверяет, существует ли он перед заменой)

Надеюсь, это поможет кому-то еще, все еще задаваясь вопросом, почему у меня не работает javascript!

person Mvd    schedule 19.05.2013

если это суффикс, который всегда начинается с /lang, попробуйте это

Прямая демонстрация

$('.english a').each(function() {
    $(this).attr('href', this.href.split("/lang")[0] + '/lang/en');
});

или если вы хотите сохранить один, если есть

$('.english a').each(function() {
  var href = this.href;
  var pos = href.indexOf("/lang/");
  if (pos == -1) $(this).attr('href', href.substring(0,pos)+'/lang/en');
});
person mplungjan    schedule 12.05.2013
comment
Привет mplungjan, спасибо за ответ! Я обнаружил, что wordpress добавляет класс, который я хочу адресовать, к тегу ‹li› вместо тега ‹a›, это выглядит так: ‹li class=english›‹a href=›English‹/a›‹/li› . Как бы я обратился к этому внутреннему тегу li при загрузке страницы? - person Mvd; 12.05.2013
comment
Класс .datalink находится в моем коде на самом деле class .english (ссылка на данные из потока, из которого я получил код). Поэтому я больше думал о чем-то вроде: '$('.english ›a').attr('href', function() { ` это кодирование звука? (часть .english ›a?). Я хочу обратиться a внутри английского класса li. Как ни странно, это не переписывает мой href при загрузке страницы.... Я немного озадачен!! Что я получил сейчас: $('.english >a').attr('href', function() { var suffix = this.href.match(/lang\/en\/?$/i) ? "" : "/lang/en"; return this.href + suffix; }); - person Mvd; 12.05.2013
comment
Привет, mplungjan, спасибо за попытку решить эту проблему, я думаю, что .each не будет работать для меня, потому что с этим одним фрагментом я хочу только переписать или написать один URL-адрес href (я добавлю еще один фрагмент для ссылки на другом языке). Дело в том, что я мог бы просто взять URL-адрес и добавить суффикс, но URL-адрес МОЖЕТ иметь суффикс неправильного языка, правильный язык или вообще не иметь суффикса. Итак, я получил этот код, который я добавил выше, но он просто ничего не делает на моей странице. сначала я подумал, потому что я адресовал li вместо a, но теперь, когда у меня есть .english a, это не может быть так, есть идеи? - person Mvd; 13.05.2013