настраиваемые тексты приложений - PullRequest
0 голосов
/ 26 апреля 2011

Мое приложение отправлено множеству разных клиентов, которые хотят контролировать тексты, отображаемые в приложении (например, один клиент хочет отобразить «операция успешно завершена», другой «операция завершена» и другое »). tres bien ').
Таким образом, в основном здесь необходимо разрешить клиенту редактировать эти вещи «на лету» через графический интерфейс.
В будущем мы можем добавить опцию «заполнители» (то есть «операция {0} завершена», где {0} - это идентификатор операции.)

Существует ли какая-либо основа / обычная практика для решения этой проблемы?
Я предполагаю, что это очень распространенная проблема, но я не смог найти никаких ресурсов по этому поводу.

(я использую ASP.Net и nHibernate для своей ORM.)
Моя лучшая идея на данный момент - иметь в базе данных таблицу для всех сообщений и реализовать для нее некоторый механизм управления.
Дальнейшие идеи будут оценены.

Ответы [ 3 ]

1 голос
/ 26 апреля 2011

Есть довольно много ответов на это вокруг на SO. По сути, нет стандартного способа сделать это, и это, как правило, смесь элементов в базе данных и других элементов, помеченных текстовыми файлами какого-либо рода. Есть GNU gettext, есть xliff и т. Д. см. Здесь список Наряду с чистым переводом существуют аспекты цвета и типографики. Англосаксы любят сан-с засечками и прохладные цвета, испаноязычные нации любят шрифты с засечками и теплые цвета. (не мой стереотип) и так далее. Неанглийские языки, особенно романские языки, как правило, примерно на 30% длиннее, чем эквивалентный английский текст, поэтому макет должен быть гибким и ИСПЫТАННЫМ. Многие языки справа налево, а некоторые, японский для одного, не имеют пробелов.

Продолжайте читать и добро пожаловать на минное поле.

Есть несколько книг на эту тему, но не так хорошо.

0 голосов
/ 05 мая 2011

Хорошо, это решение, которое я выбрал (не самое лучшее решение, я уверен, но достаточно гибкое для моих нужд):
Так как все результаты операций в моем слое businees представлены в любом случае перечислениями (например, EmployeeAddition.SameNameExists или DepartmentDeletion.DepartmentNotEmpty), было довольно просто создать класс сущности, который описывает текстовые сообщения, связанные с этими перечислениями:

public class ConfigurableText : Entity
    {
        public virtual int TextId { get; private set; }
        public virtual TextType TypeOfText { get; set; }
        public virtual int EnumValue { get; set; }
        public virtual string MainLanguageText { get; set; }
        public virtual string SecondaryLanguageText { get; set; }
        public virtual string Description { get; set; }

        public ConfigurableText()
        {
            TypeOfText = ConfigurableText.TextType.PassengerMessage;
            EnumValue = 0;
            Description = string.Empty;
            TextId = GetTextId(TypeOfText, EnumValue);
        }

        public ConfigurableText(TextType type, int enumValue,string mainLanguageText,string description) : this()
        {
            TypeOfText = type;
            EnumValue = enumValue;
            MainLanguageText = mainLanguageText;
            Description = description;
            TextId = GetTextId(TypeOfText, EnumValue);
        }

        public ConfigurableText(TextType type, int enumValue,string mainLanguageText, string description, string secondaryLanguageText) : this(type,enumValue,mainLanguageText,description)
        {
            SecondaryLanguageText = secondaryLanguageText;
        }


        public enum TextType
        {
            EmployeeMessage = 1,
            DepartmentDeletionMessage,
            //...
        }

        public static int GetTextId(TextType type, int enumValue)
        {
            return int.Parse(((int)type).ToString() + "00"
                + enumValue.ToString() + "00");
        }
    }

и затем клиентское приложение просто выходит:

var ctrl = new TextsManagementController();
 ConfigurableTextPO message = ctrl.GetText(ConfigurableText.TextType.EmployeeMessage, (int)this.Validity);

MessageMainLanguage = message.MainLanguageText;

Поскольку я использую кэш 2-го уровня nHibernate, БД (почти) никогда не срабатывает, поэтому производительность не должна быть проблемой.
Конечно, нет проблем создать графический интерфейс для обновления этих объектов.

Недостатком этого является то, что для каждого бита текста, который я хотел бы иметь возможность конфигурировать, я должен определить enum и вручную извлекать значения, когда они необходимы.

0 голосов
/ 26 апреля 2011

Почему бы вам не использовать встроенную возможность .NET для чтения из сборок ресурсов?

Таким образом, вы можете обрабатывать для каждого языка (или клиента) свою собственную сборку ресурсов. Вы можете перевести их содержание, например с http://www.sisulizer.com/ или другим сторонним приложением. Тогда каждый клиент может сам перевести или написать свой текст.

С уважением, Патрик

кстати: http://www.sisulizer.com также может переводить таблицы данных в дб: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...