Бросание исключений в многоязычном приложении (например, на английском и французском) - PullRequest
3 голосов
/ 06 мая 2011

В своих приложениях я использую исключение (я) для управления потоком.

Я использую что-то вроде этого:

throw new Exception("Unable to add new user, user already exist");

Этот метод идеально подходит в приложении с одним языком,Однако, когда я собираюсь сделать многоязычное приложение, я не знаю, что делать.

Предыдущая строка кода должна создать сообщение на языке по умолчанию, который использует пользователь.

Каковы некоторые возможные решения ??

Ответы [ 3 ]

5 голосов
/ 06 мая 2011

В приложении, которое будет использоваться с более чем одним человеческим языком, никогда не задавайте строки с жестким кодом, с которыми пользователь может столкнуться. Они должны быть в каком-то файле ресурсов. При желании вы можете жестко закодировать такие вещи, как операторы SQL и информацию о внутренней регистрации, но ничего не увидит пользователь. Я знаю, как использовать файлы строковых ресурсов в Microsoft Windows (я интернационализировал два приложения C # и одно приложение C ++), и должно быть нечто подобное для Mac OSX, Linux и любых других ОС, которые вы, вероятно, будете использовать.

В таком случае лучше выкинуть что-то вроде исключения UserAlreadyExists и передать его какой-то процедуре отображения ошибок, когда вы ее поймаете. В противном случае вы имеете дело с пользовательским интерфейсом в части обработки вашего кода, и это обычно не то, что вы хотите сделать. Не беспокойтесь о множественности исключений, поскольку, если вы локализуете приложение, у вас будет множество ссылок на файл строковых ресурсов.

1 голос
/ 06 мая 2011

Общее решение состоит в том, что у вас есть некоторые настройки для указания текущего языка, на котором должно отображаться сообщение. Затем у вас есть файл или таблица базы данных (хотя это может быть не очень хорошо, если сообщения об ошибках подключения к базе данных хранятся в база данных - вы хотите, чтобы сообщения об ошибках были как можно более доступными, - возможно, лучше всего было бы загрузить их ВСЕ в некоторый кеш при запуске приложения) где-нибудь, где содержатся все ваши строки ошибок, и на нескольких языках, например:

userExists.English = "Unable to add new user, user already exist"
userExists.Spanish = "<my Spanish isn't good enough to even try>"
userExists.ClassicalMongolian = ...

Тогда, когда вы выбрасываете исключение, у вас есть что-то вроде

//currentLanguage indicates what the language of the current session is.
//the function lookupExceptionString must be able to look up the
//correct string based on the value of currentLanguage
exceptionString = lookupExceptionString(currentLanguage);
throw new Exception(exceptionString );

... Но, к счастью для вас, есть фреймворки, которые уже многое делают. Выполните поиск в Интернете по запросу "php internationalization" или "php i18n". Первая найденная мной ссылка была такой:

http://php -flp.sourceforge.net / getting_started_english.htm

...