HEX
Server: Apache
System: Linux od-b43f49 4.9.0-0.bpo.12-amd64 #1 SMP Debian 4.9.210-1+deb9u1~deb8u1 (2020-06-09) x86_64
User: uid181852 (181852)
PHP: 8.2.30
Disabled: passthru,exec,system,popen,shell_exec,proc_open,pcntl_exec
Upload Files
File: /home/clients/94735d3feef25fe7d1511e6bdd8b0ef6/web/wp-content/plugins/pods/components/I18n/I18n.php
<?php
/**
 * Name: Translate Pods Admin
 *
 * Menu Name: Translate Pods
 *
 * Description: Allow UI of Pods and fields to be translated.
 *
 * Version: 1.1
 *
 * Category: I18n
 *
 * Class: Pods_Component_I18n
 *
 * @package    Pods\Components
 * @subpackage i18n
 */

! defined( 'ABSPATH' ) and die();

if ( class_exists( 'Pods_Component_I18n' ) ) {
	return;
}

/**
 * Class Pods_Component_I18n
 */
class Pods_Component_I18n extends PodsComponent {

	public $settings             = array();
	public $locale               = null;
	public $languages            = array();
	public $languages_available  = array();
	public $languages_translated = array();
	public $cur_pod              = null;
	public $option_key           = 'pods_component_i18n_settings';
	public $admin_page           = 'pods-component-translate-pods-admin';
	public $capability           = 'pods_i18n_activate_lanuages';
	public $nonce                = 'pods_i18n_activate_lanuages';

	/**
	 * All fields that are translatable.
	 * @var array
	 */
	protected $translatable_fields = [
		'label' => [],
		'description' => [],
		'placeholder' => [],
		'menu_name' => [],
		'name_admin_bar' => [],
		'repeatable_add_new_label' => [
			'depends-on' => [ 'repeatable' => true ],
		],
		'boolean_yes_label' => [
			'depends-on' => [ 'type' => 'boolean' ],
		],
		'boolean_no_label' => [
			'depends-on' => [ 'type' => 'boolean' ],
		],
		'color_select_label' => [
			'depends-on' => [ 'type' => 'color' ],
		],
		'color_clear_label' => [
			'depends-on' => [ 'type' => 'color' ],
		],
		'file_add_button' => [
			'depends-on' => [ 'type' => 'file' ],
		],
		'file_modal_title' => [
			'depends-on' => [ 'type' => 'file' ],
		],
		'file_modal_add_button' => [
			'depends-on' => [ 'type' => 'file' ],
		],
		'pick_select_text' => [
			'depends-on' => [ 'type' => 'pick' ],
		],
		'pick_add_new_label' => [
			'depends-on' => [ 'type' => 'pick' ],
		],
	];

