Vie't tie'ng Vie.t

Cha.y d.c tre^n IE ta^'t nhie^n se~ la` u+u tie^n so' 1 ru`i. Ma` de? vie't bo^. go~ tie'ng Vie.t javascript cho IE ko kho'.

Netscape 7.2, Mozilla >1.3, Firefox dda~ cha.y. Opera co' nhie`u kha? na(ng cu~ng se~ cha.y to't. Safari & Konqueror thi` hie.n gio` la` mission impossible vi` 2 browser ni` su? du.ng KHTML rendering engine. Em se~ lien la.c vo'i Developer cu?a KHTML engine ye^u ca`u ho. the^m va`o 1 so' ti'nh na(ng.

OS ko quan tro.ng vi` doa.n code cua? em ko phu. thuo.c va`o OS, chi? phu. thuo.c va`o browser.

Co' the? la` Netscape 7.0 ko cha.y d.c vi` no' du.a tre^n rendering engine cu?a Mozilla <1.3 cha(ng??

Functions ca`n co':
- Ko bi. lo~i tren ta't ca? ca'c browser (da~ hoa`n tha`nh)
- Hoa.t do.ng d.c tren IE
- Co' the? ba.t ta't
- Co' the? go~ theo kie?u VNI (Telex da~ hoa`n tha`nh)

Functions preferable:
- Tu. do.ng nha.n input/textarea de? go~ tie'ng Vi.t (da~ hoa`n tha`nh)
- Co' the? go~ theo VNI, VIQR, AUTO (Telex da~ hoa`n tha`nh)
- Huo'ng da~n va` tra.ng tha'i hie.n ta.i hie.n o? Status Bar

Trong nhu~ng ti'nh na(ng tre^n thi`chi? co' ho~ tro. cho IE la` ho+i nhi`u vie.c pha?i la`m. Co`n la.i co' the? ba.t ta't chi? ca`n duo'i 10 do`ng code. Ca'c kie?u go~ kha'c ngoa`i Telex cu~ng ko co' ri` kho', chi? ca`n ta`m 20-30 do`ng code cho mo~i kie?u go~. Hie.n tra.ng tha'i o? status bar cu~ng chi? duo'i 10 do`ng code.

Trong va`i nga`y to'i em pha?i hoa`n tha`nh no't assignment nen se ko vie't code tie'p trong va`i nga`y to'i. Sau nga`y 20 em se~ ba't da`u tie'p.
 
Đặng Trần Hiếu đã viết:
Cha.y d.c tre^n IE ta^'t nhie^n se~ la` u+u tie^n so' 1 ru`i. Ma` de? vie't bo^. go~ tie'ng Vie.t javascript cho IE ko kho'.

Netscape 7.2, Mozilla >1.3, Firefox dda~ cha.y. Opera co' nhie`u kha? na(ng cu~ng se~ cha.y to't. Safari & Konqueror thi` hie.n gio` la` mission impossible vi` 2 browser ni` su? du.ng KHTML rendering engine. Em se~ lien la.c vo'i Developer cu?a KHTML engine ye^u ca`u ho. the^m va`o 1 so' ti'nh na(ng.

OS ko quan tro.ng vi` doa.n code cua? em ko phu. thuo.c va`o OS, chi? phu. thuo.c va`o browser.

Co' the? la` Netscape 7.0 ko cha.y d.c vi` no' du.a tre^n rendering engine cu?a Mozilla <1.3 cha(ng??

Functions ca`n co':
- Ko bi. lo~i tren ta't ca? ca'c browser (da~ hoa`n tha`nh)
- Hoa.t do.ng d.c tren IE
- Co' the? ba.t ta't
- Co' the? go~ theo kie?u VNI (Telex da~ hoa`n tha`nh)

Functions preferable:
- Tu. do.ng nha.n input/textarea de? go~ tie'ng Vi.t (da~ hoa`n tha`nh)
- Co' the? go~ theo VNI, VIQR, AUTO (Telex da~ hoa`n tha`nh)
- Huo'ng da~n va` tra.ng tha'i hie.n ta.i hie.n o? Status Bar

Trong nhu~ng ti'nh na(ng tre^n thi`chi? co' ho~ tro. cho IE la` ho+i nhi`u vie.c pha?i la`m. Co`n la.i co' the? ba.t ta't chi? ca`n duo'i 10 do`ng code. Ca'c kie?u go~ kha'c ngoa`i Telex cu~ng ko co' ri` kho', chi? ca`n ta`m 20-30 do`ng code cho mo~i kie?u go~. Hie.n tra.ng tha'i o? status bar cu~ng chi? duo'i 10 do`ng code.

Trong va`i nga`y to'i em pha?i hoa`n tha`nh no't assignment nen se ko vie't code tie'p trong va`i nga`y to'i. Sau nga`y 20 em se~ ba't da`u tie'p.


:) mấy cái chức năng phụ cũng không phức tạp lắm. Cứ từ từ thôi, không vội mà. Cái nào không work được có thể ... bỏ qua, với điều kiện nó không bị xung đột thôi.

Làm tốt assignment nhé :X
 
DDoa.n code vu`a la`m xong:
Code mới được update theo ngày, xem bài viết cuối

Thay do?i:
- Su?a lo~i hie?n thi. sai khi nguo`i du`ng go~ qua' nhanh
- Su?a lo~i bo? da'u trong password
- Ba.t ta('t = F12
- Chuye?n bo. go~ = F9
- DDo+n gia?n ho'a code
- Hie?n thi. tho^ng tin & huo'ng da~n tre^n status bar

1 so^' die^`u ca^`n lu+u y':
- Vi` ly' do ba?o ma^.t, Firefox da.t ma(.c di.nh la` ca^'m ko cho phe'p thay do?i status bar ---> status bar se~ ko hie.n thong die.p tre^n firefox. Muo^'n thay do?i xa'c la.p ma.c di.nh, va`o firefox go~ va`o about:config, ti`m do`ng dom.disable_window_status_change, do?i tha`nh false.
- Hie.n ta.i mo'i chi? co' bo. go~ Telex ---> khi du`ng F9 de? chuye?n bo. go~ se~ gay ra lo~i. Lo~i se~ ko co`n khi la`m them bo. go~ VNI & VIQR.

Ma` bi gio` cu~ng sa'p xong ru`i, ba('t dda^`u nghi~ de'n ca'i te^n cho software d.c ru`i da'y nhi?. b-)
 
Chỉnh sửa lần cuối:
Code được update theo ngày, xem bài viết cuối
DDoa.n code thu' 2 cu?a nga`y.

DDoa.n code truo'c em post co' 1 lo~i nho? khie'n no' ko hoa.t do.ng chi'nh xa'c tren Mozilla & Netscape ma(.c du` va~n hoa.t do.ng to't tre^n firefox. Doa.n code thu' 2 ni` su?a lo~i do'.
 
Chỉnh sửa lần cuối:
Mới kiếm được cái máy cũ cài Windows XP. Bắt đầu port code sang IE.
 
Bộ gõ mà HAO hiện đang sử dụng có 1 số lỗi rất ngớ ngẩn:
- Trong text input, ví dụ anh gõ "đa" sa đó bôi đen 2 chữ nì rùi gõ tiếp d thì thay vì thay đa = d nó sẽ hiển thị dad được bôi đen
- Trong textarea, cũng làm như trên ---> còn tồi tệ hơn, nó sẽ hiển thị dad ở bên ngoài textarea.
 
Đặng Trần Hiếu đã viết:
Bộ gõ mà HAO hiện đang sử dụng có 1 số lỗi rất ngớ ngẩn:
- Trong text input, ví dụ anh gõ "đa" sa đó bôi đen 2 chữ nì rùi gõ tiếp d thì thay vì thay đa = d nó sẽ hiển thị dad được bôi đen
- Trong textarea, cũng làm như trên ---> còn tồi tệ hơn, nó sẽ hiển thị dad ở bên ngoài textarea.


- nếu gõ "đa" rồi cuối cùng gõ thêm chữ d thì nó thành dad là đúng rồi còn gì nhỉ? tiếng việt đâu có từ nào có 2 chữ đ d trong một từ đâu?

- text hiện ra bên ngoài bị khi đoạn text đó ở đầu tiên, khi select đến đầu văn bản, và ký tự gõ thay là một từ xác định dấu (w, e, r, o, a, s, d, f, j, z, x)
 
khè, ý em nói là ví khi anh select cả chữ đa rùi cơ, đáng lẽ ra nó sẽ phải xóa chữ đa đó đi thay vào = chữ d mới đúng.
 
làm xong ghi cho em cái tên vào nhé, hik có ý kiến mà :D
 
Đang tiến đến rất gần mục tiêu, hiện chỉ còn 1 lỗi nhỏ trên IE.
 
Breaking news from London b-)

Toàn bộ lỗi của IE đã được fix. Bộ gõ telex cho IE đang được gấp rút hoàn thành. Dự kiến bộ gõ telex cho IE sẽ được hoàn thành đêm nay. Ngày mai sẽ hoàn thành bộ gõ VNI & VIQR. (mà VNI gõ thế nèo ấy nhỉ??). Ngày kia sẽ hoàn thành bộ gõ Auto. Ngày tiếp theo nữa sẽ thử nghiệm lần cuối & hoàn thành project.
 
Chỉnh sửa lần cuối:
Và đây là bộ gõ chạy được trên IE, Mozilla, Netscape & Firefox,..

Mã:
var agt=navigator.userAgent.toLowerCase()
var is_ie = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1))

