Локализация программ

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Локализация программ

Сообщение timsoft » 23.10.2004 (Сб) 17:31

Занялся я тут проблемой сабжа и накропал программку.
Она делает следующее:
ищет во всех файлах папки проекта русские словеса и засовывает их в базу, потом на основе этой базы создает ресурс и заменяет в файлах проекта все русские строки на вызов функции LoadResString(ID)

Кому-то интересно потестить?
Или такое уже есть, а я протупил, не нашел и изобрел велосипед? :P

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.10.2004 (Сб) 18:04

Чел! :)

А если у меня генерируемое предложение, а в другом языке оно имеет иную структуру? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 23.10.2004 (Сб) 19:12

Известное решение - %1, %2 и т.д.

Хуже с подчинением числительным (1 файл/2 файла/10 файлов)
Последний раз редактировалось tyomitch 23.10.2004 (Сб) 19:14, всего редактировалось 2 раз(а).
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.10.2004 (Сб) 19:13

Хуже... Не то слово.
Ох и намучался я с согласованием падежей при переводе Цивилизации...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Сообщение timsoft » 23.10.2004 (Сб) 19:18

GSerg писал(а):Чел! :)


Нав! :D

GSerg писал(а):А если у меня генерируемое предложение, а в другом языке оно имеет иную структуру? :)


тут канэшна без искусственного интеллекта не обойтись :-)
но я честно говоря не могу представить прогу, в которой ты генерируешь сообщения например для MsgBox :-)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 23.10.2004 (Сб) 19:21

Просто систем падежей в общем мало, а систем числительных в общем много. У меня была где-то умная статья про проблемы локализации, и там показывалось, что проблемы с числительными самые жуткие.
Там предлагалось юзать отдельную "языковую длл-ку", где не только ресурсы, а целиком процедуры составления предложений.
Последний раз редактировалось tyomitch 23.10.2004 (Сб) 19:24, всего редактировалось 1 раз.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 23.10.2004 (Сб) 19:23

timsoft, открой эксплорер и выдели два объекта.
Тебе скажут "русским" языком: 2 элементов выделено.
Или ты собираешься писать как в русском NC: выделено 2 файл(а/ов)?

Нет, склонять слова приходится уметь :-)
Изображение

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Сообщение timsoft » 23.10.2004 (Сб) 19:30

tyomitch писал(а):Просто систем падежей в общем мало..


дык эта, всегда можно перевести такое на другой язык
"порция" -- "portion"
"порции" -- "portions"
"порций" -- "portions"

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.10.2004 (Сб) 19:32

Туда - моно...
А обратно? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Сообщение timsoft » 23.10.2004 (Сб) 19:36

tyomitch писал(а):timsoft, открой эксплорер и выдели два объекта.
Тебе скажут "русским" языком: 2 элементов выделено.


у меня другая винда?
Изображение
:shock:

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Сообщение timsoft » 23.10.2004 (Сб) 19:37

GSerg писал(а):Туда - моно...
А обратно? :)


читаем исходный пост :D

прога ищет русские словеса

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.10.2004 (Сб) 19:39

А где написано, что она переводит их только на английский? :)

А винда у тебя неважно какая, просто это дешёвый трюк, с двоеточием :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 23.10.2004 (Сб) 19:41

timsoft писал(а):у меня другая винда?

Да, у меня Win2000.
Значит, "избежали" проблемы неестественным построением предложения.

Ты когда в булочную идёшь, ты тоже говоришь: "Дайте мне буханки хлеба: 2, по цене в рублях: 5"?
Изображение

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Сообщение timsoft » 23.10.2004 (Сб) 20:23

tyomitch писал(а):Ты когда в булочную идёшь, ты тоже говоришь: "Дайте мне буханки хлеба: 2, по цене в рублях: 5"?


ну когда я за кордоном, то примерно так и изъясняюсь :oops:

GSerg писал(а):А где написано, что она переводит их только на английский?


дык эта, она ниче не переводит, она тока ресурс создает.
потом это ресурс сам переводишь

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 23.10.2004 (Сб) 20:45