	/**
	 * {@inheritdoc}
	 */
	public function init() {

		$this->settings = get_option( $this->option_key, array() );

		$active = false;
		// Are there active languages?
		if ( ! empty( $this->settings['enabled_languages'] ) ) {
			$this->languages = $this->settings['enabled_languages'];

			if ( function_exists( 'get_user_locale' ) ) {
				// WP 4.7+
				$this->locale = get_user_locale();
			} else {
				$this->locale = get_locale();
			}

			$active = true;
		}

		$is_component_page = false;
		$is_pods_edit_page = false;

		if ( is_admin() && isset( $_GET['page'] ) ) {

			$page = $_GET['page'];

			// Is the current page the admin page of this component or a Pods edit page?
			if ( $this->admin_page === $page ) {
				$is_component_page = true;
			} elseif ( 'pods' === $page ) {
				$is_pods_edit_page = true;
			}
		}

		if ( $is_component_page ) {
			// Do save action here because otherwise the loading of post_types get done first and labels aren't translated
			if ( pods_is_admin( $this->capability ) && isset( $_POST['_nonce_i18n'] ) && wp_verify_nonce( $_POST['_nonce_i18n'], $this->nonce ) ) {
				$this->admin_save();
			}

			add_action( 'admin_enqueue_scripts', array( $this, 'admin_assets' ) );
		}

		if ( $active ) {

			/**
			 * PODS ADMIN UI.
			 */

			// Pod.
			add_filter( 'pods_admin_setup_edit_tabs', array( $this, 'translation_tab' ), 99, 2 );
			add_filter( 'pods_admin_setup_edit_options', array( $this, 'translation_options' ), 99, 2 );
			// Pod Groups.
			add_filter( 'pods_admin_setup_edit_group_tabs', array( $this, 'translation_tab' ), 99, 2 );
			add_filter( 'pods_admin_setup_edit_group_options', array( $this, 'translation_options' ), 99, 2 );
			// Pod Fields.
			add_filter( 'pods_admin_setup_edit_field_tabs', array( $this, 'translation_tab' ), 99, 2 );
			add_filter( 'pods_admin_setup_edit_field_options', array( $this, 'translation_options' ), 99, 2 );

			/**
			 * REGISTERING OBJ LABELS.
			 */

			// WP Object filters (post_type and taxonomy).
			add_filter( 'pods_register_post_type', array( $this, 'translate_register_wp_object' ), 10, 2 );
			add_filter( 'pods_register_taxonomy', array( $this, 'translate_register_wp_object' ), 10, 2 );

			// ACT's
			add_filter(
				'pods_advanced_content_type_pod_data',
				array( $this, 'translate_object_options' ),
				10,
				2
			);

			/**
			 * LABEL REPLACEMENT.
			 */

			// Menu labels.
			add_filter( 'pods_admin_menu_page_title', array( $this, 'translate_admin_menu_page_title' ), 10, 2 );
			add_filter( 'pods_admin_menu_label', array( $this, 'translate_admin_menu_label' ), 10, 2 );

			// Do not overwrite Whatsit object fields if we're editing Pods.
			if ( ! $is_pods_edit_page && ! pods_doing_json() && ! wp_doing_ajax() ) {

				// Pod Objects.
				add_filter( 'pods_whatsit_get_label', array( $this, 'translate_label' ), 10, 2 );
				add_filter( 'pods_whatsit_get_description', array( $this, 'translate_description' ), 10, 2 );
				add_filter( 'pods_whatsit_get_arg', array( $this, 'translate_arg' ), 10, 3 );
				add_filter( 'pods_whatsit_get_args', array( $this, 'translate_args' ), 10, 2 );

				// Non DFV field UI.
				foreach ( pods_form()->field_types() as $type => $data ) {
					add_filter(
						'pods_form_ui_field_' . $type . '_options',
						array( $this, 'translate_field_options' ),
						10,
						5
					);
				}
			}

		}//end if
	}

	/**
	 * Load assets for this component
	 *
	 * @since 0.1.0
	 */
	public function admin_assets() {

		wp_enqueue_script(
			'pods-admin-i18n',
			PODS_URL . 'components/I18n/pods-admin-i18n.js',
			array(
				'jquery',
				'pods-i18n',
			),
			'1.0',
			true
		);
		$localize_script = array();
		if ( ! empty( $this->languages ) ) {
			foreach ( $this->languages as $lang => $lang_data ) {
				$lang_label = $this->create_lang_label( $lang_data );
				if ( ! empty( $lang_label ) ) {
					$lang_label = $lang . ' (' . $lang_label . ')';
				} else {
					$lang_label = $lang;
				}
				$localize_script[ $lang ] = $lang_label;
			}
		}
		wp_localize_script( 'pods-admin-i18n', 'pods_admin_i18n_strings', $localize_script );

		// Add strings to the i18n js object
		add_filter( 'pods_localized_strings', array( $this, 'localize_assets' ) );
	}

	/**
	 * Localize the assets
	 *
	 * @param  array $str Existing strings
	 *
	 * @return array
	 */
	public function localize_assets( $str ) {

		$str['Add translation']     = __( 'Add translation', 'pods' );
		$str['Toggle translations'] = __( 'Toggle translations', 'pods' );
		$str['Show translations']   = __( 'Show translations', 'pods' );
		$str['Hide translations']   = __( 'Hide translations', 'pods' );
		$str['Select']              = __( 'Select', 'pods' );

		return $str;
	}

	/**
	 * Check is a field name is set for translation.
	 *
	 * @since 0.1.0
	 *
	 * @param string $name
	 *
	 * @return bool
	 */
	public function is_translatable_field( $name ) {

		// All fields that start with "label".
		if ( strpos( $name, 'label' ) === 0 && false === strpos( $name, $this->locale ) ) {
			return true;
		}

		// All translatable fields.
		if ( in_array( $name, $this->get_translatable_fields( 'names' ), true ) ) {
			return true;
		}

		return false;
	}

