Robotloader->tryLoad($type) a strtolower pri locale tr_TR.utf8

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
edke
Člen | 198
+
0
-

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
+
0
-

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 | 8082
+
0
-

Funkce strtolower je použita na mnoha místech, takže použij ten workaround.

edke
Člen | 198
+
0
-

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 :-)