2016-06-16 3 views
6

В соответствии с документацией для полимерной app-localize-behaviorприложение-локализации-поведение и общий кэш локализации

Каждый элемент, который отображает контент для локализации следует добавить Polymer.AppLocalizeBehavior. Все эти элементы имеют общий кэш локализации, , поэтому вам нужно только загрузить переводы один раз.

В следующем фрагменте кода (адаптировано из this answer) не находит общих ресурсов в теге

Может быть, я что-то пропустил?

<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <base href="https://polygit.org/polymer+:master/components/"> 
 
    <script src="webcomponentsjs/webcomponents-lite.min.js"></script> 
 
    <script src="https://rawgit.com/yahoo/intl-messageformat/d361003/dist/intl-messageformat.min.js"></script> 
 

 
    <link rel="import" href="polymer/polymer.html"> 
 
    <link rel="import" href="paper-toggle-button/paper-toggle-button.html"> 
 
    <link rel="import" href="app-localize-behavior/app-localize-behavior.html"> 
 

 
</head> 
 

 
<body> 
 
    <x-local-translate></x-local-translate> 
 

 
    <dom-module id="x-local-translate"> 
 
    <template> 
 

 
     <div> 
 
     <span title="english"></span> 
 
     <paper-toggle-button on-change="_toggle" id="switch"></paper-toggle-button> 
 
     <span title="french"></span> 
 
     </div> 
 

 
     <div> 
 
     <h4>Outside Repeater</h4> 
 
     <div> 
 
      <div>{{localize('greeting')}}</div> 
 
     </div> 
 

 
     <h4>Template Repeater Items</h4> 
 
     <template is="dom-repeat" items="{{things}}"> 
 
      <div>{{localize('greeting')}}</div> 
 
     </template> 
 

 

 
     <x-local-test></x-local-test> 
 
     </div> 
 
    </template> 
 

 
    <script> 
 
     Polymer({ 
 
     is: "x-local-translate", 
 
     behaviors: [ 
 
      Polymer.AppLocalizeBehavior 
 
     ], 
 
     properties: { 
 
      things: { 
 
      type: Array, 
 
      value: function() { 
 
       return [1, 2, 3]; 
 
      } 
 
      }, 
 

 
      /* Overriden from AppLocalizeBehavior */ 
 
      language: { 
 
      value: 'en', 
 
      type: String 
 
      }, 
 

 
      /* Overriden from AppLocalizeBehavior */ 
 
      resources: { 
 
      type: Object, 
 
      value: function() { 
 
       return { 
 
       'en': { 
 
        'greeting': 'Hello!' 
 
       }, 
 
       'fr': { 
 
        'greeting': 'Bonjour!' 
 
       } 
 
       }; 
 
      } 
 
      } 
 
     }, 
 
     _toggle: function() { 
 
      this.language = this.$.switch.checked ? 'fr' : 'en'; 
 
     } 
 
     }); 
 
    </script> 
 
    </dom-module> 
 

 
    <dom-module id="x-local-test"> 
 
    <template> 
 
     <h4>Inside x-local-test</h4> 
 
     <div>{{localize('greeting')}}</div> 
 
    </template> 
 

 
    <script> 
 
     Polymer({ 
 
     is: "x-local-test", 
 
     behaviors: [ 
 
      Polymer.AppLocalizeBehavior 
 
     ], 
 

 
     properties: { 
 
      things: { 
 
      type: Array, 
 
      value: function() { 
 
       return [1, 2, 3]; 
 
      } 
 
      } 
 
     }, 
 

 
     }); 
 
    </script> 
 
    </dom-module> 
 

 
</body> 
 

 
</html>

Теперь в следующей скрипке, я сделал свою работу, передавая ресурсы и языка объект как х-местных испытания свойств. https://jsfiddle.net/g4evcxzn/2/

Но он должен работать без этого

ответ

6

Я посмотрел на AppLocaleBehavior's demo и если вы на самом деле смотреть на репо, они используют два элемента для него, один, что loads the resources from an external json и еще один, который имеет их locally defined и в демо, похоже, не разделяют кеш, как и то, что с тобой происходит.

Это показалось мне странным, что они упоминают кеш, поэтому я взглянул на behavior's code и узнал что-то интересное, кеш фактически существует, но, похоже, его цель состоит в том, чтобы не допустить повторного загрузки одного и того же внешнего ресурса вместо того, чтобы делиться свойством resources.

Так что, если вы хотите поделиться локализациями ресурсов на нескольких элементов на пути будет имеющей общий ресурс (скажем, мы называем это locales.json) и вызовите loadResources функцию на каждом из них (Так как запрос кэшируются вам не нужно беспокоиться о загрузке файла несколько раз). Вы можете сделать это на attached обратного вызова, как это:

attached: function() { 
    this.loadResources(this.resolveUrl('locales.json')); 
} 
+0

Обратите внимание, что вы должны определить свойство языка: 'язык: {значение:«ан»}' Таким образом, чтобы иметь е очень локализованный элемент в приложении отображает тот же язык, мы должны передавать язык каждому элементу. Разве это не проблема? –

+0

Я действительно не думаю, что это большая проблема, я имею в виду, что вы действительно можете хотеть, чтобы разные компоненты отображались на разных языках по какой-либо причине, поэтому вы должны решить, используете ли вы свойство языка или нет. – Alan

+1

Что я в итоге сделал для решения этой проблемы было создание поведения, которое расширило Polymer.AppLocalizationBehavior, там я захватил файл ресурсов и установил язык.Мое приложение затем включало бы поведение, которое я только что определил, и я бы не стал устанавливать язык везде. –

8

Согласно идеям Хосе А. и Жан-Реми здесь некоторые примеры кода для копирования/вставки:

<link rel="import" href="../bower_components/polymer/polymer.html"> 
    <link rel="import" href="../bower_components/app-localize-behavior/app-localize-behavior.html"> 

    <script> 
     MyLocalizeBehaviorImpl = { 
     properties: { 
      language: { 
      value: 'de' 
      } 
     }, 
     attached: function() { 
      this.loadResources(this.resolveUrl('locales.json')); 
     } 
     }; 
     MyLocalizeBehavior = [MyLocalizeBehaviorImpl, Polymer.AppLocalizeBehavior]; 
    </script> 

Include файл поведения в все пользовательские компоненты и добавить поведение:

<link rel="import" href="./my-localize-behavior.html"> 

...... 

behaviors: [ 
    MyLocalizeBehavior 
], 
+0

Это то, что я закончил делать –

+0

Как насчет проблем с кешированием браузеров с помощью locales.json, как сделано выше? Как можно принудительно использовать последний файл локалей при изменении? – sinjins

Смежные вопросы