2009-05-20 2 views
5

Что такое хороший метод локализации меток (заголовки столбцов, метки полей, верхние и нижние колонтитулы и т. Д.) В Crystal Reports?Локализованные отчеты Crystal Reports

В настоящее время мы участвуем в XI R2 SP4, но хотим перейти на 2008 год. Похоже, 2008 год предлагает лучшую локализацию пользовательского интерфейса зрителя. Есть ли у него история локализации контента?

ответ

2

Два варианта, о которых я могу думать: 1) Имейте отдельный отчет для каждой локализованной версии (это становится ужасно быстрым, и я не рекомендую его очень высоко) или 2) Создал ли отчет из приложения (скажем, aC# windows/web app), а затем вы можете локализовать с использованием стандартов локализации .net и установить весь локализованный текст (считанный из файлов ресурсов) в коде.

Я не уверен в 2008 году, но мы также на XI R2. У нас есть локализованные отчеты для каждого языка, но только потому, что мы знаем, что нам нужны только три разные локализованные версии.

+0

# 2 будет с помощью RDC просканировать каждое текстовое поле и заменить с локализованным текстом? –

+0

Да - Я никогда не делал этого, хотя я не уверен, какие головные боли участвуют. –

+0

Что вы думаете о UFL, который возвращает локализованные строки? Потребовал бы, чтобы из каждого поля метки была проблема с производительностью? –

0

Клиент попросил меня разработать для них стратегию локализации. Я хотел написать статью об этом. Благодаря вам, я сделал именно это. http://www.cogniza.com/blog/?p=55

Edit:

Я был в состоянии использовать встроенный подотчет (в разделе отчетно-заголовка), который ссылается на базу данных значений локализации. Я бы добавил, что для публикации, но это было довольно сложно.

Другой вариант - создать библиотеку пользовательских функций (UFL), которая обрабатывает эти задачи. Храните данные в базе данных или в XML-файле. Скорее всего, однако, вы потеряете функциональность ContentLocale.

+0

Подводя итог идее в случае ссылки rot: создайте пользовательскую функцию, которая возвращает локализованную строку, проверив переменную Crystal XI ContentLocale. –

+2

Мне не нравится идея размещения фактических переводов в пользовательскую функцию. Это создаст головные боли при переводе на аутсорсинг. –

2

Нашел способ локализации значений, таких как DateTimes в Crystal Reports.
Например, если дата август-2009 и культура - это французский, тогда будет отображаться как août-2009.
Все это БЕЗ переключения текущей культуры потоков на французский.

Соответствующий Фрагмент кода (пример):

  //Locale must be set BEFORE report is opened 
      if (this.IsEnglish) 
      { 
       ReportDoc.ReportClientDocument.PreferredViewingLocaleID = 
        CrystalDecisions.ReportAppServer.DataDefModel.CeLocale.ceLocaleEnglishCanada; 
       ReportDoc.ReportClientDocument.LocaleID = 
        CrystalDecisions.ReportAppServer.DataDefModel.CeLocale.ceLocaleEnglishCanada; 
       ReportDoc.ReportClientDocument.ProductLocaleID = 
        CrystalDecisions.ReportAppServer.DataDefModel.CeLocale.ceLocaleEnglishCanada; 
      } 
      else 
      { 
       ReportDoc.ReportClientDocument.PreferredViewingLocaleID = 
        CrystalDecisions.ReportAppServer.DataDefModel.CeLocale.ceLocaleFrenchCanada; 
       ReportDoc.ReportClientDocument.LocaleID = 
        CrystalDecisions.ReportAppServer.DataDefModel.CeLocale.ceLocaleFrenchCanada; 
       ReportDoc.ReportClientDocument.ProductLocaleID = 
        CrystalDecisions.ReportAppServer.DataDefModel.CeLocale.ceLocaleFrenchCanada; 
      } 

      //Load the report from file path 
      ReportDoc.Load(reportPath.ToString()); 
1

Мы наконец получили вокруг реализации локализации отчета. Загрузка Crystal Reports уже является самой отстающей/наихудшей частью пользовательского интерфейса в нашем приложении, поэтому мы хотели избежать влияния производительности. Другая идея, которая информировала наше решение, заключалась в том, что переводы не будут меняться в рамках отгруженной версии.

Мы разработали приложение, использующее API Crystal Reports (2008 - так что нет RDC) и работает в два этапа.

Первый этап - очистить весь текст и вывести его на английский .resx-файл. Самая жесткая часть этого заключается в выявлении переводного текста внутри функций и замене встроенных полей токенами, указывающими «не переводить».

После того, как локализованные версии resx вернутся, вторая фаза приложения принимает каждый отчет вместе с каждым resx и сохраняет новые отчеты с замененным на английский язык переведенным текстом. Это также позволило нам отключить шрифты только в японских отчетах MS Gothic, тем самым избегая необходимости лицензировать «универсальный» шрифт. Японские символы в «универсальных» шрифтах (например, Arial Unicode MS) имеют тенденцию выглядеть как дерьмо.

Crystal API является византийским, и вам нужно быть осторожным с краевыми случаями вокруг обнаружения переводимых строк внутри функций и встроенных полей.Будьте осторожны со встроенными полями, такими как PageNofM, они не заключены в фигурные скобки (не говоря уже о том, что вы должны заменить это полем {{}} {поле}, поэтому «страница» и «из» могут быть переведены). Один указатель использует контроллеры для замены существующих элементов клонированными/модифицированными копиями, вы не можете просто изменять текстовое содержимое элементов на месте. Удачи, если вы идете по этому маршруту, но в итоге мы считаем, что это лучший вариант.

-1

монокристалл отчет Используется для нескольких языков

if (CultureInfo.CurrentCulture.Name == "en-US") 
{ 
    (obj.ReportDefinition.ReportObjects["lbleverest"] as TextObject).Text = resBundle.GetString("Localization", "everest"); 
    (obj.ReportDefinition.ReportObjects["lblmandlicode"] as TextObject).Text = resBundle.GetString("Localization", "SocietyCode"); 
    (obj.ReportDefinition.ReportObjects["MandliName1"] as FieldObject).ApplyFont(new Font(resBundle.GetString("Localization", "Font"), Convert.ToInt32(resBundle.GetString("Localization", "FontSize")), FontStyle.Regular)); 
    (obj.ReportDefinition.ReportObjects["shortName1"] as FieldObject).ApplyFont(new Font(resBundle.GetString("Localization", "Font"), Convert.ToInt32(resBundle.GetString("Localization", "FontSize")), FontStyle.Regular));   
}  
else  
{  
    (obj.ReportDefinition.ReportObjects["lbleverest"] as TextObject).Text = resBundle.GetString("Localization", "everest");  
    (obj.ReportDefinition.ReportObjects["lblmandlicode"] as TextObject).Text = resBundle.GetString("Localization", "SocietyCode");  
    (obj.ReportDefinition.ReportObjects["MandliName1"] as FieldObject).ApplyFont(new Font(resBundle.GetString("Localization", "Font"), Convert.ToInt32(resBundle.GetString("Localization", "FontSize")), FontStyle.Regular));  
    (obj.ReportDefinition.ReportObjects["shortName1"] as FieldObject).ApplyFont(new Font(resBundle.GetString("Localization", "Font"), Convert.ToInt32(resBundle.GetString("Localization", "FontSize")), FontStyle.Regular));  
} 

obj.DataDefinition.FormulaFields["lang"].Text = "'" + CultureInfo.CurrentCulture.Name + "'";  
cv.crystalReportViewer1.ReportSource = obj;  
cv.Show(); 
+0

Что такое 'resBundle'? Почему код в if/else блокирует то же самое? –

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