358 lines
7.8 KiB
PHP
358 lines
7.8 KiB
PHP
<?php
|
|
|
|
class Blocksy_Translations_Manager {
|
|
public function init() {
|
|
add_action(
|
|
'customize_save_after',
|
|
[$this, 'register_wpml_translation_keys']
|
|
);
|
|
|
|
if (is_admin()) {
|
|
add_action(
|
|
'admin_init',
|
|
[$this, 'register_translation_keys']
|
|
);
|
|
}
|
|
|
|
add_action(
|
|
'init',
|
|
function () {
|
|
if (! class_exists('PLL_Translate_Option')) {
|
|
return;
|
|
}
|
|
|
|
$prefixes = blocksy_manager()->screen->get_single_prefixes();
|
|
|
|
$all_keys = [];
|
|
|
|
foreach ($prefixes as $prefix) {
|
|
if (
|
|
$prefix === 'single_blog_post'
|
|
||
|
|
$prefix === 'single_page'
|
|
) {
|
|
continue;
|
|
}
|
|
|
|
$related_label = blocksy_get_theme_mod(
|
|
$prefix . '_related_label',
|
|
'__empty__'
|
|
);
|
|
|
|
if ($related_label === '__empty__') {
|
|
continue;
|
|
}
|
|
|
|
$all_keys[$prefix . '_related_label'] = 1;
|
|
}
|
|
|
|
if (empty($all_keys)) {
|
|
return;
|
|
}
|
|
|
|
new PLL_Translate_Option('theme_mods_blocksy', $all_keys);
|
|
new PLL_Translate_Option('theme_mods_blocksy-child', $all_keys);
|
|
|
|
blocksy_manager()->db->wipe_cache();
|
|
}
|
|
);
|
|
}
|
|
|
|
public function get_all_translation_keys() {
|
|
$builder_keys = Blocksy_Manager::instance()->builder->translation_keys();
|
|
|
|
foreach (['blog', 'categories', 'search', 'author'] as $prefix) {
|
|
$archive_order = blocksy_get_theme_mod($prefix . '_archive_order', null);
|
|
|
|
if (! $archive_order) {
|
|
continue;
|
|
}
|
|
|
|
foreach ($archive_order as $single_archive_component) {
|
|
if ($single_archive_component['id'] !== 'read_more') {
|
|
continue;
|
|
}
|
|
|
|
if (blocksy_akg('read_more_text', $single_archive_component)) {
|
|
$builder_keys[] = [
|
|
'key' => $prefix . '_archive_read_more_text',
|
|
'value' => blocksy_akg(
|
|
'read_more_text',
|
|
$single_archive_component
|
|
)
|
|
];
|
|
}
|
|
}
|
|
}
|
|
|
|
foreach (['blog', 'single_blog_post', 'single_page'] as $prefix) {
|
|
$hero_elements = blocksy_get_theme_mod($prefix . '_hero_elements', null);
|
|
|
|
if (! $hero_elements) {
|
|
continue;
|
|
}
|
|
|
|
foreach ($hero_elements as $single_hero_component) {
|
|
if (
|
|
$single_hero_component['id'] === 'custom_meta'
|
|
&&
|
|
is_array($single_hero_component['meta_elements'])
|
|
) {
|
|
foreach ($single_hero_component['meta_elements'] as $single_meta_element) {
|
|
if (empty($single_meta_element['label'])) {
|
|
continue;
|
|
}
|
|
|
|
$builder_keys[] = [
|
|
'key' => $prefix . '_hero_meta_' . $single_meta_element['id'] . '_label',
|
|
'value' => $single_meta_element['label']
|
|
];
|
|
}
|
|
}
|
|
|
|
if (
|
|
$single_hero_component['id'] === 'custom_title'
|
|
&&
|
|
blocksy_akg('title', $single_hero_component)
|
|
) {
|
|
$builder_keys[] = [
|
|
'key' => $prefix . '_hero_custom_title',
|
|
'value' => blocksy_akg('title', $single_hero_component)
|
|
];
|
|
}
|
|
|
|
if (
|
|
$single_hero_component['id'] === 'custom_description'
|
|
&&
|
|
blocksy_akg('description', $single_hero_component)
|
|
) {
|
|
$builder_keys[] = [
|
|
'key' => $prefix . '_hero_custom_description',
|
|
'value' => blocksy_akg('description', $single_hero_component)
|
|
];
|
|
}
|
|
}
|
|
}
|
|
|
|
return apply_filters(
|
|
'blocksy:translations-manager:all-translation-keys',
|
|
$builder_keys
|
|
);
|
|
}
|
|
|
|
public function register_translation_keys() {
|
|
if (! function_exists('pll_register_string')) {
|
|
return;
|
|
}
|
|
|
|
$builder_keys = $this->get_all_translation_keys();
|
|
|
|
foreach ($builder_keys as $single_key) {
|
|
if (! is_string($single_key['value'])) {
|
|
continue;
|
|
}
|
|
|
|
pll_register_string(
|
|
$single_key['key'],
|
|
$single_key['value'],
|
|
'Blocksy',
|
|
isset($single_key['multiline']) ? $single_key['multiline'] : false
|
|
);
|
|
}
|
|
}
|
|
|
|
public function register_wpml_translation_keys() {
|
|
if (! function_exists('icl_object_id')) {
|
|
return;
|
|
}
|
|
|
|
$builder_keys = $this->get_all_translation_keys();
|
|
|
|
foreach ($builder_keys as $single_key) {
|
|
if (! is_string($single_key['value'])) {
|
|
continue;
|
|
}
|
|
|
|
do_action(
|
|
'wpml_register_single_string',
|
|
'Blocksy',
|
|
$single_key['key'],
|
|
$single_key['value']
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (! function_exists('blocksy_get_all_i18n_languages')) {
|
|
function blocksy_get_all_i18n_languages() {
|
|
$result = [];
|
|
|
|
if (function_exists('pll_languages_list')) {
|
|
$locales = pll_languages_list(['fields' => '']);
|
|
|
|
foreach ($locales as $locale) {
|
|
$result[] = [
|
|
'id' => $locale->locale,
|
|
'name' => $locale->name
|
|
];
|
|
}
|
|
}
|
|
|
|
if (
|
|
! function_exists('pll_languages_list')
|
|
&&
|
|
function_exists('icl_get_languages')
|
|
) {
|
|
$locales = icl_get_languages();
|
|
|
|
foreach ($locales as $locale_key => $locale) {
|
|
$result[] = [
|
|
'id' => $locale['default_locale'],
|
|
'name' => $locale['native_name']
|
|
];
|
|
}
|
|
}
|
|
|
|
if (class_exists('TRP_Translate_Press')) {
|
|
$settings = new TRP_Settings();
|
|
$settings_array = $settings->get_settings();
|
|
|
|
$trp = TRP_Translate_Press::get_trp_instance();
|
|
|
|
$trp_languages = $trp->get_component('languages');
|
|
|
|
if (current_user_can(apply_filters(
|
|
'trp_translating_capability',
|
|
'manage_options'
|
|
))) {
|
|
$languages_to_display = $settings_array['translation-languages'];
|
|
} else {
|
|
$languages_to_display = $settings_array['publish-languages'];
|
|
}
|
|
|
|
$languages_info = $trp_languages->get_language_names(
|
|
$languages_to_display
|
|
);
|
|
|
|
foreach ($languages_to_display as $code) {
|
|
$result[] = [
|
|
'id' => $code,
|
|
'name' => $languages_info[$code]
|
|
];
|
|
}
|
|
}
|
|
|
|
if (function_exists('weglot_get_current_language')) {
|
|
$languages_available = array_values((array)weglot_get_languages_available())[0];
|
|
$original_language = weglot_get_original_language();
|
|
$destination_languages = array_map(function ($object) {
|
|
return $object['language_to'];
|
|
}, weglot_get_destination_languages());
|
|
$languages_to_display = array_merge(array($original_language), $destination_languages);
|
|
|
|
foreach ($languages_to_display as $code) {
|
|
$result[] = [
|
|
'id' => $languages_available[$code]->getExternalCode(),
|
|
'name' => $languages_available[$code]->getLocalName()
|
|
];
|
|
}
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
}
|
|
|
|
if (! function_exists('blocksy_get_current_language')) {
|
|
function blocksy_get_current_language($format = 'locale') {
|
|
if ($format === 'slug') {
|
|
if (function_exists('pll_current_language')) {
|
|
return pll_current_language();
|
|
}
|
|
|
|
return '__NOT_KNOWN__';
|
|
}
|
|
|
|
if (function_exists('pll_current_language')) {
|
|
return pll_current_language('locale');
|
|
}
|
|
|
|
if (
|
|
function_exists('icl_get_languages')
|
|
&&
|
|
defined('ICL_LANGUAGE_CODE')
|
|
&&
|
|
isset(icl_get_languages()[ICL_LANGUAGE_CODE])
|
|
) {
|
|
return icl_get_languages()[ICL_LANGUAGE_CODE]['default_locale'];
|
|
}
|
|
|
|
global $TRP_LANGUAGE;
|
|
|
|
if (
|
|
class_exists('TRP_Translate_Press')
|
|
&&
|
|
isset($TRP_LANGUAGE)
|
|
) {
|
|
return $TRP_LANGUAGE;
|
|
}
|
|
|
|
if (function_exists('weglot_get_current_language')) {
|
|
return weglot_get_current_language();
|
|
}
|
|
|
|
return '__NOT_KNOWN__';
|
|
}
|
|
}
|
|
|
|
if (! function_exists('blocksy_translate_dynamic')) {
|
|
function blocksy_translate_dynamic($text, $key = null) {
|
|
if (function_exists('pll__')) {
|
|
return pll__($text); // PHPCS:ignore WordPress.WP.I18n
|
|
}
|
|
|
|
if ($key) {
|
|
return apply_filters(
|
|
'wpml_translate_single_string',
|
|
$text,
|
|
'Blocksy',
|
|
$key
|
|
);
|
|
}
|
|
|
|
return $text;
|
|
}
|
|
}
|
|
|
|
function blocksy_safe_sprintf($format, ...$args) {
|
|
$result = $format;
|
|
|
|
$is_error = false;
|
|
|
|
// vsprintf() triggers a warning on PHP < 8 and throws an exception on PHP 8+
|
|
// We need to handle both.
|
|
// https://www.php.net/manual/en/function.vsprintf.php#refsect1-function.vsprintf-errors
|
|
|
|
set_error_handler(function () use (&$is_error) {
|
|
$is_error = true;
|
|
});
|
|
|
|
if (interface_exists('Throwable')) {
|
|
try {
|
|
$result = vsprintf($format, $args);
|
|
} catch (\Throwable $e) {
|
|
$is_error = true;
|
|
}
|
|
} else {
|
|
$result = vsprintf($format, $args);
|
|
}
|
|
|
|
restore_error_handler();
|
|
|
|
if ($is_error) {
|
|
// TODO: maybe cleanup format from %s, %d, etc
|
|
return $format;
|
|
}
|
|
|
|
return $result;
|
|
}
|