	/**
	 * Get a translated option for a field key if available.
	 *
	 * @since 0.1.0
	 *
	 * @param  string $current Current value
	 * @param  string $key     The key / opion name to search for
	 * @param  array|Pods\Whatsit  $data    Pod data (can also be an options array of a pod or field)
	 *
	 * @return mixed
	 */
	public function get_value_translation( $current, $key, $data ) {

		$locale = $this->locale;
		if ( ! array_key_exists( $locale, $this->languages ) ) {
			return $current;
		}

		if ( $this->obj_is_language_enabled( $locale, $data ) ) {
			$translation = pods_v( $key . '_' . $locale, $data, null );
			if ( $translation ) {
				return $translation;
			}
		}

		return $current;
	}

	/**
	 * Page title for setting pages.
	 *
	 * @since 1.0.0
	 * @see   PodsAdmin.php >> admin_menu()
	 * @see   PodsAdmin.php >> admin_content_settings()
	 *
	 * @param  string $page_title Current page title
	 * @param  array  $pod        Pod data
	 *
	 * @return string
	 */
	public function translate_admin_menu_page_title( $page_title, $pod ) {

		return (string) $this->get_value_translation( $page_title, 'label', $pod );
	}

	/**
	 * Menu title for setting pages.
	 *
	 * @since 1.0.0
	 * @see   PodsAdmin.php >> admin_menu()
	 *
	 * @param  string $menu_label Current menu label
	 * @param  array  $pod        Pod data
	 *
	 * @return string
	 */
	public function translate_admin_menu_label( $menu_label, $pod ) {

		return (string) $this->get_value_translation( $menu_label, 'menu_name', $pod );
	}

	/**
	 * Returns the translated label if available.
	 *
	 * @since 1.0.0
	 * @see   \Pods\Whatsit >> 'pods_whatsit_get_label' (filter)
	 *
	 * @param  string       $label  The default label.
	 * @param  Pods\Whatsit $object The Pod Object.
	 *
	 * @return string
	 */
	public function translate_label( $label, $object ) {

		return (string) $this->get_value_translation( $label, 'label', $object );
	}

	/**
	 * Returns the translated description if available.
	 *
	 * @since 1.0.0
	 * @see   \Pods\Whatsit >> 'pods_whatsit_get_description' (filter)
	 *
	 * @param  string       $description  The default description.
	 * @param  Pods\Whatsit $object The Pod Object.
	 *
	 * @return string
	 */
	public function translate_description( $description, $object ) {

		return (string) $this->get_value_translation( $description, 'description', $object );
	}

	/**
	 * Returns the translated argument if available.
	 *
	 * @since 2.8.4
	 * @see   \Pods\Whatsit >> 'pods_whatsit_get_arg' (filter)
	 *
	 * @param  mixed        $arg    The object argument.
	 * @param  string       $name   The argument name.
	 * @param  array|Pods\Whatsit $object The Pod Object.
	 *
	 * @return string
	 */
	public function translate_arg( $arg, $name, $object ) {

		if ( $this->is_translatable_field( $name ) ) {
			return $this->get_value_translation( $arg, $name, $object );
		}

		return $arg;
	}

	/**
	 * Returns the translated arguments if available.
	 *
	 * @since 2.8.4
	 * @see   \Pods\Whatsit >> 'pods_whatsit_get_args' (filter)
	 *
	 * @param  array        $args   The object arguments.
	 * @param  Pods\Whatsit $object The Pod Object.
	 *
	 * @return array
	 */
	public function translate_args( $args, $object ) {

		foreach ( $args as $name => $value ) {
			if ( $this->is_translatable_field( $name ) ) {
				$args[ $name ] = $this->translate_arg( $value, $name, $object );
			}
		}

		return $args;
	}

	/**
	 * Replaces the default selected text with a translation if available.
	 *
	 * @since 1.0.0
	 * @see   pick.php >> 'pods_field_pick_data' (filter)
	 *
	 * @param  array  $data    The default data of the field
	 * @param  string $name    The field name
	 * @param  string $value   The field value
	 * @param  array  $options The field options
	 * @param  array  $pod     The Pod
	 * @param  int    $id      The field ID
	 *
	 * @return array
	 */
	public function translate_field_pick_data( $data, $name, $value, $options, $pod, $id ) {

		if ( isset( $data[''] ) && isset( $options['pick_select_text'] ) ) {
			$locale = $this->locale;
			if ( isset( $options[ 'pick_select_text_' . $locale ] ) && array_key_exists( $locale, $this->languages ) && $this->obj_is_language_enabled( $locale, $pod ) ) {
				$data[''] = $options[ 'pick_select_text_' . $locale ];
			}
		}

		return $data;
	}

