Vie't tie'ng Vie.t

Đặng Trần Hiếu đã viết:
Đoạn code của em, em ko có Mac nên chưa test được. Nhưng trên Windows sử dụng IE, trên Linux sử dụng Firefox, Mozilla & Epiphany thì nó hoạt động tốt. Vả lại, cũng phải nói thêm là người dùng Linux thì nhìu mà người dùng Mac thì cực hiếm (nhất là người VN).

Về đoạn code của em. Vietuni cho Firefox (Windows) bị lỗi. (anh chưa thử các thứ khác.
Em có thể thử ở forum của em, vào Firefox, gửi bài, viết một đoạn, rồi vào đoạn trước (đầu bài chẳng hạn. sẽ không viết được có dấu nữa)

anyway, đây chỉ là lỗi nhỏ.

Vấn đề về người sử dụng các OS khác nhau, anh nhìn vấn đề, không xem xét ở mức độ số lượng người dùng Windows nhiều, Linux nhiều, Mac ít, mà là nhìn vào đối tượng phục vụ của H-A-O.

đối với stats truy cập vào trang chủ (chứ không tính forum), số người truy cập bằng Mac chỉ ít hơn Linux một chút thôi:

Windows (86.13%)
Mac (0.408%)
Linux (0.442%)
FreeBSD (0.005%)
SunOS (0.013%)
IRIX (0.001%)
AIX (0.001%)
Hệ điều hành khác (2.294%)

Vấn đề là họ không gửi được bài, chứ không phải là không sử dụng được bộ gõ tự động tiếng Việt.

=> để sử dụng được cần phải thử nghiệm thêm, và debug thêm.


btw. nói anh lười biếng cũng chịu thôi :> anh đâu phải là dân lập trình? thêm 4 dòng code nhưng mà không biết thêm như thế nào thì anh cũng chịu thôi. Đâu có đơn giản như em biết làm rồi đâu :(
 
Thu được, đã vậy em sẽ viết lại toàn bộ đoạn code bộ gõ tiếng Việt mới hoàn toàn. Cái của anh thì ko dùng được cho *nix, còn cái của em sửa đổi từ đồ của bọn ở avys.de thì ko thể tin tưởng được. Chỉ có tự mình viết mới tin tưởng được thui. Anh cho em vài ngày, hiện giờ em đang chuẩn bị thi cuối kỳ. Lúc nèo xong em sẽ post lên.
 
DEBUG?


Vietuni: đối với safari, có thể gõ tiếng việt, nhưng chỉ sử dụng được các phím ký tự và số, khi sử dụng các phím khác (including space) thì toàn bộ text input bị xóa hết.

=> có thể xử lý tạm thời là nếu OS = Mac hoặc browser = safari thì không gọi script. như thế thì có thể sử dụng file hiện tại cho các browsers khác.

http://www.mozilla.org/docs/web-developer/sniffer/browser_type.html
 
Re: Vie't tie'ng Vie.t aa aa

đã disable đối với SAFARI rồi, nhưng có một số vấn đề:


OS: Windows XP

- không work với Opera 6, 7
- Lỗi với Netscape 702

- Với Firefox thì chỉ có thể viết có dấu ở từ cuối cùng, không viết được có dấu ở các vị trí trước.
với "input" field, phải gõ dấu 2 lần mới được (VD aaa = â; ass = á)
 
Chỉnh sửa lần cuối:
Hị hị, bi giờ ko phải Mac nữa mà là Konqueror chạy trên Linux cũng bị lỗi tương tự. Đến số 0 em cũng ko nhấn được nữa, mỗi lần làm thế là nó delete hết. Firefox thì chạy tốt ko cần bộ gõ nhưng lại có 1 số lỗi sau:

- Mỗi lần em muốn gõ tiếng Việt thì phải tắt xvnkb đi, nếu ko thay vì output ra tiếng Việt, nó output ra UTF-8 kiểu như khi ko set đúng charset
- Thứ 2 là cái javascript đấy nó cực ngu, username của em là lt2hieu2004, ở Konqueror thì cứ đến số 0 là nó xoá hết rùi, còn ở Firefox thì em gõ lt2hieu, đến số 2 thì nó tự hiểu là em muốn gõ VNI và thêm dấu trên chữ e, vấn đề là ở chỗ khi em lt2hieu cộng thêm 1 dấu cách rùi mới 2004 thì nó vẫn cứ thêm dấu vào đầu chữ e được ---> phải cut & paste username từ chỗ khác.
- Thứ 3 là khi em gõ tiếng Việt, mỗi khi đến chữ nèo cần bỏ dấu & là nó tự động cuộn về đầu textarea. Và chỉ gõ được tiếng Việt khi con trỏ ở cuối textarea, còn khi con trỏ trở về đầu hoặc giữa textarea là nó đứt.

Bi giờ anh gửi cho em đoạn code mà anh đang dùng để em xem, có khi thế nì lại hay, ko cần Mac, Konqueror cũng debug được.
 
Safari sử dụng HTML rendering engine KHTML của Konqueror ---> 2 cái sẽ có cùng 1 lỗi. Người dùng Mac sử dụng IE sẽ ko bị lỗi như trên.
 
kính phục 2 bác, giỏi thế :D

chị Thư oai, em với chị đi chỗ khác để 2 bác làm chuyện lớn :D
 
Mọi thứ có vẻ lại đơn giản hơn em tưởng, trong file vietuni.js, nếu anh thay hàm onKeyDown như sau thì Konqueror sẽ ko bị lỗi nữa (chắc chắn đến 90% là safari cũng sẽ hết lỗi vì 2 cái cùng dùng chung 1 rendering engine KHTML):
Mã:
function onKeyDown(evt) {
  var c= getEvt(evt);
	if (c == 10)
	{
  		reset(1)
		linebreak = 1
	}
	else if (c == 13)
	{
		linebreak = 1
	}
	else if ((c<49) && (c!=16) && (c!=20))
	{
		linebreak = 0
	}
  return true;
}
 
Chỉnh sửa lần cuối:
Mission accomplished

Hẹ hẹ, bên trong hàm typing(ctrl) thay vì return this.changed anh sửa thành return true thì sẽ gõ được tiếng Vịt bên trong Konqueror. Đã thử với Konqueror & Firefox, có nhiều khả năng sẽ hoạt động tốt trên Netscape & Mozilla & Epiphany(Cùng 1 rendering engine với Firefox), có nhiều khả năng sẽ hoạt động tốt trên Safari (Cùng 1 rendering engine với Konqueror). Chỉ còn IE nữa thui là coi như em đã hoàn thành nhiệm vụ.

Tổng quát lại, những đoạn cần sửa bao gồm:
- Thay hàm onKeyDown(evt) thành
Mã:
function onKeyDown(evt) {
  var c= getEvt(evt);
        if (c == 10)
        {
                reset(1)
                linebreak = 1
        }
        else if (c == 13)
        {
                linebreak = 1
        }
        else if ((c<49) && (c!=16) && (c!=20))
        {
                linebreak = 0
        }
  return true;
}
- Trong hàm typing(ctrl) thay vì return this.changed, sử dụng return true
- Thêm vào cuối file đoạn code sau:
Mã:
document.onkeyup = function()
{
	var x=document.getElementsByTagName("TEXTAREA")

	for (var i=0; i<x.length; i++)
	{
		initTyper(x.item(i))
	}
}

Trước tiên anh thử ở IE trước đã, nếu tất cả hoạt động theo ý muốn thì em sẽ post tiếp đoạn code để nó hoạt động với cả tag <input type="text"> nữa.
 
Chỉnh sửa lần cuối:
Khè khè, anh cứ làm thoe những rì em post ở trên, có điều riêng cái vụ chuyển return this.changed thành return true thì anh đừng nghe, nếu ko là rắc rối lém đấy. Hẹ hẹ.
 
Đặng Trần Hiếu đã viết:
Mission accomplished

Hẹ hẹ, bên trong hàm typing(ctrl) thay vì return this.changed anh sửa thành return true thì sẽ gõ được tiếng Vịt bên trong Konqueror. Đã thử với Konqueror & Firefox, có nhiều khả năng sẽ hoạt động tốt trên Netscape & Mozilla & Epiphany(Cùng 1 rendering engine với Firefox), có nhiều khả năng sẽ hoạt động tốt trên Safari (Cùng 1 rendering engine với Konqueror). Chỉ còn IE nữa thui là coi như em đã hoàn thành nhiệm vụ.
Mình lại sắp có việc để làm rùi :d

(btw, thế quái nào mà lại ko gõ đc tiếng Việt trong Firefox nữa nhở :-?)
 
Đặng Trần Hiếu đã viết:
- Thay hàm onKeyDown(evt) thành
Mã:
function onKeyDown(evt) {
  var c= getEvt(evt);
        if (c == 10)
        {
                reset(1)
                linebreak = 1
        }
        else if (c == 13)
        {
                linebreak = 1
        }
        else if ((c<49) && (c!=16) && (c!=20))
        {
                linebreak = 0
        }
  return true;
}

Mã:
function onKeyDown(evt) {
  var c= getEvt(evt);
  if ((c==10) || (c==13)) { reset(1); linebreak= 1; }
  else if ((c<49) && (c!=16) && (c!=20)) { linebreak= 0; reset(c==32); }
  return true;
}

tóm lại chỉ thêm reset(1) cho c==10 và bỏ reset(c==32) đi?

cảm giác vẫn bị lỗi :)



(btw, thế quái nào mà lại ko gõ đc tiếng Việt trong Firefox nữa nhở )
vẫn lỗi firefox nên em dùng cái cũ.
 
Chỉnh sửa lần cuối:
Đoạn code viết tiếng Việt của em xong phần Telex rùi. Chạy tốt & ko lỗi trên tất cả các browser sử dụng rendering engine của Mozilla (bao gồm Firefox, Netscape, Mozilla, Epiphany,...), chưa thử trên IE nhưng có nhiều khả năng chạy tốt, nếu ko thì sửa code để chạy trên IE cũng ko phải khó. Tuy nhiên vẫn ko chạy trên browser sử dụng rendering engine KHTML (Konqueror & Safari), tuy nhiên cũng ko gây lỗi kiểu như bị xóa cả bài như đoạn VietUni. Đoạn code mà em viết ở trên chỉ là work around tạm thời. Hiện tại, em đang có tranh chấp với ISP nên bị cắt Internet, ko online thường xuyên được, vài ngày nữa mới giải quyết được.
 
Mã:
var agt=navigator.userAgent.toLowerCase();
var is_ie = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));