timsoft писал(а):
tyomitch писал(а):Ты когда в булочную идёшь, ты тоже говоришь: "Дайте мне буханки хлеба: 2, по цене в рублях: 5"?

ну когда я за кордоном, то примерно так и изъясняюсь

Ну вот и твоя прога будет изъясняться, как будто из-за кордона ;-)
Изображение

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 23.10.2004 (Сб) 21:40

А вообще интересная прога, но правда есть уже разные переводчики "реального времени"

Пашут так - наводишь на агл. слово курсор, а над ним появляется ToolTip, а в нём перевод. Увы не помню названия проги

P.S Мой отец как то мне предложил сделать прогу, которая переводит число в число прописью. Т.е например

136

Стотридцатьшесть

Я парился дней 5 - получалось УЖАСНО КОРЯВО

Он же сделал это за 2 дня и плюс ещё со склонениями валют.

Я был в шоке.... :oops:

Вот это реально ПАРЕВНАЯ ЗАДАЧА

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.10.2004 (Сб) 21:45

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 23.10.2004 (Сб) 23:11

Ни хрена себе, это же как можно перехватить в чужом окне любое слово в обьекте и создать там же ToolTip.

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 23.10.2004 (Сб) 23:21

GetCursorPos -> WindowFromPoint -> GetWindowText -> Распознаем текст относительно размера шрифта, положения курсора и т.д. и переводим :roll:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.10.2004 (Сб) 23:24

A.A.Z., я вот когда именно это стал набирать, представил всю кучу проблем и набирать перестал :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 23.10.2004 (Сб) 23:27

Но ведь сделать-то можно! 8)

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Сообщение timsoft » 24.10.2004 (Вс) 10:08

В понедельник скину прогу
Посмотрите, че она делает
Мож че подскажете по делу.
А то так на пальцах объяснять тяжело :)

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 24.10.2004 (Вс) 21:38

Ждемс...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.10.2004 (Пн) 11:48

Насчет склонений.

Делал я как-то вот это:
Код: Выделить всё
Option Explicit

Public Enum Числа
  Единственное = 0      ' оно, он, она
  Множественное = 1     ' они
End Enum

Public Enum Одушевленность
  Неодушевленное = 0    ' пес, корова
  Одушевленное = 1      ' пень, дерево
End Enum

Public Enum Роды
  Средний = 0      ' оно
  Мужской = 1      ' он
  Женский = 2      ' она
End Enum

Public Enum Падежи
  НеСклоняется = 0
  Именительный = 1 ' кто? что?
  Родительный = 2  ' кого? чего?
  Дательный = 3    ' кому? чему?
  Винительный = 4  ' кого? что?
  Творительный = 5 ' кем? чем?
  Предложный = 6   ' о ком? о чем?
End Enum

Global Const ГласныеОткрытые As String = "АЭОЫУ"
Global Const ГласныеЗакрытые As String = "ЯЕЁИЮ"
Global Const Гласные As String = "АЕЁИОУЫЭЮЯ"

Global Const СогласныеТвердые As String = "БВГДЖЗЙКЛМНПРСТХ"
Global Const СогласныеМягкие As String = "ФЦЧШЩ"
Global Const СогласныеГлухие As String = "КПСТФХЦЧШЩ"
Global Const СогласныеЗвонкие As String = "БВГДЖЗЙЛМНР"
Global Const СогласныеШипящие As String = "ЖШ"
Global Const Согласные As String = "БВГДЖЗЙКЛМНПРСТФХЦЧШЩЬЪ"

'Заменяет Ё на Е
Public Function БезЁ(ByVal Text As String) As String
Attribute БезЁ.VB_Description = "Возвращает строку, в которой все буквы Ё заменены на буквы Е (в соответствующем регистре)."
Dim I As Integer, Z As String
I = 0
Z = UCase$(Text)
Do
  I = InStr(I + 1, Z, "Ё")
  If I = 0 Then Exit Do
  If Mid$(Text, I, 1) = "Ё" Then
    Mid$(Text, I, 1) = "Е"
  Else
    Mid$(Text, I, 1) = "е"
  End If