var obj_copy, method=1, on_off=1, changed=false

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 notWord(word) {
	return ("\ \r\n#,\\;.:-_()<>+-*/=?!\"$%{}[]\'~|^\@\&".indexOf(word)>=0)
}

function start(obj, key) {
	var uni
	obj_copy=obj
	
	if (method==4) uni=uni_auto
	else if (method==1) uni=uni_telex
	else if (method==2) uni=uni_vni
	else if (method==3) uni=uni_viqr
	
	if (!is_ie) {
		var i=obj.selectionStart
		uni(obj, obj.value.substr(i-3,1), i-2)
		i=obj.selectionStart
		uni(obj, obj.value.substr(i-2,1), i-1)
		i=obj.selectionStart
		uni(obj, obj.value.substr(i-1,1), i)
	}
	else {
		var caret=obj.document.selection.createRange()
		var word=""
		while(1) {
			caret.moveStart("character",-1)
			if (word.length == caret.text.length) break
			word=caret.text
			if (notWord(word.charAt(0))) {
				if (word.charCodeAt(0)==13) word=word.substr(2)
				else word=word.substr(1)
				break
			}
		}
		
		if (word.length) {
			caret.collapse(false)
			caret.moveStart("character",-word.length)
			obj.curword=caret.duplicate()
			word=ie_telex(key, word)
			obj.curword.text=word
			if (changed) {
				changed=false
				window.event.keyCode = 0
			}
		}
	}
}

