Just looks like a very long program to me, around 2,000 lines.
I had a program (several files compared with your one file), that grew to 2,700 lines and took 27K FLASH. It had lots of strings for LCD but I bet the difference between mine and your program is includes. I didn't have that many includes.
Two suggestions I can think off:
1) USE a 24LC512 EEPROM to store your English letters. Hope this won't slow you down too much. You'll have to try.
2) See if you're overloading any functions. Try not to overload. Say you have a constructor chips(int) and another one chips(long). If you used both, just because you didn't bother to convert long into int, the compiler stores both constructors in FLASH.
This can get significant with Serial.print(). Say you're already using the awesome sprintf, you should NOT use serial.print(int or float or long), only use serial.print(string). Use sprintf to construct a string and print with serial.print(string). Try serial.print(string) and serial.print(float) in one program and get rid of serial.print(float)
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.print("3.14");
// Serial.print(3.14);
}
This above program is only 1,894 on my 2009 and 3,726 if I uncomment the second line in loop!!!