Robotloader->tryLoad($type) a strtolower pri locale tr_TR.utf8
- edke
- Člen | 198
Zdravim.
Myslim, ze subject hovori za vsetko :) Stalo ma to hodinu debuggovania, kym som pochopil, co sa deje, lebo som nato pozeral ako puk. Tento screenshot vysvetluje vsetko: http://goo.gl/OIQqI
Skratene, do app som pridal novy gettext slovnik, turectina, locale tr_TR.utf8. A odrazu buum, ERROR 500 v production:
Class ‚Nette\DI\Container‘ not found.
Ako je mozne, ze nevie najst Container ? Debuggovanie ukazalo problem. RobotLoader-i v tryLoad() riadok:
// $type = 'Nette\DI\Container'
$type = ltrim(strtolower($type), '\\'); // $type = 'nette\dI\container' a nie 'nette\di\container'
Zrejme nejaka turecka vychytavka. Ale PHP manual pre strtolower vysvetluje:
Note that ‚alphabetic‘ is determined by the current locale. This means that in i.e. the default „C“ locale, characters such as umlaut-A (Ä) will not be converted.
Takze toto je nebezpecna vec a zrejme je potrebne, aby v tryLoad bol lowercasing rieseny funkciou, ktora nie je zavisla na current locale. Myslim, ze by vhodnou alternativou mohlo byt:
mb_strtolower($type, 'UTF-8')
- edke
- Člen | 198
WOW, tak nasiel som related bugreport 18556 na bugs.php.net a zaver ? Bug bol nahlaseny 25. jula 2002 !!!! A vyzera ze bug sa bez akychkolvek zdravotnych problemov dozije 10 narodenin !!
Well done, PHP Team !
Jediny „workaround“ (ak sa to da nazvat ako workaround) je toto:
setlocale(LC_ALL, 'tr_TR');
setlocale(LC_CTYPE, 'en_US');
Editoval edke (18. 4. 2012 14:54)
- David Grudl
- Nette Core | 8249
Funkce strtolower je použita na mnoha místech, takže použij ten workaround.
- edke
- Člen | 198
David Grudl wrote:
Funkce strtolower je použita na mnoha místech, takže použij ten workaround.
Jo, uz som to spravil tak. Vyzera ze si v tom nevinne, toto je vec PHP resp. mozno samotneho tr_TR locale a teda mozno ani nefixovatelne. Dufam len, ze nebudem potrebovat case conversion v turectine :-)