This commit is contained in:
Greta Thunberg 2021-08-17 08:32:06 +02:00
parent 3254286388
commit 411d5d72a4
128 changed files with 2603 additions and 0 deletions

View File

@ -0,0 +1,922 @@
<?php
/**
* Mutiple Domain WordPress plugin.
*
* Core features.
*
* Contributors:
*
* - Clay Allsopp <https://github.com/clayallsopp>
* - Alexander Nosov <https://github.com/cyberaleks>
* - João Faria <https://github.com/jffaria>
* - Raphael Stäbler <https://github.com/blazer82>
* - Tobias Keller <https://github.com/Tobias-Keller>
* - Maxime Granier <https://github.com/maxgranier>
*
* @author Gustavo Straube <https://github.com/straube>
* @version 1.0.6
* @package multiple-domain
*/
class MultipleDomain
{
/**
* The plugin version.
*
* @var string
* @since 0.3
*/
const VERSION = '1.0.6';
/**
* The number of the default HTTP port.
*
* @var integer
*/
const PORT_HTTP = 80;
/**
* The number of the default HTTPS port.
*
* @var integer
*/
const PORT_HTTPS = 443;
/**
* The plugin instance.
*
* @var \MultipleDomain
* @since 0.8.4
*/
private static $instance;
/**
* The current domain.
*
* This property's value also may include the host port when it's
* different than `80` (the default HTTP port) and `443` (the default HTTPS
* port).
*
* @var string
* @since 0.2
*/
private $domain = null;
/**
* The original domain set in WordPress installation.
*
* This property's value also may include the host port when it's
* different than `80` (the default HTTP port) and `443` (the default HTTPS
* port).
*
* @var string
* @since 0.3
*/
private $originalDomain = null;
/**
* The list of available domains.
*
* This array holds all available domains as its keys. Each item in the
* array is also an array containing the following keys:
*
* - `base`
* - `lang`
* - `protocol`
*
* @var string
*/
private $domains = [];
/**
* Indicate whether the default ports should be ingored.
*
* This check is used when redirecting from a domain to another, for
* example.
*
* @var bool
* @since 0.11.0
*/
private $ignoreDefaultPorts = false;
/**
* Indicate whether canonical link should be added to pages.
*
* @var bool
* @since 0.11.0
*/
private $addCanonical = false;
/**
* Plugin activation tasks.
*
* The required plugin options are added to WordPress. We also make sure
* this plugin is the first loaded here.
*
* @return void
* @since 0.7
*/
public static function activate()
{
add_option('multiple-domain-domains', []);
add_option('multiple-domain-ignore-default-ports', true);
add_option('multiple-domain-add-canonical', false);
self::loadFirst();
}
/**
* Update plugin loading order to load this plugin before any other plugin
* and make sure all plugins use the right domain replacements.
*
* @return void
* @since 0.8.7
*/
public static function loadFirst()
{
/*
* Relative path to this plugin. The array of active plugins has the
* plugin path as its keys. We'll use this path to move Multiple Domain
* to the first position in that array.
*/
$path = str_replace(WP_PLUGIN_DIR . '/', '', MULTIPLE_DOMAIN_PLUGIN);
$plugins = get_option('active_plugins');
if (empty($plugins)) {
return;
}
if (($key = array_search($path, $plugins))) {
array_splice($plugins, $key, 1);
array_unshift($plugins, $path);
update_option('active_plugins', $plugins);
}
}
/**
* Get the single plugin instance.
*
* @return \MultipleDomain The plugin instance.
* @since 0.8.4
*/
public static function instance()
{
if (!isset(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Create a new instance.
*
* Adds actions and filters required by the plugin.
*/
private function __construct()
{
$this->initAttributes();
$this->hookActions();
$this->hookFilters();
$this->hookShortcodes();
new MultipleDomainSettings($this);
}
//
// WordPress API integration
//
/**
* Initialize the class attributes.
*
* @return void
* @since 0.8
*/
private function initAttributes()
{
$this->ignoreDefaultPorts = (bool) get_option('multiple-domain-ignore-default-ports');
$this->originalDomain = $this->getDomainFromUrl(get_option('home'), $this->ignoreDefaultPorts);
$this->domain = $this->getDomainFromRequest();
$domains = (array) get_option('multiple-domain-domains');
$this->resetDomains();
foreach ($domains as $domain => $options) {
$options = wp_parse_args($options, [
'base' => null,
'lang' => null,
'protocol' => null,
]);
$this->addDomain($domain, $options['base'], $options['lang'], $options['protocol']);
}
if (!array_key_exists($this->domain, $this->domains)) {
$this->domain = $this->originalDomain;
}
$this->addCanonical = (bool) get_option('multiple-domain-add-canonical');
}
/**
* Hook plugin actions to WordPress.
*
* @return void
* @since 0.8
*/
private function hookActions()
{
add_action('init', [ $this, 'redirect' ]);
add_action('wp_head', [ $this, 'addHrefLangTags' ]);
add_action('wp_head', [ $this, 'addCanonicalTag' ]);
add_action('plugins_loaded', [ $this, 'loaded' ]);
add_action('activated_plugin', [ self::class, 'loadFirst' ]);
add_action('wpseo_register_extra_replacements', [ $this, 'registerYoastVars' ]);
}
/**
* Hook plugin filters to WordPress.
*
* @return void
* @since 0.8
*/
private function hookFilters()
{
// Generic domain replacement
add_filter('content_url', [ $this, 'fixUrl' ]);
add_filter('option_siteurl', [ $this, 'fixUrl' ]);
add_filter('option_home', [ $this, 'fixUrl' ]);
add_filter('plugins_url', [ $this, 'fixUrl' ]);
add_filter('wp_get_attachment_url', [ $this, 'fixUrl' ]);
add_filter('get_the_guid', [ $this, 'fixUrl' ]);
// Specific domain replacement filters
add_filter('upload_dir', [ $this, 'fixUploadDir' ]);
add_filter('the_content', [ $this, 'fixContentUrls' ], 20);
add_filter('allowed_http_origins', [ $this, 'addAllowedOrigins' ]);
// Add body class based on domain
add_filter('body_class', [ $this, 'addDomainBodyClass' ]);
// Stop WP built in Canonical URL if this plugin has 'Add canonical links' enabled
add_filter('get_canonical_url', [ $this, 'getCanonicalUrl' ]);
}
/**
* Hook plugin shortcodes to WordPress.
*
* @return void
* @since 0.8.5
*/
private function hookShortcodes()
{
add_shortcode('multiple_domain', [ $this, 'shortcode' ]);
}
//
//
//
/**
* Return the current domain.
*
* Since this value is checked against plugin settings, it may not reflect
* the actual current domain in `HTTP_HOST` key from global `$_SERVER` var.
*
* Depending on the plugin settings, the domain also may include the host
* port when it's different than `80` (the default HTTP port) and `443` (the
* default HTTPS port).
*
* @return string|null The domain.
* @since 0.2
*/
public function getDomain()
{
return $this->domain;
}
/**
* Return original domain set in WordPress installation.
*
* Notice this method may return an unexpected value when running the site
* using the `server` command from wp-cli. That's because wp-cli changes the
* value of `site_url` and `home_url` options through a filter.
* Unfortunately, it's not possible to change this behaviour.
*
* The domain also may include the host port when it's different than `80`
* (the default HTTP port) and `443` (the default HTTPS port).
*
* @return string The domain.
* @since 0.3
*/
public function getOriginalDomain()
{
return $this->originalDomain;
}
/**
* Return all domains available.
*
* The keys in the returned array are the domain name. Each item in the
* array is also an array containing the following keys:
*
* - `base`
* - `lang`
* - `protocol`
*
* @return array The list of domains.
* @since 0.11.0
*/
public function getDomains()
{
return $this->domains;
}
/**
* Indicate whether the default ports (`80` or `443`) should be ingored.
*
* This check is used when redirecting from a domain to another, for
* example.
*
* @return bool A boolean indicating if the default port should be ignored.
* @since 0.8.2
*/
public function shouldIgnoreDefaultPorts()
{
return $this->ignoreDefaultPorts;
}
/**
* Indicate whether the canonical tags should be added to page.
*
* @return bool A boolean indicating if the default port should be ignored.
* @since 0.11.0
*/
public function shouldAddCanonical()
{
return $this->addCanonical;
}
/**
* Get the base path associated to the given domain.
*
* If no domain is passed to the function, it'll return the base path for
* the current domain.
*
* Notice this function may return `null` when no base path is set for a
* given domain in the plugin config.
*
* @param string|null $domain The domain.
* @return string|null The base path.
* @since 0.10.3
*/
public function getDomainBase($domain = null)
{
return $this->getDomainAttribute('base', $domain);
}
/**
* Get the language associated to the given domain.
*
* If no domain is passed to the function, it'll return the language for
* the current domain.
*
* Notice this function may return `null` when no language is set for a
* given domain in the plugin config.
*
* @param string|null $domain The domain.
* @return string|null The language code.
* @since 0.8
*/
public function getDomainLang($domain = null)
{
return $this->getDomainAttribute('lang', $domain);
}
/**
* Get the protocol option for the given domain.
*
* If no domain is passed to the function, it'll return the option for the
* current domain.
*
* The possible returned values are `http`, `https`, or `auto` (default). If
* no protocol is defined for a given domain, the default value will be
* returned.
*
* @param string|null $domain The domain.
* @return string The protocol option.
* @since 0.10.0
*/
public function getDomainProtocol($domain = null)
{
$protocol = $this->getDomainAttribute('protocol', $domain);
return in_array($protocol, [ 'http', 'https' ]) ? $protocol : 'auto';
}
/**
* Reset the list of domains.
*
* In case the `$keepOriginal` param is `true`, which is the default, the
* list of domains will have only the original domain where WordPress was
* installed.
*
* @param bool $keepOriginal Indicates whether the original domain should
* be kept.
* @return void
* @since 1.0.0
*/
public function resetDomains($keepOriginal = true)
{
if (!$keepOriginal || empty($this->originalDomain)) {
$this->domains = [];
return;
}
$this->domains = [
$this->originalDomain => [
'base' => null,
'lang' => null,
'protocol' => 'auto',
],
];
}
/**
* Add a new domain to the list of domains.
*
* Besides the `$domain` param, all other are optional.
*
* @param string $domain The domain.
* @param string $base The base path.
* @param string $lang The language.
* @param string $protocol The protocol option. It can be `http`, `https`
* or `auto`.
* @return void
* @since 1.0.0
*/
public function addDomain($domain, $base = null, $lang = null, $protocol = 'auto')
{
$this->domains[$domain] = [
'base' => $base,
'lang' => $lang,
'protocol' => $protocol,
];
}
/**
* Store the current list of domains in the WordPress options.
*
* This is can be used to persist changes made to the list of domains with
* `resetDomains` and `addDomain` methods.
*
* @return void
* @since 1.0.0
*/
public function storeDomains()
{
update_option('multiple-domain-domains', $this->domains);
}
/**
* When the current domain has a base URL restriction and the current
* request URI doesn't match it, redirects the user.
*
* @return void
*/
public function redirect()
{
/*
* Allow developers to create their own logic for redirection.
*/
do_action('multiple_domain_redirect', $this->domain);
$base = $this->getDomainBase();
$uri = !empty($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : null;
$base = ltrim($base, '/');
$uri = ltrim($uri, '/');
if (empty($base) || preg_match('/^wp-[a-z]+(\.php|\/|$)/i', $uri)) {
return;
}
if (strpos($uri, $base) !== 0) {
wp_redirect(home_url('/' . $base));
exit;
}
}
/**
* Replaces the domain in the given URL.
*
* The domain in the given URL is replaced with the current domain. If the
* URL contains `/wp-admin/` it'll be ignored when replacing the domain and
* returned as is.
*
* @param string $url The URL to fix.
* @return string The domain replaced URL.
* @since 0.10.0
*/
public function fixUrl($url)
{
if (!preg_match('/\/wp-admin\/?/', $url)) {
$domain = $this->getDomainFromUrl($url);
$url = $this->replaceDomain($domain, $url);
}
return $url;
}
/**
* Replaces the domain in `upload_dir` filter used by `wp_upload_dir()`.
*
* The domain in the given `url` and `baseurl` is replaced by the current
* domain.
*
* @param array $uploads The array of `url`, `baseurl` and other
* properties.
* @return array The domain-replaced values.
* @since 0.4
*/
public function fixUploadDir($uploads)
{
$uploads['url'] = $this->fixUrl($uploads['url']);
$uploads['baseurl'] = $this->fixUrl($uploads['baseurl']);
return $uploads;
}
/**
* Replaces the domain in post content.
*
* All occurrences of any of the available domains (i.e. all domains set in
* the plugin config) will be replaced with the current domain.
*
* @param string $content The content to fix.
* @return string The domain replaced content.
* @since 0.8
*/
public function fixContentUrls($content)
{
foreach (array_keys($this->domains) as $domain) {
$content = $this->replaceDomain($domain, $content);
}
return $content;
}
/**
* Add all available domains to allowed origins.
*
* This filter is used to prevent CORS issues.
*
* @param array $origins The default list of allowed origins.
* @return array The updated list of allowed origins.
* @since 0.8
*/
public function addAllowedOrigins($origins)
{
foreach (array_keys($this->domains) as $domain) {
$origins[] = 'https://' . $domain;
$origins[] = 'http://' . $domain;
}
return array_values(array_unique($origins));
}
/**
* Add the current domain to the body class in a sanitized version.
*
* If the current domain is `example.com`, the class added to the page body
* will be `multiple-domain-example-com`. Notice this filter only has effect
* when the `body_class()` function is added to the page's `<body> tag`.
*
* @param array $classes The initial list of body class names.
* @return array Updated list of body class names.
* @since 0.9.0
*/
public function addDomainBodyClass($classes)
{
$classes[] = 'multiple-domain-' . preg_replace('/[^a-z0-9]+/i', '-', $this->domain);
return $classes;
}
/**
* Add `hreflang` links to head for SEO purpose.
*
* @return void
* @author Alexander Nosov <https://github.com/cyberaleks>
* @since 0.4
*/
public function addHrefLangTags()
{
/**
* The WP class instance.
*
* @var WP
*/
global $wp;
$uri = trailingslashit('/' . ltrim(add_query_arg([], $wp->request), '/'));
$currentProtocol = $this->getCurrentProtocol();
foreach (array_keys($this->domains) as $domain) {
$protocol = $this->getDomainProtocol($domain);
if ($protocol === 'auto') {
$protocol = $currentProtocol;
}
$protocol .= '://';
$lang = $this->getDomainLang($domain);
if (!empty($lang)) {
$this->outputHrefLangTag($protocol . $domain . $uri, $lang);
}
if ($domain === $this->originalDomain) {
$this->outputHrefLangTag($protocol . $domain . $uri);
}
}
}
/**
* Add `canonical` links to head for SEO purpose.
*
* @return void
* @since 0.11.0
*/
public function addCanonicalTag()
{
if (!$this->shouldAddCanonical()) {
return;
}
/**
* The WP class instance.
*
* @var WP
*/
global $wp;
$uri = home_url(add_query_arg([], $wp->request), 'relative') . '/';
$currentProtocol = $this->getCurrentProtocol();
$protocol = $this->getDomainProtocol($this->originalDomain);
if ($protocol === 'auto') {
$protocol = $currentProtocol;
}
$protocol .= '://';
$this->outputCanonicalTag($protocol . $this->originalDomain . $uri);
}
/**
* This shortcode simply returns the current domain.
*
* @return string The current domain.
* @since 0.8.5
*/
public function shortcode()
{
return $this->domain;
}
/**
* Load text domain when plugin is loaded.
*
* @return void
* @since 0.8.6
*/
public function loaded()
{
$path = dirname(plugin_basename(MULTIPLE_DOMAIN_PLUGIN)) . '/languages/';
load_plugin_textdomain('multiple-domain', false, $path);
}
/**
* Register vars to be used as text replacements in Yoast tags.
*
* @return void
* @since 0.11.0
*/
public function registerYoastVars()
{
wpseo_register_var_replacement(
'%%multiple_domain%%',
[ $this, 'getDomain' ],
'advanced',
__('The current domain from Multiple Domain', 'multiple-domain')
);
}
/**
* Get the current domain via request headers parsing.
*
* @return string|null The current domain.
* @since 0.8.7
*/
private function getDomainFromRequest()
{
$domain = $this->getHostHeader();
if (empty($domain)) {
return null;
}
$matches = [];
if (preg_match('/^(.*):(\d+)$/', $domain, $matches) && $this->isDefaultPort($matches[2])) {
$domain = $matches[1];
}
return $domain;
}
/**
* Get the `Host` HTTP header value.
*
* To make it compatible with proxies, this function first tries to get the
* value from `X-Host` header and, then, falls back to the regular `Host`
* header.
*
* It returns `null` in case both headers are empty.
*
* @return string|null The HTTP `Host` header value.
* @since 0.8.7
*/
private function getHostHeader()
{
if (!empty($_SERVER['HTTP_X_HOST'])) {
return $_SERVER['HTTP_X_HOST'];
}
if (!empty($_SERVER['HTTP_HOST'])) {
return $_SERVER['HTTP_HOST'];
}
return null;
}
/**
* Get the current URL protocol based on server settings.
*
* The possible returned values are `http` and `https`.
*
* @return string The protocol.
*/
private function getCurrentProtocol()
{
return empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === 'off' ? 'http' : 'https';
}
/**
* Get an attribute by its name for the given domain.
*
* If no domain is passed to the function, it'll return the attribute value
* for the current domain.
*
* Notice this function may return `null` when the attribute is not set in
* the plugin config or doesn't exist.
*
* @param string $name The attribute name.
* @param string|null $domain The domain.
* @return string The attribute value.
* @since 0.10.0
*/
private function getDomainAttribute($name, $domain = null)
{
if (empty($domain)) {
$domain = $this->domain;
}
$attribute = null;
if (!empty($this->domains[$domain][$name])) {
$attribute = $this->domains[$domain][$name];
}
return $attribute;
}
/**
* Replaces the domain.
*
* All occurrences of the given domain will be replaced with the current
* domain in the content.
*
* The protocol may also be replaced following the protocol settings defined
* in the plugin config for the current domain.
*
* @param string $domain The domain to replace.
* @param string $content The content that will have the domain replaced.
* @return string The domain-replaced content.
*/
private function replaceDomain($domain, $content)
{
if (MULTIPLE_DOMAIN_LOW_MEMORY) {
return $this->replaceDomainUsingLessMemory($domain, $content);
}
if (array_key_exists($domain, $this->domains)) {
$regex = '/(https?):\/\/' . preg_quote($domain, '/') . '(?![a-z0-9.\-:])/i';
$protocol = $this->getDomainProtocol($this->domain);
$replace = ($protocol === 'auto' ? '${1}' : $protocol) . '://' . $this->domain;
$content = preg_replace($regex, $replace, $content);
}
return $content;
}
/**
* Replaces the domain using less memory.
*
* This function does the same as `replaceDoamin`, however it uses
* `mb_eregi_replace` instead of `preg_replace` for less memory consumption.
* On the other hand, it takes more time to execute.
*
* @param string $domain The domain to replace.
* @param string $content The content that will have the domain replaced.
* @return string The domain-replaced content.
* @since 1.0.2
*/
private function replaceDomainUsingLessMemory($domain, $content)
{
if (array_key_exists($domain, $this->domains)) {
$regex = '(https?):\/\/' . preg_quote($domain, '/') . '(?![a-z0-9.\-:])';
$protocol = $this->getDomainProtocol($this->domain);
$replace = ($protocol === 'auto' ? '\\1' : $protocol) . '://' . $this->domain;
$content = mb_eregi_replace($regex, $replace, $content);
}
return $content;
}
/**
* Parses the given URL to return only its domain.
*
* The server port may be included in the returning value depending on its
* number and plugin settings.
*
* @param string $url The URL to parse.
* @param bool $ignoreDefaultPorts If `true` is passed to this value, a
* default HTTP or HTTPS port will be ignored even if it's present
* in the URL.
* @return string The domain.
* @since 0.2
*/
private function getDomainFromUrl($url, $ignoreDefaultPorts = false)
{
$parts = parse_url($url);
$domain = $parts['host'];
if (!empty($parts['port']) && !($ignoreDefaultPorts && $this->isDefaultPort($parts['port']))) {
$domain .= ':' . $parts['port'];
}
return $domain;
}
/**
* Checks if the given port is a default HTTP (`80`) or HTTPS (`443`) port.
*
* @param int $port The port to check.
* @return bool Indicates if the port is a default one.
* @since 0.2
*/
private function isDefaultPort($port)
{
$port = (int) $port;
return $port === self::PORT_HTTP || $port === self::PORT_HTTPS;
}
/**
* Prints a `hreflang` link tag.
*
* @param string $url The URL to be set into `href` attribute.
* @param string $lang The language code to be set into `hreflang`
* attribute. Defaults to `x-default`.
* @return void
* @since 0.5
*/
private function outputHrefLangTag($url, $lang = 'x-default')
{
$url = htmlentities($url);
$lang = str_replace('_', '-', $lang);
printf('<link rel="alternate" href="%s" hreflang="%s" />', $url, $lang);
}
/**
* Prints a `canonical` link tag.
*
* @param string $url The canonical URL to be set into `href` attribute.
* @return void
* @since 0.11.0
*/
private function outputCanonicalTag($url)
{
$url = htmlentities($url);
printf('<link rel="canonical" href="%s" />', $url);
}
/**
* Filter override WordPress built-in canonical tag generation if using the this plugin's canonical tag feature
*
* @param $url
* @return string
*/
public function getCanonicalUrl($url)
{
// If *not* using the plugin's canonical tags, then return this URL. Otherwise, don't
if (!$this->shouldAddCanonical()) {
return $url;
}
return '';
}
}

View File

@ -0,0 +1,355 @@
<?php
/**
* Mutiple Domain settings.
*
* Integration with WordPress admin.
*
* @author Gustavo Straube <https://github.com/straube>
* @version 1.0.6
* @since 0.11.0
* @package multiple-domain
*/
class MultipleDomainSettings
{
/**
* The plugin core instance.
*
* @var \MultipleDomain
*/
private $core;
/**
* Create a new instance.
*
* Adds actions and filters required by the plugin for the admin.
*
* @param \MultipleDomain $core The core plugin class instance.
*/
public function __construct(MultipleDomain $core)
{
$this->core = $core;
$this->hookActions();
$this->hookFilters();
}
//
// WordPress API integration
//
/**
* Hook plugin actions to WordPress.
*
* @return void
*/
private function hookActions()
{
add_action('admin_init', [ $this, 'settings' ]);
add_action('admin_enqueue_scripts', [ $this, 'scripts' ]);
}
/**
* Hook plugin filters to WordPress.
*
* @return void
*/
private function hookFilters()
{
add_filter('plugin_action_links_' . plugin_basename(MULTIPLE_DOMAIN_PLUGIN), [ $this, 'actionLinks' ]);
}
//
//
//
/**
* Sets up the required settings to show in the admin.
*
* @return void
*/
public function settings()
{
add_settings_section('multiple-domain', __('Multiple Domain', 'multiple-domain'), [
$this,
'settingsHeading',
], 'general');
add_settings_field('multiple-domain-domains', __('Domains', 'multiple-domain'), [
$this,
'settingsFieldsForDomains',
], 'general', 'multiple-domain');
add_settings_field('multiple-domain-options', __('Options', 'multiple-domain'), [
$this,
'settingsFieldsForOptions',
], 'general', 'multiple-domain');
register_setting('general', 'multiple-domain-domains', [
$this,
'sanitizeDomainsSettings',
]);
register_setting('general', 'multiple-domain-ignore-default-ports', [
$this,
'castToBool',
]);
register_setting('general', 'multiple-domain-add-canonical', [
$this,
'castToBool',
]);
}
/**
* Sanitizes the domain settings.
*
* It takes the value sent by the user in the settings form and parses it
* to store in the internal format used by the plugin.
*
* @param array $value The user defined option value.
* @return array The sanitized option value.
*/
public function sanitizeDomainsSettings($value)
{
$domains = [];
if (is_array($value)) {
foreach ($value as $row) {
if (empty($row['host'])) {
continue;
}
$host = preg_replace('/^https?:\/\//i', '', $row['host']);
$base = !empty($row['base']) ? $row['base'] : null;
$lang = !empty($row['lang']) ? $row['lang'] : null;
$proto = !empty($row['protocol']) ? $row['protocol'] : 'auto';
$domains[$host] = [
'base' => $base,
'lang' => $lang,
'protocol' => $proto,
];
}
}
return $domains;
}
/**
* Casts the given value to boolean.
*
* @param mixed $value The value to cast.
* @return bool A bolean representing the passed value.
*/
public function castToBool($value)
{
return (bool) $value;
}
/**
* Renders the settings heading.
*
* @return void
*/
public function settingsHeading()
{
echo $this->loadView('heading');
}
/**
* Renders the fields for setting domains.
*
* @return void
*/
public function settingsFieldsForDomains()
{
$fields = '';
$counter = 0;
foreach ($this->core->getDomains() as $domain => $values) {
$base = null;
$lang = null;
$protocol = null;
/*
* Backward compatibility with earlier versions.
*/
if (is_string($values)) {
$base = $values;
} else {
$base = !empty($values['base']) ? $values['base'] : null;
$lang = !empty($values['lang']) ? $values['lang'] : null;
$protocol = !empty($values['protocol']) ? $values['protocol'] : null;
}
$fields .= $this->getDomainFields($counter++, $domain, $base, $lang, $protocol);
}
/*
* Adds a row of empty fields to the settings when no domain is set.
*/
if ($counter === 0) {
$fields = $this->getDomainFields($counter);
}
$fieldsToAdd = $this->getDomainFields('COUNT');
echo $this->loadView('domains', compact('fields', 'fieldsToAdd'));
}
/**
* Renders the fields for plugin options.
*
* @return void
*/
public function settingsFieldsForOptions()
{
$ignoreDefaultPorts = $this->core->shouldIgnoreDefaultPorts();
$addCanonical = $this->core->shouldAddCanonical();
echo $this->loadView('options', compact('ignoreDefaultPorts', 'addCanonical'));
}
/**
* Enqueues the required scripts.
*
* @param string $hook The current admin page.
* @return void
*/
public function scripts($hook)
{
if ($hook !== 'options-general.php') {
return;
}
$settingsPath = plugins_url('settings.js', MULTIPLE_DOMAIN_PLUGIN);
wp_enqueue_script('multiple-domain-settings', $settingsPath, [ 'jquery' ], MultipleDomain::VERSION, true);
}
/**
* Add the "Settings" link to the plugin row in the plugins page.
*
* @param array $links The default list of links.
* @return array The updated list of links.
*/
public function actionLinks($links)
{
$url = admin_url('options-general.php#multiple-domain');
$link = '<a href="' . $url . '">' . __('Settings', 'multiple-domain') . '</a>';
array_unshift($links, $link);
return $links;
}
/**
* Returns the fields for a domain setting.
*
* @param int $count The field count. It's used within the field name,
* since it's an array.
* @param string $host The host field value.
* @param string $base The base URL field value.
* @param string $lang The language field value.
* @param string $protocol The protocol handling option.
* @return string The rendered group of fields.
*/
private function getDomainFields($count, $host = null, $base = null, $lang = null, $protocol = null)
{
$langField = $this->getLangField($count, $lang);
return $this->loadView('fields', compact('count', 'host', 'base', 'protocol', 'langField'));
}
/**
* Gets the language field for domain settings.
*
* @param int $count The field count. It's used within the field name,
* since it's an array.
* @param string $lang The selected language.
* @return string The rendered field.
*/
private function getLangField($count, $lang = null)
{
/*
* Backward compability with a locale defined in previous versions.
*
* The HTML `lang` attribute uses a dash (`en-US`) to separate language
* and region, but WP languages have an underscore (`en_US`).
*/
if (!empty($lang)) {
$lang = str_replace('-', '_', $lang);
}
$locales = $this->getLocales();
return $this->loadView('lang', compact('count', 'lang', 'locales'));
}
/**
* Get the list of locales.
*
* The keys of the returned array are locale codes and the values are
* their names.
*
* A cached version will be returned if available.
*
* @return array The locales list.
*/
private function getLocales()
{
$locales = wp_cache_get('locales', 'multiple-domain');
if (empty($locales)) {
$locales = $this->getLocalesFromFile();
wp_cache_set('locales', $locales, 'multiple-domain');
}
return $locales;
}
/**
* Get the list of locales from the source file.
*
* The keys of the returned array are locale codes and the values are
* their names.
*
* @return array The locales list.
*/
private function getLocalesFromFile()
{
$locales = [];
$handle = fopen(dirname(MULTIPLE_DOMAIN_PLUGIN) . '/locales.csv', 'r');
while (($row = fgetcsv($handle)) !== false) {
$locales[$row[0]] = $row[1];
}
fclose($handle);
asort($locales);
return $locales;
}
/**
* Load a view and return its contents.
*
* @param string $name The view name.
* @param array|null $data The data to pass to the view. Each key will be
* extracted as a variable into the view file.
* @return string The view contents.
*/
private function loadView($name, $data = null)
{
$path = sprintf('%s/views/%s.php', dirname(MULTIPLE_DOMAIN_PLUGIN), $name);
if (!is_file($path)) {
return false;
}
ob_start();
if (is_array($data)) {
extract($this->replaceNull($data));
}
include $path;
return ob_get_clean();
}
/**
* Replace all `null` values in an array.
*
* @param array $array The original array.
* @param mixed $replacement The value to replace the `null` occurrences.
* @return array The array with replaced values.
*/
private function replaceNull($array, $replacement = '')
{
return array_map(function ($value) use ($replacement) {
return $value === null ? $replacement : $value;
}, $array);
}
}

View File

@ -0,0 +1,88 @@
msgid ""
msgstr ""
"Project-Id-Version: Multiple Domain\n"
"POT-Creation-Date: 2019-01-18 15:34-0200\n"
"PO-Revision-Date: 2019-01-18 16:22-0200\n"
"Last-Translator: \n"
"Language-Team: Straube <https://straube.co>\n"
"Language: en_US\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.2.1\n"
"X-Poedit-Basepath: .\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-KeywordsList: __;_e\n"
"X-Poedit-SearchPath-0: .\n"
#: MultipleDomain.php:181
msgid "Multiple Domain"
msgstr "Multiple Domain"
#: MultipleDomain.php:185
msgid "Domains"
msgstr "Domains"
#: MultipleDomain.php:189
msgid "Options"
msgstr "Options"
#: MultipleDomain.php:251
msgid ""
"You can use multiple domains in your WordPress defining them below. It's "
"possible to limit the access for each domain to a base URL."
msgstr ""
"You can use multiple domains in your WordPress defining them below. Its "
"possible to limit the access for each domain to a base URL."
#: MultipleDomain.php:283
msgid "Add domain"
msgstr "Add domain"
#: MultipleDomain.php:285
msgid ""
"A domain may contain the port number. If a base URL restriction is set for a "
"domain, all requests that don't start with the base URL will be redirected "
"to the base URL. <b>Example</b>: the domain and base URL are <code>example."
"com</code> and <code>/base/path</code>, when requesting <code>example.com/"
"other/path</code> it will be redirected to <code>example.com/base/path</"
"code>. Additionaly, it's possible to set a language for each domain, which "
"will be used to add <code>&lt;link&gt;</code> tags with a <code>hreflang</"
"code> attribute to the document head."
msgstr ""
"A domain may contain the port number. If a base URL restriction is set for a "
"domain, all requests that dont start with the base URL will be redirected "
"to the base URL. <b>Example</b>: the domain and base URL are <code>example."
"com</code> and <code>/base/path</code>, when requesting <code>example.com/"
"other/path</code> it will be redirected to <code>example.com/base/path</"
"code>. Additionaly, its possible to set a language for each domain, which "
"will be used to add <code>&lt;link&gt;</code> tags with a <code>hreflang</"
"code> attribute to the document head."
#: MultipleDomain.php:305
msgid "Ignore default ports"
msgstr "Ignore default ports"
#: MultipleDomain.php:306
msgid ""
"When enabled, removes the port from URL when redirecting and it's a default "
"HTTP (<code>80</code>) or HTTPS (<code>443</code>) port."
msgstr ""
"When enabled, removes the port from URL when redirecting and its a default "
"HTTP (<code>80</code>) or HTTPS (<code>443</code>) port."
#: MultipleDomain.php:412
msgid "Settings"
msgstr "Settings"
#: MultipleDomain.php:609
msgid "Domain"
msgstr "Domain"
#: MultipleDomain.php:612
msgid "Base path restriction"
msgstr "Base path restriction"
#: MultipleDomain.php:615
msgid "Remove"
msgstr "Remove"

View File

@ -0,0 +1,89 @@
msgid ""
msgstr ""
"Project-Id-Version: Multiple Domain\n"
"POT-Creation-Date: 2019-01-18 15:34-0200\n"
"PO-Revision-Date: 2019-01-18 16:22-0200\n"
"Language-Team: Straube <https://straube.co>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.2.1\n"
"X-Poedit-Basepath: .\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Poedit-KeywordsList: __;_e\n"
"Last-Translator: \n"
"Language: pt_BR\n"
"X-Poedit-SearchPath-0: .\n"
#: MultipleDomain.php:181
msgid "Multiple Domain"
msgstr "Multiple Domain"
#: MultipleDomain.php:185
msgid "Domains"
msgstr "Domínios"
#: MultipleDomain.php:189
msgid "Options"
msgstr "Opções"
#: MultipleDomain.php:251
msgid ""
"You can use multiple domains in your WordPress defining them below. It's "
"possible to limit the access for each domain to a base URL."
msgstr ""
"Você pode usar múltiplos domínios com o seu WordPress os definindo abaixo. É "
"possível limitar o acesso a cada domínio a uma URL base."
#: MultipleDomain.php:283
msgid "Add domain"
msgstr "Adicionar domínio"
#: MultipleDomain.php:285
msgid ""
"A domain may contain the port number. If a base URL restriction is set for a "
"domain, all requests that don't start with the base URL will be redirected "
"to the base URL. <b>Example</b>: the domain and base URL are <code>example."
"com</code> and <code>/base/path</code>, when requesting <code>example.com/"
"other/path</code> it will be redirected to <code>example.com/base/path</"
"code>. Additionaly, it's possible to set a language for each domain, which "
"will be used to add <code>&lt;link&gt;</code> tags with a <code>hreflang</"
"code> attribute to the document head."
msgstr ""
"Um domínio pode conter um número de porta. Se uma restrição de URL base for "
"definida para um domínio, todos as requisições que não começarem com a URL "
"base serão direcionadas para a URL base. <b>Exemplo</b>: o domínio e a base "
"são <code>example.com</code> e <code>/caminho/base</code>, quando "
"requisitando <code>example.com/outro/caminho</code> será redirecionado para "
"<code>example.com/caminho/base</code>. Adicionalmente, é possível determinar "
"um idioma para cada domínio, que será usado para adicionar tags <code>&lt;"
"link&gt;</code> com o atributo <code>hreflang</code> ao cabeçalho do "
"documento."
#: MultipleDomain.php:305
msgid "Ignore default ports"
msgstr "Ignorar portas padrão"
#: MultipleDomain.php:306
msgid ""
"When enabled, removes the port from URL when redirecting and it's a default "
"HTTP (<code>80</code>) or HTTPS (<code>443</code>) port."
msgstr ""
"Quando habilitado, remove a porta da URL quando redirecionando e é uma porta "
"padrão HTTP (<code>80</code>) ou HTTPS (<code>443</code>)."
#: MultipleDomain.php:412
msgid "Settings"
msgstr "Configurações"
#: MultipleDomain.php:609
msgid "Domain"
msgstr "Domínio"
#: MultipleDomain.php:612
msgid "Base path restriction"
msgstr "Restrição de caminho base"
#: MultipleDomain.php:615
msgid "Remove"
msgstr "Remover"

View File

@ -0,0 +1,564 @@
id,value
af,Afrikaans
af_NA,"Afrikaans (Namibia)"
af_ZA,"Afrikaans (South Africa)"
ak,Akan
ak_GH,"Akan (Ghana)"
sq,Albanian
sq_AL,"Albanian (Albania)"
sq_XK,"Albanian (Kosovo)"
sq_MK,"Albanian (Macedonia)"
am,Amharic
am_ET,"Amharic (Ethiopia)"
ar,Arabic
ar_DZ,"Arabic (Algeria)"
ar_BH,"Arabic (Bahrain)"
ar_TD,"Arabic (Chad)"
ar_KM,"Arabic (Comoros)"
ar_DJ,"Arabic (Djibouti)"
ar_EG,"Arabic (Egypt)"
ar_ER,"Arabic (Eritrea)"
ar_IQ,"Arabic (Iraq)"
ar_IL,"Arabic (Israel)"
ar_JO,"Arabic (Jordan)"
ar_KW,"Arabic (Kuwait)"
ar_LB,"Arabic (Lebanon)"
ar_LY,"Arabic (Libya)"
ar_MR,"Arabic (Mauritania)"
ar_MA,"Arabic (Morocco)"
ar_OM,"Arabic (Oman)"
ar_PS,"Arabic (Palestinian Territories)"
ar_QA,"Arabic (Qatar)"
ar_SA,"Arabic (Saudi Arabia)"
ar_SO,"Arabic (Somalia)"
ar_SS,"Arabic (South Sudan)"
ar_SD,"Arabic (Sudan)"
ar_SY,"Arabic (Syria)"
ar_TN,"Arabic (Tunisia)"
ar_AE,"Arabic (United Arab Emirates)"
ar_EH,"Arabic (Western Sahara)"
ar_YE,"Arabic (Yemen)"
hy,Armenian
hy_AM,"Armenian (Armenia)"
as,Assamese
as_IN,"Assamese (India)"
az,Azerbaijani
az_AZ,"Azerbaijani (Azerbaijan)"
az_Cyrl_AZ,"Azerbaijani (Cyrillic, Azerbaijan)"
az_Cyrl,"Azerbaijani (Cyrillic)"
az_Latn_AZ,"Azerbaijani (Latin, Azerbaijan)"
az_Latn,"Azerbaijani (Latin)"
bm,Bambara
bm_Latn_ML,"Bambara (Latin, Mali)"
bm_Latn,"Bambara (Latin)"
eu,Basque
eu_ES,"Basque (Spain)"
be,Belarusian
be_BY,"Belarusian (Belarus)"
bn,Bengali
bn_BD,"Bengali (Bangladesh)"
bn_IN,"Bengali (India)"
bs,Bosnian
bs_BA,"Bosnian (Bosnia & Herzegovina)"
bs_Cyrl_BA,"Bosnian (Cyrillic, Bosnia & Herzegovina)"
bs_Cyrl,"Bosnian (Cyrillic)"
bs_Latn_BA,"Bosnian (Latin, Bosnia & Herzegovina)"
bs_Latn,"Bosnian (Latin)"
br,Breton
br_FR,"Breton (France)"
bg,Bulgarian
bg_BG,"Bulgarian (Bulgaria)"
my,Burmese
my_MM,"Burmese (Myanmar (Burma))"
ca,Catalan
ca_AD,"Catalan (Andorra)"
ca_FR,"Catalan (France)"
ca_IT,"Catalan (Italy)"
ca_ES,"Catalan (Spain)"
zh,Chinese
zh_CN,"Chinese (China)"
zh_HK,"Chinese (Hong Kong SAR China)"
zh_MO,"Chinese (Macau SAR China)"
zh_Hans_CN,"Chinese (Simplified, China)"
zh_Hans_HK,"Chinese (Simplified, Hong Kong SAR China)"
zh_Hans_MO,"Chinese (Simplified, Macau SAR China)"
zh_Hans_SG,"Chinese (Simplified, Singapore)"
zh_Hans,"Chinese (Simplified)"
zh_SG,"Chinese (Singapore)"
zh_TW,"Chinese (Taiwan)"
zh_Hant_HK,"Chinese (Traditional, Hong Kong SAR China)"
zh_Hant_MO,"Chinese (Traditional, Macau SAR China)"
zh_Hant_TW,"Chinese (Traditional, Taiwan)"
zh_Hant,"Chinese (Traditional)"
kw,Cornish
kw_GB,"Cornish (United Kingdom)"
hr,Croatian
hr_BA,"Croatian (Bosnia & Herzegovina)"
hr_HR,"Croatian (Croatia)"
cs,Czech
cs_CZ,"Czech (Czech Republic)"
da,Danish
da_DK,"Danish (Denmark)"
da_GL,"Danish (Greenland)"
nl,Dutch
nl_AW,"Dutch (Aruba)"
nl_BE,"Dutch (Belgium)"
nl_BQ,"Dutch (Caribbean Netherlands)"
nl_CW,"Dutch (Curaçao)"
nl_NL,"Dutch (Netherlands)"
nl_SX,"Dutch (Sint Maarten)"
nl_SR,"Dutch (Suriname)"
dz,Dzongkha
dz_BT,"Dzongkha (Bhutan)"
en,English
en_AS,"English (American Samoa)"
en_AI,"English (Anguilla)"
en_AG,"English (Antigua & Barbuda)"
en_AU,"English (Australia)"
en_BS,"English (Bahamas)"
en_BB,"English (Barbados)"
en_BE,"English (Belgium)"
en_BZ,"English (Belize)"
en_BM,"English (Bermuda)"
en_BW,"English (Botswana)"
en_IO,"English (British Indian Ocean Territory)"
en_VG,"English (British Virgin Islands)"
en_CM,"English (Cameroon)"
en_CA,"English (Canada)"
en_KY,"English (Cayman Islands)"
en_CX,"English (Christmas Island)"
en_CC,"English (Cocos (Keeling) Islands)"
en_CK,"English (Cook Islands)"
en_DG,"English (Diego Garcia)"
en_DM,"English (Dominica)"
en_ER,"English (Eritrea)"
en_FK,"English (Falkland Islands)"
en_FJ,"English (Fiji)"
en_GM,"English (Gambia)"
en_GH,"English (Ghana)"
en_GI,"English (Gibraltar)"
en_GD,"English (Grenada)"
en_GU,"English (Guam)"
en_GG,"English (Guernsey)"
en_GY,"English (Guyana)"
en_HK,"English (Hong Kong SAR China)"
en_IN,"English (India)"
en_IE,"English (Ireland)"
en_IM,"English (Isle of Man)"
en_JM,"English (Jamaica)"
en_JE,"English (Jersey)"
en_KE,"English (Kenya)"
en_KI,"English (Kiribati)"
en_LS,"English (Lesotho)"
en_LR,"English (Liberia)"
en_MO,"English (Macau SAR China)"
en_MG,"English (Madagascar)"
en_MW,"English (Malawi)"
en_MY,"English (Malaysia)"
en_MT,"English (Malta)"
en_MH,"English (Marshall Islands)"
en_MU,"English (Mauritius)"
en_FM,"English (Micronesia)"
en_MS,"English (Montserrat)"
en_NA,"English (Namibia)"
en_NR,"English (Nauru)"
en_NZ,"English (New Zealand)"
en_NG,"English (Nigeria)"
en_NU,"English (Niue)"
en_NF,"English (Norfolk Island)"
en_MP,"English (Northern Mariana Islands)"
en_PK,"English (Pakistan)"
en_PW,"English (Palau)"
en_PG,"English (Papua New Guinea)"
en_PH,"English (Philippines)"
en_PN,"English (Pitcairn Islands)"
en_PR,"English (Puerto Rico)"
en_RW,"English (Rwanda)"
en_WS,"English (Samoa)"
en_SC,"English (Seychelles)"
en_SL,"English (Sierra Leone)"
en_SG,"English (Singapore)"
en_SX,"English (Sint Maarten)"
en_SB,"English (Solomon Islands)"
en_ZA,"English (South Africa)"
en_SS,"English (South Sudan)"
en_SH,"English (St. Helena)"
en_KN,"English (St. Kitts & Nevis)"
en_LC,"English (St. Lucia)"
en_VC,"English (St. Vincent & Grenadines)"
en_SD,"English (Sudan)"
en_SZ,"English (Swaziland)"
en_TZ,"English (Tanzania)"
en_TK,"English (Tokelau)"
en_TO,"English (Tonga)"
en_TT,"English (Trinidad & Tobago)"
en_TC,"English (Turks & Caicos Islands)"
en_TV,"English (Tuvalu)"
en_UM,"English (U.S. Outlying Islands)"
en_VI,"English (U.S. Virgin Islands)"
en_UG,"English (Uganda)"
en_GB,"English (United Kingdom)"
en_US,"English (United States)"
en_VU,"English (Vanuatu)"
en_ZM,"English (Zambia)"
en_ZW,"English (Zimbabwe)"
eo,Esperanto
et,Estonian
et_EE,"Estonian (Estonia)"
ee,Ewe
ee_GH,"Ewe (Ghana)"
ee_TG,"Ewe (Togo)"
fo,Faroese
fo_FO,"Faroese (Faroe Islands)"
fi,Finnish
fi_FI,"Finnish (Finland)"
fr,French
fr_DZ,"French (Algeria)"
fr_BE,"French (Belgium)"
fr_BJ,"French (Benin)"
fr_BF,"French (Burkina Faso)"
fr_BI,"French (Burundi)"
fr_CM,"French (Cameroon)"
fr_CA,"French (Canada)"
fr_CF,"French (Central African Republic)"
fr_TD,"French (Chad)"
fr_KM,"French (Comoros)"
fr_CG,"French (Congo - Brazzaville)"
fr_CD,"French (Congo - Kinshasa)"
fr_CI,"French (Côte dIvoire)"
fr_DJ,"French (Djibouti)"
fr_GQ,"French (Equatorial Guinea)"
fr_FR,"French (France)"
fr_GF,"French (French Guiana)"
fr_PF,"French (French Polynesia)"
fr_GA,"French (Gabon)"
fr_GP,"French (Guadeloupe)"
fr_GN,"French (Guinea)"
fr_HT,"French (Haiti)"
fr_LU,"French (Luxembourg)"
fr_MG,"French (Madagascar)"
fr_ML,"French (Mali)"
fr_MQ,"French (Martinique)"
fr_MR,"French (Mauritania)"
fr_MU,"French (Mauritius)"
fr_YT,"French (Mayotte)"
fr_MC,"French (Monaco)"
fr_MA,"French (Morocco)"
fr_NC,"French (New Caledonia)"
fr_NE,"French (Niger)"
fr_RE,"French (Réunion)"
fr_RW,"French (Rwanda)"
fr_SN,"French (Senegal)"
fr_SC,"French (Seychelles)"
fr_BL,"French (St. Barthélemy)"
fr_MF,"French (St. Martin)"
fr_PM,"French (St. Pierre & Miquelon)"
fr_CH,"French (Switzerland)"
fr_SY,"French (Syria)"
fr_TG,"French (Togo)"
fr_TN,"French (Tunisia)"
fr_VU,"French (Vanuatu)"
fr_WF,"French (Wallis & Futuna)"
ff,Fulah
ff_CM,"Fulah (Cameroon)"
ff_GN,"Fulah (Guinea)"
ff_MR,"Fulah (Mauritania)"
ff_SN,"Fulah (Senegal)"
gl,Galician
gl_ES,"Galician (Spain)"
lg,Ganda
lg_UG,"Ganda (Uganda)"
ka,Georgian
ka_GE,"Georgian (Georgia)"
de,German
de_AT,"German (Austria)"
de_BE,"German (Belgium)"
de_DE,"German (Germany)"
de_LI,"German (Liechtenstein)"
de_LU,"German (Luxembourg)"
de_CH,"German (Switzerland)"
el,Greek
el_CY,"Greek (Cyprus)"
el_GR,"Greek (Greece)"
gu,Gujarati
gu_IN,"Gujarati (India)"
ha,Hausa
ha_GH,"Hausa (Ghana)"
ha_Latn_GH,"Hausa (Latin, Ghana)"
ha_Latn_NE,"Hausa (Latin, Niger)"
ha_Latn_NG,"Hausa (Latin, Nigeria)"
ha_Latn,"Hausa (Latin)"
ha_NE,"Hausa (Niger)"
ha_NG,"Hausa (Nigeria)"
he,Hebrew
he_IL,"Hebrew (Israel)"
hi,Hindi
hi_IN,"Hindi (India)"
hu,Hungarian
hu_HU,"Hungarian (Hungary)"
is,Icelandic
is_IS,"Icelandic (Iceland)"
ig,Igbo
ig_NG,"Igbo (Nigeria)"
id,Indonesian
id_ID,"Indonesian (Indonesia)"
ga,Irish
ga_IE,"Irish (Ireland)"
it,Italian
it_IT,"Italian (Italy)"
it_SM,"Italian (San Marino)"
it_CH,"Italian (Switzerland)"
ja,Japanese
ja_JP,"Japanese (Japan)"
kl,Kalaallisut
kl_GL,"Kalaallisut (Greenland)"
kn,Kannada
kn_IN,"Kannada (India)"
ks,Kashmiri
ks_Arab_IN,"Kashmiri (Arabic, India)"
ks_Arab,"Kashmiri (Arabic)"
ks_IN,"Kashmiri (India)"
kk,Kazakh
kk_Cyrl_KZ,"Kazakh (Cyrillic, Kazakhstan)"
kk_Cyrl,"Kazakh (Cyrillic)"
kk_KZ,"Kazakh (Kazakhstan)"
km,Khmer
km_KH,"Khmer (Cambodia)"
ki,Kikuyu
ki_KE,"Kikuyu (Kenya)"
rw,Kinyarwanda
rw_RW,"Kinyarwanda (Rwanda)"
ko,Korean
ko_KP,"Korean (North Korea)"
ko_KR,"Korean (South Korea)"
ky,Kyrgyz
ky_Cyrl_KG,"Kyrgyz (Cyrillic, Kyrgyzstan)"
ky_Cyrl,"Kyrgyz (Cyrillic)"
ky_KG,"Kyrgyz (Kyrgyzstan)"
lo,Lao
lo_LA,"Lao (Laos)"
lv,Latvian
lv_LV,"Latvian (Latvia)"
ln,Lingala
ln_AO,"Lingala (Angola)"
ln_CF,"Lingala (Central African Republic)"
ln_CG,"Lingala (Congo - Brazzaville)"
ln_CD,"Lingala (Congo - Kinshasa)"
lt,Lithuanian
lt_LT,"Lithuanian (Lithuania)"
lu,Luba-Katanga
lu_CD,"Luba-Katanga (Congo - Kinshasa)"
lb,Luxembourgish
lb_LU,"Luxembourgish (Luxembourg)"
mk,Macedonian
mk_MK,"Macedonian (Macedonia)"
mg,Malagasy
mg_MG,"Malagasy (Madagascar)"
ms,Malay
ms_BN,"Malay (Brunei)"
ms_Latn_BN,"Malay (Latin, Brunei)"
ms_Latn_MY,"Malay (Latin, Malaysia)"
ms_Latn_SG,"Malay (Latin, Singapore)"
ms_Latn,"Malay (Latin)"
ms_MY,"Malay (Malaysia)"
ms_SG,"Malay (Singapore)"
ml,Malayalam
ml_IN,"Malayalam (India)"
mt,Maltese
mt_MT,"Maltese (Malta)"
gv,Manx
gv_IM,"Manx (Isle of Man)"
mr,Marathi
mr_IN,"Marathi (India)"
mn,Mongolian
mn_Cyrl_MN,"Mongolian (Cyrillic, Mongolia)"
mn_Cyrl,"Mongolian (Cyrillic)"
mn_MN,"Mongolian (Mongolia)"
ne,Nepali
ne_IN,"Nepali (India)"
ne_NP,"Nepali (Nepal)"
nd,"North Ndebele"
nd_ZW,"North Ndebele (Zimbabwe)"
se,"Northern Sami"
se_FI,"Northern Sami (Finland)"
se_NO,"Northern Sami (Norway)"
se_SE,"Northern Sami (Sweden)"
no,Norwegian
no_NO,"Norwegian (Norway)"
nb,"Norwegian Bokmål"
nb_NO,"Norwegian Bokmål (Norway)"
nb_SJ,"Norwegian Bokmål (Svalbard & Jan Mayen)"
nn,"Norwegian Nynorsk"
nn_NO,"Norwegian Nynorsk (Norway)"
or,Oriya
or_IN,"Oriya (India)"
om,Oromo
om_ET,"Oromo (Ethiopia)"
om_KE,"Oromo (Kenya)"
os,Ossetic
os_GE,"Ossetic (Georgia)"
os_RU,"Ossetic (Russia)"
ps,Pashto
ps_AF,"Pashto (Afghanistan)"
fa,Persian
fa_AF,"Persian (Afghanistan)"
fa_IR,"Persian (Iran)"
pl,Polish
pl_PL,"Polish (Poland)"
pt,Portuguese
pt_AO,"Portuguese (Angola)"
pt_BR,"Portuguese (Brazil)"
pt_CV,"Portuguese (Cape Verde)"
pt_GW,"Portuguese (Guinea-Bissau)"
pt_MO,"Portuguese (Macau SAR China)"
pt_MZ,"Portuguese (Mozambique)"
pt_PT,"Portuguese (Portugal)"
pt_ST,"Portuguese (São Tomé & Príncipe)"
pt_TL,"Portuguese (Timor-Leste)"
pa,Punjabi
pa_Arab_PK,"Punjabi (Arabic, Pakistan)"
pa_Arab,"Punjabi (Arabic)"
pa_Guru_IN,"Punjabi (Gurmukhi, India)"
pa_Guru,"Punjabi (Gurmukhi)"
pa_IN,"Punjabi (India)"
pa_PK,"Punjabi (Pakistan)"
qu,Quechua
qu_BO,"Quechua (Bolivia)"
qu_EC,"Quechua (Ecuador)"
qu_PE,"Quechua (Peru)"
ro,Romanian
ro_MD,"Romanian (Moldova)"
ro_RO,"Romanian (Romania)"
rm,Romansh
rm_CH,"Romansh (Switzerland)"
rn,Rundi
rn_BI,"Rundi (Burundi)"
ru,Russian
ru_BY,"Russian (Belarus)"
ru_KZ,"Russian (Kazakhstan)"
ru_KG,"Russian (Kyrgyzstan)"
ru_MD,"Russian (Moldova)"
ru_RU,"Russian (Russia)"
ru_UA,"Russian (Ukraine)"
sg,Sango
sg_CF,"Sango (Central African Republic)"
gd,"Scottish Gaelic"
gd_GB,"Scottish Gaelic (United Kingdom)"
sr,Serbian
sr_BA,"Serbian (Bosnia & Herzegovina)"
sr_Cyrl_BA,"Serbian (Cyrillic, Bosnia & Herzegovina)"
sr_Cyrl_XK,"Serbian (Cyrillic, Kosovo)"
sr_Cyrl_ME,"Serbian (Cyrillic, Montenegro)"
sr_Cyrl_RS,"Serbian (Cyrillic, Serbia)"
sr_Cyrl,"Serbian (Cyrillic)"
sr_XK,"Serbian (Kosovo)"
sr_Latn_BA,"Serbian (Latin, Bosnia & Herzegovina)"
sr_Latn_XK,"Serbian (Latin, Kosovo)"
sr_Latn_ME,"Serbian (Latin, Montenegro)"
sr_Latn_RS,"Serbian (Latin, Serbia)"
sr_Latn,"Serbian (Latin)"
sr_ME,"Serbian (Montenegro)"
sr_RS,"Serbian (Serbia)"
sh,Serbo-Croatian
sh_BA,"Serbo-Croatian (Bosnia & Herzegovina)"
sn,Shona
sn_ZW,"Shona (Zimbabwe)"
ii,"Sichuan Yi"
ii_CN,"Sichuan Yi (China)"
si,Sinhala
si_LK,"Sinhala (Sri Lanka)"
sk,Slovak
sk_SK,"Slovak (Slovakia)"
sl,Slovenian
sl_SI,"Slovenian (Slovenia)"
so,Somali
so_DJ,"Somali (Djibouti)"
so_ET,"Somali (Ethiopia)"
so_KE,"Somali (Kenya)"
so_SO,"Somali (Somalia)"
es,Spanish
es_AR,"Spanish (Argentina)"
es_BO,"Spanish (Bolivia)"
es_IC,"Spanish (Canary Islands)"
es_EA,"Spanish (Ceuta & Melilla)"
es_CL,"Spanish (Chile)"
es_CO,"Spanish (Colombia)"
es_CR,"Spanish (Costa Rica)"
es_CU,"Spanish (Cuba)"
es_DO,"Spanish (Dominican Republic)"
es_EC,"Spanish (Ecuador)"
es_SV,"Spanish (El Salvador)"
es_GQ,"Spanish (Equatorial Guinea)"
es_GT,"Spanish (Guatemala)"
es_HN,"Spanish (Honduras)"
es_MX,"Spanish (Mexico)"
es_NI,"Spanish (Nicaragua)"
es_PA,"Spanish (Panama)"
es_PY,"Spanish (Paraguay)"
es_PE,"Spanish (Peru)"
es_PH,"Spanish (Philippines)"
es_PR,"Spanish (Puerto Rico)"
es_ES,"Spanish (Spain)"
es_US,"Spanish (United States)"
es_UY,"Spanish (Uruguay)"
es_VE,"Spanish (Venezuela)"
sw,Swahili
sw_KE,"Swahili (Kenya)"
sw_TZ,"Swahili (Tanzania)"
sw_UG,"Swahili (Uganda)"
sv,Swedish
sv_AX,"Swedish (Åland Islands)"
sv_FI,"Swedish (Finland)"
sv_SE,"Swedish (Sweden)"
tl,Tagalog
tl_PH,"Tagalog (Philippines)"
ta,Tamil
ta_IN,"Tamil (India)"
ta_MY,"Tamil (Malaysia)"
ta_SG,"Tamil (Singapore)"
ta_LK,"Tamil (Sri Lanka)"
te,Telugu
te_IN,"Telugu (India)"
th,Thai
th_TH,"Thai (Thailand)"
bo,Tibetan
bo_CN,"Tibetan (China)"
bo_IN,"Tibetan (India)"
ti,Tigrinya
ti_ER,"Tigrinya (Eritrea)"
ti_ET,"Tigrinya (Ethiopia)"
to,Tongan
to_TO,"Tongan (Tonga)"
tr,Turkish
tr_CY,"Turkish (Cyprus)"
tr_TR,"Turkish (Turkey)"
uk,Ukrainian
uk_UA,"Ukrainian (Ukraine)"
ur,Urdu
ur_IN,"Urdu (India)"
ur_PK,"Urdu (Pakistan)"
ug,Uyghur
ug_Arab_CN,"Uyghur (Arabic, China)"
ug_Arab,"Uyghur (Arabic)"
ug_CN,"Uyghur (China)"
uz,Uzbek
uz_AF,"Uzbek (Afghanistan)"
uz_Arab_AF,"Uzbek (Arabic, Afghanistan)"
uz_Arab,"Uzbek (Arabic)"
uz_Cyrl_UZ,"Uzbek (Cyrillic, Uzbekistan)"
uz_Cyrl,"Uzbek (Cyrillic)"
uz_Latn_UZ,"Uzbek (Latin, Uzbekistan)"
uz_Latn,"Uzbek (Latin)"
uz_UZ,"Uzbek (Uzbekistan)"
vi,Vietnamese
vi_VN,"Vietnamese (Vietnam)"
cy,Welsh
cy_GB,"Welsh (United Kingdom)"
fy,"Western Frisian"
fy_NL,"Western Frisian (Netherlands)"
yi,Yiddish
yo,Yoruba
yo_BJ,"Yoruba (Benin)"
yo_NG,"Yoruba (Nigeria)"
zu,Zulu
zu_ZA,"Zulu (South Africa)"
1 id value
2 af Afrikaans
3 af_NA Afrikaans (Namibia)
4 af_ZA Afrikaans (South Africa)
5 ak Akan
6 ak_GH Akan (Ghana)
7 sq Albanian
8 sq_AL Albanian (Albania)
9 sq_XK Albanian (Kosovo)
10 sq_MK Albanian (Macedonia)
11 am Amharic
12 am_ET Amharic (Ethiopia)
13 ar Arabic
14 ar_DZ Arabic (Algeria)
15 ar_BH Arabic (Bahrain)
16 ar_TD Arabic (Chad)
17 ar_KM Arabic (Comoros)
18 ar_DJ Arabic (Djibouti)
19 ar_EG Arabic (Egypt)
20 ar_ER Arabic (Eritrea)
21 ar_IQ Arabic (Iraq)
22 ar_IL Arabic (Israel)
23 ar_JO Arabic (Jordan)
24 ar_KW Arabic (Kuwait)
25 ar_LB Arabic (Lebanon)
26 ar_LY Arabic (Libya)
27 ar_MR Arabic (Mauritania)
28 ar_MA Arabic (Morocco)
29 ar_OM Arabic (Oman)
30 ar_PS Arabic (Palestinian Territories)
31 ar_QA Arabic (Qatar)
32 ar_SA Arabic (Saudi Arabia)
33 ar_SO Arabic (Somalia)
34 ar_SS Arabic (South Sudan)
35 ar_SD Arabic (Sudan)
36 ar_SY Arabic (Syria)
37 ar_TN Arabic (Tunisia)
38 ar_AE Arabic (United Arab Emirates)
39 ar_EH Arabic (Western Sahara)
40 ar_YE Arabic (Yemen)
41 hy Armenian
42 hy_AM Armenian (Armenia)
43 as Assamese
44 as_IN Assamese (India)
45 az Azerbaijani
46 az_AZ Azerbaijani (Azerbaijan)
47 az_Cyrl_AZ Azerbaijani (Cyrillic, Azerbaijan)
48 az_Cyrl Azerbaijani (Cyrillic)
49 az_Latn_AZ Azerbaijani (Latin, Azerbaijan)
50 az_Latn Azerbaijani (Latin)
51 bm Bambara
52 bm_Latn_ML Bambara (Latin, Mali)
53 bm_Latn Bambara (Latin)
54 eu Basque
55 eu_ES Basque (Spain)
56 be Belarusian
57 be_BY Belarusian (Belarus)
58 bn Bengali
59 bn_BD Bengali (Bangladesh)
60 bn_IN Bengali (India)
61 bs Bosnian
62 bs_BA Bosnian (Bosnia & Herzegovina)
63 bs_Cyrl_BA Bosnian (Cyrillic, Bosnia & Herzegovina)
64 bs_Cyrl Bosnian (Cyrillic)
65 bs_Latn_BA Bosnian (Latin, Bosnia & Herzegovina)
66 bs_Latn Bosnian (Latin)
67 br Breton
68 br_FR Breton (France)
69 bg Bulgarian
70 bg_BG Bulgarian (Bulgaria)
71 my Burmese
72 my_MM Burmese (Myanmar (Burma))
73 ca Catalan
74 ca_AD Catalan (Andorra)
75 ca_FR Catalan (France)
76 ca_IT Catalan (Italy)
77 ca_ES Catalan (Spain)
78 zh Chinese
79 zh_CN Chinese (China)
80 zh_HK Chinese (Hong Kong SAR China)
81 zh_MO Chinese (Macau SAR China)
82 zh_Hans_CN Chinese (Simplified, China)
83 zh_Hans_HK Chinese (Simplified, Hong Kong SAR China)
84 zh_Hans_MO Chinese (Simplified, Macau SAR China)
85 zh_Hans_SG Chinese (Simplified, Singapore)
86 zh_Hans Chinese (Simplified)
87 zh_SG Chinese (Singapore)
88 zh_TW Chinese (Taiwan)
89 zh_Hant_HK Chinese (Traditional, Hong Kong SAR China)
90 zh_Hant_MO Chinese (Traditional, Macau SAR China)
91 zh_Hant_TW Chinese (Traditional, Taiwan)
92 zh_Hant Chinese (Traditional)
93 kw Cornish
94 kw_GB Cornish (United Kingdom)
95 hr Croatian
96 hr_BA Croatian (Bosnia & Herzegovina)
97 hr_HR Croatian (Croatia)
98 cs Czech
99 cs_CZ Czech (Czech Republic)
100 da Danish
101 da_DK Danish (Denmark)
102 da_GL Danish (Greenland)
103 nl Dutch
104 nl_AW Dutch (Aruba)
105 nl_BE Dutch (Belgium)
106 nl_BQ Dutch (Caribbean Netherlands)
107 nl_CW Dutch (Curaçao)
108 nl_NL Dutch (Netherlands)
109 nl_SX Dutch (Sint Maarten)
110 nl_SR Dutch (Suriname)
111 dz Dzongkha
112 dz_BT Dzongkha (Bhutan)
113 en English
114 en_AS English (American Samoa)
115 en_AI English (Anguilla)
116 en_AG English (Antigua & Barbuda)
117 en_AU English (Australia)
118 en_BS English (Bahamas)
119 en_BB English (Barbados)
120 en_BE English (Belgium)
121 en_BZ English (Belize)
122 en_BM English (Bermuda)
123 en_BW English (Botswana)
124 en_IO English (British Indian Ocean Territory)
125 en_VG English (British Virgin Islands)
126 en_CM English (Cameroon)
127 en_CA English (Canada)
128 en_KY English (Cayman Islands)
129 en_CX English (Christmas Island)
130 en_CC English (Cocos (Keeling) Islands)
131 en_CK English (Cook Islands)
132 en_DG English (Diego Garcia)
133 en_DM English (Dominica)
134 en_ER English (Eritrea)
135 en_FK English (Falkland Islands)
136 en_FJ English (Fiji)
137 en_GM English (Gambia)
138 en_GH English (Ghana)
139 en_GI English (Gibraltar)
140 en_GD English (Grenada)
141 en_GU English (Guam)
142 en_GG English (Guernsey)
143 en_GY English (Guyana)
144 en_HK English (Hong Kong SAR China)
145 en_IN English (India)
146 en_IE English (Ireland)
147 en_IM English (Isle of Man)
148 en_JM English (Jamaica)
149 en_JE English (Jersey)
150 en_KE English (Kenya)
151 en_KI English (Kiribati)
152 en_LS English (Lesotho)
153 en_LR English (Liberia)
154 en_MO English (Macau SAR China)
155 en_MG English (Madagascar)
156 en_MW English (Malawi)
157 en_MY English (Malaysia)
158 en_MT English (Malta)
159 en_MH English (Marshall Islands)
160 en_MU English (Mauritius)
161 en_FM English (Micronesia)
162 en_MS English (Montserrat)
163 en_NA English (Namibia)
164 en_NR English (Nauru)
165 en_NZ English (New Zealand)
166 en_NG English (Nigeria)
167 en_NU English (Niue)
168 en_NF English (Norfolk Island)
169 en_MP English (Northern Mariana Islands)
170 en_PK English (Pakistan)
171 en_PW English (Palau)
172 en_PG English (Papua New Guinea)
173 en_PH English (Philippines)
174 en_PN English (Pitcairn Islands)
175 en_PR English (Puerto Rico)
176 en_RW English (Rwanda)
177 en_WS English (Samoa)
178 en_SC English (Seychelles)
179 en_SL English (Sierra Leone)
180 en_SG English (Singapore)
181 en_SX English (Sint Maarten)
182 en_SB English (Solomon Islands)
183 en_ZA English (South Africa)
184 en_SS English (South Sudan)
185 en_SH English (St. Helena)
186 en_KN English (St. Kitts & Nevis)
187 en_LC English (St. Lucia)
188 en_VC English (St. Vincent & Grenadines)
189 en_SD English (Sudan)
190 en_SZ English (Swaziland)
191 en_TZ English (Tanzania)
192 en_TK English (Tokelau)
193 en_TO English (Tonga)
194 en_TT English (Trinidad & Tobago)
195 en_TC English (Turks & Caicos Islands)
196 en_TV English (Tuvalu)
197 en_UM English (U.S. Outlying Islands)
198 en_VI English (U.S. Virgin Islands)
199 en_UG English (Uganda)
200 en_GB English (United Kingdom)
201 en_US English (United States)
202 en_VU English (Vanuatu)
203 en_ZM English (Zambia)
204 en_ZW English (Zimbabwe)
205 eo Esperanto
206 et Estonian
207 et_EE Estonian (Estonia)
208 ee Ewe
209 ee_GH Ewe (Ghana)
210 ee_TG Ewe (Togo)
211 fo Faroese
212 fo_FO Faroese (Faroe Islands)
213 fi Finnish
214 fi_FI Finnish (Finland)
215 fr French
216 fr_DZ French (Algeria)
217 fr_BE French (Belgium)
218 fr_BJ French (Benin)
219 fr_BF French (Burkina Faso)
220 fr_BI French (Burundi)
221 fr_CM French (Cameroon)
222 fr_CA French (Canada)
223 fr_CF French (Central African Republic)
224 fr_TD French (Chad)
225 fr_KM French (Comoros)
226 fr_CG French (Congo - Brazzaville)
227 fr_CD French (Congo - Kinshasa)
228 fr_CI French (Côte d’Ivoire)
229 fr_DJ French (Djibouti)
230 fr_GQ French (Equatorial Guinea)
231 fr_FR French (France)
232 fr_GF French (French Guiana)
233 fr_PF French (French Polynesia)
234 fr_GA French (Gabon)
235 fr_GP French (Guadeloupe)
236 fr_GN French (Guinea)
237 fr_HT French (Haiti)
238 fr_LU French (Luxembourg)
239 fr_MG French (Madagascar)
240 fr_ML French (Mali)
241 fr_MQ French (Martinique)
242 fr_MR French (Mauritania)
243 fr_MU French (Mauritius)
244 fr_YT French (Mayotte)
245 fr_MC French (Monaco)
246 fr_MA French (Morocco)
247 fr_NC French (New Caledonia)
248 fr_NE French (Niger)
249 fr_RE French (Réunion)
250 fr_RW French (Rwanda)
251 fr_SN French (Senegal)
252 fr_SC French (Seychelles)
253 fr_BL French (St. Barthélemy)
254 fr_MF French (St. Martin)
255 fr_PM French (St. Pierre & Miquelon)
256 fr_CH French (Switzerland)
257 fr_SY French (Syria)
258 fr_TG French (Togo)
259 fr_TN French (Tunisia)
260 fr_VU French (Vanuatu)
261 fr_WF French (Wallis & Futuna)
262 ff Fulah
263 ff_CM Fulah (Cameroon)
264 ff_GN Fulah (Guinea)
265 ff_MR Fulah (Mauritania)
266 ff_SN Fulah (Senegal)
267 gl Galician
268 gl_ES Galician (Spain)
269 lg Ganda
270 lg_UG Ganda (Uganda)
271 ka Georgian
272 ka_GE Georgian (Georgia)
273 de German
274 de_AT German (Austria)
275 de_BE German (Belgium)
276 de_DE German (Germany)
277 de_LI German (Liechtenstein)
278 de_LU German (Luxembourg)
279 de_CH German (Switzerland)
280 el Greek
281 el_CY Greek (Cyprus)
282 el_GR Greek (Greece)
283 gu Gujarati
284 gu_IN Gujarati (India)
285 ha Hausa
286 ha_GH Hausa (Ghana)
287 ha_Latn_GH Hausa (Latin, Ghana)
288 ha_Latn_NE Hausa (Latin, Niger)
289 ha_Latn_NG Hausa (Latin, Nigeria)
290 ha_Latn Hausa (Latin)
291 ha_NE Hausa (Niger)
292 ha_NG Hausa (Nigeria)
293 he Hebrew
294 he_IL Hebrew (Israel)
295 hi Hindi
296 hi_IN Hindi (India)
297 hu Hungarian
298 hu_HU Hungarian (Hungary)
299 is Icelandic
300 is_IS Icelandic (Iceland)
301 ig Igbo
302 ig_NG Igbo (Nigeria)
303 id Indonesian
304 id_ID Indonesian (Indonesia)
305 ga Irish
306 ga_IE Irish (Ireland)
307 it Italian
308 it_IT Italian (Italy)
309 it_SM Italian (San Marino)
310 it_CH Italian (Switzerland)
311 ja Japanese
312 ja_JP Japanese (Japan)
313 kl Kalaallisut
314 kl_GL Kalaallisut (Greenland)
315 kn Kannada
316 kn_IN Kannada (India)
317 ks Kashmiri
318 ks_Arab_IN Kashmiri (Arabic, India)
319 ks_Arab Kashmiri (Arabic)
320 ks_IN Kashmiri (India)
321 kk Kazakh
322 kk_Cyrl_KZ Kazakh (Cyrillic, Kazakhstan)
323 kk_Cyrl Kazakh (Cyrillic)
324 kk_KZ Kazakh (Kazakhstan)
325 km Khmer
326 km_KH Khmer (Cambodia)
327 ki Kikuyu
328 ki_KE Kikuyu (Kenya)
329 rw Kinyarwanda
330 rw_RW Kinyarwanda (Rwanda)
331 ko Korean
332 ko_KP Korean (North Korea)
333 ko_KR Korean (South Korea)
334 ky Kyrgyz
335 ky_Cyrl_KG Kyrgyz (Cyrillic, Kyrgyzstan)
336 ky_Cyrl Kyrgyz (Cyrillic)
337 ky_KG Kyrgyz (Kyrgyzstan)
338 lo Lao
339 lo_LA Lao (Laos)
340 lv Latvian
341 lv_LV Latvian (Latvia)
342 ln Lingala
343 ln_AO Lingala (Angola)
344 ln_CF Lingala (Central African Republic)
345 ln_CG Lingala (Congo - Brazzaville)
346 ln_CD Lingala (Congo - Kinshasa)
347 lt Lithuanian
348 lt_LT Lithuanian (Lithuania)
349 lu Luba-Katanga
350 lu_CD Luba-Katanga (Congo - Kinshasa)
351 lb Luxembourgish
352 lb_LU Luxembourgish (Luxembourg)
353 mk Macedonian
354 mk_MK Macedonian (Macedonia)
355 mg Malagasy
356 mg_MG Malagasy (Madagascar)
357 ms Malay
358 ms_BN Malay (Brunei)
359 ms_Latn_BN Malay (Latin, Brunei)
360 ms_Latn_MY Malay (Latin, Malaysia)
361 ms_Latn_SG Malay (Latin, Singapore)
362 ms_Latn Malay (Latin)
363 ms_MY Malay (Malaysia)
364 ms_SG Malay (Singapore)
365 ml Malayalam
366 ml_IN Malayalam (India)
367 mt Maltese
368 mt_MT Maltese (Malta)
369 gv Manx
370 gv_IM Manx (Isle of Man)
371 mr Marathi
372 mr_IN Marathi (India)
373 mn Mongolian
374 mn_Cyrl_MN Mongolian (Cyrillic, Mongolia)
375 mn_Cyrl Mongolian (Cyrillic)
376 mn_MN Mongolian (Mongolia)
377 ne Nepali
378 ne_IN Nepali (India)
379 ne_NP Nepali (Nepal)
380 nd North Ndebele
381 nd_ZW North Ndebele (Zimbabwe)
382 se Northern Sami
383 se_FI Northern Sami (Finland)
384 se_NO Northern Sami (Norway)
385 se_SE Northern Sami (Sweden)
386 no Norwegian
387 no_NO Norwegian (Norway)
388 nb Norwegian Bokmål
389 nb_NO Norwegian Bokmål (Norway)
390 nb_SJ Norwegian Bokmål (Svalbard & Jan Mayen)
391 nn Norwegian Nynorsk
392 nn_NO Norwegian Nynorsk (Norway)
393 or Oriya
394 or_IN Oriya (India)
395 om Oromo
396 om_ET Oromo (Ethiopia)
397 om_KE Oromo (Kenya)
398 os Ossetic
399 os_GE Ossetic (Georgia)
400 os_RU Ossetic (Russia)
401 ps Pashto
402 ps_AF Pashto (Afghanistan)
403 fa Persian
404 fa_AF Persian (Afghanistan)
405 fa_IR Persian (Iran)
406 pl Polish
407 pl_PL Polish (Poland)
408 pt Portuguese
409 pt_AO Portuguese (Angola)
410 pt_BR Portuguese (Brazil)
411 pt_CV Portuguese (Cape Verde)
412 pt_GW Portuguese (Guinea-Bissau)
413 pt_MO Portuguese (Macau SAR China)
414 pt_MZ Portuguese (Mozambique)
415 pt_PT Portuguese (Portugal)
416 pt_ST Portuguese (São Tomé & Príncipe)
417 pt_TL Portuguese (Timor-Leste)
418 pa Punjabi
419 pa_Arab_PK Punjabi (Arabic, Pakistan)
420 pa_Arab Punjabi (Arabic)
421 pa_Guru_IN Punjabi (Gurmukhi, India)
422 pa_Guru Punjabi (Gurmukhi)
423 pa_IN Punjabi (India)
424 pa_PK Punjabi (Pakistan)
425 qu Quechua
426 qu_BO Quechua (Bolivia)
427 qu_EC Quechua (Ecuador)
428 qu_PE Quechua (Peru)
429 ro Romanian
430 ro_MD Romanian (Moldova)
431 ro_RO Romanian (Romania)
432 rm Romansh
433 rm_CH Romansh (Switzerland)
434 rn Rundi
435 rn_BI Rundi (Burundi)
436 ru Russian
437 ru_BY Russian (Belarus)
438 ru_KZ Russian (Kazakhstan)
439 ru_KG Russian (Kyrgyzstan)
440 ru_MD Russian (Moldova)
441 ru_RU Russian (Russia)
442 ru_UA Russian (Ukraine)
443 sg Sango
444 sg_CF Sango (Central African Republic)
445 gd Scottish Gaelic
446 gd_GB Scottish Gaelic (United Kingdom)
447 sr Serbian
448 sr_BA Serbian (Bosnia & Herzegovina)
449 sr_Cyrl_BA Serbian (Cyrillic, Bosnia & Herzegovina)
450 sr_Cyrl_XK Serbian (Cyrillic, Kosovo)
451 sr_Cyrl_ME Serbian (Cyrillic, Montenegro)
452 sr_Cyrl_RS Serbian (Cyrillic, Serbia)
453 sr_Cyrl Serbian (Cyrillic)
454 sr_XK Serbian (Kosovo)
455 sr_Latn_BA Serbian (Latin, Bosnia & Herzegovina)
456 sr_Latn_XK Serbian (Latin, Kosovo)
457 sr_Latn_ME Serbian (Latin, Montenegro)
458 sr_Latn_RS Serbian (Latin, Serbia)
459 sr_Latn Serbian (Latin)
460 sr_ME Serbian (Montenegro)
461 sr_RS Serbian (Serbia)
462 sh Serbo-Croatian
463 sh_BA Serbo-Croatian (Bosnia & Herzegovina)
464 sn Shona
465 sn_ZW Shona (Zimbabwe)
466 ii Sichuan Yi
467 ii_CN Sichuan Yi (China)
468 si Sinhala
469 si_LK Sinhala (Sri Lanka)
470 sk Slovak
471 sk_SK Slovak (Slovakia)
472 sl Slovenian
473 sl_SI Slovenian (Slovenia)
474 so Somali
475 so_DJ Somali (Djibouti)
476 so_ET Somali (Ethiopia)
477 so_KE Somali (Kenya)
478 so_SO Somali (Somalia)
479 es Spanish
480 es_AR Spanish (Argentina)
481 es_BO Spanish (Bolivia)
482 es_IC Spanish (Canary Islands)
483 es_EA Spanish (Ceuta & Melilla)
484 es_CL Spanish (Chile)
485 es_CO Spanish (Colombia)
486 es_CR Spanish (Costa Rica)
487 es_CU Spanish (Cuba)
488 es_DO Spanish (Dominican Republic)
489 es_EC Spanish (Ecuador)
490 es_SV Spanish (El Salvador)
491 es_GQ Spanish (Equatorial Guinea)
492 es_GT Spanish (Guatemala)
493 es_HN Spanish (Honduras)
494 es_MX Spanish (Mexico)
495 es_NI Spanish (Nicaragua)
496 es_PA Spanish (Panama)
497 es_PY Spanish (Paraguay)
498 es_PE Spanish (Peru)
499 es_PH Spanish (Philippines)
500 es_PR Spanish (Puerto Rico)
501 es_ES Spanish (Spain)
502 es_US Spanish (United States)
503 es_UY Spanish (Uruguay)
504 es_VE Spanish (Venezuela)
505 sw Swahili
506 sw_KE Swahili (Kenya)
507 sw_TZ Swahili (Tanzania)
508 sw_UG Swahili (Uganda)
509 sv Swedish
510 sv_AX Swedish (Åland Islands)
511 sv_FI Swedish (Finland)
512 sv_SE Swedish (Sweden)
513 tl Tagalog
514 tl_PH Tagalog (Philippines)
515 ta Tamil
516 ta_IN Tamil (India)
517 ta_MY Tamil (Malaysia)
518 ta_SG Tamil (Singapore)
519 ta_LK Tamil (Sri Lanka)
520 te Telugu
521 te_IN Telugu (India)
522 th Thai
523 th_TH Thai (Thailand)
524 bo Tibetan
525 bo_CN Tibetan (China)
526 bo_IN Tibetan (India)
527 ti Tigrinya
528 ti_ER Tigrinya (Eritrea)
529 ti_ET Tigrinya (Ethiopia)
530 to Tongan
531 to_TO Tongan (Tonga)
532 tr Turkish
533 tr_CY Turkish (Cyprus)
534 tr_TR Turkish (Turkey)
535 uk Ukrainian
536 uk_UA Ukrainian (Ukraine)
537 ur Urdu
538 ur_IN Urdu (India)
539 ur_PK Urdu (Pakistan)
540 ug Uyghur
541 ug_Arab_CN Uyghur (Arabic, China)
542 ug_Arab Uyghur (Arabic)
543 ug_CN Uyghur (China)
544 uz Uzbek
545 uz_AF Uzbek (Afghanistan)
546 uz_Arab_AF Uzbek (Arabic, Afghanistan)
547 uz_Arab Uzbek (Arabic)
548 uz_Cyrl_UZ Uzbek (Cyrillic, Uzbekistan)
549 uz_Cyrl Uzbek (Cyrillic)
550 uz_Latn_UZ Uzbek (Latin, Uzbekistan)
551 uz_Latn Uzbek (Latin)
552 uz_UZ Uzbek (Uzbekistan)
553 vi Vietnamese
554 vi_VN Vietnamese (Vietnam)
555 cy Welsh
556 cy_GB Welsh (United Kingdom)
557 fy Western Frisian
558 fy_NL Western Frisian (Netherlands)
559 yi Yiddish
560 yo Yoruba
561 yo_BJ Yoruba (Benin)
562 yo_NG Yoruba (Nigeria)
563 zu Zulu
564 zu_ZA Zulu (South Africa)

View File

@ -0,0 +1,139 @@
<?php
/*
Plugin Name: Multiple Domain
Plugin URI: https://github.com/straube/multiple-domain
Description: This plugin allows you to have multiple domains in a single WordPress installation and enables custom redirects for each domain.
Version: 1.0.7
Author: goINPUT IT Solutions
Author URI: http://goinput.de
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: multiple-domain
Domain Path: /languages
*/
/*
* Loading classes.
*/
require 'MultipleDomain.php';
require 'MultipleDomainSettings.php';
/**
* The plugin file name.
*
* This is used mainly to set hooks and other features that requires the base
* plugin file name to work properly.
*
* @var string
* @since 0.8.3
*/
define('MULTIPLE_DOMAIN_PLUGIN', __FILE__);
if (!defined('MULTIPLE_DOMAIN_LOW_MEMORY')) {
/**
* The low memory option.
*
* This option may be used where the site is throwing "allowed memory
* exhausted" errors. It will reduce the memory usage in domain replacements
* with the downside of a higher execution time.
*
* @var bool
* @since 1.0.2
*/
define('MULTIPLE_DOMAIN_LOW_MEMORY', false);
}
/*
* Register the activation method.
*/
register_activation_hook(MULTIPLE_DOMAIN_PLUGIN, [ MultipleDomain::class, 'activate' ]);
/*
* Bootstrap...
*/
$multipleDomain = MultipleDomain::instance();
$domain = $multipleDomain->getDomain();
$originalDomain = $multipleDomain->getOriginalDomain();
$domainLang = $multipleDomain->getDomainLang();
/**
* The current domain.
*
* Since this value is checked against plugin settings, it may not reflect the
* actual domain in `HTTP_HOST` element from `$_SERVER`. It also may include
* the host port when it's different than 80 (default HTTP port) or 443
* (default HTTPS port).
*
* @var string
* @since 1.0.2
*/
define('MULTIPLE_DOMAIN_DOMAIN', $domain);
/**
* The original domain set in WordPress installation.
*
* @var string
* @since 1.0.2
*/
define('MULTIPLE_DOMAIN_ORIGINAL_DOMAIN', $originalDomain);
/**
* The current domain language.
*
* This value is the language associated with the current domain in the plugin
* settings. No check is made to verifiy if it reflects the actual user
* language or locale. Also, notice this constant may be `null` when no
* language is set in the plugin config.
*
* @var string
* @since 1.0.2
*/
define('MULTIPLE_DOMAIN_DOMAIN_LANG', $domainLang);
/**
* Keeping back compability with prior versions.
*
* This constant will be removed in a future release.
*
* @var string
* @since 0.2
* @see MULTIPLE_DOMAIN_DOMAIN
* @deprecated
*/
define('MULTPLE_DOMAIN_DOMAIN', MULTIPLE_DOMAIN_DOMAIN);
/**
* Keeping back compability with prior versions.
*
* This constant will be removed in a future release.
*
* @var string
* @since 0.3
* @see MULTIPLE_DOMAIN_ORIGINAL_DOMAIN
* @deprecated
*/
define('MULTPLE_DOMAIN_ORIGINAL_DOMAIN', MULTIPLE_DOMAIN_ORIGINAL_DOMAIN);
/**
* Keeping back compability with prior versions.
*
* This constant will be removed in a future release.
*
* @var string
* @since 0.8
* @see MULTIPLE_DOMAIN_DOMAIN_LANG
* @deprecated
*/
define('MULTPLE_DOMAIN_DOMAIN_LANG', MULTIPLE_DOMAIN_DOMAIN_LANG);

View File

@ -0,0 +1,280 @@
=== Multiple Domain ===
Contributors: sirjavik, mrelliwood, goinput, GustavoStraube, cyberaleks, jffaria
Tags: multiple, domains, redirect
Requires at least: 4.0
Tested up to: 5.7
Stable tag: 1.0.7
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
This plugin allows you to have multiple domains in a single Wordpress installation and enables custom redirects for each
domain.
== Description ==
Important: This plugin has a new maintainer. So the plugin will now be active developed again, and it's now part of [goINPUT](https://goinput.de).
Multiple Domain allows you having more than one domain in a single WordPress installation. This plugin doesn't support
more than one theme or advanced customizations for each domain. It's only intended to enable constant navigation under
many domains. For a more complex setup, there is
[WordPress Multisite (MU)](https://codex.wordpress.org/Create_A_Network).
When there is more than one domain set in your host, all links and resources will point to the default domain. This is
the default WordPress behavior. With Multiple Domain installed and properly configured, it'll update all link on the
fly. This way, the user navigation will be end-to-end under the same domain.
You can also set an optional base URL. If you want only a set of URL's available under a given domain, you can use this
restriction.
Additionally, a language can be set for each domain. The language will be used to add `<link>` tags with `hreflang`
attribute to document head. This is for SEO purposes.
== Installation ==
Follow the steps below to install the plugin:
1. Upload the plugin files to the `/wp-content/plugins/multiple-domain` directory, or install the plugin through the
WordPress plugins screen directly.
2. Activate the plugin through the 'Plugins' screen in WordPress.
3. Use the Settings -> General screen to configure your additional domains.
== Frequently Asked Questions ==
= How can I help the plugin development? =
Feel free to open a [pull request](https://github.com/goINPUT-IT-Solutions/multiple-domain/pulls) to address any of the
[issues](https://github.com/goINPUT-IT-Solutions/multiple-domain/issues) reported by the plugin users. In case you have questions
on how to fix or the best approach, start a discussion on the appropriate thread.
If you want to add a new feature, please [open an issue](https://github.com/goINPUT-IT-Solutions/multiple-domain/issues/new)
explaining the feature and how it would help the users before start writing your code.
**Donations**
If you find this plugin helpful, you can support the work involved buying me a coffee, beer or a Playstation 4 game.
You can send donations over PayPal to paypal@goinput.de.
= Does this plugin set extra domains within my host? =
No. You have to set additional domains, DNS, and everything else to use this plugin.
= Can I have a different theme/content/plugins for each domain? =
Nope. If you want a complex set up like this, you may be interested in WordPress Multisite. It's delivered with every
WordPress installation since 3.0, you can find more info here: https://codex.wordpress.org/Create_A_Network.
= There is a way to add domain based logic to my themes? =
Absolutely. You can use the `MULTIPLE_DOMAIN_DOMAIN` and `MULTIPLE_DOMAIN_ORIGINAL_DOMAIN` constants to get the current
and original domains. Just notice that since the value of the first one is checked against plugin settings, it may not
reflect the actual domain in `HTTP_HOST` element from `$_SERVER` or user's browser. They also may include the host port
when it's different than 80 (default HTTP port) or 443 (default HTTPS port).
**Notice**: in prior versions these constants were wrongly prefixed with `MULTPLE_`, missing the "I". The old constants
are now deprecated. They still available for backcompat but will be removed in future releases.
= Can I create a custom access restriction logic for each domain? =
Yes. You can use the `multiple_domain_redirect` action to do that. Please check
https://github.com/straube/multiple-domain/issues/2 for an example on how to do that.
= Can I get the language associated with the current domain? =
Yes. You can use the `MULTIPLE_DOMAIN_DOMAIN_LANG` constant to get the language associated with the current domain. Keep
in mind the value in this constant doesn't necessarily reflect the actual user language or locale. This is just the
language set in the plugin config. Also notice the language may be `null`.
**Notice**: in prior versions these constants were wrongly prefixed with `MULTPLE_`, missing the "I". The old constants
are now deprecated. They still available for backcompat but will be removed in future releases.
= Can I show the current domain in the content of posts or pages? =
Yes. There is a shortcode available for that. Just add `[multiple_domain]` to the post/page and it'll be replaced by
the current domain when viewing the content. You can write things like "Welcome to [multiple_domain]!", which would be
rendered as "Welcome to mydomain.com!".
= What domains should I add to the plugin setup? =
Any domain you're site is served from must be added to the plugin configuration. Even `www` variations and the original
domain where your WordPress was installed in must be added. You'll probably see some unexpected output when accessing
the site from a non-mapped domain.
= Can I disable `hreflang` tags output even for the original domain? =
Yes. You may notice that even if you don't set a language for any domain, you still get a default `hreflang` tag in
your page head. To disable this behavior, follow the instructions from
https://github.com/straube/multiple-domain/issues/51.
= I locked myself out, and what am I doing now? =
Under certain circumstances, in the case of a wrong configuration, you may not be able to log in to the admin area
and your page will be redirected. In this case, there are two ways to solve this.
1. Delete the plugin directory `wp-content/plugins/multiple-domain`. You should be able to do that from the hosting
panel, from an FTP client, or via SSH. The downside of this technique is that it wont be possible to install the
plugin again since the configuration will still be in the database.
2. Remove the plugin configuration from the database using the following SQL query `DELETE FROM {YOUR-PREFIX}_options
WHERE option_name LIKE 'multiple-domain-%'`; (Remember to replace the prefix from your own table name). This can be
done from the hosting panel when PHPMyAdmin is available or using a MySQL client.
== Screenshots ==
== Changelog ==
= 1.0.7 =
* Changed the author to the new one.
* Tested suport for WP 5.7
= 1.0.6 =
* Fix URI generated for canonical tag.
= 1.0.5 =
* Fixed issue with system routes when a base path is defined.
= 1.0.4 =
* Fixed assertions in admin views.
= 1.0.3 =
* Fixed XSS vulnerability in canonical/alternate tags.
= 1.0.2 =
* Added low memory option. (Refer to https://github.com/straube/multiple-domain/issues/45 on how to enable it)
* Constants starting with `MULTPLE_` are now deprecated. They have a matching `MULTIPLE_` prefixed constant.
* Fixed constants starting with `MULTPLE_`, changed to `MULTIPLE`.
= 1.0.1 =
* Fixed issue with regex used in domain replacement.
= 1.0.0 =
* Locked out instructions to readme file.
* API to programmatically change the domains list.
* Don't add canonical link if settings are `false`.
= 0.11.2 =
* FAQ about removal of `hreflang` tags.
* Fixed bug in domain replacement when it contains a slash (the regex delimiter).
* Fixed issue in the domain replacement regex.
= 0.11.1 =
* Fixed URI validation when there is a domain's base restriction.
= 0.11.0 =
* Add CHANGELOG.md file.
* Added option to enable canonical tags.
* Added `%%multiple_domain%%` advanced variable for Yoast.
* Moved WordPress admin features to a separate class.
* Renamed hreflang related methods.
* Inline documentation review.
* Minor refactoring.
* Fixed issue with domain replacement.
= 0.10.3 =
* Added public method to retrieve a given (or current) domain base path: `getDomainBase($domain = null)`.
* Minor code refactoring.
= 0.10.2 =
* Fix minor notice message when loading the non-mapped original domain.
* Added FAQ about plugin settings and domains.
= 0.10.1 =
* Fix bug introduced in 0.10.0 with setups where the original domain is not present in the plugin settings.
= 0.10.0 =
* Fix #31: Don't add SSL when accessing via a Tor domain name
* Moved HTML to view files.
= 0.9.0 =
* Fixed bug in backward compatibility logic.
* Added a class to `<body>` tag containing the domain name (e.g. `multipled-domain-name-tld`) to allow front-end customizations.
= 0.8.7 =
* Loading Multiple Domain before other plugins to fix issue with paths.
* Fix #38: Missing locales on language list (this issue was reopened and now it's fixed)
* Refactored `initAttributes` method.
= 0.8.6 =
* Fix #39: Rolling back changes introduced in 0.8.4 and 0.8.5 regarding to avoid URL changes in the WP admin.
= 0.8.5 =
* Fixed an issue introduced in 0.8.4 that breaks the admin URLs.
* Fix #38: Missing locales on language list
* Add `[multiple_domain]` shortcode to show the current language.
= 0.8.4 =
* Fix: #36 Wrong host in URLs returned by the JSON API
* Using singleton pattern for main plugin class.
* Avoiding URL changes in the admin panel.
= 0.8.3 =
* Fix: #34 hreflang tag error
= 0.8.2 =
* Fix: #32 Image URLs not being re-written properly via Tor.
= 0.8.1 =
* Fix: #23 Undefined index when using wp-cli.
= 0.8.0 =
* Moved `MultipleDomain` class to its own file.
* Fix: #14 Remove `filter_input` from plugin.
* Attempt to fix #22.
* Added `MULTIPLE_DOMAIN_DOMAIN_LANG` constant for theme/plugin customization.
* Fix: #21 No 'Access-Control-Allow-Origin' header is present on the requested resource
= 0.7.1 =
* Make the plugin compatible with PHP 5.4 again.
= 0.7 =
* Code review/refactoring.
* Added activation hook to fix empty settings bug.
= 0.6 =
* Fix: #11 Redirect to original domain if SSL/https.
= 0.5 =
* Added http/https for alternate link.
= 0.4 =
* Fixed resolving host name to boolean.
* Added Reflang links to head for SEO purpose. E.g.
`<link rel="alternate" hreflang="x-default" href="https://example.com/">`
`<link rel="alternate" hreflang="de-DE" href="https://de.example.com/">`
= 0.3 =
* Fixed bug when removing the port from current domain.
* Added `MULTIPLE_DOMAIN_ORIGINAL_DOMAIN` constant to hold the original WP home domain.
* Allowing developers to create custom URL restriction logic through `multiple_domain_redirect` action.
* Improved settings interface.
= 0.2 =
* Improved port verification.
* Added `MULTIPLE_DOMAIN_DOMAIN` constant for theme/plugin customization.
* And, last but not least, code refactoring.
= 0.1 =
This is the first release. It supports setting domains and an optional base URL for each one.
== Upgrade Notice ==

View File

@ -0,0 +1,21 @@
(function ($) {
'use strict';
var $d = $(document);
var count = null;
$d.on('click', '.multiple-domain-remove', function (event) {
event.preventDefault();
$(this).parent().remove();
});
$d.on('click', '.multiple-domain-add', function (event) {
event.preventDefault();
if (count === null) {
count = $('.multiple-domain-domain').length;
}
$(this).parent().before(multipleDomainFields.replace(/COUNT/g, count++));
});
})(jQuery);

View File

@ -0,0 +1,29 @@
<?php
/**
* Making sure the required vars are set.
*/
assert(isset($fields) && isset($fieldsToAdd));
?><?php echo $fields; ?>
<p>
<button type="button" class="button multiple-domain-add">
<?php _e('Add domain', 'multiple-domain'); ?>
</button>
</p>
<p class="description">
<?php _e(
'A domain may contain the port number. '
. 'If a base URL restriction is set for a domain, '
. 'all requests that don\'t start with the base URL will be redirected to the base URL. '
. '<b>Example</b>: the domain and base URL are <code>example.com</code> and <code>/base/path</code>, '
. 'when requesting <code>example.com/other/path</code> it will be redirected to '
. '<code>example.com/base/path</code>. '
. 'Additionaly, it\'s possible to set a language for each domain, which will be used to add '
. '<code>&lt;link&gt;</code> tags with a <code>hreflang</code> attribute to the document head.',
'multiple-domain'
); ?>
</p>
<script type="text/javascript">
var multipleDomainFields = <?php echo json_encode($fieldsToAdd); ?>;
</script>

View File

@ -0,0 +1,51 @@
<?php
/**
* Making sure the required vars are set.
*/
assert(isset($count) && isset($protocol) && isset($host) && isset($base) && isset($langField));
?><p class="multiple-domain-domain">
<select
name="multiple-domain-domains[<?php echo $count; ?>][protocol]"
title="<?php _e('Protocol', 'multiple-domain'); ?>"
>
<option
value="auto"
<?php if (empty($protocol) || $protocol === 'auto') : ?>
selected
<?php endif; ?>
>Auto</option>
<option
value="http"
<?php if ($protocol === 'http') : ?>
selected
<?php endif; ?>
>http://</option>
<option
value="https"
<?php if ($protocol === 'https') : ?>
selected
<?php endif; ?>
>https://</option>
</select>
<input
type="text"
name="multiple-domain-domains[<?php echo $count; ?>][host]"
value="<?php echo $host ?: ''; ?>"
class="regular-text code"
placeholder="example.com"
title="<?php _e('Domain', 'multiple-domain'); ?>"
>
<input
type="text"
name="multiple-domain-domains[<?php echo $count; ?>][base]"
value="<?php echo $base ?: ''; ?>"
class="regular-text code"
placeholder="/base/path" title="<?php _e('Base path restriction', 'multiple-domain'); ?>"
>
<?php echo $langField; ?>
<button type="button" class="button multiple-domain-remove">
<span class="required"><?php _e('Remove', 'multiple-domain'); ?></span>
</button>
</p>

View File

@ -0,0 +1,4 @@
<p id="multiple-domain">
<?php _e('You can use multiple domains in your WordPress defining them below. '
. 'It\'s possible to limit the access for each domain to a base URL.', 'multiple-domain'); ?>
</p>

View File

@ -0,0 +1,19 @@
<?php
/**
* Making sure the required vars are set.
*/
assert(isset($count) && isset($locales) && isset($lang));
?><select name="multiple-domain-domains[<?php echo $count; ?>][lang]">
<option value=""><?php _e('None', 'multiple-domain'); ?></option>
<option value="" disabled="disabled">--</option>
<?php foreach ($locales as $code => $name) : ?>
<option
value="<?php echo esc_attr($code); ?>"
<?php if ($lang === $code) : ?>
selected
<?php endif; ?>
><?php echo $name; ?></option>
<?php endforeach; ?>
</select>

View File

@ -0,0 +1,42 @@
<?php
/**
* Making sure the required vars are set.
*/
assert(isset($ignoreDefaultPorts) && isset($addCanonical));
?><label>
<input
type="checkbox"
name="multiple-domain-ignore-default-ports"
value="1"
<?php if ($ignoreDefaultPorts) : ?>
checked
<?php endif; ?>
>
<?php _e('Ignore default ports', 'multiple-domain'); ?>
</label>
<p class="description">
<?php _e('When enabled, removes the port from URL when redirecting and it\'s a '
. 'default HTTP (<code>80</code>) or HTTPS (<code>443</code>) port.', 'multiple-domain'); ?>
</p>
<br />
<label>
<input
type="checkbox"
name="multiple-domain-add-canonical"
value="1"
<?php if ($addCanonical) : ?>
checked
<?php endif; ?>
>
<?php _e('Add canonical links', 'multiple-domain'); ?>
</label>
<p class="description">
<?php _e(
'When enabled, adds canonical link tags to pages. '
. 'The domain for canonical links will be the original domain where WordPress is installed. '
. 'You may want to keep this option unchecked if you have a SEO plugin (e.g. Yoast) installed.',
'multiple-domain'
); ?>
</p>

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 552 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Some files were not shown because too many files have changed in this diff Show More