This isn't quite an answer right now. But ECMA-402 now specifies (as of the spec's 2nd edition) the behavior of
String.prototype.toLocaleUpperCase. ECMA-402 changes the function to take a
locale argument (
undefined, string, or arraylike of locales) -- similar to what
Number.prototype.toLocaleString and the various other locale-sensitive functions in ECMA-262 take, when modified by ECMA-402 -- and behaves consistent with that locale. Once Node implements that (it doesn't right now), you can simply change
var str = "bira"; str.toLocaleUpperCase(); // "BIRA"
var str = "bira"; str.toLocaleUpperCase("tr-TR"); // BİRA
and be on your way.
(Disclaimer: I don't know Turkish at all, I just picked a word containing "i" off a Turkish word list, and I'm presuming locale-sensitive uppercasing works the way I expect it does, for the purpose of the example above.)