Sign in Join
Wiki copytemporary

spelling/ru: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: spelling/ru

OldNewLine
1+# Использование hunspell с Lazarus
2+
3+> **Note:** Эта страница актуальна по состоянию на август 2018 года, но все меняется .....
4+
5+Эта страница посвящена использованию библиотеки hunspell с Lazarus. Он описывает модель, которая работает, вроде как. Вам почти наверняка понадобится внести некоторые изменения для ваших конкретных целей, но, надеюсь, эта страница послужит вам хорошим началом.
6+
7+Во-первых, на форуме есть несколько ссылок на некоторый код, который будет работать с библиотекой hunspell. Модуль hunspell.pas в значительной степени основан на этих блоках кода. У большинства нет информации о лицензии, и делается предположение, что она является «общеизвестной» и, следовательно, свободна от каких-либо ограничений. Я добавил немного, что решает проблему поиска файлов библиотеки и словаря. И установил разумный интерфейс.
8+
9+Кроме того, пользователь [[https://forum.lazarus.freepascal.org/index.php?action=profile;u=55059 rvk]] с форума создал Windows 64-битную DLL, так как для пользователей Windows не было никакой альтернативы.
10+
11+# О библиотеке Hunspell
12+
13+Hunspell - это активный проект с открытым исходным кодом, распространяемый по открытой лицензии Mozilla. Библиотека hunspell используется в таких продуктах, как Libra Office, Open Office и Firefox. Его можно заставить работать на Windows, Linux и Mac (и, возможно, на кучах других платформ). См. ссылки на платформоспецифичные страницы ниже. Словари Hunspell легко доступны и, возможно, уже установлены на многих машинах. Даже если вы не можете получить доступ к библиотеке другого приложения, вы можете использовать его словарь.
14+
15+Словари Hunspell поставляются в виде пары файлов *.dic и *.aff. Например, австралийский словарь состоит из en_AU.dic и en_AU.aff. Префикс 'en' обозначает его английский, а суффикс 'AU' говорит о его специфичности специально для Австралии. Как говорящий по-английски, я отмечаю, что словари en_US, кажется, всегда установлены, и я добавляю австралийские. Я не знаю, насколько распространен этот шаблон в не-англоязычных системах.
16+
17+Словари можно найти здесь <https://github.com/LibreOffice/dictionaries>, а также некоторую информацию, связанную с этим, здесь <https://wiki.documentfoundation.org/Development/Dictionaries>
18+
19+# Замечание насчет словарей
20+
21+В некоторых случаях для корректного отображения предлагаемых слов словари должны быть закодированы в UTF-8. Если вы заметили, что некоторые слова отображаются неправильно — например, яблоко на польском — это jabłko, а вы получаете jab�ko, — это означает, что словари pl_PL.aff и pl_PL.dic должны быть преобразованы в UTF-8. Чтобы преобразовать словари в UTF-8 в Linux Debian (это должно работать в любом Linux, конвертированные словари можно использовать в Windows - проверьте также [эту ветку форума](http://forum.lazarus.freepascal.org/index.php/topic,44298.0.html)) выполните следующие действия:
22+
23+1\. Запустить терминал как root
24+
25+`  su`
26+
27+2\. Если он еще не установлен, установите hunspell (hunspell-pl для польского словаря — подробнее на [Debian Hunspell package](https://packages.debian.org/search?keywords=hunspell))
28+
29+`  apt-get install hunspell`\
30+`  apt-get install hunspell-pl`
31+
32+3\. Перейдите в /usr/share/hunspell/, где хранятся словари, и создайте папку dic
33+
34+`  cd /usr/share/hunspell/`\
35+`  mkdir dic`
36+
37+4\. Преобразуйте, например, словарь pl_PL.aff и pl_PL.dic. Используйте [ISO-8859-2](https://en.wikipedia.org/wiki/ISO/IEC_8859-2) (для Восточной Европы), [ISO-8859-1](https://en.wikipedia.org/wiki/ISO/IEC_8859-1) (или ISO-8859-15) для Западной Европы, [ISO-8859-5](https://ru.wikipedia.org/wiki/ISO_8859-5) для кириллицы и т.д.
38+
39+`  iconv -f ISO-8859-2 -t UTF-8 /usr/share/hunspell/pl_PL.aff | sed 's/^SET ISO8859-2$/SET UTF-8/g' > dic/pl_PL.aff`\
40+`  iconv -f ISO-8859-2 -t UTF-8 /usr/share/hunspell/pl_PL.dic > dic/pl_PL.dic`
41+
42+5\. Скопируйте папку dic или словари из папки dic в свое приложение.
43+
44+# Платформозависимость
45+
46+## Linux
47+
48+Во многих дистрибутивах Linux по умолчанию установлен Hunspell вместе с соответствующими языковыми словарями. Если нет, то, вероятно, это просто случай использования менеджера пакетов дистрибутива. Если ничего не помогает, возьмите исходник с сайта hunspell github и создайте его самостоятельно. Пользователи Linux любят это.
49+
50+Чтобы проверить, установлена ли у вас библиотека hunspell, попробуйте эту команду
51+
52+` ldconfig -p | grep hunspell `
53+
54+Точно так же вы можете найти некоторые словари с помощью
55+
56+` ls -l /usr/share/hunspell `
57+
58+Если это не сработает, попробуйте
59+
60+` find /usr -name *.aff `
61+
62+это займет немного больше времени.
63+
64+## Windows
65+
66+Установка библиотеки hunspell на Windows является более серьезной проблемой. По-видимому, нет предварительно скомпилированного 'комплекта', и большинство приложений Windows, которые используют Hunspell, похоже, статически связывают его, поэтому не осталось никаких hunspell.dll для использования. Но просто, чтобы быть уверенным, попробуйте поискать `*hunspell*.dll`. На сайте Hunspell github приведен рецепт его создания, но он включает установку MSYS2 и довольно сложен. Получающаяся DLL также нуждается вдобавок в паре gcc DLL.
67+
68+К счастью, пользователь rvk с форума Lazarus создал нам хорошую статически (т.е. автономно) связанную DLL-библиотеку с использованием Microsoft Visual Studio Community 2015. Таким образом, вы можете использовать и распространять эту DLL-библиотеку вместе с вашей программой, подпадающей под действие публичной лицензии Mozilla.
69+
70+Вы найдете эту DLL в комплекте с файлом лицензии на <https://github.com/davidbannon/hunspell4pas>, щелкните «DLL», щелкните по файлу dll, и вы увидите кнопку «Загрузить». Не забудьте также получить файл лицензии, он должен распространяться, так или иначе, с вашим приложением.
71+
72+------------------------------------------------------------------------
73+
74+Прим.перев.: Вы также можете посмотреть исходники интерфейса Hunspell для Lazarus здесь: [<https://github.com/cutec-chris/hunspell>](https://github.com/cutec-chris/hunspell)
75+
76+------------------------------------------------------------------------
77+
78+## Mac
79+
80+На Mac'е автора, по-видимому, была установлена библиотека Hunspell при установке Sierra. Но, может быть, просто возможно, это пришло вместе с Firefox. Я хотел бы получить обратную связь .... \[уже установлено на Mojave и Catalina\]
81+
82+> **Note:** См <https://opensource.apple.com/tarballs/hunspell/> для загрузки исходников v1.2.8.
83+
84+Чтобы проверить, установлена ли у вас библиотека hunspell, попробуйте эту команду
85+
86+` find / 2>&1 | grep "\hunspell"`
87+
88+она будет выполняться некоторое время, в зависимости от того, сколько файлов в вашей системе. Скорее всего, она найдет несколько файлов, включая некоторые, в вашем каталоге XCode. Однако конечным пользователям, вероятно, не будет установлен XCode. Один особенно интересный файл для меня был
89+
90+` /usr/lib/libhunspell-1.2.dylib `
91+
92+Версия 1.2 немного старше, чем где-либо, но работала нормально. Если вы не можете найти пригодную для использования библиотеку, я предлагаю вам установить его с помощью менеджера пакетов, такого как MacPorts, Fink или brew. Следующая проблема заключается в том, что вам понадобятся словари. Аналогичная команда
93+
94+` find / 2>&1 | grep "\.aff"`
95+
96+опять же, медленная, она ищет по всему вашему диску. Я нашел команду
97+
98+` /Applications/Firefox.app/Contents/Resources/dictionaries/en-US.aff `
99+
100+И быстрый 'ls' заверил меня, что есть соответствующие файлы en-US.dic, так что все хорошо.
101+
102+Более опытный пользователь Mac может предложить лучшие стратегии поиска. Пожалуйста!
103+
104+# Модуль Hunspell
105+
106+При первоначальном создании этой страницы (2017?) я допустил серьезную ошибку и использовал код, у которого не было четкой лицензии или истории. Было высказано предположение, что тем самым я нарушил лицензию Hunspell, как и все, кто использовал ее с тех пор.
107+
108+Чтобы исправить эту ситуацию, я выпустил новую версию Hunspell Wrapper, которая имеет довольно небольшую часть, только определения функций, с Hunspell (Лицензия: MPL 1.1/GPL 2.0/LGPL 2.1) и Hunspell Unit (Лицензия: Clear BSD License) в отдельных файлах. С точки зрения кодирования это почти идентично тому, что было здесь раньше.
109+
110+См. <https://github.com/davidbannon/hunspell4pas>
111+
112+Я удалил оболочку hunspell, которая раньше находилась на этой странице. Тот, что на Github выше, является заменой, вам нужны hunspell.pas и hunspell.inc. Оставшаяся часть файла представляет собой базовый test/demo проект Lazarus командной строки, который заменяет Demo 1.
113+
114+## Demo 2 в полном графическом интерфейсе
115+
116+Демо графического интерфейса Lazarus имеет больше смысла и была протестирована на Linux, Mac и Windows. Но это немного сложнее, \[чем\] скопировать и вставить.
117+
118+Для этой демо вам понадобится форма с двумя TMemo: Memo1 и MemoMsg. Кнопка ButtonSpell, Tlistbox Listbox1. Сделайте следующие обработчики событий: FormCreate для главной формы; дважды щелкните по Listbox1 и \[дважды\] кликните по ButtonSpell.
119+
120+Сначала вы должны создать объект hunspell и посмотреть, нашел ли он свою библиотеку, вот пример метода FormCreate () ....
121+
122+``` pascal
123+uses hunspell;
124+var
125+ Form1: TForm1;
126+ Sp: THunspell;
127+ DictPath : AnsiString;
128+
129+procedure TForm1.FormCreate(Sender: TObject);
130+begin
131+ SetDefaultDicPath();
132+ Sp := THunspell.Create();
133+ if Sp.ErrorMessage = '' then begin
134+ MemoMsg.append('Library Loaded =' + Sp.LibraryFullName);
135+ ButtonSpell.enabled := CheckForDict();
136+ end else
137+ MemoMsg.append(SP.ErrorMessage);
138+end;
139+```
140+
141+В этом примере мы пишем сообщение о статусе в MemoMsg, это простой способ увидеть, что происходит. ButtonSpell НЕ включен, пока не будут установлены словари. Ожидаем этого ....
142+
143+Теперь нам нужны два метода: один читает назначенный каталог и ищет возможные файлы словарей, другой управляет решениями. Если мы найдем только один словарный набор, используем его, если мы не найдем - пожалуемся. Но если мы найдем несколько, и это наиболее вероятно, мы должны спросить пользователя, какой словарь (то есть язык) он хочет использовать.
144+
145+``` pascal
146+function TForm1.FindDictionary(const Dict : TStrings; const DPath : AnsiString) : boolean;
147+var
148+ Info : TSearchRec;
149+begin
150+ Dict.Clear;
151+ if FindFirst(AppendPathDelim(DPath) + '*.dic', faAnyFile and faDirectory, Info)=0 then begin
152+ repeat
153+ Dict.Add(Info.Name);
154+ until FindNext(Info) <> 0;
155+ end;
156+ FindClose(Info);
157+ Result := Dict.Count >= 1;
158+end;
159+
160+function TForm1.CheckForDict() : boolean;
161+begin
162+ Result := False;
163+ EditDictPath.Caption := DictPathAlt;
164+ if not FindDictionary(ListBox1.Items, DictPath) then
165+ MemoMsg.Append('ERROR - no dictionaries found in ' + DictPath);//[прим.перев.]: словари в DictPath не найдены
166+ if ListBox1.Items.Count = 1 then begin // Один [словарь] вернулся точно.
167+ if not Sp.SetDictionary(AppendPathDelim(DictPath) + ListBox1.Items.Strings[0]) then
168+ MemoMsg.Append('ERROR ' + SP.ErrorMessage)
169+ else
170+ MemoMsg.Append('Dictionary set to ' + DictPath + ListBox1.Items.Strings[0]);// [прим.перев.]: словарь (первый из списка ListBox1) установлен в DictPath
171+ end;
172+ Result := SP.GoodToGo; // если count был точно один или FindDict не вернул ничего и ничего не изменилось
173+end;
174+```
175+
176+Ах, вы спросите, но где нам искать словари? К сожалению, у меня нет хорошего решения для этого. Вот где я нашел свой -
177+
178+``` pascal
179+procedure TForm1.SetDefaultDicPath();
180+begin
181+ {$ifdef LINUX}
182+ DictPath := '/usr/share/hunspell/';
183+ {$ENDIF}
184+ {$ifdef WINDOWS}
185+ DictPath := ExtractFilePath(Application.ExeName);
186+ //DictPath := 'C:\Program Files\LibreOffice 5\share\extensions\dict-en\';
187+ {$ENDIF}
188+ {$ifdef DARWIN}
189+ DictPath := '/Applications/Firefox.app/Contents/Resources/dictionaries/';
190+ //DictPathAlt := ExtractFilePath(Application.ExeName);
191+ {$endif}
192+end;
193+```
194+
195+Возможно, если другие пользователи сообщат, где они нашли пригодные для использования словари Hunspell, мы можем составить список для каждой платформы. Или просто выберите легкий путь и попросите пользователя найти несколько словарей и поместить их в каталог приложений на Windows и Mac. Ваши мысли очень приветствуются ....
196+
197+Пока, если в указанном каталоге есть ровно один словарь, все хорошо. Но что, если их несколько? Наш ListBox1 содержит их список, если пользователь дважды щелкнет один из них, он вызовет этот метод -
198+
199+``` pascal
200+procedure TForm1.ListBox1DblClick(Sender: TObject);
201+begin
202+ if ListBox1.ItemIndex > -1 then
203+ ButtonSpell.enabled := Sp.SetDictionary( AppendPathDelim(DictPath) + ListBox1.Items.Strings[ListBox1.ItemIndex]);
204+ if SP.ErrorMessage = '' then begin
205+ MemoMsg.Append('Good To Go =' + booltostr(Sp.GoodToGo, True));
206+ MemoMsg.Append('Dictionary set to ' + AppendPathDelim(DictPath) + ListBox1.Items.Strings[ListBox1.ItemIndex]);
207+ end else
208+ MemoMsg.append('ERROR ' + SP.ErrorMessage);
209+end;
210+```
211+
212+Предполагая, что у нас теперь есть все, что нужно, мы можем нажать кнопку ButtonSpell и вызвать это -
213+
214+``` pascal
215+procedure TForm1.ButtonSpellClick(Sender: TObject);
216+begin
217+ if not Sp.Spell(Edit1.text) then begin
218+ Memo1.Lines.BeginUpdate;
219+ Sp.Suggest('badspeller', Memo1.lines);
220+ Memo1.Lines.EndUpdate;
221+ end else
222+ Memo1.Lines.Clear;
223+end;
224+```
225+
226+Memo1 теперь содержит несколько советов о лучших способах написания \[слова\] неграмотному!
227+
228+Важно! Не забудьте освободить наш объект hunspeller, утечки памяти - зло!
229+
230+``` pascal
231+procedure TForm1.FormDestroy(Sender: TObject);
232+begin
233+ Sp.free;
234+ Sp := nil;
235+end;
236+```
237+
238+Этот модуль делает значительно больше, но он представлен здесь в его наиболее урезанной форме для удобства чтения.
239+
240+> **Note:** для новичков в Lazarus, методы с "(Sender: TObject)", показанные выше, не могут быть просто вставлены в ваш исходник, сначала используйте инспектор объектов формы, чтобы создать события, а затем вставьте мой пример кода в метод.
241+
242+## Demo 3 - Lazspell - Tmemo
243+
244+В этом примере использовался компонент TMemo.
245+
246+![](/wiki-images/b/b3/Lazspell.gif)
247+
248+Lazspell - пример проверки орфографии - из <https://github.com/Raf20076/Lazspell>
249+
250+## Demo 4 - Lazspell 2-version 2 - TRichMemo
251+
252+В этом примере использовался компонент TRichMemo.
253+
254+![](/wiki-images/8/8c/Lazspell-ver2.gif)
255+
256+Lazspell 2 v2 - пример проверки орфографии - изm <https://github.com/Raf20076/Lazspell-2-version-2>
257+
258+## Demo 5 - Простая проверка орфографии
259+
260+1\. Запустите IDE Lazarus
261+
262+2\. Кликните Project -\> New Project -\> Choose -\> Application. Вы только что создали новое приложение. Теперь сохраните его
263+
264+3\. Кликните File -\> Save as. Выберите папку, в которой будет сохранено ваше приложение. Сначала будет сохранен project1.lpi, затем unit1.pasunit1.pas
265+
266+4\. Поместите hunspell.pas и hunspell.inc (from <https://github.com/davidbannon/hunspell4pas>) в вашу папку
267+
268+5\. Поместите libhunspell.dll в папку с вашим приложением (вы должны загрузить ее отсюда <https://github.com/Raf20076/Lazspell> или <https://github.com/davidbannon/hunspell4pas>) в любом случае или соберите ее самостоятельно.
269+
270+6\. Поместите словарь в папку приложения (оба файла), например pl_PL.aff, pl_PL.dic. Словари должны быть закодированы в UTF8. Скачать их можно отсюда <https://github.com/Raf20076/Lazspell/tree/master/dict>
271+
272+7\. Положите на Form1 компонент TButton (Button1) с вкладки Standard
273+
274+8\. Положите на Form1 компонен TMemo (Memo1) с вкладки Standard
275+
276+9\. Положите на Form1 компонен TListbox (ListBox1) с вкладки Standard (здесь будут отображаться слова с ошибками)
277+
278+10\. Кликните по кнопке Button1 на Form1 затем перейдите в ObjectInspector, щелкните по вкладке Events, затем дважды щелкните рядом с событием OnClik: это создаст событие OnClick, и код вставки (см. код всего приложения), начинающийся с
279+
280+``` pascal
281+
282+{Check spelling}
283+ var
284+ i : Integer;
285+ MAX : Integer;
286+ FillInArrayWithWords:TStringArray;
287+ FillInString1: String;
288+ FillInString2: String;
289+```
290+
291+до
292+
293+``` pascal
294+
295+//Если слова нет в словаре, показать его в Listbox как ошибку
296+```
297+
298+11\. Перейдите в ObjectInspector и щелкните Form1, затем щелкните вкладку Events, затем дважды щелкните рядом с OnCreate, это создаст событие OnCreate и вставит код (см. код всего приложения)
299+
300+``` pascal
301+ SpellCheck := THunspell.Create(True);
302+ SpellCheck.SetDictionary('pl_PL.dic');//загружаем словарь
303+ SpellCheck.GoodToGo := True;
304+```
305+
306+12\. Оставаясь в ObjectInspector, щелкните Form1, затем щелкните вкладку Events, затем дважды щелкните рядом с OnDestroy, это создаст событие OnDestroy и вставит код (см. код всего приложения)
307+
308+``` pascal
309+ SpellCheck.free;
310+ SpellCheck := nil;
311+```
312+
313+13\. Затем в вашем коде разместите такие функции, как `ArrayValueCount` и т.д.
314+
315+См. ниже код всего приложения, чтобы сравнить его с вашим.
316+
317+``` pascal
318+//SpellChecker by Raf20076, Poland 2019
319+
320+unit Unit1;
321+
322+{$mode objfpc}{$H+}
323+
324+interface
325+
326+uses
327+ Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,
328+ LazFileUtils, LCLProc, LazUtils, LazUtf8;
329+
330+type
331+ TForm1 = class(TForm)
332+ Button1: TButton;
333+ Label1: TLabel;
334+ Label2: TLabel;
335+ ListBox1: TListBox;
336+ ListBox2: TListBox;
337+ Memo1: TMemo;
338+ procedure Button1Click(Sender: TObject);
339+ procedure FormCreate(Sender: TObject);
340+ procedure FormDestroy(Sender: TObject);
341+ end;
342+
343+var
344+ Form1: TForm1;
345+
346+implementation
347+
348+uses hunspell;//поместите hunspell.pas и hunspell.inc в папку вашего приложения
349+ //из https://github.com/davidbannon/hunspell4pas
350+
351+var
352+ SpellCheck: THunspell;
353+
354+{$R *.lfm}
355+
356+procedure TForm1.FormCreate(Sender: TObject);
357+begin
358+ SpellCheck := THunspell.Create(True);
359+ SpellCheck.SetDictionary('pl_PL.dic');//загружаем словарь
360+ SpellCheck.GoodToGo := True;
361+end;
362+
363+{Извлекаем слова из строки: НЕсимволы, пробелы, возврат каретки}
364+
365+function ArrayValueCount(const InputArray: Array of string): Integer;
366+{Подсчет элементов в массиве}
367+var
368+ i:Integer;
369+begin
370+ result := 0;
371+ for i := low(InputArray) to high(InputArray) do
372+ if InputArray[i] <> ' ' then // 'между ними один пробел'
373+ inc(result);
374+end;
375+
376+function StripOffNonCharacter(const aString: string): string;
377+{Удаляем НЕсимволы из строки}
378+var
379+ a: Char;
380+begin
381+ Result := '';
382+ for a in aString do begin //под знаками препинания цифры, которые нужно удалить из строки
383+ if not CharInSet( a, ['.', ',', ';', ':', '!', '/',
384+ '?', '@', '#', '$', '%', '&', '*', '(', ')', '{',
385+ '}', '[', ']', '-', '\', '|', '<', '>', '''', '"', '^',
386+ '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '_', '+',
387+ '=', '~']) then //'„', '”'])эти метки делают ошибку: ожидается порядковое выражение, необходимо исправить
388+ begin
389+ Result := Result + a;
390+ end;
391+ end;
392+end;
393+
394+function ReplaceCarriageReturn(s: string) : string;
395+{Заменяем возврат каретки одним пробелом}
396+var
397+ i: Integer;
398+begin
399+ Result:=s;
400+ for i := 1 to Length(Result) do
401+ if Result[i] in [#3..#13] then
402+ Result[i] := ' ';//'Между ними один пробел'
403+end;
404+
405+procedure TForm1.Button1Click(Sender: TObject);
406+{Проверяем орфографию}
407+var
408+ i : Integer;
409+ MAX : Integer;
410+ FillInArrayWithWords:TStringArray;
411+ FillInString1: String;
412+ FillInString2: String;
413+begin
414+ ListBox1.clear;
415+ ListBox1.Items.Clear;
416+
417+ FillInString1 := ReplaceCarriageReturn(Memo1.Lines.Text);//берем текст из Memo1; заменяем возврат каретки
418+ //одним пробелом (используя функцию ReplaceCarriageReturn) и помещаем внутрь FillInString1
419+
420+ FillInString2 := StripOffNonCharacter(FillInString1);//удаляем все НЕсимволы из FillInString1
421+ //(используя функцию StripOffNonCharacter) и помещаем строку без НЕсимволов внутрь FillInString2
422+
423+ FillInArrayWithWords := FillInString2.split(' '); //разделяем строку на слова с помощью ' ' одного пробела
424+ //(используя .split) и помещаем слова по отдельности в массив FillInArrayWithWords
425+
426+ MAX := ArrayValueCount(FillInArrayWithWords); //узнаем, сколько элементов в массиве
427+ //(используя функцию ArrayValueCount)
428+
429+ for i := 0 to MAX -1 do
430+ if not SpellCheck.Spell(FillInArrayWithWords[i]) then
431+ ListBox1.Items.add(FillInArrayWithWords[i]);
432+ //Берем слово из массива и проверяем по словарю через hunspell (используя функцию SpellCheck.Spell)
433+ //Если слова нет в словаре, показываем его в Listbox, как ошибку
434+end;
435+
436+procedure TForm1.FormDestroy(Sender: TObject);
437+begin
438+ SpellCheck.free;
439+ SpellCheck := nil;
440+end;
441+
442+end.
443+```
444+
445+Когда вы запустите свое приложение и введете какой-либо текст в Memo, а затем нажмете кнопку, приложение проверит, обнаружены ли какие-либо ошибки, и, если они будут найдены, отобразит их в ListBox. Основная проблема заключалась в том, как удалить возврат каретки и НЕсимволы, а затем как разбить текст на отдельные слова. Это непростая задача. Поэтому для этого есть три функции: функция `ReplaceCarriageReturn`, функция `StripOffNonCharacter` и функция `FillInString2.split`. Функция `FillInString2.split` на самом деле использует функцию `.split` из `SysUtils`. Надеюсь, код всего приложения не требует пояснений.
446+
447+## Дальнейшее чтение и ссылки
448+
449+<https://github.com/hunspell/hunspell>
450+
451+<https://github.com/Homebrew> - вероятно, разумный способ получить Hunspell на вашем Mac, если его еще нет.
452+
453+<https://github.com/tomboy-notes/tomboy-ng/releases> - содержит 64-битную Windows DLL в tomboy-ng_win64_\<ver\>.zip
454+
455+<https://github.com/cutec-chris/hunspell>
456+
457+---
458+*From the Free Pascal wiki, page "spelling/ru", as it stood on 2022-10-04 after a change by Zoltanleo, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history