	/**
	 * Replaces the default values with a translation if available.
	 *
	 * @since 1.0.0
	 * @see   PodsForm.php >> 'pods_form_ui_field_' . $type . '_options' (filter)
	 *
	 * @param  array  $options The field options
	 * @param  string $name    The field name
	 * @param  string $value   The field value
	 * @param  array  $pod     The Pod
	 * @param  int    $id      The field ID
	 *
	 * @return array
	 */
	public function translate_field_options( $options, $name, $value, $pod, $id ) {
		$locale = $this->locale;
		if ( ! array_key_exists( $locale, $this->languages ) || ! $this->obj_is_language_enabled( $locale, $pod ) ) {
			return $options;
		}

		foreach ( $this->get_translatable_fields( 'names' ) as $field ) {
			$translation = pods_v( $field . '_' . $locale, $options, null );
			if ( $translation ) {
				$options[ $field ] = $translation;
			}
		}

		return $options;
	}

	/**
	 * Filter hook function to overwrite the labels and description with translations (if available)
	 *
	 * @since 1.0.0
	 * @see   PodsInit.php >> setup_content_types()
	 *
	 * @param  array  $options The array of object options
	 * @param  string $object  The object type name/slug
	 *
	 * @return array
	 */
	public function translate_register_wp_object( $options, $object ) {

		$locale = $this->locale;

		$pod = pods_api()->load_pod( $object );

		if ( ! $this->obj_is_language_enabled( $locale, $pod ) ) {
			return $options;
		}

		// Load the pod
		foreach ( $pod['options'] as $_option => $_value ) {
			$pod[ $_option ] = $_value;
		}

		$labels = array(
			// Default
			'name'                       => 'label', // Different.
			'singular_name'              => 'label_singular', // Different.
			'menu_name'                  => 'menu_name',
			'add_new_item'               => 'label_add_new_item',
			'edit_item'                  => 'label_edit_item',
			'view_item'                  => 'label_view_item',
			'all_items'                  => 'label_all_items',
			'search_items'               => 'label_search_items',
			'parent_item_colon'          => 'label_parent_item_colon',
			'not_found'                  => 'label_not_found',
			'items_list_navigation'      => 'label_items_list_navigation',
			'items_list'                 => 'label_items_list',

			// Post Types
			'name_admin_bar'             => 'name_admin_bar',
			'add_new'                    => 'label_add_new',
			'new_item'                   => 'label_new_item',
			'edit'                       => 'label_edit',
			'view'                       => 'label_view',
			'view_items'                 => 'label_view_items',
			'parent'                     => 'label_parent',
			'not_found_in_trash'         => 'label_not_found_in_trash',
			'archives'                   => 'label_archives',
			'attributes'                 => 'label_attributes',
			'insert_into_item'           => 'label_insert_into_item',
			'uploaded_to_this_item'      => 'label_uploaded_to_this_item',
			'featured_image'             => 'label_featured_image',
			'set_featured_image'         => 'label_set_featured_image',
			'remove_featured_image'      => 'label_remove_featured_image',
			'use_featured_image'         => 'label_use_featured_image',
			'filter_items_list'          => 'label_filter_items_list',
			// Block Editor (WP 5.0+)
			'item_published'             => 'label_item_published',
			'item_published_privately'   => 'label_item_published_privately',
			'item_reverted_to_draft'     => 'label_item_reverted_to_draft',
			'item_scheduled'             => 'label_item_scheduled',
			'item_updated'               => 'label_item_updated',
			'filter_by_date'             => 'label_filter_by_date', // WP 5.7

			// Taxonomies
			'update_item'                => 'label_update_item',
			'popular_items'              => 'label_popular_items',
			'parent_item'                => 'label_parent_item',
			'new_item_name'              => 'label_new_item_name',
			'separate_items_with_commas' => 'label_separate_items_with_commas',
			'add_or_remove_items'        => 'label_add_or_remove_items',
			'choose_from_most_used'      => 'label_choose_from_the_most_used', // Different.
			'no_terms'                   => 'label_no_terms',
			'filter_by_item'             => 'label_filter_by_item', // WP 5.7
		);

		if ( ! isset( $options['labels'] ) || ! is_array( $options['labels'] ) ) {
			$options['labels'] = array();
		} else {
			// Try to find new labels.
			foreach ( $options['labels'] as $key => $val ) {
				if ( ! isset( $labels[ $key ] ) ) {
					$labels[ $key ] = 'label_' . $key;
				}
			}
		}

		foreach ( $labels as $key => $pods_key ) {
			$label = pods_v( $pods_key . '_' . $locale, $pod, '', true );
			if ( $label ) {
				$options['labels'][ $key ] = $label;
			}
		}

		return $options;
	}