Loop
БезЁ = Text
End Function

'Определение одушевленности существительного
Public Function ОпределитьОдушевленность(Существительное As String) As Одушевленность
Attribute ОпределитьОдушевленность.VB_Description = "Возвращает вид одушевленности существительного (одушевленный/неодушевленный)."
'Все слова считаются неодушевленными, кроме перечисленных.
'Слово должно задаваться в именительном падеже.
Dim Z As String, ret As Одушевленность
Z = UCase$(Существительное)
ret = Одушевленное
Select Case БезЁ(Z)
  Case "КОНЬ", "КОБЫЛА", "ЛОШАДЬ", "ЖЕРЕБЕНОК"
  Case "ОСЕЛ", "МУЛ", "ОСЛИЦА", "ИШАК"
  Case "БАРАН", "ОВЦА"
  Case "ЧЕЛОВЕК", "ЛЮДИ"
  Case Else
    ret = Неодушевленное
End Select
ОпределитьОдушевленность = ret
End Function

'Определение рода существительного (мужской, женский, средний)
Public Function ОпределитьРод(Существительное As String) As Роды
Attribute ОпределитьРод.VB_Description = "Возвращает род существительного (мужской, женский, средний)."
'Определяет и возвращает род существительного. Существительное
'должно быть в именительном падеже в единственном числе.
Dim Z As String, ret As Роды
Z = UCase$(Существительное)
If InChar(Char(Z, -1), "ИЫ") Then
  Z = RevLeft(Z, 1)
End If
Select Case Z
  Case ""
    ret = Средний
  Case "РУБЛЬ"
    ret = Мужской
  Case "ЕГЕРЬ"
    ret = Мужской
  Case "МИЗГИРЬ"
    ret = Мужской
  Case "ВЫПРЯМИТЕЛЬ", "ДУПЕЛЬ"
    ret = Мужской
  Case "ПАПА", "ПАПКА", "ПАПОЧКА", "ДЯДЯ", "ДЯДЬКА", "ДЯДЕЧКА"
    ret = Мужской
  Case ""
    ret = Женский
  Case Else
    ret = Мужской
    If CmpRWord(Z, "А") Or CmpRWord(Z, "Я") Or (CmpRWord(Z, "Ь") And True) Then
      ret = Женский
    End If
    If CmpRWord(Z, "О") Or CmpRWord(Z, "Е") Then
      ret = Средний
    End If
    If False Then
      ret = Мужской
    End If
End Select
ОпределитьРод = ret
End Function

'Склонение существительного
Public Function Склонение(Существительное As String, ByVal Падеж As Падежи, Optional ByVal Род As Роды = -1, Optional ByVal Число As Числа = Числа.Единственное) As String
Attribute Склонение.VB_Description = "Возвращает существительное (указанное в именительнои падеже) в произвольном падеже."
'Склонение существительного.
'  Падеж - падеж, в котором надо просклонять существительное;
'  Род - род существительного. Если не указан, определяется автоматически;
'  Число - число, в котором указано существительное. Если не указано, считается в единственном числе.
'Существительное всегда должно задаваться в именительном падеже единственного числа.
Dim ret As String, Z As String, Одуш As Boolean
ret = Существительное
Z = UCase$(ret)
Select Case Z
  Case "ШОССЕ", "ШАССИ"
    If Падеж = Предложный Then
      ret = IfCase(IIf(InChar(Left$(Z, 1), Гласные), "об ", "о "), ret) & ret
    End If
    Склонение = ret
    Exit Function
