Lingotek Translation - Version 1.0.1

Version Description

(2015-07-14) =

  • Added pointer, updated FAQs, and minor content updates
Download this release

Release Info

Developer smithworx
Plugin Icon 128x128 Lingotek Translation
Version 1.0.1
Comparing to
See all releases

Code changes from version 1.0 to 1.0.1

admin/actions.php CHANGED
@@ -308,7 +308,7 @@ abstract class Lingotek_Actions {
308
  }
309
 
310
  // offers to disassociate translations
311
- if (!empty($document->translations))
312
  $actions['lingotek-delete'] = $this->get_action_link(array('document_id' => $document->document_id, 'action' => 'delete'));
313
 
314
  return $actions;
308
  }
309
 
310
  // offers to disassociate translations
311
+ if (isset($document->source))
312
  $actions['lingotek-delete'] = $this->get_action_link(array('document_id' => $document->document_id, 'action' => 'delete'));
313
 
314
  return $actions;
admin/admin.php CHANGED
@@ -276,10 +276,10 @@ class Lingotek_Admin {
276
  foreach ($api_data->entities as $project) {
277
  $projects[$project->properties->id] = $project->properties->title;
278
  }
279
- if($update_first_project_callback){
280
- $client = new Lingotek_API();
281
- $project_id = current(array_keys($projects));//update callback for 1st project
282
- $client->update_callback_url($project_id);
283
  }
284
  natcasesort($projects); //order by title (case-insensitive)
285
  $refresh_success['projects'] = TRUE;
276
  foreach ($api_data->entities as $project) {
277
  $projects[$project->properties->id] = $project->properties->title;
278
  }
279
+ if ($api_data->properties->total == 1) {
280
+ if (!$project->properties->callback_url) {
281
+ $client->update_callback_url($project->properties->id);
282
+ }
283
  }
284
  natcasesort($projects); //order by title (case-insensitive)
285
  $refresh_success['projects'] = TRUE;
admin/settings/view-account.php CHANGED
@@ -5,7 +5,7 @@ if (!$community_id) {
5
  $ltk_num_communities = $ltk_communities->properties->total;
6
  if ($ltk_num_communities == 1) {
7
  $ltk_community_id = $ltk_communities->entities[0]->properties->id;
8
- $this->set_community_resources($ltk_community_id, TRUE);
9
  echo '<script type="text/javascript">document.body.innerHTML = ""; window.location = "admin.php?page=wp-lingotek_tutorial";</script>';
10
  }
11
  }
5
  $ltk_num_communities = $ltk_communities->properties->total;
6
  if ($ltk_num_communities == 1) {
7
  $ltk_community_id = $ltk_communities->entities[0]->properties->id;
8
+ $this->set_community_resources($ltk_community_id);
9
  echo '<script type="text/javascript">document.body.innerHTML = ""; window.location = "admin.php?page=wp-lingotek_tutorial";</script>';
10
  }
11
  }
admin/settings/view-edit-profile.php CHANGED
@@ -117,6 +117,9 @@ unset($settings['secondary_filter_id']['options'][$primary_filter_id]);
117
  <table class="form-table"><?php
118
  unset($settings['upload']); // we don't want this for target languages
119
  unset($settings['project_id']); // FIXME disable the possibility to have a different project per target language for now
 
 
 
120
 
121
  foreach ($this->pllm->get_languages_list() as $language) { ?>
122
  <tr>
117
  <table class="form-table"><?php
118
  unset($settings['upload']); // we don't want this for target languages
119
  unset($settings['project_id']); // FIXME disable the possibility to have a different project per target language for now
120
+ // Filters not needed for target languages
121
+ unset($settings['primary_filter_id']);
122
+ unset($settings['secondary_filter_id']);
123
 
124
  foreach ($this->pllm->get_languages_list() as $language) { ?>
125
  <tr>
admin/settings/view-preferences.php CHANGED
@@ -24,7 +24,15 @@ $setting_details = array(
24
  'future' => __('Scheduled', 'wp-lingotek'),
25
  'private' => __('Privately Published', 'wp-lingotek'),
26
  )
27
- )
 
 
 
 
 
 
 
 
28
  );
29
 
30
  $page_key = $this->plugin_slug . '_settings&sm=preferences';