var temp, method = 1
var obj_copy

var typicalSearch=new Array(
	'a', 'aa', 'aw', 'e', 'ee', 'i', 'o', 'oo', 'ow', 'u', 'uw', 'y',
	'A', 'AA', 'AW', 'E', 'EE', 'I', 'O', 'OO', 'OW', 'U', 'UW', 'Y');

var typicalKeyCode = new Array(
	97, 226, 259, 101, 234, 105, 111, 244, 417, 117, 432, 121,
	65, 194, 258, 69, 202, 73, 79, 212, 416, 85, 431, 89);
	
function start(obj) {
	obj_copy=obj
	i=obj.selectionStart
	key=obj.value.substr(i-1, 1)
	
	if (method == 0) //auto
	{
		uni_auto(obj, key, i)
	}
	else if (method == 1) //telex
	{
		uni_telex(obj, key, i, true)
	}
	else if (method == 2) //vni
	{
		uni_vni(obj, key, i)
	}
	else if (method == 3) //viqr
	{
		uni_viqr(obj, key, i)
	}
}

function uni_telex(obj, key, i, first)
{
	var pos
	var upkey=key.toUpperCase()
	if ('SFJRX'.indexOf(upkey)>=0) {
		typicalReplace(obj, key, i)
	}
	else if (upkey=='D') {
		var searchFor=new Array('d','D')
		pos=findCharToChange(obj, key, i, searchFor)
		if (pos) {
			var charCode=(key=='d')?273:272
			replaceChar(obj, i-pos, charCode, i)
		}
	}
	else if (upkey=='A') {
		var searchFor=new Array('a','A')
		pos=findCharToChange(obj, key, i, searchFor)
		if (pos) {
			var charCode=(key=='a')?226:194
			replaceChar(obj, i-pos, charCode, i)
		}
	}
	else if (upkey=='W') {
		var charCode
		var searchFor=new Array('a','A','o','O','u','U')
		pos=findCharToChange(obj, key, i, searchFor)
		if (pos) {
			var poschar=obj.value.substr(i-pos,1).toUpperCase()
			if (poschar=='A') charCode=(key=='w')?259:258
			else if (poschar=='O') charCode=(key=='w')?417:416
			else if (poschar=='U') charCode=(key=='w')?432:431
			replaceChar(obj, i-pos, charCode, i)
		}
	}
	else if (upkey=='E') {
		var searchFor=new Array('e','E')
		pos=findCharToChange(obj, key, i, searchFor)
		if (pos) {
			var charCode=(key=='e')?234:202
			replaceChar(obj, i-pos, charCode, i)
		}
	}
	else if (upkey=='O') {
		var searchFor=new Array('o','O')
		pos=findCharToChange(obj, key, i, searchFor)
		if (pos) {
			var charCode=(key=='o')?244:212
			replaceChar(obj, i-pos, charCode, i)
		}
	}
	
	if (first) {
		uni_telex(obj, obj.value.substr(i-2,1), i-1, false)
	}
}