	/**
	 * Filter hook function to overwrite the labels and description with translations (if available)
	 *
	 * @since 1.0.0
	 * @see   PodsInit.php >> admin_menu()
	 *
	 * @param  array  $options The array of object options
	 * @param  string $object  The object type name/slug
	 *
	 * @return array
	 */
	public function translate_object_options( $options, $object ) {

		/**
		 * @todo allow labels to be set even if the default language isn't
		 *
		 * - Find all keys that end with the current locale
		 * - Assign them to the keys without that locale
		 */

		foreach ( $options as $key => $option ) {
			if ( is_string( $option ) && $this->is_translatable_field( $key ) ) {
				$options[ $key ] = $this->get_value_translation( $option, $key, $options );
			}
		}

		if ( ! empty( $options['options'] ) ) {
			foreach ( $options['options'] as $key => $option ) {
				if ( is_string( $option ) && $this->is_translatable_field( $key ) ) {
					$options['options'][ $key ] = $this->get_value_translation( $option, $key, $options['options'] );
				}
			}
		}

		return $options;
	}

	/**
	 * Save component settings
	 *
	 * @since 0.1.0
	 */
	public function admin_save() {

		$this->languages_available = get_available_languages();

		/**
		 * format: array( language, version, updated, english_name, native_name, package, iso, strings )
		 */
		require_once ABSPATH . 'wp-admin/includes/translation-install.php';
		$this->languages_translated = wp_get_available_translations();

		$new_languages = array();

		if ( isset( $_POST['pods_i18n_enabled_languages'] ) && is_array( $_POST['pods_i18n_enabled_languages'] ) ) {
			foreach ( $_POST['pods_i18n_enabled_languages'] as $locale ) {
				$locale = sanitize_text_field( $locale );

				if ( in_array( $locale, $this->languages_available, true ) ) {
					$new_languages[ $locale ] = array();

					if ( isset( $this->languages_translated[ $locale ]['language'] ) ) {
						$new_languages[ $locale ]['language'] = $this->languages_translated[ $locale ]['language'];
					}

					if ( isset( $this->languages_translated[ $locale ]['english_name'] ) ) {
						$new_languages[ $locale ]['english_name'] = $this->languages_translated[ $locale ]['english_name'];
					}

					if ( isset( $this->languages_translated[ $locale ]['native_name'] ) ) {
						$new_languages[ $locale ]['native_name'] = $this->languages_translated[ $locale ]['native_name'];
					}
				}
			}
		}//end if

		$this->languages                     = $new_languages;
		$this->settings['enabled_languages'] = $new_languages;

		update_option( $this->option_key, $this->settings );

	}

