PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : تنظیم خودکار text-align و direction



amirreza22
October 7th, 2010, 22:30
یه اسکریپتی، کدی،چیزی نمی شناسید باهاش مثل سایت فیس بوک و Google Translate بشه چپ چین یا راست چین بودن متن رو با توجه به زبان نوشتن یعنی فارسی یا انگلیسی تغییر بده؟

من سورس Google Translate رو که نگاه میکردم، انگار از یه کدجاوا اسکریپت برای تغییر direction و text-align استفاده میکرد.

کلی گشتم اما نتونستم کدی برای اینکار پیدا کنم.

اگه بتونیم یه کد صاف و صاف بنویسیم مطمئنا به درد خیلی ها میخوره.

Rezash
October 7th, 2010, 23:04
مي توني بگي براي كجا مي خواي ؟ چون شناسايي كاراكتر هاي فارسي از انگليسي دردسر هاي خاص خودش رو داره، عبارات باقاعده و ...
ولي اگر بتوني بيشتر توضيح بدي براي چجور جايي مي خواي و استفاده و كاربردش در چيه شايد بشه روش بهتري رو پياده سازي كرد.

amirreza22
October 8th, 2010, 12:01
مي توني بگي براي كجا مي خواي ؟ چون شناسايي كاراكتر هاي فارسي از انگليسي دردسر هاي خاص خودش رو داره، عبارات باقاعده و ...
ولي اگر بتوني بيشتر توضيح بدي براي چجور جايي مي خواي و استفاده و كاربردش در چيه شايد بشه روش بهتري رو پياده سازي كرد.

خوبــه شما یه جوابی دادید،ممنون;)
من از Wordpress استفاده میکنم، میخواستم با این اسکریپت فرضاً اگه عنوان مطالبم انگلیسی بود از چپ به راست نوشته بشه و اگه فارسی از راست به چپ.
یا در قسمت نظرات اگه کسی فینگیلیش تایپ کرد، متنش از چپ به راست باشه...

در مورد عبارات باقاعده خیلی متوجه منظورتون نشدم ولی خوب میشه یه اسکریپت نوشت که:
تووش همه حروف انگلیسی رو از aتا z بنویسیم، بعد با یه دستور بفهمونیم اگه اول یه نوشته یکی از این حروف بود، متن از چپ به راست نمایش داده بشه، در غیر این صورت از راست به چپ..

توی بلاگفا یه کدی دیدم که به نظر جالب میومد:

var KeylangFarsi=true;
// for keypress
function farsikey(myfield,e)
{
var key;
var basestring=' !"#$%،گ)(×+و-./0123456789:ک,=.؟@ِذ}ىُىلآ÷ـ،/’د×؛َءٍف‘{ًْإ~جژچ^_پشذزیثب لاهتنمئدخحضقسفعرصطغظ<|>ّ';
if (window.event)
key = window.event.keyCode;
else if (e)
key = e.which;

if (key < 0x0020 || key >= 0x00FF) return true;
if (KeylangFarsi==true)
{
if (window.event)
window.event.keyCode=basestring.charCodeAt(key-32);
else if (e)
e.which=basestring.charCodeAt(key-32);
}
return true;
}

// function for keydown
function changelang(objtext1)
{
if (window.event.keyCode==119)
KeylangFarsi =(KeylangFarsi==true) ? false : true ;
if (window.event.altKey && window.event.shiftKey )
KeylangFarsi = false ;
return true;
}


و همینطور یه کد خیلی بهتر که با جاوا اسکریپت انگار امکان فارسی نوشتن رو فراهم میسازه که خیلی جالبه...:

