C # Word Interop - проверка орфографии на определенном языке

Для моего клиента мне нужно принудительно проверить орфографию на определенном языке.

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

Моя проблема в том, что я ничего не могу найти об этих словарях или о том, как ими пользоваться.

Также есть вероятность, что, конечно, есть другой способ сделать это.

Может ли кто-нибудь подвигнуть меня в правильном направлении?


person Tom Ceuppens    schedule 28.03.2012    source источник


Ответы (4)


Нашел свое решение:

foreach (Range range in activeDocument.Words)
{
    range.LanguageID = WdLanguageID.wdFrenchLuxembourg;
}

Редактировать после комментария

Поскольку мой активный документ находится в переменной, я, кажется, теряю статическое свойство Range. Я нашел работу, выполнив следующие действия. (lan - это моя переменная, в которой я храню свой WdLanguageId)

object start = activeDocument.Content.Start;
object end = activeDocument.Content.End;

activeDocument.Range(ref start, ref end).LanguageID = lan;

спасибо @Adrianno за помощь!

person Tom Ceuppens    schedule 30.03.2012
comment
Как указано в комментарии, это работает, но проверьте производительность, если вы перечислите все диапазоны. В большом документе это могло быть очень медленным! - person Adriano Repetti; 02.04.2012

Проверка орфографии использует язык текста для выбора правил и словарей (см. здесь, чтобы проверить, как это работает).

Вы должны установить тот язык текста, который вам нужен, и тогда SC будет использовать этот язык. Для получения более подробной информации перейдите по этой ссылке:

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.language.aspx

person Adriano Repetti    schedule 28.03.2012
comment
Я попытался установить activeDocument.Content.LanguageId, но SC его не уловил ... - person Tom Ceuppens; 28.03.2012
comment
Вы пробовали с ActiveDocument.Range.LanguageID = wdEnglishUS - person Adriano Repetti; 29.03.2012
comment
Мне не нужны отзывы или что-то в этом роде. Я просто хочу установить язык SC на заранее определенном языке ... Мой клиент француз, и есть много видов французского. И часто слово обнаруживает не то ... - person Tom Ceuppens; 30.03.2012

Я работал с этим в последнее время и подумал, что добавлю немного к уже данным ответам.

Чтобы получить список орфографических ошибок в документе для определенного языка, выполните следующие действия:

// Set the proofing language
myDocument.Content.LanguageID = WdLanguageID.wdDanish;

// Get the spelling errors (returns a ProofreadingErrors collection)
var errors = myDocument.SpellingErrors;

// There is no "ProofreadingError" object -> errors are accessed as Ranges
foreach (Range proofreadingError in errors)
    Console.WriteLine(proofreadingError.Text);

Как указал Адриано, ключ состоит в том, чтобы сначала указать язык содержимого документа, а затем вы можете получить доступ к орфографическим ошибкам для данного языка. Я протестировал это (Word Interop API версии 15, Office 2013), и он работает.

Если вы хотите получить предложения по каждому слову с ошибкой, я предлагаю вам взглянуть на мой предыдущий ответ на этот вопрос: https://stackoverflow.com/a/14202099/700926

В этом ответе я привожу образец кода, а также ссылки на соответствующую документацию о том, как это делается. В частности, в примере рассказывается, как выполнить проверку орфографии данного слова на определенном языке (по вашему выбору) с помощью Word Interop. В примере также показано, как получить доступ к предложениям, возвращаемым Word.

Наконец, у меня есть пара замечаний:

  • В отличие от текущего принятого ответа (вашего собственного) - этот подход работает намного быстрее, поскольку не нужно повторять каждое слово. Я работал с Word Interop для отчетов (более 100 страниц) и поверьте мне, вы не хотите сидеть и ждать завершения этой итерации.
  • Информацию о свойстве SpellingErrors можно найти на здесь.
  • Информацию об отсутствии объекта ProofreadingError можно найти здесь.
person Lasse Christiansen    schedule 07.01.2013

Никогда не используйте операторы foreach при доступе к объекту Office. Большинство объектов Office являются COM-объектами, и использование foreach приводит к утечкам памяти.

Ниже приведен фрагмент рабочего кода.

    Microsoft.Office.Interop.Word.ProofreadingErrors errorCollection = null;

    try
    {
        errorCollection = Globals.ThisAddIn.Application.ActiveDocument.SpellingErrors;

     // Indexes start at 1 in Office objects
        for (int i = 1; i <= errorCollection .Count; i++)
        {
            int start =  errorCollection[i].Start;
            int end = errorCollection[i].End;

        }

    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);

    }
    finally
    {
        // Release the COM objects here 
        // as finally shall be always called

        if (errorCollection != null)
        {
            Marshal.ReleaseComObject(errorCollection);
            errorCollection = null;
        }

    }
person Sujay Ghosh    schedule 15.11.2014