End Select
If Число = Единственное And Род < 0 Then Род = ОпределитьРод(ret)
Одуш = (ОпределитьОдушевленность(Z) = Одушевленное)
Select Case Падеж
  Case Падежи.Именительный
    Select Case Z
      Case ""
      Case Else
        Select Case Число
          Case Числа.Единственное
            Select Case Род
              Case Роды.Средний
              Case Роды.Мужской
              Case Роды.Женский
            End Select
          Case Числа.Множественное
        End Select
    End Select
  Case Падежи.Родительный
    Select Case Z
      Case ""
      Case Else
        Select Case Число
          Case Числа.Единственное
            Select Case Род
              Case Роды.Средний
                If CmpRWord(Z, "ОЕ") Then
                ElseIf CmpRWord(Z, "Е") Or CmpRWord(Z, "О") Then
                  ret = RevLeft$(ret, 1) & IfCase(IIf(InChar(Char(Z, -2), ГласныеЗакрытые), "я", "а"), ret)
                End If
              Case Роды.Мужской
                If Одуш Then
                Else
                  If CmpRWord(Z, "ЕЦ") And Not (InChar(Char(Z, -2), Согласные) And InChar(Char(Z, -3), Согласные)) Then ret = RevLeft$(ret, 2) + IfCase("Ц", ret)
                  If CmpRWord(Z, "А") Or CmpRWord(Z, "Я") Then
                    ret = RevLeft$(ret, 1) & IfCase(IIf((Char(Z, -2) = "К") Or (InChar(Char(Z, -1), ГласныеЗакрытые) Or (InChar(Char(Z, -1), СогласныеШипящие))), "и", "ы"), ret)
                  Else
                    ret = RevLeft$(ret, IIf((CmpRWord(Z, "Ь")) Or (CmpRWord(Z, "Й")), 1, 0)) & IfCase(IIf((CmpRWord(Z, "Ь")) Or (CmpRWord(Z, "Й")), "я", "а"), ret)
                  End If
                End If
              Case Роды.Женский
                If CmpRWord(Z, "АЯ") Then
                  ret = RevLeft$(ret, 2) & IfCase("ой", ret)
                ElseIf CmpRWord(Z, "А") Or CmpRWord(Z, "Я") Then
                  ret = RevLeft$(ret, 1) & IfCase(IIf((Char(Z, -2) = "К") Or (InChar(Char(Z, -1), ГласныеЗакрытые) Or (InChar(Char(Z, -2), СогласныеМягкие))), "и", "ы"), ret)
                ElseIf CmpRWord(Z, "Ь") Then
                  ret = RevLeft$(ret, 1) & IfCase("и", ret)
                End If
            End Select
          Case Числа.Множественное
        End Select
    End Select
  Case Падежи.Дательный
    Select Case Z
      Case ""
      Case Else
        Select Case Число
          Case Числа.Единственное
            Select Case Род
              Case Роды.Средний
                If CmpRWord(Z, "ОЕ") Then
                  ret = RevLeft$(ret, 1) & IfCase("му", ret)
                ElseIf CmpRWord(Z, "Е") Or CmpRWord(Z, "О") Then
                  ret = RevLeft$(ret, 1) & IfCase(IIf(InChar(Char(Z, -2), ГласныеЗакрытые), "ю", "у"), ret)
                End If
              Case Роды.Мужской
                If Одуш Then
                Else
                  If CmpRWord(Z, "ЕЦ") And Not (InChar(Char(Z, -2), Согласные) And InChar(Char(Z, -3), Согласные)) Then ret = RevLeft$(ret, 2) + IfCase("Ц", ret)
                  If CmpRWord(Z, "А") Or CmpRWord(Z, "Я") Then
                    ret = RevLeft$(ret, 1) & IfCase(IIf(InChar(Char(Z, -1), ГласныеЗакрытые), "и", "е"), ret)
                  Else
                    ret = RevLeft$(ret, IIf((CmpRWord(Z, "Ь")) Or (CmpRWord(Z, "Й")), 1, 0)) & IfCase(IIf((CmpRWord(Z, "Ь")) Or (CmpRWord(Z, "Й")), "ю", "у"), ret)
                  End If
                End If
              Case Роды.Женский
                If CmpRWord(Z, "АЯ") Then
                  ret = RevLeft$(ret, 2) & IfCase("ой", ret)
                ElseIf CmpRWord(Z, "А") Or CmpRWord(Z, "Я") Then
                  ret = RevLeft$(ret, 1) & IfCase(IIf(InChar(Char(Z, -1), ГласныеЗакрытые), "и", "е"), ret)
                ElseIf CmpRWord(Z, "Ь") Then
                  ret = RevLeft$(ret, 1) & IfCase("и", ret)
                End If
            End Select
          Case Числа.Множественное
        End Select
    End Select
  Case Падежи.Винительный
    Select Case Z
      Case ""
      Case Else
        Select Case Число
          Case Числа.Единственное
            Select Case Род
              Case Роды.Средний
              Case Роды.Мужской
                If Одуш Then
                Else
                  If CmpRWord(Z, "А") Or CmpRWord(Z, "Я") Then
                    ret = RevLeft$(ret, 1) & IfCase(IIf(InChar(Char(Z, -1), ГласныеЗакрытые), "ю", "у"), ret)
                  End If
                End If
              Case Роды.Женский
                If CmpRWord(Z, "АЯ") Then
                  ret = RevLeft$(ret, 2) & IfCase("ую", ret)
                ElseIf CmpRWord(Z, "А") Or CmpRWord(Z, "Я") Then
                  ret = RevLeft$(ret, 1) & IfCase(IIf(InChar(Char(Z, -1), ГласныеЗакрытые), "ю", "у"), ret)
                ElseIf CmpRWord(Z, "Ь") Then
                End If
            End Select
          Case Числа.Множественное
        End Select
    End Select
  Case Падежи.Творительный
    Select Case Z
      Case ""
      Case Else
        Select Case Число
          Case Числа.Единственное
            Select Case Род
              Case Роды.Средний
                If CmpRWord(Z, "ОЕ") Then
                  ret = RevLeft$(ret, 2) & IfCase("ым", ret)
                ElseIf CmpRWord(Z, "Е") Or CmpRWord(Z, "О") Then
                  ret = ret & IfCase("м", ret)
                End If
              Case Роды.Мужской
                If Одуш Then
                Else
                  If CmpRWord(Z, "ЕЦ") And Not (InChar(Char(Z, -2), Согласные) And InChar(Char(Z, -3), Согласные)) Then ret = RevLeft$(ret, 2) + IfCase("Ц", ret)
                  If CmpRWord(Z, "А") Or CmpRWord(Z, "Я") Then
                    ret = RevLeft$(ret, 1) & IfCase(IIf(InChar(Char(Z, -1), ГласныеЗакрытые), "ей", "ой"), ret)
                  Else
                    ret = RevLeft$(ret, IIf((CmpRWord(Z, "Ь")) Or (CmpRWord(Z, "Й")), 1, 0)) & IfCase(IIf((CmpRWord(Z, "Ь")) Or (CmpRWord(Z, "Й")), "ём", "ом"), ret)
                  End If
                End If
              Case Роды.Женский
                If CmpRWord(Z, "АЯ") Then
                  ret = RevLeft$(ret, 2) & IfCase("ой", ret)
                ElseIf CmpRWord(Z, "А") Or CmpRWord(Z, "Я") Then
                  ret = RevLeft$(ret, 1) & IfCase(IIf(InChar(Char(Z, -1), ГласныеЗакрытые), "ей", "ой"), ret)
                ElseIf CmpRWord(Z, "Ь") Then
                  ret = ret & IfCase("ю", ret)
                End If
            End Select
          Case Числа.Множественное
        End Select
    End Select
  Case Падежи.Предложный
    ret = IfCase(IIf(InChar(Left$(Z, 1), Гласные), "об ", "о "), ret) & ret
    Select Case Z
      Case ""
      Case Else
        Select Case Число
          Case Числа.Единственное
            Select Case Род
              Case Роды.Средний
                If CmpRWord(Z, "ОЕ") Then
                  ret = RevLeft$(ret, 1) & IfCase("м", ret)
                ElseIf CmpRWord(Z, "Е") Or CmpRWord(Z, "О") Then
                  ret = RevLeft$(ret, 1) & IfCase(IIf(InChar(Char(Z, -2), ГласныеЗакрытые), "и", "е"), ret)
                End If
              Case Роды.Мужской
                If Одуш Then
                Else
                  If CmpRWord(Z, "ЕЦ") And Not (InChar(Char(Z, -2), Согласные) And InChar(Char(Z, -3), Согласные)) Then ret = RevLeft$(ret, 2) + IfCase("Ц", ret)
                  If CmpRWord(Z, "А") Or CmpRWord(Z, "Я") Then
                    ret = RevLeft$(ret, 1) & IfCase(IIf((Char(Z, -2) = "К") Or (InChar(Char(Z, -1), ГласныеЗакрытые)), "е", "е"), ret)
                  Else
                    ret = RevLeft$(ret, IIf((CmpRWord(Z, "Ь")) Or (CmpRWord(Z, "Й")), 1, 0)) & IfCase(IIf((CmpRWord(Z, "Ь")) Or (CmpRWord(Z, "Й")), "е", "е"), ret)
                  End If
                End If
              Case Роды.Женский
                If CmpRWord(Z, "АЯ") Then
                  ret = RevLeft$(ret, 2) & IfCase("ой", ret)
                ElseIf CmpRWord(Z, "А") Or CmpRWord(Z, "Я") Then
                  ret = RevLeft$(ret, 1) & IfCase(IIf((Char(Z, -2) = "К") Or (InChar(Char(Z, -1), ГласныеЗакрытые)), "е", "е"), ret)
                ElseIf CmpRWord(Z, "Ь") Then
                  ret = RevLeft$(ret, 1) & IfCase("и", ret)
                End If
            End Select
          Case Числа.Множественное
        End Select
    End Select