function ie_telex(key, word) {
	var upkey=key.toUpperCase()
	if ('SFJRX'.indexOf(upkey)>=0) {
		var return_word=typicalReplace(word, key, null)
		if (return_word) return return_word
	}
	else if (upkey=='D') {
		var searchFor=new Array('d', 'D')
		pos=findCharToChange(word,key,null,searchFor)
		if (pos) {
			var charCode=(key=='d')?273:272
			return ie_replaceChar(word, pos, charCode)
		}
	}
	else if (upkey=='A') {
		var searchFor=new Array('a', 'A')
		pos=findCharToChange(word,key,null,searchFor)
		if (pos) {
			var charCode=(key=='a')?226:194
			return ie_replaceChar(word, pos, charCode)
		}
	}
	else if (upkey=='W') {
		var charCode
		var searchFor=new Array('a','A','o','O','u','U')
		pos=findCharToChange(word,key,null,searchFor)
		if (pos) {
			var poschar=word.substr(word.length-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
			return ie_replaceChar(word, pos, charCode)
		}
	}
	else if (upkey=='E') {
		var searchFor=new Array('e','E')
		pos=findCharToChange(word,key,null,searchFor)
		if (pos) {
			var charCode=(key=='e')?234:202
			return ie_replaceChar(word, pos, charCode)
		}
	}
	else if (upkey=='O') {
		var searchFor=new Array('o','O')
		pos=findCharToChange(word,key,null,searchFor)
		if (pos) {
			var charCode=(key=='o')?244:212
			return ie_replaceChar(word, pos, charCode)
		}
	}
	return word
}

function ie_replaceChar(word, pos, charCode) {
	changed=true
	return word.substr(0,word.length-pos)+String.fromCharCode(charCode)+word.substr(word.length-pos+1)
}

function uni_telex(obj, key, i) {
	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)
		}
	}
}

function findCharToChange(obj, key, i, searchFor) {
	var g, str=""
	for (g=0; g<searchFor.length; g++) {
		str+=searchFor[g]
	}
	
	if (!is_ie) {
		for (g=2; g<7; g++) {
			if (i-g>=0) {
				if (notWord(obj.value.substr(i-g, 1))) break
				else if (str.indexOf(obj.value.substr(i-g, 1))>=0) return g
			}
			else break
		}
	}
	else {
		for (g=1; g<=obj.length; g++) {
			if (str.indexOf(obj.substr(obj.length-g,1))>=0) return g
		}
	}
	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)
		if (!is_ie) replaceChar(obj, i-pos, charCode, i)
		else return ie_replaceChar(obj, pos, charCode)
	}
	return false
}

