Можно ли создать список всех помеченных строк в C # во время компиляции / выполнения? - PullRequest
4 голосов
/ 10 марта 2011

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

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

Пример строкиКод c # выглядит примерно так:

textBoxName.Text = string.Format(Translate.tr("Create {0}"), NextAutoName());

И c ++ будет выглядеть так:

info_out << tr( L"Grip weights range from {0} to {1}" )(low_weight)(high_weight) << endl;

На стороне c ++ при построении списка строк для генерации шаблона используется синтаксический анализатор c ++ (см. мой предыдущий вопрос ), который выполняется как часть внешних сборок по всему коду C ++ в проекте.По сути, любая строка, помещаемая в вызов tr (), автоматически извлекается.

Есть ли лучшее решение для c #, чем написание другого парсера?Я хотел бы получить список строк, который создается во время компиляции, или тот, к которому я могу получить доступ во время выполнения.A List<string> было бы замечательно.

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

Сейчас в c ++ гораздо удобнее поддерживать шаблон перевода в актуальном состоянии - мне просто нужно убедиться, что строки, которые я хочу перевести, обернуты в tr (), а анализатор обрабатывает все остальное.В c # я в настоящее время вручную проверяю все строки и обновляю фиктивную функцию на стороне c ++ новыми строками.Я близок к тому, чтобы сломать и написать еще один парсер.Я надеялся, что c #, с его высокоуровневыми функциями, мог бы сделать лучше здесь.

Ответы [ 2 ]

1 голос
/ 10 марта 2011

У меня есть проект, который делает то же самое. Только синтаксический анализатор перевода написан на C # (он называется c3po). Помимо синтаксического анализа проекта, c3po также отвечает за генерацию файлов для отправки поставщику перевода, а также за генерацию файлов, используемых проектом .net для хранения переведенных строк. Мы обнаружили, что он имеет несколько преимуществ по сравнению с «традиционными» файлами ресурсов .Net:

1) поскольку c3po поддерживает собственную внутреннюю базу данных локализованных строк, мы можем отслеживать нашу собственную память переводов и следить за тем, чтобы ежемесячно отправлять только новые строки переводчикам. Он также удаляет строки, которые больше не нужны. Это сэкономило нам тысячи долларов на переводческих расходах.

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

3) c3po обслуживает сразу несколько различных проектов, что упрощает наше взаимодействие с нашим поставщиком переводов.

4) Мы можем автоматизировать c3po через наш CI-сервер, поэтому каждый раз, когда разработчик регистрируется (или раз в ночь, или что-то еще), мы можем позволить ему выполнять все его задачи, включая отправку файлов переводчикам, подбор новых фраз, и т.д.

1 голос
/ 10 марта 2011

Я сделал нечто подобное (я просто вытащил список строковых констант) и использовал один и тот же парсер для C # и C ++.Хотя это был скорее лексический анализатор, чем анализатор, который работает, потому что два языка имеют очень похожую лексическую структуру.

Как только у вас есть список строк, вы можете записать его в исходный файл C # и скомпилировать егов вашу программу.Ваш код будет генерировать файл примерно так:

namespace MyProject
{
    class MyStrings
    {
        public string[] Strings = {
            "pony",
            "cob",
            "stallion"
        };
    }
}

Затем вы можете включить этот файл в свой проект, чтобы предоставить вашему коду доступ к списку его строк.

Если вы запуститеинструмент как событие перед сборкой, это будет происходить как часть сборки.

Однако, как говорит Ганс, вам лучше взглянуть на встроенную поддержку локализации.

...