End Select
Склонение = ret
End Function

'Преобразование числа в текст
Function Числительное(Number As Variant, Optional ByVal Падеж As Падежи = Падежи.Именительный, Optional ByVal Род As Роды = -1, Optional ByVal Число As Числа = Числа.Единственное, Optional ByVal IntPart As String = "", Optional ByVal FloatPart As String = "") As String
Attribute Числительное.VB_Description = "Возвращает текстовое написание числа (в произвольном падеже)."
'  Number - число. Если Integer или Long, то результат возвращается наподобии "пять", "двенадцать".
'           Если Single или Double, то результат возвращается типа "две целых три десятых".
'           Если Currency, то результат возвращается в виде "два рубля одна копейка", если IntPart="рубль", FloatPart="копейка";
'  Падеж - падеж, в котором возвращается числительное (по умолчанию именительный) - один камень, одного камня;
'  Род - род, к которому относится числительное - один кирпич, одна булка;
'  Число - число, в котором будет представлено числительное, по умолчанию единственное - два ножа, двое ножниц;
'  IntPart,FloatPart - фрагменты, вставляемые в текст после целой и дробной части. Актуально только, если тип Number - Currency.
'Результат всегда выводится в малои регистре (прописные буквы).
Dim C As Integer, N As Integer, I As Integer, Z As String, O As Integer
Dim IP As String, FP As String, RT As Integer, IV As Long, FV As Double
Dim V2 As Variant, V1 As Variant, V0 As Variant, V As Variant, LO As Integer
RT = 0
Select Case VarType(Number)
  Case VariantTypeConstants.vbVInteger, VariantTypeConstants.vbVLong
    RT = 0
  Case VariantTypeConstants.vbVSingle, VariantTypeConstants.vbVDouble
    RT = 1
  Case VariantTypeConstants.vbVCurrency
    RT = 2
  Case Else
    Exit Function