	/**
	 * Build admin area
	 *
	 * @since 0.1.0
	 *
	 * @param  $options
	 * @param  $component
	 *
	 * @return void
	 */
	public function admin( $options, $component ) {

		$this->languages_available = get_available_languages();

		/**
		 * format: array( language, version, updated, english_name, native_name, package, iso, strings )
		 */
		require_once ABSPATH . 'wp-admin/includes/translation-install.php';

		$this->languages_translated = wp_get_available_translations();

		// en_US is always installed (default locale of WP)
		$data = array(
			'en_US' => array(
				'id'          => 'en_US',
				'locale'      => 'en_US',
				'lang'        => 'English',
				'lang_native' => 'English',
				'enabled'     => 'Default',
			),
		);

		foreach ( $this->languages_available as $locale ) {
			$checked = checked( isset( $this->languages[ $locale ] ), true, false );

			$enabled = sprintf( '<input type="checkbox" name="pods_i18n_enabled_languages[%s]" value="%s"%s />', esc_attr( $locale ), esc_attr( $locale ), $checked );

			$data[ $locale ] = array(
				'id'          => $locale,
				'locale'      => $locale,
				'lang'        => $this->languages_translated[ $locale ]['english_name'],
				'lang_native' => $this->languages_translated[ $locale ]['native_name'],
				'enabled'     => $enabled,
			);
		}

		$ui = array(
			'component'        => $component,
			// 'data' => $data,
			// 'total' => count( $data ),
			// 'total_found' => count( $data ),
			'items'            => __( 'Languages', 'pods' ),
			'item'             => __( 'Language', 'pods' ),
			'fields'           => array(
				'manage' => array(
					'enabled'     => array(
						'label' => __( 'Active', 'pods' ),
						'type'  => 'raw',
					),
					'locale'      => array(
						'label'   => __( 'Locale', 'pods' ),
						'classes' => array( 'column-secondary' ),
					),
					'lang'        => array( 'label' => __( 'Language', 'pods' ) ),
					'lang_native' => array( 'label' => __( 'Native name', 'pods' ) ),
					/*
					'fields' => array(
						'label' => __( 'Fields', 'pods' ),
						'type' => 'text',
						'options' => array(
							'text_allow_html' => 1,
							'text_allowed_html_tags' => 'br code'
						)
					),*/
				),
			),
			'actions_disabled' => array( 'edit', 'add', 'delete', 'duplicate', 'view', 'export' ),
			'actions_custom'   => array(
				// 'add' => array( $this, 'admin_add' ),
				// 'edit' => array( $this, 'admin_edit' ),
				// 'delete' => array( $this, 'admin_delete' )
			),
			'search'           => false,
			'searchable'       => false,
			'sortable'         => false,
			'pagination'       => false,
		);

		/**
		 * Filter the language data
		 *
		 * @since 0.1.0
		 *
		 * @param array
		 */
		$data = apply_filters( 'pods_component_i18n_admin_data', $data );

		/**
		 * Filter the UI fields
		 *
		 * @since 0.1.0
		 *
		 * @param array
		 */
		$ui['fields'] = apply_filters( 'pods_component_i18n_admin_ui_fields', $ui['fields'], $data );

		$ui['data']        = $data;
		$ui['total']       = count( $data );
		$ui['total_found'] = count( $data );

		/*
		if ( !pods_is_admin( array( 'pods_i18n_activate_lanuages' ) ) )
			$ui[ 'actions_disabled' ][] = 'edit';*/

		echo '<div id="pods_admin_i18n" class="pods-submittable-fields">';

		// Do save action here because otherwise the loading of post_types get done first and labels aren't translated
		if ( pods_is_admin( $this->capability ) && isset( $_POST['_nonce_i18n'] ) && wp_verify_nonce( $_POST['_nonce_i18n'], $this->nonce ) ) {
			pods_message( __( 'Updated active languages.', 'pods' ) );
		}

		pods_ui( $ui );

		// @todo Do this in pods_ui so we don't rely on javascript
		echo '<div id="pods_i18n_settings_save">';
		wp_nonce_field( $this->nonce, '_nonce_i18n', false );
		submit_button();
		echo '</div>';

		echo '</div>';
	}

	/**
	 * The i18n option tab.
	 *
	 * @since 1.0.0
	 *
	 * @param  array $tabs
	 *
	 * @return array
	 */
	public function translation_tab( $tabs ) {

		$tabs['i18n'] = __( 'Translations', 'pods' );

		return $tabs;
	}

