Last active
April 27, 2022 13:51
-
-
Save cdsaenz/850fb628efe2535d18dfda7f0e8c632b to your computer and use it in GitHub Desktop.
Wordpress Basic Translation Functions, URL, Session, Localization Domain Setup. Multilanguage
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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