Yeah, I see what you mean. I can't supply any details about how SF3 does it, but normally how this is done is to have a "formatting sequence" (in the case of the standard C printf function, these would be strings like %d, %s, %x, etc., but SF3 is almost certainly using something else) in the string, and extra parameters passed to the display routine that supply the address or value of the thing to substitute for the formatting sequence. In the case of a string, it would be passing the memory address and possibly the length of the string to substitute (item/character/spell name). Probably what happens is something like this:
- Player triggers a "get item" event
- Game calls the "get item" subroutine with the reference number for the particular item obtained - for the sake of illustration I'll say it's item #42
- The subroutine does any checking and sorting necessary to add one of item #42 to the inventory
- The subroutine loads the 42nd entry in a table of string addresses for item names, and passes this address and the address of the common string to a display routine
Unless you're going to somehow manage to replace all of these strings with ones of equal length, you'll need to know the location and format of this table so that you can generate a new one pointing to the proper addresses for your translated strings. There are several possible approaches to finding it. One is to locate the subroutine in question and find the address of the table there. Another would be to run the game in an emulator, do a RAM dump, find the actual strings, then search for the offsets where each string begins in order to find the table.
I've never looked at SF3's code, but the situation is probably at least similar to what I've described. If you're not comfortable looking at code then you'll have to talk to somebody who will hack it for you. If you want to give it a shot yourself I'd be happy to answer any other questions you have.