function returnUniCode(obj, key, i, pos) {
	var uni_array=returnKeyCode(key.toUpperCase())
	var charCode=(!is_ie)?(obj.value.charCodeAt(i-pos)):(obj.charCodeAt(obj.length-pos))
	for (var g=0; g<typicalKeyCode.length; g++) if (typicalKeyCode[g]==charCode) 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) {
	var oldlen=obj.value.length
	var fix=obj.selectionStart
	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 (fix > i) obj.setSelectionRange(i+(fix-i)-1, i+(fix-i)-1)
	else obj.setSelectionRange(i-(oldlen-obj.value.length), i-(oldlen-obj.value.length))
	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;
}

function statusMessage() {
	var str='Mode: '
	if(!on_off) str+='NONE'
	else if(method==1) str+='TELEX'
	else if(method==2) str+='VNI'
	else if(method==3) str+='VIQR'
	else if(method==4) str+='AUTO'
	str+=" [F9=TypingMode; F12=On/Off]"
	window.status=str
}

document.onkeydown = function(e) {
	var key = (!is_ie) ? e.which : window.event.keyCode
	if (key==120) {
		on_off=true
		if (method==4) method=1
		else method++
	}
	else if (key==123) on_off=!on_off
	statusMessage()
}

document.onkeyup = function(e) {
	if ((!on_off) || (is_ie)) return
	var el=e.target
	if ((el.type != 'textarea') && (el.type != 'text')) return
	start(el, null)
}

document.onkeypress = function() {
	if (!is_ie) return
	var el=window.event.srcElement
	var code=window.event.keyCode
	if (((el.type != 'textarea') && (el.type != 'text')) || (!on_off) || (code<47) || (code==145) || (code==255)) return
	start(el, String.fromCharCode(window.event.keyCode))
}

statusMessage()

Cái này là phần thô bao gồm 278 dòng code. Sau khi xong hoàn chỉnh, có thể sẽ bao gồm tổng cộng 400 dòng code.
 
anh Hà không cho ý kiến giề ah, để ông Hiếu tung hoành trên vương quốc của anh kìa.
 
Nguyễn Đức Long đã viết:
anh Hà không cho ý kiến giề ah, để ông Hiếu tung hoành trên vương quốc của anh kìa.
:) cám ơn Long nhắc nhở, anh liên hệ trực tiếp với Hiếu rồi mà.

với cả H-A-O là vương quốc của tất cả chúng ta, là vương quốc của em, chứ đâu phải của riêng anh đâu :>
 
Nguyên tắc bỏ dấu trong tiếng Việt

Tham khảo cái này nhé, cách bỏ dấu của em sai hết rồi đấy.
Có thể tham khảo thêm trong bộ nguồn của unikey nữa


Tiếng Việt có
12 nguyên âm: a ă â e ê i o ô ơ u ư y
17 phụ âm đơn: b c d đ g h k l m n p q r s t v x
11 phụ âm kép: ch gh gi kh ng ngh nh ph qu th tr


Một số nguyên tắc bỏ dấu cơ bản:

- Chỉ bỏ dấu trên nguyên âm
- Nếu từ chỉ có một nguyên âm, bỏ dấu vào nguyên âm đó. Ví dụ: bị, bố, cóc, đàn ...
- Nếu từ kết thúc bằng 2 nguyên âm, đặt dấu vào nguyên âm thứ nhất. Ví dụ: bối, cứa, đào ...
chú ý đối với các phụ âm kép như gi, qu là một phụ âm, bỏ dấu vào nguyên âm. Ví dụ: giữ, giải, quạ, quấy ...
- Nếu từ có 2 nguyên âm và kết thúc bằng một hoặc 2 phụ âm, thì đặt dấu vào nguyên âm thứ hai. Ví dụ: hoặc, đoàng, hoàng, trường ...
- Nếu từ có 3 nguyên âm thì đặt dấu vào nguyên âm chính giữa. Ví dụ: bưởi, đuổi, ngoại ...

- Trường hợp đặc biệt: với các từ có các nguyên âm â, ê, ô thì phải đặt dấu ở nguyên âm này, bất kể vị trí của nguyên âm. Ví dụ: tuế, huệ, truyện ...
thuẫn



Nguồn: dựa theo một số nguồn tham khảo online. Nếu có thiếu sót, mời các bạn bổ sung
 

Đính kèm

  • chucaitiengViet.gif
    chucaitiengViet.gif
    12.9 KB · Xem: 14
Chỉnh sửa lần cuối:
Re: Nguyên tắc bỏ dấu trong tiếng Việt

Chuyện nhỏ sân cỏ. Tối nay sẽ làm xong.
 
hik trình tiếng việt còn quên hết sao làm bộ gõ cho người việt được hả anh ơi

chat anh còn sai chính tả nữa là
 
Back
Bên trên