@@ -33,7 +41,12 @@ if (!empty($_POST)) {
33
  check_admin_referer($page_key, '_wpnonce_' . $page_key);
34
  $options = array();
35
  foreach ($setting_details as $key => $setting) {
36
- $options[$key] = $_POST[$key];
 
 
 
 
 
37
  }
38
  update_option('lingotek_prefs', $options);
39
 
24
  'future' => __('Scheduled', 'wp-lingotek'),
25
  'private' => __('Privately Published', 'wp-lingotek'),
26
  )
27
+ ),
28
+ 'delete_document_from_tms' => array(
29
+ 'type' => 'checkboxes',
30
+ 'label' => __('Disassociation', 'wp-lingotek'),
31
+ 'description' => __('Your documents will remain in your WordPress site but will be deleted from the Lingotek TMS if this option is checked.', 'wp-lingotek'),
32
+ 'values' => array(
33
+ 'delete' => __('Delete documents from Lingotek TMS when disassociating.', 'wp-lingotek'),
34
+ )
35
+ ),
36
  );
37
 
38
  $page_key = $this->plugin_slug . '_settings&sm=preferences';
41
  check_admin_referer($page_key, '_wpnonce_' . $page_key);
42
  $options = array();
43
  foreach ($setting_details as $key => $setting) {
44
+ if (isset($_POST[$key])) {
45
+ $options[$key] = $_POST[$key];
46
+ }
47
+ else {
48
+ $options[$key] = null;
49
+ }
50
  }
51
  update_option('lingotek_prefs', $options);
52
 