function findCharToChange(obj, key, i, searchFor) {
	var g, str=""
	for (g=0; g<searchFor.length; g++) {
		str+=searchFor[g]
	}
	for (g=2; g<7; g++) {
		if (i-g>=0) {
			if (obj.value.substr(i-g, 1)==" ") break
			else if (str.indexOf(obj.value.substr(i-g, 1))>=0) return g
		}
		else break
	}
	return false
}

function typicalReplace(obj, key, i) {
	var searchFor=new Array()
	for (var g=0; g<typicalKeyCode.length; g++) searchFor.push(String.fromCharCode(typicalKeyCode[g]))
	pos=findCharToChange(obj, key, i, searchFor)
	if (pos) {
		var charCode=returnUniCode(obj, key, i, pos)
		replaceChar(obj, i-pos, charCode, i)
	}
}

function returnUniCode(obj, key, i, pos) {
	var uni_array=returnKeyCode(key.toUpperCase())
	for (var g=0; g<typicalKeyCode.length; g++) if (typicalKeyCode[g]==obj.value.charCodeAt(i-pos)) return uni_array[g]
}

function returnKeyCode(key) {
	if (key=='S') return new Array(225, 7845, 7855, 233, 7871, 237, 243, 7889, 7899, 250, 7913, 253,
									193, 7844, 7854, 201, 7870, 205, 211, 7888, 7898, 218, 7912, 221);
	else if (key=='F') return new Array(224, 7847, 7857, 232, 7873, 236, 242, 7891, 7901, 249, 7915, 7923,
										192, 7846, 7856, 200, 7872, 204, 210, 7890, 7900, 217, 7914, 7922);
	else if (key=='J') return new Array(7841, 7853, 7863, 7865, 7879, 7883, 7885, 7897, 7907, 7909, 7921, 7925,
										7840, 7852, 7862, 7864, 7878, 7882, 7884, 7896, 7906, 7908, 7920, 7924);
	else if (key=='R') return new Array(7843, 7849, 7859, 7867, 7875, 7881, 7887, 7893, 7903, 7911, 7917, 7927,
										7842, 7848, 7858, 7866, 7874, 7880, 7886, 7892, 7902, 7910, 7916, 7926);
	else if (key=='X') return new Array(227, 7851, 7861, 7869, 7877, 297, 245, 7895, 7905, 361, 7919, 7929,
										195, 7850, 7860, 7868, 7876, 296, 213, 7894, 7904, 360, 7918, 7928);
}