/* isiri2901.js - Standard Persian keyboard driver for JavaScript
*
* Copyright (C) 2000 Roozbeh Pournader
* Copyright (C) 2003, 2005 Behdad Esfahbod
* Copyright (C) 2005, 2006 Pooya Karimian
* Copyright (C) 2005 Behnam Esfahbod
* Copyright (C) 2005 Artyom Lukanin
*
* ChangeLog:
* Mar 05, 2005 Pooya Karimian, FireFox/Mozilla support added.
* Mar 20, 2005 Behdad Esfahbod, random fixes in Firefox support.
* Apr 14, 2005 Behnam Esfahbod, U+0654, U+0670, U+00F7 added.
* Apr 21, 2005 Behdad Esfahbod, Minimal Opera 8.0 support added.
* Alt+Ctrl+anything now is known to switch language.
* Sep 06, 2005 Artyom Lukanin, FireFox 1.0.6 support added.
* Sep 09, 2005 Behdad Esfahbod, Added fallback support back in,
* removed Opera code that doesn't was not worth it.
* Sep 09, 2005 Behdad Esfahbod, Make toggleDir() with no object
* passed changing language, actually work.
* Sep 09, 2005 Added U+FDFC RIAL SIGN!
* Sep 09, 2005 Assigned U+0653 to shift+X.
* Dec 02, 2005 Pooya Karimian, Fixing vertical & horizontal scrolling
* Apr 13, 2006 Pooya Karimian, initKeyEvent is back in Firefox 1.5.0.2 (FF Bug#303713)
*
* Licensed under GNU GPL.
*/

var isiri2901_lang = 1; // 1: Persian, 0: English
var isiri2901_nativelang = 0; // 1: Persian, 0: English

// Persian keyboard map based on ISIRI-2901

var isirikey = [
0x0020, 0x0021, 0x061B, 0x066B, 0xFDFC, 0x066A, 0x060C, 0x06AF,
0x0029, 0x0028, 0x002A, 0x002B, 0x0648, 0x002D, 0x002E, 0x002F,
0x06F0, 0x06F1, 0x06F2, 0x06F3, 0x06F4, 0x06F5, 0x06F6, 0x06F7,
0x06F8, 0x06F9, 0x003A, 0x06A9, 0x003E, 0x003D, 0x003C, 0x061F,
0x066C, 0x0624, 0x200C, 0x0698, 0x064A, 0x064D, 0x0625, 0x0623,
0x0622, 0x0651, 0x0629, 0x00BB, 0x00AB, 0x0621, 0x0654, 0x005D,
0x005B, 0x0652, 0x064B, 0x0626, 0x064F, 0x064E, 0x0670, 0x064C,
0x0653, 0x0650, 0x0643, 0x062C, 0x005C, 0x0686, 0x00D7, 0x0640,
0x200D, 0x0634, 0x0630, 0x0632, 0x06CC, 0x062B, 0x0628, 0x0644,
0x0627, 0x0647, 0x062A, 0x0646, 0x0645, 0x067E, 0x062F, 0x062E,
0x062D, 0x0636, 0x0642, 0x0633, 0x0641, 0x0639, 0x0631, 0x0635,
0x0637, 0x063A, 0x0638, 0x007D, 0x007C, 0x007B, 0x007E
];

// on Alt+Ctrl+anything, switch language
function PersianKeyDown(e)
{
if (window.event)
e = window.event;
if (e.ctrlKey && e.altKey) {
if (isiri2901_lang == 0)
setPersian();
else
setEnglish();
try {
e.preventDefault();
} catch (err) {
}
return false;
}
return true;
}

var pk_test_ev;

function PersianKeyPress(e)
{
var key;
var obj;


if (window.event) {
e = window.event;
obj = e.srcElement;
key = e.keyCode;
} else {
obj = e.target;
key = e.charCode;
}

if (e.bubbles==false)
return true;

// This cannot be used anymore, in FF 1.5.0.2, as a new event will call keypress again.
// Change to English, if user is using an OS non-English keyboard
if (key >= 0x00FF) {
isiri2901_nativelang = 1;
setPersian();
} else
if (isiri2901_nativelang == 1) {
isiri2901_nativelang = 0;
setEnglish();
}


// Avoid processing if control or higher than ASCII
// Or ctrl or alt is pressed.
if (key < 0x0020 || key >= 0x007F || e.ctrlKey || e.altKey || e.metaKey)
return true;

if (isiri2901_lang == 1) { //If Persian

// rewrite key
var newkey;
if (key == 0x0020 && e.shiftKey) // Shift-space -> ZWNJ
newkey = 0x200C;
else
newkey = isirikey[key - 0x0020];

if (newkey == key)
return true;


try {
// Gecko
var new_event=document.createEvent("KeyEvents");
new_event.initKeyEvent("keypress", false, true, document.defaultView, false, false, false, false, 0, newkey);
obj.dispatchEvent(new_event);
e.preventDefault();
} catch (err) {
try {
// Windows
e.keyCode = newkey;
} catch (err) {
try {
// Gecko after banning fake key emission (FF 1.0.6 to FF 1.5.0.1)
// Try inserting at cursor position
pnhMozStringInsert(obj, String.fromCharCode(newkey));
e.preventDefault();
} catch (err) {
// Everything else, simply add to the end of buffer
obj.value += String.fromCharCode(newkey);
e.preventDefault();
}}}
}
return true;
}