End Select
Select Case RT
  Case 1
    If Len(IntPart) = 0 Then IntPart = "целая"
  Case 2
    If Len(IntPart) = 0 Then IntPart = "рубль"
    If Len(FloatPart) = 0 Then FloatPart = "копейка"
End Select
If Род < 0 Then
  If RT > 0 Then Род = ОпределитьРод(IntPart) Else Род = Средний
End If
IV = Fix(Abs(Number))
FV = Abs(Number) - IV
If Abs(FV) < 0.000000001 Then FV = 0
If Number = 0 Then
  Select Case RT
    Case 0
      IP = "ноль"
      FP = ""
    Case 1
      IP = "ноль" & Склонение(IntPart, Падеж, Род, Число)
      FP = ""
    Case 2
      IP = "ноль" & Склонение(IntPart, Падеж, Род, Число)
      FP = ""
  End Select
  Z = IP: If Len(FP) > 0 Then Z = Z & "  " & FP
  Числительное = Z
  Exit Function
End If
IP = Trim$(Str$(IV))
FP = Trim$(Str$(FV)): If RT = 0 Then FP = ""
  If Left$(FP, 1) = "0" Then FP = RevRight$(FP, 1)
  If Left$(FP, 1) = "." Then FP = RevRight$(FP, 1)
