123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474 |
- <?php
- /**
- * @file
- * Internationalization (i18n) module - Translation set
- */
- class i18n_translation_set {
- public $tsid = NULL;
- public $type;
- public $bundle = '';
- public $status = 0;
- public $master_id = 0;
- // It may optionally have a title
- public $title = '';
- // Translations indexed by language
- protected $translations = NULL;
- // Translation languages indexed by oid
- protected $object_languages = array();
- // Related translation sets indexed by tsid
- // Keep track of old translation sets objects belong to.
- protected $related_translations = array();
- /**
- * Constructor from object/array
- */
- public function __construct($translation = NULL) {
- if ($translation) {
- foreach ((array)$translation as $key => $value) {
- $this->$key = $value;
- }
- }
- }
- /**
- * Delete a translation set
- *
- * @param $delete_translations
- * Whether to unlink translations from the set. Detaults to TRUE.
- */
- public function delete($delete_translations = TRUE) {
- db_delete('i18n_translation_set')
- ->condition('tsid', $this->tsid)
- ->execute();
- if ($delete_translations) {
- $this->delete_translations();
- }
- $this->invoke_all('delete');
- $this->tsid = NULL;
- }
- /**
- * Invoke all modules
- */
- public function invoke_all($op) {
- module_invoke_all('i18n_translation_set_' . $op, $this);
- module_invoke_all('entity_' . $op, $this, 'i18n_translation');
- }
- /**
- * Create a new translation set
- *
- * @param $save_translations
- * Whether to update linked objects so they belong to this set.
- */
- public function insert($save_translations = TRUE) {
- $this->created = $this->changed = REQUEST_TIME;
- $status = drupal_write_record('i18n_translation_set', $this);
- if ($save_translations) {
- $this->save_translations();
- $this->update_related();
- }
- $this->invoke_all('insert');
- return $status;
- }
- /**
- * Save translation set
- *
- * @param $save_translations
- * Whether to update linked objects so they belong to this set.
- */
- public function save($save_translations = TRUE) {
- $this->invoke_all('presave');
- return empty($this->tsid) ? $this->insert($save_translations) : $this->update($save_translations);
- }
- /**
- * Update a translation set
- *
- * @param $update_translations
- * Whether to update objects linked to this set.
- */
- public function update($update_translations = TRUE) {
- $this->changed = REQUEST_TIME;
- $status = drupal_write_record('i18n_translation_set', $this, 'tsid');
- if ($update_translations) {
- $this->clean_translations();
- $this->save_translations();
- $this->update_related();
- }
- $this->invoke_all('update');
- return $status;
- }
- /**
- * Update a translation set or delete if empty.
- */
- public function update_delete() {
- if ($this->get_translations()) {
- $result = $this->save(TRUE);
- // Update related translation sets too.
- $this->update_related();
- return $result;
- }
- else {
- return $this->delete(TRUE);
- }
- }
- /**
- * Update related translation sets
- */
- protected function update_related($op = 'update_delete') {
- foreach ($this->related_translations as $translation_set) {
- $translation_set->$op();
- }
- }
-
- /**
- * Clean all items in this translation set
- *
- * Unlink other items (not current translations from this translation set)
- */
- public function clean_translations() {
- if (($table = $this->get_table()) && ($field = $this->get_field())) {
- $query = db_update($table)
- ->fields(array($field => 0))
- ->condition($field, $this->tsid);
- if ($translations = $this->get_translations()) {
- $query->condition('language', array_keys($translations), 'NOT IN');
- }
- return $query->execute();
- }
- }
- /**
- * Save translations in this translation set
- */
- public function save_translations() {
- if (($table = $this->get_table()) && ($field = $this->get_field())) {
- if ($keys = $this->get_translations_keys()) {
- return db_update($table)
- ->fields(array($field => $this->tsid))
- ->condition($this->key_field(), $keys)
- ->execute();
- }
- else {
- return $this->delete_translations();
- }
- }
- }
- /**
- * Delete translations in this translation set
- *
- * It won't delete objects, just unlink them from translation set
- */
- public function delete_translations() {
- if (($table = $this->get_table()) && ($field = $this->get_field())) {
- return db_update($table)
- ->fields(array($field => 0))
- ->condition($field, $this->tsid)
- ->execute();
- }
- }
- /**
- * Get translations, indexed by language
- */
- public function get_translations() {
- $translations = array();
- foreach ($this->get_objects() as $lang => $object) {
- $translations[$lang] = $object->get_object();
- }
- return $translations;
- }
- /**
- * Reset translations, set empty array or new array of translations.
- *
- * @param $translations array
- * Array of langcode => item
- */
- public function reset_translations($translations = array()) {
- $this->translations = array();
- $this->add_translations($translations);
- return $this;
- }
- /**
- * Get translations as i18n objects, indexed by language
- */
- public function get_objects() {
- if (!isset($this->translations)) {
- $this->translations = array();
- // Disable selection query altering, just in case
- $previous = i18n_select(FALSE);
- $this->add_translations($this->load_translations());
- i18n_select($previous);
- }
- return $this->translations;
- }
- /**
- * Get item for language
- */
- public function get_item($langcode) {
- if (($translations = $this->get_translations()) && isset($translations[$langcode])) {
- return $translations[$langcode];
- }
- else {
- return NULL;
- }
- }
- /**
- * Get translations keys, indexed by language
- */
- public function get_translations_keys() {
- $keys = array();
- foreach ($this->get_objects() as $lang => $object) {
- if ($id = $object->get_key()) {
- $keys[$lang] = $id;
- }
- }
- return array_filter($keys);
- }
- /**
- * Get edit path for this translation set
- */
- public function get_edit_path() {
- if ($path = $this->get_info('edit path')) {
- return strtr($path, $this->get_path_placeholders('delete'));
- }
- else {
- return '';
- }
- }
- /**
- * Get operations as renderable links
- */
- public function get_operations() {
- $destination = drupal_get_destination();
- $operations = array();
- if ($path = $this->get_edit_path()) {
- $operations['edit'] = array(
- 'title' => t('edit'),
- 'href' => $path,
- 'query' => $destination,
- );
- }
- if ($path = $this->get_delete_path()) {
- $operations['delete'] = array(
- 'title' => t('delete'),
- 'href' => $path,
- 'query' => $destination,
- );
- }
- return $operations;
- }
- /**
- * Get items as renderable links
- */
- public function get_links() {
- $language_list = language_list();
- $items = array();
- foreach ($this->get_objects() as $langcode => $object) {
- $title = $object->get_title();
- $path = $object->get_path();
- $language = isset($language_list[$langcode]) ? $language_list[$langcode] : NULL;
- $items[$langcode] = array(
- 'title' => $title,
- 'href' => $path ? $path : NULL,
- 'language' => $language,
- );
- if ($language && function_exists('languageicons_link_add')) {
- languageicons_link_add($items[$langcode]);
- }
- }
- return $items;
- }
- /**
- * Get overview (list) path for this translation set
- */
- public function get_list_path() {
- return $this->get_info('list path');
- }
- /**
- * Get delete path for this translation set
- */
- public function get_delete_path() {
- if ($path = $this->get_info('delete path')) {
- return strtr($path, $this->get_path_placeholders('delete'));
- }
- else {
- return '';
- }
- }
- /**
- * Get placeholder values for path replacement
- */
- function get_path_placeholders($op = 'list') {
- $values['%operation'] = $op;
- $values['%type'] = $this->type;
- $values['%i18n_translation_set'] = $this->tsid;
- if ($placeholder = $this->get_info('placeholder')) {
- $values[$placeholder] = $this->tsid;
- }
- return $values;
- }
-
- /**
- * Get field on translations table that stores the translation set id (tsid)
- */
- protected function get_field() {
- return $this->get_info('field');
- }
- /**
- * Get property from translation set info
- */
- public function get_info($property, $default = NULL) {
- $info = i18n_translation_set_info($this->type);
- return $info && isset($info[$property]) ? $info[$property] : $default;
- }
- /**
- * Get table name, where translation items are stored.
- */
- protected function get_table() {
- return $this->get_info('table');
- }
- /**
- * Get title for this set
- */
- public function get_title() {
- if (!empty($this->title)) {
- return $this->title;
- }
- elseif ($translations = $this->get_objects()) {
- foreach ($translations as $object) {
- $names[] = $object->get_title();
- }
- return implode(' / ', $names);
- }
- else {
- return t('Undefined');
- }
- }
- /**
- * Get item list
- */
- public function item_list() {
- $language_list = language_list();
- $items = array();
- foreach ($this->get_objects() as $langcode => $object) {
- $title = $object->get_title();
- $path = $object->get_path();
- if ($title && $path) {
- $options = isset($language_list[$langcode]) ? array('language' => $language_list[$langcode]) : array();
- $items[$langcode] = l($title, $path, $options);
- }
- elseif ($title) {
- $items[$langcode] = check_plain($title);
- }
- }
- return $items;
- }
- /**
- * Add array of translation items
- *
- * @param $translations array
- * Translation items indexed by language code
- */
- public function add_translations($translations) {
- foreach ($translations as $langcode => $item) {
- $this->add_item($item, $langcode);
- }
- return $this;
- }
- /**
- * Add translation item
- */
- public function add_item($item, $langcode = NULL) {
- $object = i18n_object($this->type, $item);
- $langcode = $langcode ? $langcode : $object->get_langcode();
- // Check whether this item belongs to another translation set
- $old_tsid = $object->get_tsid();
- if ($old_tsid && $old_tsid != $this->tsid) {
- $this->related_translations[$old_tsid] = i18n_translation_set_load($old_tsid);
- $this->related_translations[$old_tsid]->remove_object($object);
- }
- if ($langcode) {
- $this->get_translations();
- $object->set_tsid($this->tsid);
- $this->translations[$langcode] = $object;
- $this->object_languages[$object->get_index()] = $langcode;
- }
- return $this;
- }
- /**
- * Remove item / language from translation set
- *
- * @param $item
- * Item to remove from this translation set, it must have a language property.
- */
- public function remove_item($item) {
- $this->remove_object(i18n_object($this->type, $item));
- return $this;
- }
-
- /**
- * Remove i18n object from translation set.
- */
- public function remove_object($object) {
- // As object's language may have changed, we use our object_languages index better.
- $index = $object->get_index();
- $this->get_translations();
- if (isset($this->object_languages[$index])) {
- $langcode = $this->object_languages[$index];
- unset($this->translations[$langcode]);
- unset($this->object_languages[$index]);
- }
- return $this;
- }
- /**
- * Remove language from translation set.
- *
- * @param $langcode
- * Language to remove from this translation set.
- */
- public function remove_language($langcode) {
- $this->get_translations();
- if (isset($this->translations[$langcode])) {
- $this->remove_object($this->translations[$langcode]);
- }
- return $this;
- }
- /**
- * Load all translations as objects indexed by language
- */
- public function load_translations() {
- if (($table = $this->get_table()) && ($field = $this->get_field())) {
- return db_select($table, 't')
- ->fields('t')
- ->condition('t.' . $field, $this->tsid)
- ->execute()
- ->fetchAllAssoc('language');
- }
- else {
- return array();
- }
- }
- /**
- * Get key field for this translation items
- */
- protected function key_field() {
- $info = i18n_object_info($this->type);
- return $info['key'];
- }
- }
|