function setPersian (obj, quiet)
{
isiri2901_lang = 1;
if (obj) {
obj.style.textAlign = "right";
obj.style.direction = "rtl";
obj.focus();
}
if (!quiet)
window.defaultStatus = "Persian Keyboard (Press Ctrl+Alt+Space to change to English)";
}


function setEnglish (obj, quiet)
{
isiri2901_lang = 0;
if (obj) {
obj.style.textAlign = "left";
obj.style.direction = "ltr";
obj.focus();
}
if (!quiet)
window.defaultStatus = "English Keyboard (Press Ctrl+Alt+Space to change to Persian)";
}


function toggleDir (obj, quiet) {
var isrtl = 0;
if (obj)
isrtl = obj.style.direction != 'ltr';
else
isrtl = isiri2901_lang;
if (isrtl)
setEnglish(obj, quiet);
else
setPersian(obj, quiet);
}

// Inserts a string at cursor
function pnhMozStringInsert(elt, newtext) {
var posStart = elt.selectionStart;
var posEnd = elt.selectionEnd;
var scrollTop = elt.scrollTop;
var scrollLeft = elt.scrollLeft;

elt.value = elt.value.slice(0,posStart)+newtext+elt.value.slic e(posEnd);
var newpos = posStart+newtext.length;
elt.selectionStart = newpos;
elt.selectionEnd = newpos;
elt.scrollTop = scrollTop;
elt.scrollLeft = scrollLeft;
elt.focus();

}


اطلاعات بیشتر در مورد کد دوم در اینجا : Persian Javascript | Codes | Pooya Karimian (http://pooyak.com/p/persianjavascript/)

این سوال در انجمنهای مجیدآنلاین،P30World،iranphp،WP-Persian مطرح شده ولی کسی نتوسته جواب بده=D>

Rezash
October 8th, 2010, 17:17
اگر قرار باشه خود متن رو تجزيه و تحليل كنيم و ببينيم راست چين باشه يا چپ چين در خيلي از موارد خطا و اشتباه زياد هست...خيلي رو بولد كردم چون در بيشتر موارد هست !
به نظر من بهتر هست براي بخش نظرات و ارسال مطلب يك اديتور بذاريد (فكر كنم wp چنين امكاني رو داشته باشه) و كاربر دستي با فشردن يك دكمه هر جاي متنش رو كه خواست راست چين يا چپ چين كنه
گاهي در يك متن ما هم جملات فارسي داريم و هم انگليسي...
بهر حال قابل پياده سازي هست و مي تونيم يك آرايه از حروف فارسي رو بسازيم.
متن وارد شده رو حرف به حرف بررسي كنيم و اگر در آرايه بود راست چين كنيم و عمليات بررسي حروف رو تا وقتي ادامه بديم كه يا به يك حرف فارسي برسيم يا حروف تموم بشه
بهر حال توصيه من اديتور هست كه دست كاربر رو باز تر ميذاره و روشي هم كه گفتم يك روش پيشنهادي هست.

amirreza22
October 9th, 2010, 13:20
یک کد که اولین حرف از متن رو چک کنه و ببینه فارسی هست یا انگلیسی به نظرم کافیه،حداقل برای عناوین مطالب..