admin/settings/view-utilities.php CHANGED
@@ -40,34 +40,15 @@ if (!empty($_POST)) {
40
  <?php
41
 
42
  printf(
43
- '<p><input type="checkbox" name="%1$s" id="%1$s" onclick="%3$s"/><label for="%1$s">%2$s</label></p>',
44
  'utility_disassociate',
45
- __('Disassociate all the content from Lingotek TMS.', 'wp-lingotek'),
46
- "
47
- if (this.checked == false) {
48
- document.getElementById('utility_delete_documents').checked = false;
49
- }"
50
- );
51
-
52
- printf(
53
- '<p><input type="checkbox" name="%1$s" id="%1$s" onclick="%3$s"/><label for="%1$s">%2$s</label></p>',
54
- 'utility_delete_documents',
55
- __('Delete all documents in Lingotek TMS.', 'wp-lingotek'),
56
- "
57
- if (this.checked == true) {
58
- document.getElementById('utility_disassociate').checked = true;
59
- }"
60
  );
61
 
62
  $confirm_disassociate = __('You are about to disassociate all your content from Lingotek TMS. Are you sure ?', 'wp-lingotek');
63
- $confirm_delete = __('You are about to disassociate all your content and delete all documents in Lingotek TMS. Are you sure ?', 'wp-lingotek');
64
 
65
  $confirm_js = "
66
  d = document.getElementById('utility_disassociate');
67
- dd = document.getElementById('utility_delete_documents');
68
- if (dd.checked == true) {
69
- return confirm('$confirm_delete');
70
- }
71
  if (d.checked == true) {
72
  return confirm('$confirm_disassociate');
73
  }";
40
  <?php
41
 
42
  printf(
43
+ '<p><input type="checkbox" name="%1$s" id="%1$s"/><label for="%1$s">%2$s</label></p>',
44
  'utility_disassociate',
45
+ __('Disassociate all the content from Lingotek TMS.', 'wp-lingotek')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  );
47
 
48
  $confirm_disassociate = __('You are about to disassociate all your content from Lingotek TMS. Are you sure ?', 'wp-lingotek');
 
49
 
50
  $confirm_js = "
51
  d = document.getElementById('utility_disassociate');
 
 
 
 
52
  if (d.checked == true) {
53
  return confirm('$confirm_disassociate');
54
  }";
admin/tutorial/credits.php CHANGED
@@ -51,8 +51,8 @@ shuffle($people);
51
 
52
  foreach($people as $person_key=>$person){
53
  printf('<li class="wp-person" id="wp-person-%s">
54
- <a href="%s"><img src="%s?s=60&d=mm&r=G" srcset="%s?s=120&d=mm&r=G 2x" class="gravatar" alt="%s"></a>
55
- <a class="web" href="%s">%s</a>
56
  <span class="title">%s</span>
57
  </li>',$person_key,$person['url'],$person['image_url'],$person['image_url'],$person['name'],$person['url'],$person['name'],$person['title']);
58
  }
51
 
52
  foreach($people as $person_key=>$person){
53
  printf('<li class="wp-person" id="wp-person-%s">
54
+ <a href="%s" target="_blank"><img src="%s?s=60&d=mm&r=G" srcset="%s?s=120&d=mm&r=G 2x" class="gravatar" alt="%s"></a>
55
+ <a class="web" href="%s" target="_blank">%s</a>
56
  <span class="title">%s</span>
57
  </li>',$person_key,$person['url'],$person['image_url'],$person['image_url'],$person['name'],$person['url'],$person['name'],$person['title']);
58
  }
admin/tutorial/faq.php CHANGED
@@ -24,6 +24,9 @@
24
  <i><?php _e('Note: If you have translated content in a language you will not be able to remove that language until that content has been deleted.', 'wp-lingotek') ?></i>
25
  </p>
26
 
 
 
 
27
  <b><?php _e("Can I use my own translation agency with Lingotek?", 'wp-lingotek') ?></b>
28
  <p><?php _e( "Use your own translation agency or tap into Lingotek's network of more than 5,000+ in-country translators. Content transfer is fully automated between WordPress and Lingotek. You'll have full visibility into the translation process every step of the way. And once the translations are completed, they'll automatically download and publish to your website according to the preferences you've set." , 'wp-lingotek'); ?></p>
29
 
24
  <i><?php _e('Note: If you have translated content in a language you will not be able to remove that language until that content has been deleted.', 'wp-lingotek') ?></i>
25
  </p>
26
 
27
+ <b><?php _e("Why can't I upload my existing content to Lingotek?", 'wp-lingotek') ?></b>
28
+ <p><?php printf(__("You must assign a language to content that existed before you installed the <i>Polylang</i> and <i>Lingotek</i> plugins. You can do this manually or use the <a href='%s'><i>Lingotek Language Utility</i></a> to set all content that doesn't have an assigned language to the default language. This will allow you to upload your exisiting content to Lingotek.", 'wp-lingotek'), 'admin.php?page=wp-lingotek_settings&sm=utilities'); ?></p>
29
+
30
  <b><?php _e("Can I use my own translation agency with Lingotek?", 'wp-lingotek') ?></b>
31
  <p><?php _e( "Use your own translation agency or tap into Lingotek's network of more than 5,000+ in-country translators. Content transfer is fully automated between WordPress and Lingotek. You'll have full visibility into the translation process every step of the way. And once the translations are completed, they'll automatically download and publish to your website according to the preferences you've set." , 'wp-lingotek'); ?></p>
32
 
admin/tutorial/features.php CHANGED
@@ -35,5 +35,6 @@
35
  <img src="<?php echo LINGOTEK_URL . '/admin/tutorial/img/professional-translation.png'; ?>">
36
  <h3><?php _e( 'Request professional translation', 'wp-lingotek'); ?></h3>
37
  <p><?php _e( "Use your own translation agency or tap into Lingotek's network of more than 5,000+ in-country translators. Content transfer is fully automated between WordPress and Lingotek. You'll have full visibility into the translation process every step of the way. And once the translations are completed, they'll automatically download and publish to your website according to the preferences you've set.", 'wp-lingotek'); ?></p>
 
38
  </div>
39
  </div>
35
  <img src="<?php echo LINGOTEK_URL . '/admin/tutorial/img/professional-translation.png'; ?>">
36
  <h3><?php _e( 'Request professional translation', 'wp-lingotek'); ?></h3>
37
  <p><?php _e( "Use your own translation agency or tap into Lingotek's network of more than 5,000+ in-country translators. Content transfer is fully automated between WordPress and Lingotek. You'll have full visibility into the translation process every step of the way. And once the translations are completed, they'll automatically download and publish to your website according to the preferences you've set.", 'wp-lingotek'); ?></p>
38
+ <a href="http://www.lingotek.com/wordpress/request-professional-translation" class="button button-primary" target="_blank"><?php _e('Request Translation', 'wp-lingotek'); ?></a>
39
  </div>
40
  </div>
include/group-string.php CHANGED
@@ -71,10 +71,15 @@ class Lingotek_Group_String extends Lingotek_Group {
71
  *
72
  * @param bool $delete whether to delete the Lingotek document or not
73
  */
74
- public function disassociate($delete = true) {
75
  $client = new Lingotek_API();
 
76
 
77
- if (!$delete || $client->delete_document($this->document_id)) {
 
 
 
 
78
  wp_delete_term($this->term_id, 'post_translations');
79
  }
80
  }
71
  *
72
  * @param bool $delete whether to delete the Lingotek document or not
73
  */
74
+ public function disassociate() {
75
  $client = new Lingotek_API();
76
+ $prefs = Lingotek_Model::get_prefs();
77
 
78
+ if ($prefs['delete_document_from_tms']) {
79
+ $client->delete_document($this->document_id);
80
+ wp_delete_term($this->term_id, 'post_translations');
81
+ }
82
+ else {
83
  wp_delete_term($this->term_id, 'post_translations');
84
  }
85
  }
include/group.php CHANGED
@@ -101,10 +101,16 @@ abstract class Lingotek_Group {
101
  *
102
  * @param bool $delete whether to delete the Lingotek document or not
103
  */
104
- public function disassociate($delete = true) {
105
  $client = new Lingotek_API();
 
106
 
107
- if (!$delete || $client->delete_document($this->document_id)) {
 
 
 
 
 
108
  unset($this->desc_array['lingotek']);
109
  $this->save();
110
  }
101
  *
102
  * @param bool $delete whether to delete the Lingotek document or not
103
  */
104
+ public function disassociate() {
105
  $client = new Lingotek_API();
106
+ $prefs = Lingotek_Model::get_prefs();
107
 
108
+ if ($prefs['delete_document_from_tms']) {
109
+ $client->delete_document($this->document_id);
110
+ unset($this->desc_array['lingotek']);
111
+ $this->save();
112
+ }
113
+ else {
114
  unset($this->desc_array['lingotek']);
115
  $this->save();
116
  }
include/model.php CHANGED
@@ -132,7 +132,10 @@ class Lingotek_Model {
132
  'publish' => 1,
133
  'future' => 1,
134
  'private' => 0,
135
- )
 
 
 
136
  );
137
  $prefs = get_option('lingotek_prefs', $default);
138
  return $prefs;
132
  'publish' => 1,
133
  'future' => 1,
134
  'private' => 0,
135
+ ),
136
+ 'delete_document_from_tms' => array(
137
+ 'delete' => 1,
138
+ ),
139
  );
140
  $prefs = get_option('lingotek_prefs', $default);
141
  return $prefs;
lingotek.php CHANGED
@@ -2,7 +2,7 @@
2
  /*
3
  Plugin name: Lingotek Translation
4
  Plugin URI: http://lingotek.com/wordpress#utm_source=wpadmin&utm_medium=plugin&utm_campaign=wplingotektranslationplugin
5
- Version: 1.0.0
6
  Author: Lingotek and Frédéric Demarle
7
  Author uri: http://lingotek.com
8
  Description: Lingotek offers convenient cloud-based localization and translation.
@@ -15,7 +15,7 @@ GitHub Plugin URI: https://github.com/lingotek/wp-lingotek
15
  if (!function_exists('add_action'))
16
  exit();
17
 
18
- define('LINGOTEK_VERSION', '1.0.0'); // plugin version (should match above meta)
19
  define('LINGOTEK_MIN_PLL_VERSION', '1.7.4.2');
20
  define('LINGOTEK_BASENAME', plugin_basename(__FILE__)); // plugin name as known by WP
21
  define('LINGOTEK_PLUGIN_SLUG', 'wp-lingotek');// plugin slug (should match above meta: Text Domain)
@@ -109,6 +109,11 @@ class Lingotek {
109
 
110
  // flag title
111
  add_filter('pll_flag_title', array(&$this, 'pll_flag_title'), 10, 3);
 
 
 
 
 
112
  }
113
 
114
  /**
@@ -501,6 +506,40 @@ class Lingotek {
501
  error_log($log_string);
502
  }
503
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
504
  }
505
 
506
  // Helpers - development functions
2
  /*
3
  Plugin name: Lingotek Translation
4
  Plugin URI: http://lingotek.com/wordpress#utm_source=wpadmin&utm_medium=plugin&utm_campaign=wplingotektranslationplugin
5
+ Version: 1.0.1
6
  Author: Lingotek and Frédéric Demarle
7
  Author uri: http://lingotek.com
8
  Description: Lingotek offers convenient cloud-based localization and translation.
15
  if (!function_exists('add_action'))
16
  exit();
17
 
18
+ define('LINGOTEK_VERSION', '1.0.1'); // plugin version (should match above meta)
19
  define('LINGOTEK_MIN_PLL_VERSION', '1.7.4.2');
20
  define('LINGOTEK_BASENAME', plugin_basename(__FILE__)); // plugin name as known by WP
21
  define('LINGOTEK_PLUGIN_SLUG', 'wp-lingotek');// plugin slug (should match above meta: Text Domain)
109
 
110
  // flag title
111
  add_filter('pll_flag_title', array(&$this, 'pll_flag_title'), 10, 3);
112
+
113
+ // adds a pointer upon plugin activation to draw attention to Lingotek
114
+ if (!get_option('lingotek_token')) {
115
+ add_action('init', array(&$this, 'lingotek_activation_pointer'));
116
+ }
117
  }
118
 
119
  /**
506
  error_log($log_string);
507
  }
508
  }
509
+
510
+ /*
511
+ * Creates a pointer to draw attention to the new Lingotek menu item upon plugin activation
512
+ * code borrowed from Polylang
513
+ * @since 1.0.1
514
+ */
515
+ public function lingotek_activation_pointer() {
516
+ $content = __('You’ve just installed Lingotek Translation! Click below to activate your account and automatically translate your website for free!', 'wp-lingotek');
517
+
518
+ $buttons = array(
519
+ array(
520
+ 'label' => __('Close')
521
+ ),
522
+ array(
523
+ 'label' => __('Activate Account', 'wp-lingotek'),
524
+ 'link' => admin_url('admin.php?page=' . $this->plugin_slug . '_settings&connect=new'),
525
+ )
526
+ );
527
+
528
+ $args = array(
529
+ 'pointer' => 'wp-lingotek',
530
+ 'id' => 'toplevel_page_wp-lingotek',
531
+ 'position' => array(
532
+ 'edge' => 'bottom',
533
+ 'align' => 'left',
534
+ ),
535
+ 'width' => 380,
536
+ 'title' => __('Congratulations!', 'wp-lingotek'),
537
+ 'content' => $content,
538
+ 'buttons' => $buttons
539
+ );
540
+
541
+ new Lingotek_Pointer($args);
542
+ }
543
  }
544
 
545
  // Helpers - development functions
readme.txt CHANGED
@@ -1,20 +1,18 @@
1
  === Lingotek Translation ===
2
- Contributors: Chouby, msmith, erichie
3
  Donate link: http://lingotek.com/
4
- Tags: Lingotek, lingotek, multilingual, bilingual, translate, translation, language, multilanguage, international, localization
5
  Requires at least: 3.8
6
  Tested up to: 4.2
7
- Stable tag: 1.0
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
11
- Lingotek Translation offers convenient cloud-based localization and translation solutions for your WordPress content.
12
 
13
  == Description ==
14
 
15
- Lingotek offers convenient cloud-based localization and translation.
16
-
17
- Lingotek Translation simplifies the process of creating and maintaining your WordPress multilingual website. Features include machine, professional, and community translation solutions that ease the manual burden of launching in new markets while improving language consistency, cutting costs, and enabling you to deliver your brand to consumers abroad in the quickest and most effective way possible.
18
 
19
  Make your WordPress website content truly multilingual. The power to translate is now inside WordPress!
20
 
@@ -22,17 +20,11 @@ Make your WordPress website content truly multilingual. The power to translate i
22
 
23
  WordPress administrators use Translation Profiles to categorize content by its relative value. You associate each content type with a Translation Profile, and the plugin carries out the appropriate workflow:
24
 
25
- = Professional =
26
-
27
- The plugin enables you to use your own translation agency or tap into Lingotek's marketplace of more than 5,000+ in-country translators. Don't have time to manage your own translation project? Let Lingotek take care of it for you. The plugin fully automates file transfer between Wordpress and Lingotek. You'll have full visibility into the translation process every step of the way. And once the translations are completed, they'll automatically download and publish to your website according to the preferences you've set.
28
-
29
- = Community =
30
 
31
- If you're looking to save money by avoiding professional translation, you can take the do-it-yourself approach and have your bilingual employees, partners and/or users perform translations right within Wordpress. The plugin integrates with and provides use of the Lingotek Workbench, a professional-grade text editor used for translating, reviewing, and post-editing multilingual content.
32
 
33
- = Free Automatic =
34
-
35
- Machine translation is an excellent option if you're on a tight budget, looking for near-instant results, and are okay with less-than-perfect quality. The plugin allows you to quickly and automatically translate your site by providing use of the commercial API for Microsoft Translator (the cost is covered by Lingotek for up to 100,000 words). Machine translations can be post-edited at any time using the Lingotek Workbench.
36
 
37
  = Cloud-Based Translation Management System =
38
 
@@ -88,9 +80,13 @@ Visit the [Lingotek documentation site](https://lingotek.atlassian.net/wiki/disp
88
 
89
  == Changelog ==
90
 
91
- = 1.0 (2015-06-22) =
 
 
 
 
92
 
93
- * Released on June 22, 2015
94
 
95
  == Upgrade Notice ==
96
 
1
  === Lingotek Translation ===
2
+ Contributors: chouby, smithworx, erichie
3
  Donate link: http://lingotek.com/
4
+ Tags: automation, bilingual, international, language, Lingotek, localization, multilanguage, multilingual, translate, translation
5
  Requires at least: 3.8
6
  Tested up to: 4.2
7
+ Stable tag: 1.0.1
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
11
+ Lingotek Translation offers convenient cloud-based localization and translation for WordPress.
12
 
13
  == Description ==
14
 
15
+ Lingotek Translation offers convenient cloud-based localization and translation for WordPress by simplifying the process of creating and maintaining your multilingual website. Features include machine, professional, and community translation solutions that ease the manual burden of launching in new markets while improving language consistency, cutting costs, and enabling you to deliver your brand to consumers abroad in the quickest and most effective way possible.
 
 
16
 
17
  Make your WordPress website content truly multilingual. The power to translate is now inside WordPress!
18
 
20
 
21
  WordPress administrators use Translation Profiles to categorize content by its relative value. You associate each content type with a Translation Profile, and the plugin carries out the appropriate workflow:
22
 
23
+ * __Professional__ - The plugin enables you to use your own translation agency or tap into Lingotek's marketplace of more than 5,000+ in-country translators. Don't have time to manage your own translation project? Let Lingotek take care of it for you. The plugin fully automates file transfer between Wordpress and Lingotek. You'll have full visibility into the translation process every step of the way. And once the translations are completed, they'll automatically download and publish to your website according to the preferences you've set.
 
 
 
 
24
 
25
+ * __Community__ - If you're looking to save money by avoiding professional translation, you can take the do-it-yourself approach and have your bilingual employees, partners and/or users perform translations right within Wordpress. The plugin integrates with and provides use of the Lingotek Workbench, a professional-grade text editor used for translating, reviewing, and post-editing multilingual content.
26
 
27
+ * __Free Automatic__ - Machine translation is an excellent option if you're on a tight budget, looking for near-instant results, and are okay with less-than-perfect quality. The plugin allows you to quickly and automatically translate your site by providing use of the commercial API for Microsoft Translator (the cost is covered by Lingotek for up to 100,000 words). Machine translations can be post-edited at any time using the Lingotek Workbench.
 
 
28
 
29
  = Cloud-Based Translation Management System =
30
 
80
 
81
  == Changelog ==
82
 
83
+ = 1.0.1 (2015-07-14) =
84
+
85
+ * Added pointer, updated FAQs, and minor content updates
86
+
87
+ = 1.0 (2015-07-06) =
88
 
89
+ * Initial release on July 6, 2015
90
 
91
  == Upgrade Notice ==
92