	/**
	 * The i18n options.
	 *
	 * @since 1.0.0
	 *
	 * @param array              $options
	 * @param array|Pods\Whatsit $object
	 *
	 * @return array
	 */
	public function translation_options( $options, $object ) {
		$i18n_fields = [];

		foreach ( $options as $tab => $fields ) {
			foreach ( $fields as $name => $field ) {
				if ( ! $this->is_translatable_field( $name ) ) {
					continue;
				}

				$i18n_options = $this->get_translatable_field_options( $name );

				// None of the i18n fields are required!
				$field['required'] = false;

				$heading_field = $field;
				$heading_field['type'] = 'heading';
				$heading_field['name'] = $name . '_i18n';

				$i18n_fields[][ $name . '_i18n' ] = array_merge_recursive( $heading_field, $i18n_options );

				$default_field = $field;
				$default_field['type'] = 'html';
				$default_field['name'] = $name . '_i18n_default';
				$default_field['label'] = __( 'Default', 'pods' );
				$default_field['html_content'] = '%s';
				$default_field['html_content_param'] = $name;
				$default_field['html_content_param_default'] = '-';

				$i18n_fields[][ $name . '_i18n_default' ] = array_merge_recursive( $default_field, $i18n_options );

				foreach ( $this->languages as $locale => $lang_data ) {
					if ( ! $this->obj_is_language_enabled( $locale, $object ) ) {
						continue;
					}

					$locale_name              = $name . '_' . $locale;
					$locale_field             = $field;
					$locale_field['name']     = $locale_name;
					$locale_field['label']    = $locale;
					$locale_field['default']  = '';

					$i18n_fields[][ $locale_name ] = array_merge_recursive( $locale_field, $i18n_options );
				}
			}
		}

		$options['i18n'] = $i18n_fields;

		// if ( $object['type'] === '' )
		/*
		$options[ 'pods-i18n' ] = array(
			'enabled_languages' => array(
				'label' => __( 'Enable/Disable languages for this Pod', 'pods' ),
				'help' => __( 'This overwrites the defaults set in the component admin.', 'pods' ),
				'group' => array(),
			),
		);

		foreach ( $this->languages as $locale => $lang_data ) {
			$options['pods-i18n']['enabled_languages']['group']['enable_i18n'][ $locale ] = array(
				'label'      => $locale . ' (' . $this->create_lang_label( $lang_data ) . ')',
				'default'    => 1,
				'type'       => 'boolean',
			);
		}*/

		return $options;
	}

	/**
	 * Check if a language is get to enabled for an object
	 *
	 * @since 0.1.0
	 *
	 * @param  string $locale The locale to validate
	 * @param  array  $data   Object data
	 *
	 * @return bool
	 */
	public function obj_is_language_enabled( $locale, $data ) {

		// If the locale isn't enabled in the global scope from the component it's always disabled
		if ( ! array_key_exists( $locale, $this->languages ) ) {
			return false;
		}
		if ( $data instanceof Pods\Whatsit ) {
			$enable_i18n = $data->get_arg( 'enable_i18n' );
		} else {
			$options = pods_v( 'options', $data, $data );
			$enable_i18n = pods_v( 'enable_i18n', $options, null );
		}

		if ( null === $enable_i18n ) {
			// If there are no i18n settings in the object data then assume it's enabled.
			return true;
		}

		return (bool) pods_v( $locale, $enable_i18n, true );
	}

	/**
	 * Create a label with the english and native name combined
	 *
	 * @since 0.1.0
	 *
	 * @param  array $lang_data
	 *
	 * @return string
	 */
	public function create_lang_label( $lang_data ) {

		$label       = pods_v( 'english_name', $lang_data, '' );
		$native_name = pods_v( 'native_name', $lang_data, '' );

		if ( ! empty( $native_name ) && $label !== $native_name ) {
			$label .= ' / ' . $native_name;
		}

		return $label;
	}

	/**
	 * @param string $return Return type (supports 'names').
	 * @return array
	 */
	public function get_translatable_fields( $return = '' ) {

		/**
		 * Overwrite translatable fields.
		 *
		 * @since 2.8.4
		 *
		 * @param string[] $fields The translatable fields.
		 */
		$fields = apply_filters( 'pods_translatable_fields', $this->translatable_fields );

		// Backwards compatibility: Before v1.1 this was a list of field names instead of options.
		foreach ( $fields as $name => $value ) {
			if ( is_string( $value ) ) {
				unset( $fields[ $name ] );
				if ( ! isset( $fields[ $value ] ) ) {
					$fields[ $value ] = [];
				}
			}
		}

		if ( 'names' === $return ) {
			return array_keys( $fields );
		}

		return $fields;
	}

	/**
	 * @since 2.8.4
	 * @return array[]
	 */
	public function get_translatable_field_options( $key ) {

		$field_options = pods_v( $key, $this->get_translatable_fields(), array() );

		/**
		 * Overwrite translatable field options.
		 *
		 * @since 2.8.4
		 *
		 * @param array  $field_options The translatable field options.
		 * @param string $key           The field name.
		 */
		return apply_filters( 'pods_translatable_field_options', $field_options, $key );
	}
}