I think it comes down to the fact that the predominate view of programming languages is that they are math and tools for conducting science/business. English was the lingua-fraca for science/business long before programming languages were around so it might have followed naturally that programming languages should be localized in English as well.
But it's hard to say, there are a lot of cultural elements at play. We see one right here in this very language that is trying to escape the English domain -- it doesn't have support for character accents native to the language it's trying to support. This limitation probably derives from the days when bytes were highly expensive, so character encodings had to be frugal with their use of memory. With one byte you can encode enough characters for the English alphabet, numbers, symbols, and control characters, but you're not going to have enough for all the combinations of accents. Just look at what went into the extended ASCII table: they made room for some common accented characters from western nations, but also allocated precious space for copyrights, trademarks, fractions, legal symbols, more mathematical operators, and currency symbols of the largest nations. More than a purely technical decision, this is a statement of priorities.
Again you see programming-as-math/science playing a role here; character encodings for mathematical symbols were given priority, but characters that could be used for communicating in other languages were disregarded. This is likely because the kinds of applications people were looking to use programming languages for were based in math/science, so those symbols were viewed as indispensable. I'm not saying this was wrong, btw, I'm just saying that's the way these things evolved.
This very early (circa 1960) decision still has rippling consequences even today, so it's clear momentum of early choices in computing plays a large role here.