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
@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.
//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);
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
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:
__() – (two underscores) The basic function that you will use the majority of the time. It returns the text in the correct language.
e() – The same as _() except it echoes the text instead of returning it.
_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.
_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' );
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.