2015-10-30 2 views
1

Я пытаюсь локализовать шаблон dojo, и я сталкиваюсь с проблемой, когда локализованная строка содержит одиночную кавычку.Dojo Localization - data-dojo-props терпит неудачу, когда локализованная строка содержит одинарную цитату

Мой шаблон выглядит следующим образом:

<div> 
    <select data-dojo-props="label:'${i18n.mySelectorLabel}'" 
      > 
    </select> 
</div> 

и связанная с ним линия в комплекте ресурсов для французского языка выглядит примерно так:

"mySelectorLabel" : "d'élément :", 

Это было мое ожидание, что додзё шаблонной система будет справляться с единой цитатой, представленной во французском слове «element», без дополнительного экранирования в наборе ресурсов.

Выполнение кода моих результатов в следующей ошибке:

dojo/parser::parse() error Error: SyntaxError: Expected '}' in data-dojo-props='label:'d'élément :'' 

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

ответ

0

Посмотрите, как работает парсер додзё, похоже, что он передает значение атрибута data-dojo-props в eval. Вы в конечном итоге с чем-то вроде этого:

eval("{" + "label:'${i18n.mySelectorLabel}'" + "}"); 

Казалось бы, это подразумевает, что этот вопрос описано в вопросе является фундаментальным ограничением додзё.

Обходной путь, предложенный vogomatix, работает специально для «персонажа», но на него влияет используемый minifier. Uglify в порядке, но Dojo ShrinkSafe - нет.

С тех точек, в виду, что решения, которые мы придумали следующие:

  1. Побег символ в комплекте ресурсов.
  2. Набор этикеток явно
    <select label="${i18n.mySelectorLabel}">
  3. Используйте присоединять точку, чтобы установить метку программно.

Мы пошли с вариантом 2. Не идеально, но продемонстрировали, что работаем как с Dojo 1.7, так и с Dojo ShrinkSafe и Dojo 1.10 с Uglify.

0

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

<div> 
    <select data-dojo-props='label:"${i18n.mySelectorLabel}"'> 
    </select> 
</div> 

Обновления: К сожалению, это не работает все время, либо - см комментариев по ОП для дальнейшего объяснения.

+0

Это работает в нашем конкретном случае (спасибо!), Но мне интересно, существует ли более общее решение? Отменив использование цитаты, строка теперь не может содержать двойную кавычку. Очевидно, что это менее вероятно, но это демонстрирует, что на самом деле мы просто работали над проблемой, а не нашли решение. –

+1

Копаясь немного глубже, казалось бы, что додзё передает значение реквизита в eval. Вы получите что-то вроде этого: eval ("{" + "label: '$ {i18n.mySelectorLabel} '"+"} "); Из этого следует, что проблема, изложенная в вопросе, является фундаментальным ограничением додзё, и единственным реальным решением является удаление символов в наборе ресурсов. –

+0

Фактически, я отмените это, предлагаемое решение не работает в нашем случае. Работает ли оно или нет, используется используемый мини-фильтр. Это решение работает, если Uglify используется в качестве минификатора, но не используется, если используется Dojo ShrinkSafe. , это появилось в старом проекте, который использует последний. –

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