Skip to content

Instantly share code, notes, and snippets.

@cdsaenz
Last active April 27, 2022 13:51
Show Gist options
  • Save cdsaenz/850fb628efe2535d18dfda7f0e8c632b to your computer and use it in GitHub Desktop.
Save cdsaenz/850fb628efe2535d18dfda7f0e8c632b to your computer and use it in GitHub Desktop.
Wordpress Basic Translation Functions, URL, Session, Localization Domain Setup. Multilanguage
<?php
/**
* WP THEME MULTILINGUAL SUPPORT
* Used with Bootscore, WooCommerce
* Based on https://gist.github.com/l2aelba/5244912
* Version 1.0 - 5mar2022
* Version 2.0 - 27apr2022
* csdev
* NOTE: require this file from functions.php or integrate
**/
/**
* Array of supported languages, first is default
*/
function csdev_langs()
{
return array('en', 'es', 'it');
}
function csdev_default_lang()
{
$langs = csdev_langs();
return $langs[0];
}
/**
* Translate page title blindly
* Setup domain, here using Bootscore
*/
function csdev_page_title($page_title)
{
return __($page_title, 'bootscore');
}
add_filter('woocommerce_page_title', 'csdev_page_title', 10, 1);
/**
* No home canonical redirect
* Also force WooCommerce Plugin Domain & Theme Domain reload
*/
add_action('template_redirect', function () {
if (is_front_page()) {
remove_action('template_redirect', 'redirect_canonical');
}
// reload woo domain with correct language
wc()->load_plugin_textdomain();
// reload theme domain
load_theme_textdomain('bootscore', get_template_directory() . '/languages');
}, 0);
/**
* Add rewrite rules for languages
* Still in development
*/
function csdev_lang_rewrite_rule()
{
$custom_types = ["product"];
// categories AT TOP?
foreach (csdev_langs() as $lang) {
add_rewrite_rule(
"^$lang/product-category/(.+?)/?$",
'index.php?product_cat=$matches[1]&lang=' . $lang,
'top'
);
// /product-category/CATEGORY/CATEGORY1
add_rewrite_rule(
"^$lang/product-category/(.+?)/page/?([0-9]{1,})/?$",
'index.php?product_cat=$matches[1]&paged=$matches[2]&lang=' . $lang,
'top'
);
}
// Product post Individual
foreach (csdev_langs() as $lang) {
// home
add_rewrite_rule(
"^$lang" . '/?$',
'index.php?pagename=home&lang=' . $lang,
'top'
);
// home too
add_rewrite_rule(
"^$lang/home",
'index.php?pagename=home&lang=' . $lang,
'top'
);
// shop
add_rewrite_rule(
"^$lang" . '/shop',
'index.php?post_type=product&lang=' . $lang,
'top'
);
foreach ($custom_types as $type) {
// Custom Post Individual
add_rewrite_rule(
"^$lang/" . $type . '/([^/]*)/?$',
'index.php?lang=' . $lang . '&' . $type . '=$matches[1]',
'top'
);
}
}
// pages AT THE END after custom post
foreach (csdev_langs() as $lang) {
// example: for my-account/edit-address/facturacion
// pagename=my-account&edit-address=facturacion
add_rewrite_rule(
"^$lang/([^/]*)/?/([^/]*)/?/([^/]*)/?",
'index.php?pagename=$matches[1]&$matches[2]=$matches[3]&lang=' . $lang,
'top'
);
// example: for my-account/edit-address
add_rewrite_rule(
"^$lang/([^/]*)/?/([^/]*)/?",
'index.php?pagename=$matches[1]&$matches[2]&lang=' . $lang,
'top'
);
// example: for /my-account
add_rewrite_rule(
"^$lang/([^/]*)/?",
'index.php?pagename=$matches[1]&lang=' . $lang,
'top'
);
}
// eliminate in production!
flush_rewrite_rules(true);
}
add_action('init', 'csdev_lang_rewrite_rule');
/**
* Add current language to menu items
* Translate title "blindly" (enter string in .POT)
*/
function csdev_change_menu($items)
{
foreach ($items as $item) {
$item->url = csdev_get_lang_url($item->url);
$item->title = __($item->title, "bootscore");
}
return $items;
}
add_filter('wp_nav_menu_objects', 'csdev_change_menu', 10, 2);
/**
* Get any relative url for lang
* ie /en/product-category/wines/alfredo-roca
* $url shouldn't contain a $lang segment!
*/
function csdev_get_lang_url($url, $lang = false)
{
$lang = $lang ?: csdev_get_lang();
$root = get_bloginfo("url");
// remove root from url
$thisurl = str_replace($root, "", $url);
// determine if language is in first segment, remove it
$segments = explode('/', parse_url(ltrim($thisurl,"/"), PHP_URL_PATH));
$segment = $segments[0] ?? null;
if (in_array($segment,csdev_langs())) {
// language found, remove
$thisurl = substr($thisurl,3);
}
$url = $root . "/" . $lang . $thisurl;
return $url;
}
/**
* Set text domain for plugins & theme
* TODO: Implement more languages
*/
function csdev_set_locale($locale)
{
global $locale;
$lang = csdev_get_lang();
if ($lang == 'es')
$locale = 'es_AR';
elseif ($lang == 'en')
$locale = 'en_US';
elseif ($lang == 'it')
$locale = 'it_IT';
return $locale;
}
add_filter('locale', 'csdev_set_locale', 10, 1);
/**
* Session
*/
function csdev_init_session()
{
if (!session_id()) {
session_start();
}
// don't set default language or it will overwrite if it's already set
}
add_action('init', 'csdev_init_session', 1);
/**
* Set lang in session (from url or forced)
*/
function csdev_set_lang($lang = false)
{
// do not refresh page
$_SESSION['refresh'] = false;
// current session language
$session_lang = $_SESSION['lang'] ?? false;
// parameter or else url
$lang = $lang ?: get_query_var('lang', '');
$langs = csdev_langs();
if (in_array($lang, $langs)) {
// if valid language, save it to session only if different
if ($session_lang !== $lang) {
$_SESSION['lang'] = $lang;
$_SESSION['refresh'] = true;
}
} else {
// invalid parameter or url language, use current or default and rectify url
if (!$session_lang) {
$_SESSION['lang'] = csdev_default_lang();
}
// redirect to correct url
wp_redirect(csdev_get_current_lang_url(), 301);
}
// set domains
return $_SESSION['lang'];
}
/**
* Current URL for a certain language (or current if false)
*/
function csdev_get_current_lang_url($lang =false)
{
global $wp;
return csdev_get_lang_url(home_url($wp->request),$lang);
}
/**
* Clean up buffer at init
*/
function output_buffer()
{
ob_start();
}
add_action('init', 'output_buffer', 2);
/**
* Header calls
*/
function csdev_lang_header()
{
csdev_set_lang();
/* Refresh if new language */
if ($_SESSION['refresh']) {
error_log("REFRESH " . $_SESSION['lang']);
header("Refresh:0");
$_SESSION['refresh'] = false;
}
}
add_action('wp_head', 'csdev_lang_header', 0);
/**
* Get current lang
*/
function csdev_get_lang()
{
return $_SESSION['lang'] ?? csdev_default_lang();
}
/**
* Whitelist "?lang"
*/
add_filter('query_vars', function ($query_vars) {
$query_vars[] = 'lang';
return $query_vars;
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment