Форум » [x]Harbour » Перевожу Clipper на консольный Харбор » Ответить

Перевожу Clipper на консольный Харбор

MIKHAIL: Добрый день, уважаемое сообщество! Перехожу на Харбор, собрал программу, начинаю бороть ошибки несовместимости кода, по мере появления вопросов надеюсь на скорую помощь. Заранее всем участникам огромное спасибо!

Ответов - 245, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 All

MIKHAIL: alexmar пишет: memo полями в формате fpt, которые ntx не поддерживают конвертни в dbt

alexmar: 2MIKHAIL Я в свое время спецом конвертнул их в fpt из-за постоянно возникающих ошибок переполнения счетчика количества блоков Dima пишет: ... тянем Advantage Client Engine Advantage Clipper RDD или более раннюю версию а Advantage Database Server разве не нужен?

Dima: alexmar пишет: Advantage Database Server разве не нужен можно локальный юзать ну если задача не сетевая а если сетевая то да нужен и если религия позволяет можно и пиратский качнуть PS я тупанул , для локального тож надо качнуть Advantage Database Server


alexmar: Такой вопрос. Имеется dbf файл с мемо файлом. Как определить с каким типом файла dbt или fpt открывается dbf файл, если в папке, где лежит dbf, лежат оба мемо-файла?

Pasha: Тип мемо однозначно определяется по сигнатуре, 1-му байту dbf Если там 0x83 - то dbt, если 0xF5 или 0x30 - fpt

SergKis: Pasha пишет Тип мемо однозначно определяется по сигнатуре После USE можно и так ? dbinfo(DBI_MEMOEXT)

alexmar: Привет всем Есть идеи как организовать многоязыковую поддержку двуязычного интерфейса в консольном харборе? Программы построены на вызовах из меню. Меню динамическое, основанное на dbf-файле. Т.е. из самой программы можно изменять меню, подключая или отключая функционал. По поводу меню у меня 2 варианта: 1. Дублирование полей, привязанных к языку 2. Добавление в dbf файл меню мемо полей, содержащих локализованные названия и т.д Пока не решил какой вариант лучше. Может есть еще какие-то варианты? Браузер и средства для редактирования записей реализованы через текстовые вспомогательные файлы, в которых описаны названия колонок и полей в режиме редактирования. Т.е. для работы с браузером достаточно перевести эти файлы. Основной вопрос как быть с диалоговыми окнами. Они все реализованы через одну и ту же функцию. Может кто-то занимался подобной задачей в консольном харборе или клиппере?

SergKis: alexmar пишет как организовать многоязыковую поддержку двуязычного интерфейса в консольном харборе? Посмотрите исходники hbedit http://www.kresin.ru/hbedit.html

Петр: alexmar пишет: Основной вопрос как быть с диалоговыми окнами. Они все реализованы через одну и ту же функцию. Может кто-то занимался подобной задачей в консольном харборе или клиппере? Harbour поддерживает i18n "из коробки". Хорошим примером могут могут послужить исходники hbmk2 Поищите на этом форуме, я что-то также писал на эту тему. Harbour & i18n в примерах

SergKis: Кусочки текстов работы с code page в hbedit (он у меня под рукой, как раб инструмент) Делаете подключение нужных ... REQUEST HB_CODEPAGE_ROISO, HB_CODEPAGE_ROWIN, HB_CODEPAGE_RU1251, HB_CODEPAGE_RU866, HB_CODEPAGE_RUISO ... REQUEST HB_CODEPAGE_TRWIN, HB_CODEPAGE_UA1125, HB_CODEPAGE_UA1251, HB_CODEPAGE_UA866, HB_CODEPAGE_UAKOI8 REQUEST HB_CODEPAGE_UTF8 используете [pre2] ... x1 := Int( (MaxCol()-nLen)/2 ) bufsc := Savescreen( y1, x1, y1+Len(aText)+3, x1+nLen ) oldc := SetColor( TEdit():cColorWR ) cp := hb_cdpSelect( "RU866" ) @ y1, x1, y1+Len(aText)+3, x1+nLen BOX "┌─┐│┘─└│ " hb_cdpSelect( cp ) FOR i := 1 TO Len( aText ) @ y1+i, x1 + 2 SAY aText NEXT SetColor( oldc ) i := edi_Read( aGets ) Restscreen( y1, x1, y1+Len(aText)+3, x1+nLen, bufsc ) ... hb_cdpSelect( "RU866" ) @ 09, 10, 15, 72 BOX "┌─┐│┘─└│ " @ 13, 20 SAY "├" @ 13, 60 SAY "┤" @ 13, 11 TO 13, 71 hb_cdpSelect( oEdit:cp ) @ 10, 12 SAY "Open file" @ 12, 12 SAY "[ ] ReadOnly" @ 12, 27 SAY "[ ] In a current window" IF !Empty( oEdit:cFileName ) aGets[5,3] := 1 @ 12, 55 SAY "[ ] Diff" ENDIF ... hb_cdpSelect( "RU866" ) @ 09, 20, 16, 60 BOX "┌─┐│┘─└│ " @ 14, 20 SAY "├" @ 14, 60 SAY "┤" @ 14, 21 TO 14, 59 hb_cdpSelect( oEdit:cp ) @ 10,22 SAY "Search for" @ 12, 22 SAY "[ ] Case sensitive" @ 12, 42 SAY "[ ] Backward" @ 13, 22 SAY "[ ] Whole word" @ 13, 42 SAY "[ ] Regular expr." ... oldc := SetColor( cColor ) cp := hb_cdpSelect( "RU866" ) aText := hb_aTokens( cText, ";" ) FOR i := 1 TO Len( aText ) nLen := Max( nLen, Len( aText ) ) NEXT nLen += 4 x1 := Int( (MaxCol()-nLen)/2 ) x2 := x1+nLen y2 := y1+Len(aText)+1 cBuffScr := SaveScreen( y1, x1, y2, x2 ) @ y1, x1, y2, x2 BOX "┌─┐│┘─└│ " hb_cdpSelect( cp ) FOR i := 1 TO Len( aText ) @ y1+i, x1 + 2 SAY aText NEXT SetColor( oldc ) ... [/pre2]

SergKis: УПС. В текстах было [ i ] без пробелов, исказилось, но суть понятна должна быть. Поиск RU866 в *.prg hbedit все выдаст

SergKis: PS С dbf, если все поля в нем в одной кодировке, при открытии указывайте CP, тогда в установленную кодировку hb_cdpSelect( cp ) будет переводить hb, если поля в разных кодировках, не указывайте CP при открытии, но уст. этот CP (программы) при чтении\записи. Др. языки из полей читайте в переменные и при выводе ставьте нужный CP с возвратом потом

alexmar: Всем огромное спасибо. Пошел изучать матчасть Появятся вопросы, буду здесь отписываться

alexmar: Петр пишет: Harbour поддерживает i18n "из коробки". Файлик почитал. А где можно про эти функции поподробнее почитать? hb_i18n_gettext hb_i18n_ngettext, hb_i18n_gettext_strict, hb_i18n_ngettext_strict etc.

Dima: Может тут http://hmgforum.com/viewtopic.php?f=14&t=4284&start=10

alexmar: спасибо