function replaceChar(obj, pos, charCode, i) {
	obj.setSelectionRange(pos, pos+1)
	obj.value = obj.value.substr(0, obj.selectionStart) + String.fromCharCode(charCode) + obj.value.substr(obj.selectionEnd)
	obj.setSelectionRange(i-1, i)
	obj.value = obj.value.substr(0, obj.selectionStart) + obj.value.substr(obj.selectionEnd)
	if (temp.length < obj.value.length) obj.setSelectionRange(i+(obj.value.length-temp.length), i+(obj.value.length-temp.length))
	else obj.setSelectionRange(i, i)
	scrollIntoView(obj)
}

function scrollIntoView(obj)
{
	var factor = 36
	if ((obj_copy.scrollHeight <= obj.scrollTop) || (obj_copy.scrollHeight >= obj.scrollTop + obj.offsetHeight))
	obj.scrollTop = obj_copy.scrollHeight - obj_copy.offsetHeight + factor;
}

document.onkeydown = function(e) {
	var el = (!is_ie) ? e.target : window.event.srcElement
	temp = el.value
}

document.onkeyup = function(e) {
	var el = (!is_ie) ? e.target : window.event.srcElement
	start(el)
}
Anh thu+? doa.n code ni`, hie^.n gio` no' chi? cha.y tre^n Mozilla, Firefox,... chu+a cha.y tre^n IE. Tuy nhie^n the^m ho~ tro. cho IE ko kho'. Doa.n code tre^n chi? co`n 1 lo~i nho? la` khi nguo`i du`ng go~ kha' nhanh thi` no' se~ ko bo? da'u tie^'ng Vie.t vo'i 1 so' tu`. Hie^.n gio` mo'i chi? co' bo^. go~ Telex, ca'c bo. go~ kha'c se~ d.c the^m va`o sau ne^'u anh muo^'n du`ng bo^. go~ ni`.
 
Chỉnh sửa lần cuối:
sound cool.

http://www.hn-ams.org/javascript/test.html

Windows XP:

Firefox
Text: Good
Password: Not good (bị có dấu)
Textarea: Good

Netscape
Text: Good
Password: Not good (bị có dấu)
Textarea: Bad - chưa chạy

IE
Text:
Password:
Textarea:


Bac nao co cac OS/Browsers khac thi kiem tra thu ho xem co chay ko nhe.
 
Chỉnh sửa lần cuối:
Khe`, ci' vu. pass co' da^'u thi` chi? ca^`n 1 do`ng code la` su+?a xong thui muh. Co`n ci' vu. textarea cu?a Netscape thi` de? em xem la.i. Em mo'i chi? test tre^n Firefox. Khe`, co`n IE thi` de^~ da`ng ru`i vi` IE ho^~ tro+. da`y du?. Chi? co`n la.i vie.c Netscape textarea ko cha.y.
 
Đặng Trần Hiếu đã viết:
Khe`, ci' vu. pass co' da^'u thi` chi? ca^`n 1 do`ng code la` su+?a xong thui muh. Co`n ci' vu. textarea cu?a Netscape thi` de? em xem la.i. Em mo'i chi? test tre^n Firefox. Khe`, co`n IE thi` de^~ da`ng ru`i vi` IE ho^~ tro+. da`y du?. Chi? co`n la.i vie.c Netscape textarea ko cha.y.


Thuc ra cai ma anh quan tam nhat la khong bi loi tren cac browser khac (co the no khong chay, nhung ma khong bi ... xoa het ca text di nhu hien tai).

Cac browsers pho bien:

- Internet Explorer *
- Netscape *
- Opera
- Mozilla (+Firefox) *
- Safari
- Konqueror

và các browsers khác :)
OS:
- Windows
- Linux
- Mac
- SunOS

Cha.y tre^n netscape to^'t muh, ca? textarea la~n input. O^ng anh xem thu? qua? screenshot cu?a em, Netscape 7.2 cha.y tre^n Slackware Linux 10.

Netscape củ chuối. anh vừa cái NS7.2 chạy được, nhưng cái 7.0 thì ... ngắc ngoải như bên trên anh nói. Anyway, không quan trọng lắm.


Functions cần có:
- Không bị lỗi trên tất cả các browser (lỗi làm cho không sử dụng được browsers)
- hoạt động được trên IE (và càng nhiều browsers càng tốt)
- Có thể bật/tắt
- Có thể gõ theo kiểu telex + VNI


Functions preferable:
- Tự động nhận input/text area field để gõ tiếng Việt
- Có thể gõ theo Telex, VNI, VIQR, AUTO (theo Telex và VIQR only), OFF
- Hướng dẫn và trạng thái hiện tại hiện ở Status bar
 
Back
Bên trên