N = Fix((Len(IP) - 1) / 3): ReDim ID(0 To N) As Integer
N = Fix((Len(FP) - 1) / 3): ReDim FD(1 To N + 1) As Integer
LO = Len(IP)
For I = Len(IP) To 1 Step -1
  O = Fix((Len(IP) - I) / 3)
  If Val(Char(IP, I)) > 0 And LO = Len(IP) Then LO = Len(IP) - I
  Z = Char(IP, I) + Z
  ID(O) = Val(Z)
  If Len(Z) = 3 Then Z = ""
Next I
Z = "": If IV = 0 Then Z = "ноль "
For C = UBound(ID) To 0 Step -1
  If Fix(LO / 3) < C Then
    V2 = Array("", "сто ", "двести ", "триста ", "четыреста ", "пятьсот ", "шестьсот ", "семьсот ", "восемьсот ", "девятьсот ")
    V1 = Array("", "", "двадцать ", "тридцать ", "сорок ", "пятьдесят ", "шестьдесят ", "восемьдесят ", "девяносто ")
    V = Array("десять ", "одинадцать", "двенадцать", "тринадцать", "четырнадцать", "пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать")
    V0 = Array("", "один ", "два ", "три ", "четыре ", "пять ", "шесть ", "семь ", "восемь ", "девять ")
  *Else
    V2 = Array("", "сто ", "двести ", "триста ", "четыреста ", "пятьсот ", "шестьсот ", "семьсот ", "восемьсот ", "девятьсот ")
    V1 = Array("", "", "двадцать ", "тридцать ", "сорок ", "пятьдесят ", "шестьдесят ", "восемьдесят ", "девяносто ")
    V = Array("десять ", "одинадцать", "двенадцать", "тринадцать", "четырнадцать", "пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать")
    V0 = Array("", "один ", "два ", "три ", "четыре ", "пять ", "шесть ", "семь ", "восемь ", "девять ")
    Select Case LO Mod 3
      Case 0
      Case 1
      Case 2
    End Select
  End If
  N = ID(C)
  O = Fix(N / 100)
  Z = Z + V2(O)
  O = N - 100 * O
  If Fix(O / 10) = 1 Then
    Z = Z + V(O - 10 * Fix(O / 10))
  Else
    Z = Z + V1(Fix(O / 10))
  End If
  If C = 0 Then
  Else
  End If
Next C
IP = Trim$(Z & Склонение(IntPart, Падеж, Род, Число))
Z = ""
'...
If RT = 0 Then FP = "" Else FP = Trim$(Z)
Z = IP: If Len(FP) > 0 Then Z = Z & "  " & FP
If Number < 0 Then Z = "минус " & Z
Числительное = Z
End Function


Пример, кстати, и правда работает -- осуществляет склонение существительных русского языка, выраженных в единственном числе.
Но когда количество слов-исключений начало стремительно разрастаться, я подумал, что зря я это затеял. А когда я вспомнил об омонимах, я махнул рукой на такой интеллект.
Lasciate ogni speranza, voi ch'entrate.

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Сообщение timsoft » 25.10.2004 (Пн) 12:03

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

в зипе есть ридми -- почитайте :)
для регистрации контролов запустите setup.bat, кому лень вручную...
Вложения
Localizator.zip
Жду критику :-)
(225.27 Кб) Скачиваний: 21

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 25.10.2004 (Пн) 13:17

alibek, на будущее просьба столь длинный фрагменты кидатьв архиве, а не постить простыню в форум.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

    TopList