SergKis: alexmar пишет А где можно про эти функции поподробнее почитать? hb_i18n_gettext hb_i18n_ngettext, hb_i18n_gettext_strict, hb_i18n_ngettext_strict etc. в исходниках rtl\hbi18n?.* Но по мне это не совсем удобная штука, т.к. варианты текстов (окончания) могут форм. динамически, часто тексты привязаны к окнам и таблицам и выбранное кучей в .pot файлы - офигенная работа для разбора всего. Т.к. мы страдаем с языками со времен clipper и похожую схему выборки текстов для перевода делали еще в 90х ... Удобнее оказалось сразу делать текст в ini.RU, ini.LV, ini.EN с секциями, которые могут опр. использование в конкретном prg или окне + часто клиент не согласен с переводом того или др. текста. Имеем перекрывающие ini в подкаталоге пользователя, где только тексты от клиента (даем возможность их менять). Тексты не читаем в память (массивы или hash), достаются они ф-ей сразу из файла, т.к. в win буферизация, то все достается мгновенно. Все ini utf8 с BOM, если у ini нет bom - это старая версия и сразу переделываем в вариант с BOM. Пример ini _Agent.lv (базовый вариант в ресурсах программы) [pre2] v.m. = 0.0063 [DOK] DokumRet = Pavadzīme Nr. SumNoPvn = Kopā bez PVN EUR SumArpvn = Kopā ar PVN EUR PvnProc = % PVN [KLI] Kli = Nosūtītājs Sanem = Saņēmējs Bank = Banka BankKod = Bankas kods BankScet = Bankas konts AdrJur = Juridiskā adrese AdrFiz = Preču izsniegšanas vieta: AdrMst = Preču saņemšanas vieta: Telefon = Tālruņa nr. RegNr = Reģistrācijas Nr. PvnNr = PVN reģistrācijas Nr. [RET] Nr = Nr. p.k. Ean = Svītru kods Name = Nosaukums KolVo = Daudz. EdIzm = Mērv. Cena = Vienības cena Sale = Atl. % Summa = Summa [TEXT] Menu10 = DOKUMENTI Menu11 = Zakazi ot agentov Menu20 = LOAD Menu21 = Load Excel ( xls ) files NewCopy = New as ... New = New Del = Delete Edit = Edit Metka = Zīme MetLine = Atzīmēt rindu MetAll = Atzīmēt visas rindas MetAllNo = Noņemiet atzīmi no visām rindām MsgCopy = Add new record from selected record MsgNew = Apend new record MsgDel = Dzēst izvēlēto rindu ; Delete selected record MsgDelAll = Dzēst visas rindas ; Delete ALL records MsgEdit = Edit selected record MsgSel = Selected record Title = Materiāli Vozvrat = Atgriešanās Refund = Atgriešanās Art = Article ; Raksts Cancel = Atcelt Anulet = Anulēt Info = INFO Error = ERROR Load = Load Ili = or g = .g. Line = Līnijas Stroki = Rindās Print = Drukāt Prnt = Drukāšana Continue = Turpināt Material = Materiāli MatName = Mat. nosaukums NotInf = Informācijas nav ! NotDok = Nav dokuments ! NotCena = Nav cenas NotMCen = Materiālu sarakstā nav cenas RedLine = Izvēlētās līnijas korekcija Data = Datums Ddat = Datums Edi = Mērv. Enter = Rindu izvēle Exit = Izeja ExitPrg = Programmas beigas ExitWnd = Izeja no saraksta Spisok = Sarakst Find = Meklēt Find1 = Meklēt no šķirotā saraksta Find2 = Meklēt pa grupas kodiem Find_Mt = Mēklet materiālos Found = found ! GoEnd = Uz beigām GoTom = Uz beigām GoTop = Sākumā Gru = Grupas Grupa = Grupas KlNum1 = Daudzums Kod = Kods Kods = Šķirot pa kodiem Ucen = Cenu uzskaite Rcen = Pārdošanas cena Scen = Kataloga cena Ncen = Jauna cena Mcen = Cena Mcnp = Pl.cena Medi = Mērv. Menshe = Mazāk, vienādi Met = Zīme Met1 = Zīme Met2 = Uzstādīt zīmes Met3 = Noņemt zīmes Ean = Svītru kods CenaR = Vienības cena CenaS = Norakstīšanas cena Mkol = Daudzums Kolvo = daudz. Kol. = Daudz. EdIzm = Mērv. Month1 = Mēnesis Month2 = Nomainīt mēnesi Msma = Atlaide Msmp = Pl.summa Msum = Summa Nam = Nosaukums Name = Šķirot pa nosaukumiem NewYear = Jauns gads Next = Nāk.rinda Next_ = Nākošā rinda NmName = Nosaukums NmNote = Piezīmes Nos = Nosaukums NotField = FieldName not found in table NotFound = File not found ! NotUsed = File not used ! NotKod = Kods nav atrasts ! NotPprNr = Nav PPR numeru ! Note = Piezīmes Nr. = Nr. R_1 = Kods R_2 = Nosaukums Sort = Šķirot Sort1 = Šķirot Sort2 = Šķirot pa kodiem / pa nosaukumiem SortPakape = Šķirot pēc pakāpe SortNodala = Šķirot pēc nodaļa SortKods = Šķirot pēc koda Vibor = Izvēle Viss = Viss saraksts Itogo = Kopā Pavisam = Pavisam Vsego = Pavisam: Kopa = Kopā izsniegts KopaItg = Pavisam apmaksai ScetNr = RĒĶINS Nr. PavadNr = PAVADZĪME Nr. Pavadz = Pavadzīme Nr. Kravas = Kravas pārvadātājs: AM_Reg = A/M reg. Nr. : Vodila = Vadītājs: SpecAtz1 = Apmaksa līdz SpecAtz3 = (preču piegāde) SamaksatD = Ar pārskaitījumu Samaksat = Samaksas veids un kārtība: SpecAtz = Speciālas atzīmes : SpecDop = Pasūtījuma Nr. : SaimnDA = Saimnieciskās darbības apraksts: PrecuPar = Preču piegāde (pārdošana) PavisApm = ```Pavisam apmaksai: ApmVard = `````( ar vārdiem ): VidalKto = Izsniedza : VidalDat = Datums : VidalGod = Piegādes datums: 201__.g.__________________ PriemKto = Pieņēma : ________________________ PriemPar = Paraksts : ________________________ PriemDat = Datums : ________________________ ScetKto1 = Rēķinu izsniedza : ScetKto2 = ```````````````````________________________ ____________________ ____________ ScetKto3 = ````````````````````````````amats vārds, uzvārds paraksts Kto1 = Amats Kto2 = Vārds, uzvārds Kto3 = Paraksts Wait = ... G A I D I E T ... Zime = Z. Save = Saglabāt SaveInf = Informācija jau ir saglabāta SaveNo = Dokuments nav saglabāts NoLock = Informācija nav saglabāts BarKod = BAR-CODE h1 = Nr. h2 = EAN h3 = Artikuls, nosaukums h4 = Daudz. h5 = Krāsa h6 = Informācija h7 = Cena Order = Pasūtīt Orders = Pasūtījumi OrderNr = Pasūtījuma Nr. OrderData = Pasūtījuma datumi OrderLine = Pasūtījuma līnijas OrdRet = Pieņemt dokum. Ordbtn = Orders ; Pasūtījumi OrdLst = Pasūtījumu saraksts Customer = Klients CustKli = Nosūtītājs Agenti = Aģenti Agent = Aģents Price = Cenrādis PriceCen = Cenrādis cena ; Cena no cenrāža PriceList = Preču cenu saraksts PriceMat = Materiālu cenrādis Dokum = Dokumenti Dok.Ser = Sēriju Dok.Dat = Dok. datums Dok.Nr = Dok. Nr. DokNr = Dokum. Nr DokNr. = Dokumenta Nr. DokDat = Dokumenta datums DokPrn = Dokumenta drukāšana Oplata = Apm. (dienas) gr1 = Kods gr2 = Nosaukums gr3 = Mērv. gr4 = Daudz. gr5 = Uzsk. cena gr6 = Uzsk. summa gr7 = Datums gr8 = Dokum.Nr gr9 = Debets gr10 = Krēdits gr11 = EAN gl5 = Ligum. cena gl6 = Ligum. summa gl7 = Starpiba gl8 = Koef. AdrF = Faktiskā adrese AdrFT = __________tālr.,fakss AdrJ = Juridiskā adrese AdrJT = __________tālr.,fakss DirDnm = Vadītāja amata nosaukums DirFio = Vadītāja uzvārds Bank = Bank Rscet = Nor.konta Nr. Kscet = Kor.konta Nr. Banka = Banka BankKod = Bankas kods BankScet = Bankas konts EurBank = EUR.BANK EurIban = EUR.IBAN EurSwift = EUR.SWIFT GlvDnm = Galv.grāmatveža amata nosaukums GlvFio = Galv.grāmatveža uzvārds IspAmats = Izpildvaras amats IspDnm = Izpildītāja amata nosaukums IspDnmEN = Post of performer IspDnmRU = Должность исполнителя IspFio = Izpildītāia uzvārds IspFioEN = Name, surname IspFioRU = Ф. И. О. исполнителя KodBil = Kods SIA Bilance NameK = Īis nosaukums NameP = Pilns nosaukums NodIn = Nodokļu inspekcija NodNr = Nodokļu maksātāja kods Note = Piezīmes PamV = Pamatdarbibas veids ParIn = Pārvaldes institūcija PvnNr = PVN maks. Nr. RegNr = Reģistrācijas Nr. PvnNr2 = PVN reģistrācijas Nr. Nosut = Nosūtītājs Sanem = Saņēmējs AdrJur = Jurid./dzīvesviet. adrese AdrFiz = Nosūtīšanas vietas adrese Telef = Tālr. BankNm = Kredītiestādes nosaukums BankKd = Kredītiestādes kods BankRs = Nor.konta Nr. M01 = Janvāris M02 = Februāris M03 = Marts M04 = Aprīlis M05 = Maijs M06 = Jūnijs M07 = Jūlijs M08 = Augusts M09 = Septembri M10 = Oktobris M11 = Novembris M12 = Decembris Prixod = Ieņēmumi Pereme = Pārvietoties Realiz = Realizācija Vibiti = Norakstīšana Dok_1 = Ieņēmumi no piegādātāja Dok_2 = Iekšējais apgrozījums Dok_3 = Realizācija Dok_4 = Norakstīšana 1_Dok = Dokuments 1_Skl = Noliktava 1_Kli = Piegādātāji 1_R_4 = Datums 1_R_50 = Sērija 1_R_5 = Numurs 1_R_6 = Summa 1_R_22 = Summa\valūtā 1_R_16 = Valūta\kods 1_R_3 = Cehs\Iecirknis 1_R_7 = Kods 1_R_19 = Nosaukums 1_R_19A = Reģ. Nr. UK\PVN Nr. / PK 1_R_200 = Grupas 1_R_92 = Dok.\tips 1_R_93 = Tipa\Nosauk. D3_Dok. = Dokum. D3_Dok = Dokuments D3_Skl = Noliktava D3_Kli = Saņēmējs D3_Cehs = No ceha D3_Rpt1 = Realizācija pēc saņēmēji D3_Rpt2 = Realizācija pēc saņēmēju grupām D3_Rpt3 = Realizācija par datumu D3_Rpt4 = Realizācija par datumu pēc saņēmēja D3_Rpt5 = Realizācija par datumu pēc saņēmēju grupām D3_R_20 = Līgums D3_R_4 = Datums D3_R_50 = Sērija D3_R_5 = Numurs D3_R_6 = Summa D3_R_11 = Daudzums D3_R_26 = Cena D3_R_27 = Summa D3_R_22 = Summa\valūtā D3_R_16 = Valūta\kods D3_R_3 = Cehs\Iecirknis D3_R_7 = Kods D3_MA_1 = Kods D3_MA_2 = Nosaukums D3_MA_3 = Mērv. D3_MA_4 = E A N D3_MA_5 = Artikuls D3_R_19 = Nosaukums D3_R_19A = Reģ. Nr. UK\PVN Nr. / PK D3_R_50A = Orders D3_R_51 = Orders D3_R_92 = Dok.\tips D3_R_93 = Tipa\Nosauk. D3_R_200 = Grupas Gru_All = Pilns saraksts grupu Kli_All = Pilns saraksts saņēmēju Kli_U03 = Piegādātāji Kli_U04 = Saņēmēji Kli_Adr = Adrese Kli_R_1 = Kods Kli_R_2 = Nosaukums Kli_R_2A = Pilns nosaukums Kli_R_3 = Juridiskā adrese Kli_R_3A = Kli_R_4 = Nod. m. kods Kli_R_5 = Rēg.NR. UK Kli_R_10 = Spec. informācīja Kli_R_11A = Valsts Kli_R_11B = Tips Kli_R_12B = Piezīmes Kli_R_13 = Grupas Kli_R_34 = Faktiskā adrese Kli_R_35 = Kli_R_40 = Cenrādis Kli_R_41 = Apmaksa ( dienas ) Kli_R_43 = Aģents Kli_R_31 = LV Adrese Kli_R_32 = RU Адрес Kli_R_33 = EN Adress Kli_R_51 = LV Nosaukums Kli_R_52 = RU Наименование Kli_R_53 = EN Name Kli_R_54 = Agreement [/pre2] в коде текст достается ф-ей _gTxt("ключ", ...) в параметрах можно указать варианты окончания и секцию подмены от установл. default

Pasha: SergKis пишет: Т.к. мы страдаем с языками со времен clipper Хотя наши страдания с языками уже закончились, вспоминаю времена, когда эти страдания еще были... Возвращаясь к исходному вопросу. Проще всего идти по п.1: добавить в dbf локализованные поля: Name/NameU. Я так и делал

alexmar: SergKis пишет: Т.к. мы страдаем с языками со времен clipper и похожую схему выборки текстов для перевода делали еще в 90х ... Удобнее оказалось сразу делать текст в ini.RU, ini.LV, ini.EN с секциями Т.е вариант локализации с ini-файлами использовали еще в Clipper? А вместо _gTxt() что использовали?

SergKis: alexmar пишет А вместо _gTxt() что использовали? Т.к. hash не было был dbf с полями EN, RU, LV и index unique, переводили в dbf _gTxt() не было, выбирали из prg строки в "", '' потом меняли прямо в prg, но таких prg было мало, т.к. была своя Ide с базой txt формата, где хранились все окна с координатами, типа (упрощенно схема) Func SvWnd(y,x,w,h) ; Retu hb_valtoexp({ y,x,w,h, savescreen(y,x,w,h), <тип данных> }) // <тип данных> : Func RsWnd(w) ; Local a := &(w) ;Retu restscreen(a[1],a[2],a[3],a[4], a[5])) // панель, текст, структура, dbf, ... ф-ии на C, доставали окна, тексты с окон. панелей. В ide (уже на S87 была) можно было рисовать окна, привязывать к Say,Get,, макросы,своей achioce и tbrowse, так вот файлы были отд. для каждого языка и из dbf процедурой переносились в нужный и от ENV установки подкл. тот или иной язык.



полная версия страницы