Azzal kezdeném, hogy ugatom a PHP-t! Lassan, de biztosan haladok :-) "néha az őrület felé"
Van egy PHP alapú fórummotor amit megpróbálok magyarrá tenni. Nem egyedül, de lehetséges, hogy ebbe a problémába más még nem ütközött bele. A probléma a dátum kezeléssel van. A teljes oldal kódolása UTF-8, míg a szolgáltató alapértelmezettje iso-8859-1. Csak a dátumoknál jelentkezik, hogy így jelenik meg:
"Bejegyezve dzsolt által m�rcius 30, 21:27-kor"
Próbáltam egy egyszerű megfeleltetéses módszert így:
$honapok = Array("január", "február", "március","április","május", "június",
"július", "augusztus","szeptember","október", "november", "december");
$honap = $honapok[date("n")-1];
később "$honap" néven hivatkozok rá. Ezzel csak az a baj, hogy innentől csak az épp aktuális hónap létezik számára. A múlt hónapi bejegyzések is az aktuális haviakká válnak. Próbáltam
$honap = $honapok["%m"];
-el is, de gondolom a baj itt abból adódik, hogy az április nem "3" hanem az strftime-nak megfelelő "04". A hónap száma előtt álló "0" miatt nem jelenik meg semmi a hónap helyén?
Merre induljak el? Nem konkrét megoldás kell, hanem irányadás, hogy magamtól jöjjek rá, különben sosem tanulom meg :-)
dzsolt
- 2189 megtekintés
Hozzászólások
Szerintem valahogy igy kene:
$t=time();
...
$l=localtime($t,1);
$month=$t["tm_mon"]+1;
$honapstring=$honapok[$month-1];
fontos, hogy amit a
$honapok[]
tombnek atadsz az legyen levalasztva, mint egy egesz sza'm, es ezt kulturaltan, numerikusan kezeljuk vegig, ez a date() elegge elkomolytalanitja a dolgot (ti. vegig egesz szamokkal kell szamolni, a date() meg string-et ad vissza).
Ezenfelul minden ido"adatot timestamp formaban tarolj, adatbazisban, belso" valtozokban, stb, mindig. Es csak akkor alakitsd at a vegso formajara (ev/ho/nap ora/perc/masodperc, ...) ha szukse'g van ra'.
Ha olyasmi problemad van, hogy azalapjan kell rendezni az adatot, hogy "aktualis honap" meg "elozo honap" meg ilyenek, akkor kiszamolod a hataroknak (honap eleje, honap vege) timestampjait a
mktime()
fuggvennyel, es a forumbejegyze'sek timestamp-jait sima relaciokkal ellenorzod (vagy azalapjan query-zed ki az adatbazisbol, barmi).
A lenyeg hogy mindig mindenhol timestamp...
A.
- A hozzászóláshoz be kell jelentkezni
Igen, de gondolom ez részéről elég sok kódátírást jelentene, és ő meg csak lokalizálni akar...
- A hozzászóláshoz be kell jelentkezni
Valóban!
De nem adom fel, keresem a megoldást!
dzsolt
- A hozzászóláshoz be kell jelentkezni
@setlocale() esetleg?
- A hozzászóláshoz be kell jelentkezni
osCommerce-t most csinálom, ott segített, igaz maradtam a latin2-es kódlapnál.
Csak a PHP-t kell rávenni az UTF-8 használatára. Ne írj át semmit!!!
- A hozzászóláshoz be kell jelentkezni
Szerintem is egy setlocale(LC_ALL, "hu_HU.UTF-8") meg kell hogy oldja. Feltéve hogy van ilyen locale telepítve a szerveren, de ha esetleg nincs, akkor az adminokat kell seggberúgni :)
- A hozzászóláshoz be kell jelentkezni
Ebben a formában nekem nem működött, adminokkal még én sem beszéltem. Ha jól sejtem így csak FreeBSD alatt használható. Bár én is csak ugatom a PHP-t.
Linuxok alatt csak ennyit mondhatsz:
@setlocale(LC_*, "hu_HU");
értelemszerűen a * helyére kerülhet TIME, ALL, stb.
- A hozzászóláshoz be kell jelentkezni
FreeBSD-hez nem értek, állítólag BSD-k nem igazán járnak élen locale támogatás terén, nem tudom. Én Linux alatt használom (php-ból is) a setlocale parancsot, hu_HU.UTF-8 argumentummal. Bizonyos disztribek alatt szükség lehet arra, hogy megfelelő (valszeg disztrib-specifikus) paranccsal elkészítsd ezt a locale-t, mert lehet hogy alapból nincsen telepítve.
- A hozzászóláshoz be kell jelentkezni
Sajnos az extra.hu-s adminokat nem igen rugdoshatom semmiért, elvégre ajándék lónak ne nézd a fogát. De mivel előfordulhat máshol is, ezért keresek valami megoldást. A PHP manuálból kikukkolt system parancs pedig le van tiltva, így nem tudom ellenőrizni, hogy mik az engedélyezett localok.
- A hozzászóláshoz be kell jelentkezni
Akkor csináld azt mint én:
@setlocale(LC_TIME, "hu_HU");
és használj Latin2-es kódlapot. Mi indokolja az UTF-8 használatát?
Egyébként nem hiszem hogy 8859-1-es kódolást lehet csak használni. A böngészőknek megmondhatod a fejlécben mit használjanak, és nem hiszem, hogy a PHP úgy lenne telepitve, hogy csak latin1-et tudjon.
Ha tisztességesen van megcsinálva az a fórummotor akkor esetleg egy-két helyen kell átírnod a HTML fejléc létrehozására szánt kódot, ha a PHP-nak meg adsz egy fenti parancsot, akkor Latin2-őt használ alapból sztem.
- A hozzászóláshoz be kell jelentkezni
> és használj Latin2-es kódlapot. Mi indokolja az UTF-8 használatát?
Mi indokolná Latin2 használatát? Egyértelműen az UTF-8 a jövő, a Latin2 használata csak szíváshoz vezethet hosszú távon.
Egyébként ha valami külső forrásból valami sztringet Latin2 kódolásban kapsz meg (például a dátumot jelen esetben), az egy szem iconv() hívással átalakítható UTF-8-ba:
$datestring = iconv("ISO-8859-2", "UTF-8", $datestring);
- A hozzászóláshoz be kell jelentkezni
A latin2-ét az, hogy a szerver csak azt támogatja, ill. ezt tudjuk biztosan, és nem tudjuk hogyan rávenni, hogy UTF-8-at használjon.
Én maradnék, sőt maradtam is a Latin2-nél, minthogy megkeressem és átírjam az összes PHP által dobott sztringet.
Ráadásul, ha lesz UTF-8 támogatás a szerveren, vagy átkerül a lap másik szerverre, akkor lehet kezdeni mident előről.
Nekem is szimpatikusabb az UTF-8, de ha nem tudom korrektül megoldani a használatát, akkor inkább maradok a Latin2-nél.
- A hozzászóláshoz be kell jelentkezni
> Ráadásul, ha lesz UTF-8 támogatás a szerveren, [...] akkor lehet kezdeni mident előről.
Keversz két dolgot: azt, hogy van-e _támogatás_ (lehetőség) UTF-8 használatára (tehát hogy a fent említett setlocale végre működni fog), és azt, hogy alapból azt használja-e a rendszer. Miért ne jelenhetne meg az UTF-8 lehetősége alternatívaként úgy, hogy közben a latin2 marad a default?
- A hozzászóláshoz be kell jelentkezni
> hogy a szerver csak azt támogatja, ill. ezt tudjuk biztosan, és nem tudjuk hogyan rávenni,...
ez is ott volt a mondatban. Nem azt írtam, hogy nem támogatja. Egyszerüen nem tudjuk hogyan lehet rávenni, hogy azt használja.
Arról amit írtál - hogy minden egyes PHP által visszaadott sztringet egy fügvényhívással konvertáljon UTF-8-ra - te sem gondoltad komolyan, hogy korrekt megoldás!
- A hozzászóláshoz be kell jelentkezni
> Ráadásul, ha lesz UTF-8 támogatás a szerveren...
> Nem azt írtam, hogy nem támogatja
Most akkor ezt hogy? Szerintem abban amit írtál, igenis benne volt, hogy most nem támogatja a szerver. Lehet hogy nem erre gondoltál persze.
te sem gondoltad komolyan, hogy korrekt megoldás
Mit értesz korrekt alatt? Funkcionálisan korrekt, nem? Azt, hogy mennyire járható út, nem tudom, mivel nem látom a kódodat. Fogalmam sincs, hogy 1 vagy ezer helyen kéne ezt berakni. Adtam egy ötletet. Sajnálom hogy nem tetszik.
- A hozzászóláshoz be kell jelentkezni
Azt írtam - lehet neked nem így jött le - hogy a Latin2-őt tudjuk használni, az UTF-8-at nem, vagy csak nehézkesen.
A fórum kódját én sem ismerem, nem én nyitottam a topicot. A lokalizáció számomra azt jelenti, hogy nem kell az összes php fájlt átirni, hanem egy helyen megoldható a kódlap, dátumok, stb kezelése. Tapasztalatom szerint öszetett fórum, portál, webáruház motorok így vannak megoldva. Részemre elfogadhatatlan lenne, ha pl. egy PHPNuke-ban ahány helyen dátumot ír ki, mindenütt meghívjak egy konverziós fgv.-t. Ezt nem tartom korrekt megoldásnak.
- A hozzászóláshoz be kell jelentkezni
Az oldal egészén helyesen jelenik meg az összes ékezet, csak a dátumban nem.
Az alábbi részletbe be van illesztve a konverzió csak épp nem azt a működést váltja ki amit vártam.
Sajnos ezzel a részlettel minden múltbéli esemény e havivá válik, olykor előre :-) mivel április 28 pl. még nem volt idén.
Amúgy a http://www.phorum.org -ról van szó.
// ============================================================
// General settings
// ============================================================
// The language name as it is presented in the interface.
$language = "Magyar";
// Uncomment this to hide this language from the user-select-box.
//$language_hide = 1;
// Date formatting. Check the PHP-docs for the syntax of these
// entries (http://www.php.net/strftime). One tip: do not use
// %T for showing the time zone, as users can change their time zone.
// Ez a két sor azért kellett, mert ha a szerver nem alapértelmezetten
// UTF-8, akkor a dátumban szereplő hónap neve az eltérő kódlappal kerül
// megjelenítésre, míg az oldal többi része helyesen látszik, ha be van
// állítva a 'setlocale(LC_TIME, "hu_HU");'
$honapok = Array("január", "február", "március","április","május", "június",
"július", "augusztus","szeptember","október", "november", "december");
$honap = $honapok[date("n")-1];
// Ez viszont csak opcionális. A 'Readable Dates" modulban használom.
// Ha nem használod, ne törődj vele!
$PHORUM['cool_date'] = "$honap %e. napján, %H:%M-kor";
$PHORUM['long_date'] = "%Y. $honap %e, %H:%M-kor";
$PHORUM['short_date'] = "$honap %e, %H:%M-kor";
// The locale setting for enabling localized times/dates. Take a look
// at http://www.w3.org/WAI/ER/IG/ert/iso639.htm for the needed string.
$PHORUM['locale'] = "hu_HU";
// The character set to use for converting html into safe valid text.
// Also used in the header template for the xml tag. For a list of
// supported character sets see: http://www.php.net/htmlentities
// You may also need to set a meta-tag with a character set in it.
$PHORUM['DATA']['CHARSET'] = "UTF-8";
// The encoding used for outgoing mail messages.
$PHORUM['DATA']['MAILENCODING'] = "8bit";
// Some languages need additional meta tags to set encoding, etc.
$PHORUM['DATA']['LANG_META'] = "";
- A hozzászóláshoz be kell jelentkezni
Ha mindig az aktuális dátum hónapnevét használod, ne csodálkozz ezen! :)
- A hozzászóláshoz be kell jelentkezni
Egyszerüen nem tudjuk hogyan lehet rávenni, hogy azt használja.
Hmm...
Debian esetén így: dpkg-reconfigure locales, a felugró dialogba be kell klattyintani a hu_HU.UTF8 melletti checkboxot, a második ablakba pedig azt kell kiválasztani mint default locale. Ezután vizuális visszajelzés történik arról, hogy a locale meggyártatott. Ha nem gyártaná meg, akkor újra kell játszani a mókát, ezért szeretjük ezt a rendszert.
Ezután egy apache restart tuti kell, de a legjobb az egész szervert restartolni, ugyanis így egészen biztos, hogy minden fel fogja venni.
SQL-ben pedig asszem ki lehet választani a tábla/adatbázi kódolását. Ha nem támogassa a SQL szerver, akkor itt az ideje frissíteni azt.
- A hozzászóláshoz be kell jelentkezni
de nem fér hozzá a szerverhez, extrás tárhely. Az adminokat meg nem akarja zaklatni.
- A hozzászóláshoz be kell jelentkezni
Upppsz, télleg, sry, elnézést, etc. Azt hittem ez már egy másik thread. Télleg really sorry.
- A hozzászóláshoz be kell jelentkezni
Ha az ékezetes karakterek helyett HTML entityket használsz, tuti nem futsz bele ilyesmibe. Én anno írtam két functiont, amik oda-vissza konvertálnak, így sem az adatbázisban, sem megjelenítéskor nincs probléma, akárhol is legyen az oldal. Mondjuk visszafelé csak javascriptnél kellett. :)
Üdv,
MantaRay
- A hozzászóláshoz be kell jelentkezni
Teljesen mindegy, hogy mi a szerver beállíátsa, mert kézzel könnyedén felül lehet írni.
Mielőtt elkezdődik a html kimenet, hozzáadhatsz egy fejlécet:
header("Content-type: text/html; charset=utf-8");
Aztán, az output részében nem árt megerősítani mégegyszer a dolgot:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="hu" />
Nekem is extra-n van az oldalam, és így simán megy az utf8.
---------
WARNING: Linux requires you to type! After rebooted to Windows, you can safely unplug your keyboard.
- A hozzászóláshoz be kell jelentkezni
Ekkor közlöd a böngészővel, hogy milyen kódlapot használ az oldalad, és ha a php beleszúrkál más kódolással dolgokat, akkor kezdődnek a gondok. :)
- A hozzászóláshoz be kell jelentkezni
Hmm... ha mysql-ben jól be van állítva a kódlap, akkor nem. Illetve, statikus string-eket többféleképpen is meg lehet oldani: jó kódolással mented a php fájlt, vagy quanta-t használsz, és beállítod az automatikus-helyettesítést, azaz ha beírsz egy nem latin1-es karaktert, kicserélni a html-es változatára ^^
---------
WARNING: Linux requires you to type! After rebooted to Windows, you can safely unplug your keyboard.
- A hozzászóláshoz be kell jelentkezni
És ha van egy ilyen v. hasonló kódod:
...
$t = getdate();
print $t[weekday];
...
mi köze ennek a mysql-hez?
honnan tudja a php fájlod, vagy a quanta, hogy a php interpreter milyen kódolással adja vissza a nap nevét?
- A hozzászóláshoz be kell jelentkezni
Hát ilyen esetem nekem még spec nem volt, de valószínű, hogy akkor utánanéznék a dolognak google-lel.
---------
WARNING: Linux requires you to type! After rebooted to Windows, you can safely unplug your keyboard.
- A hozzászóláshoz be kell jelentkezni