How can I translate my navigation menu's LINKS with qtranslate on wordpress?

╄→尐↘猪︶ㄣ 提交于 2019-12-03 15:04:23

问题


I have a bilingual (english/arabic) wordpress site. I was able to successfully translate the navigation menu items. However, the menu links on the arabic site, link to the default language which is English.

How can I tell wordpress that I need the menu links to change on the arabic site (I need the links on the arabic site to include /ar, for example: www.talalonline.com/ar instead of www.talalonline.com)

thanks


回答1:


@maha, I searched a lot about this and found the solution here, but the answer is a little fuzzy…

As you don't want to mess with your WP core files, all changes are in the theme. Your theme is located in wp-content/themes/your-theme-name/

Find your theme's function.php and add the code above in the end of the file, before the php end tag (?>):

class CustomLinkModifierWalker extends Walker_Nav_Menu {
    function __( $text ) {
        if ( preg_match_all('~(.*?)\|(\w{2,})\|~', $text, $matches) ) {
            $text = '';
            foreach ($matches[1] as $i => $match) {
                $text .= "[:{$matches[2][$i]}]$match";
            }
            $text = __( $text );
        }
        return $text;
    }
    function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
        global $wp_query;
        $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

        $class_names = $value = '';

        $classes = empty( $item->classes ) ? array() : (array) $item->classes;
        $classes[] = 'menu-item-' . $item->ID;

        $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) );
        $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';

        $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args );
        $id = $id ? ' id="' . esc_attr( $id ) . '"' : '';

        $output .= $indent . '<li' . $id . $value . $class_names .'>';

        $attributes  = ! empty( $item->attr_title ) ? ' title="'  . esc_attr( $item->attr_title ) .'"' : '';
        $attributes .= ! empty( $item->target )     ? ' target="' . esc_attr( $item->target     ) .'"' : '';
        $attributes .= ! empty( $item->xfn )        ? ' rel="'    . esc_attr( $item->xfn        ) .'"' : '';
        $attributes .= ! empty( $item->url )    ? ' href="' . esc_attr( $this->__( $item->url )  ) .'"' : '';

        $item_output = $args->before;
        $item_output .= '<a'. $attributes .'>';
        $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
        $item_output .= '</a>';
        $item_output .= $args->after;

        $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
    }
}

Then, you have to find where's your menu view inside your theme. The theme I'm using implement's it in the header.php. Maybe your's uses another file name, like header-fancy-theme.php.

My header view code was like this:

<?php
$nav_sec_menu_params = array(
    'depth' => 0,
    'theme_location' => 'sec-menu',
    'container_class' => 'menu-topmenu-container',
    'menu_class' => 'menus menu-topmenu',
    'fallback_cb' => 'block_sec_menu'
);
wp_nav_menu($nav_sec_menu_params);
?>

All you have to do is add the Walker implementation in the param array:

<?php
$nav_sec_menu_params = array(
    'walker' => new CustomLinkModifierWalker(),
    'depth' => 0,
    'theme_location' => 'sec-menu',
    'container_class' => 'menu-topmenu-container',
    'menu_class' => 'menus menu-topmenu',
    'fallback_cb' => 'block_sec_menu'
);
wp_nav_menu($nav_sec_menu_params);
?>

Then, in your menu, you'll use |lang| after the language URL ,like this:

I know it's not the exactly use you were hopping of automatic language links, but this may solve your problem.




回答2:


 //tested and worked for me.
//use native wordpress filter wp_setup_nav_menu_item

 function qtrans_menuitem( $menu_item ) {

// convert local URLs in custom menu items
   if ($menu_item->type == 'custom' && stripos($menu_item->url, get_site_url()) !== false){
    $menu_item->url = qtrans_convertURL($menu_item->url);
}     
return $menu_item;
 }

 add_filter('wp_setup_nav_menu_item', 'qtrans_menuitem', 0);



回答3:


fork of qtranslate does this out of the box:

https://wordpress.org/plugins/qtranslate-x/

in the menu item in the field "navigation label" just provide strings for both languages:

[:en]English Text[:de]Deutsch Text

tested with qTranslate-X 2.7.8, Wordpress 4.1 and Twenty Fifteen 1.0 theme




回答4:


There are four functions in WP to translate your menu text using default or plugin option.

Each of the four functions requires at least one argument, which is the text that is to be translated. The functions are:

  1. __() – (two underscores) The basic function that you will use the majority of the time. It returns the text in the correct language.

  2. e() – The same as _() except it echoes the text instead of returning it.

  3. _n() – Used when the text has the potential to be plural, so for example if you were to display how many comments have been made, you might want to output either “X comments” or “X comment” depending on how many comments you have.

  4. _x() – Useful for when the translation of the word depends on the context. “Post” could mean “a post (noun)” or “to post (verb)” depending on context. It is important for the translator to know which you mean when translating to be accurate. _x() is mainly used where single words are used.

ex

echo __( 'Menu Text' );



回答5:


I am also working with qTranslate and bilingual Arabic/English site.

You can have your .htaccess as the following:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
#RewriteRule ^ar[\/]?$ index.php?lang=ar
#RewriteRule ^en[\/]?$ index.php?lang=en 
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
</IfModule>

And select the "Use Pre-Path Mode (Default, puts /en/ in front of URL)" options from Advanced settings section of your qTranslate plugin settings page.



来源:https://stackoverflow.com/questions/10102752/how-can-i-translate-my-navigation-menus-links-with-qtranslate-on-wordpress

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!