Перевод веб-приложений, методы и инструменты - PullRequest
14 голосов
/ 23 марта 2010

Я разработал веб-приложение.В будущем он должен быть переведен на языки, отличные от английского, и в идеале переводчикам не нужно знать HTML / JS / C ++ для обеспечения перевода.Серверная часть веб-приложения написана на C ++, и большая часть локализованного текста находится в файлах HTML.

Мой вопрос: Какие существуют подходы к переводу веб-приложений? -

  • Существуют ли какие-либо инструменты, которые позволили бы переводчику, который не понимает HTML, переводить сайт?
  • Должен ли я написать приложение, которое извлекает локализованный текст из файла HTMLи можно ли заменить переведенный текст?
  • Вы просто предоставляете html-файл своим переводчикам для локализации?

Я знаю, что вопрос не является строгосвязанное с программированием, но решение может включать программирование и может потребовать некоторой программной инженерии.

Ответы [ 6 ]

19 голосов
/ 01 апреля 2010

Имея некоторый опыт в локализации приложений, я могу сказать вам следующее:

  • У любого переводчика, на которого вы можете положиться, не будет проблем с HTML (при условии, что перевод не сломаетдизайн)
  • Большинство профессиональных переводчиков используют приложения памяти переводов (например, Transit, Trados), которые могут анализировать многие форматы документов (XML, HTML, PDF, .DOC и т. д.) и отделять разметку от содержимого.Они доставят переведенную копию в том же формате, что и оригинал.
  • Все переводимые сообщения, которые используются в вашем программном коде, должны быть изолированы в пакетах ресурсов.Почти все популярные фреймворки веб-приложений имеют соответствующие средства.Пакеты обычно представляют собой простые текстовые файлы с парами ключ / значение.Переводчик не должен видеть код.
  • Сообщения в пакетах ресурсов могут быть форматирующими строками для функций, подобных printf.В этом случае вам следует документировать ожидаемых «наполнителей».
  • Когда вы предоставляете комплекты ресурсов переводчикам, обязательно приложите инструкции, как получить тексты в интерфейсе приложения, чтобы переводчик знал контекст данного сообщения.
  • Если естьЭтикетки не должны превышать длину, вы должны сообщить об этом заранее.
  • Если приложение использует специфическую для компании терминологию, вы должны предоставить глоссарий, чтобы перевод был согласованным.
  • Делайте все возможное, чтобы избавиться от текстов на изображениях.Это будет ваша головная боль.
  • Если вы переводите с английского, вы можете столкнуться с необходимостью ввести дополнительную логику, чтобы охватить грамматические особенности целевого языка (правильный регистр, пол)
  • itочень умен, чтобы хранить текст руководства пользователя и подобные тексты в простом формате XML (подмножество XHTML, DOCBOOK) и применять XSL-преобразование для получающегося HTML.Это позволяет легко перенести перевод на другой язык и подтвердить формат документа.

Список, безусловно, не зависит от веб-приложения.

3 голосов
/ 29 марта 2010

Прежде всего, сохраняйте каждую переводимую единицу текста в уникально идентифицированном теге div на каждой веб-странице.Сохраните содержимое в таблице базы данных, в которой ключ и текстовое поле имеют идентификатор div и идентификатор языка.Разрешить базовую разметку HTML, но не использовать скрипт или стилизацию.

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

Сделайте так, чтобы ваше веб-приложение отображало уникальные теги div или span из базы данных на основе предпочтений языка.

У вас может быть отдельное приложение, которое отображает текст по умолчанию (например, английский), а затем имеет текстовую область для перевода переводчиком.После ввода этого тега div можно отобразить на языке по выбору пользователя.

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

1 голос
/ 01 апреля 2010

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

На уровне пользовательского интерфейса вы переводите текст метки, текст кнопки, заголовок таблицы, DropDown и параметры меню в соответствующий текст на другом языке.

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

Я использовал технику манипуляции с jQuery DOM для перевода текста в зависимости от выбора, сделанного пользователем. Я сохранил весь текст и соответствующий перевод в базу данных. Также используя профили asp.net, я сохранял предпочтения пользователей во время операций входа / выхода.

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

1 голос
/ 01 апреля 2010
            /****** Object:  Table [dbo].[LangInfo]    Script Date: 03/29/2010 14:58:37 ******/
            IF  EXISTS (SELECT * FROM sys.objects 
            WHERE object_id = OBJECT_ID(N'[dbo].[LangInfo]') AND type in (N'U'))
            DROP TABLE [dbo].[LangInfo]
            GO

            /****** Object:  Table [dbo].[LangInfo]    

            Script Date: 03/29/2010 14:58:37 ******/
            SET ANSI_NULLS ON
            GO

            SET QUOTED_IDENTIFIER ON
            GO

            CREATE TABLE [dbo].[LangInfo](
                [LangInfoId] [int] IDENTITY(1,1) NOT NULL,
                [CultureName] [varchar](10) NOT NULL,
                [DisplayName] [varchar](50) NULL,
                [ISO_639x_Value] [nchar](6) NULL,
                [CultureCode] [nvarchar](10) NULL,
                [CollationName] [varchar](50) NULL,
                [IsEnabledInApp] [bit] NULL,
                [CultureNameU] [varchar](10) NOT NULL,
             CONSTRAINT [PK_CultureInfo] PRIMARY KEY CLUSTERED 
            (
                [LangInfoId] ASC
            )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, 
            ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
            ) ON [PRIMARY]

            /*
            <doc> 
            Stores culture / country info and models culture formatting 
            </doc>
            */

            GO


    SET NOCOUNT ON;
    SET XACT_ABORT ON;
    GO

    SET IDENTITY_INSERT [dbo].[LangInfo] ON;
    BEGIN TRANSACTION;
    INSERT INTO [dbo].[LangInfo]([LangInfoId], [CultureName], [DisplayName], [ISO_639x_Value], [CultureCode], [CollationName], [IsEnabledInApp], [CultureNameU])
    SELECT 1, N'af-ZA', N'Afrikaans - South Africa', N'0x0436', N'AFK', NULL, 0, N'af_ZA' UNION ALL
    SELECT 2, N'sq-AL', N'Albanian - Albania', N'0x041C', N'SQI', NULL, 0, N'sq_AL' UNION ALL
    SELECT 3, N'ar-DZ', N'Arabic - Algeria', N'0x1401', N'ARG', NULL, 0, N'ar_DZ' UNION ALL
    SELECT 4, N'ar-BH', N'Arabic - Bahrain', N'0x3C01', N'ARH', NULL, 0, N'ar_BH' UNION ALL
    SELECT 5, N'ar-EG', N'Arabic - Egypt', N'0x0C01', N'ARE', NULL, 0, N'ar_EG' UNION ALL
    SELECT 6, N'ar-IQ', N'Arabic - Iraq', N'0x0801', N'ARI', NULL, 0, N'ar_IQ' UNION ALL
    SELECT 7, N'ar-JO', N'Arabic - Jordan', N'0x2C01', N'ARJ', NULL, 0, N'ar_JO' UNION ALL
    SELECT 8, N'ar-KW', N'Arabic - Kuwait', N'0x3401', N'ARK', NULL, 0, N'ar_KW' UNION ALL
    SELECT 9, N'ar-LB', N'Arabic - Lebanon', N'0x3001', N'ARB', NULL, 0, N'ar_LB' UNION ALL
    SELECT 10, N'ar-LY', N'Arabic - Libya', N'0x1001', N'ARL', NULL, 0, N'ar_LY' UNION ALL
    SELECT 11, N'ar-MA', N'Arabic - Morocco', N'0x1801', N'ARM', NULL, 0, N'ar_MA' UNION ALL
    SELECT 12, N'ar-OM', N'Arabic - Oman', N'0x2001', N'ARO', NULL, 0, N'ar_OM' UNION ALL
    SELECT 13, N'ar-QA', N'Arabic - Qatar', N'0x4001', N'ARQ', NULL, 0, N'ar_QA' UNION ALL
    SELECT 14, N'ar-SA', N'Arabic - Saudi Arabia', N'0x0401', N'ARA', NULL, 0, N'ar_SA' UNION ALL
    SELECT 15, N'ar-SY', N'Arabic - Syria', N'0x2801', N'ARS', NULL, 0, N'ar_SY' UNION ALL
    SELECT 16, N'ar-TN', N'Arabic - Tunisia', N'0x1C01', N'ART', NULL, 0, N'ar_TN' UNION ALL
    SELECT 17, N'ar-AE', N'Arabic - United Arab Emirates', N'0x3801', N'ARU', NULL, 0, N'ar_AE' UNION ALL
    SELECT 18, N'ar-YE', N'Arabic - Yemen', N'0x2401', N'ARY', NULL, 0, N'ar_YE' UNION ALL
    SELECT 19, N'hy-AM', N'Armenian - Armenia', N'0x042B', N' ', NULL, 0, N'hy_AM' UNION ALL
    SELECT 20, N'Cy-az-AZ', N'Azeri (Cyrillic) - Azerbaijan', N'0x082C', N' ', NULL, 0, N'Cy_az_AZ' UNION ALL
    SELECT 21, N'Lt-az-AZ', N'Azeri (Latin) - Azerbaijan', N'0x042C', N' ', NULL, 0, N'Lt_az_AZ' UNION ALL
    SELECT 22, N'eu-ES', N'Basque - Basque', N'0x042D', N'EUQ', NULL, 0, N'eu_ES' UNION ALL
    SELECT 23, N'be-BY', N'Belarusian - Belarus', N'0x0423', N'BEL', NULL, 0, N'be_BY' UNION ALL
    SELECT 24, N'bg-BG', N'Bulgarian - Bulgaria', N'0x0402', N'BGR', NULL, 1, N'bg_BG' UNION ALL
    SELECT 25, N'ca-ES', N'Catalan - Catalan', N'0x0403', N'CAT', NULL, 0, N'ca_ES' UNION ALL
    SELECT 26, N'zh-CN', N'Chinese - China', N'0x0804', N'CHS', NULL, 0, N'zh_CN' UNION ALL
    SELECT 27, N'zh-HK', N'Chinese - Hong Kong SAR', N'0x0C04', N'ZHH', NULL, 0, N'zh_HK' UNION ALL
    SELECT 28, N'zh-MO', N'Chinese - Macau SAR', N'0x1404', N' ', NULL, 0, N'zh_MO' UNION ALL
    SELECT 29, N'zh-SG', N'Chinese - Singapore', N'0x1004', N'ZHI', NULL, 0, N'zh_SG' UNION ALL
    SELECT 30, N'zh-TW', N'Chinese - Taiwan', N'0x0404', N'CHT', NULL, 0, N'zh_TW' UNION ALL
    SELECT 31, N'zh-CHS', N'Chinese (Simplified)', N'0x0004', N' ', NULL, 0, N'zh_CHS' UNION ALL
    SELECT 32, N'zh-CHT', N'Chinese (Traditional)', N'0x7C04', N' ', NULL, 0, N'zh_CHT' UNION ALL
    SELECT 33, N'hr-HR', N'Croatian - Croatia', N'0x041A', N'HRV', NULL, 0, N'hr_HR' UNION ALL
    SELECT 34, N'cs-CZ', N'Czech - Czech Republic', N'0x0405', N'CSY', NULL, 0, N'cs_CZ' UNION ALL
    SELECT 35, N'da-DK', N'Danish - Denmark', N'0x0406', N'DAN', NULL, 0, N'da_DK' UNION ALL
    SELECT 36, N'div-MV', N'Dhivehi - Maldives', N'0x0465', N' ', NULL, 0, N'div_MV' UNION ALL
    SELECT 37, N'nl-BE', N'Dutch - Belgium', N'0x0813', N'NLB', NULL, 0, N'nl_BE' UNION ALL
    SELECT 38, N'nl-NL', N'Dutch - The Netherlands', N'0x0413', N' ', NULL, 0, N'nl_NL' UNION ALL
    SELECT 39, N'en-AU', N'English - Australia', N'0x0C09', N'ENA', NULL, 0, N'en_AU' UNION ALL
    SELECT 40, N'en-BZ', N'English - Belize', N'0x2809', N'ENL', NULL, 0, N'en_BZ' UNION ALL
    SELECT 41, N'en-CA', N'English - Canada', N'0x1009', N'ENC', NULL, 0, N'en_CA' UNION ALL
    SELECT 42, N'en-CB', N'English - Caribbean', N'0x2409', N' ', NULL, 0, N'en_CB' UNION ALL
    SELECT 43, N'en-IE', N'English - Ireland', N'0x1809', N'ENI', NULL, 0, N'en_IE' UNION ALL
    SELECT 44, N'en-JM', N'English - Jamaica', N'0x2009', N'ENJ', NULL, 0, N'en_JM' UNION ALL
    SELECT 45, N'en-NZ', N'English - New Zealand', N'0x1409', N'ENZ', NULL, 0, N'en_NZ' UNION ALL
    SELECT 46, N'en-PH', N'English - Philippines', N'0x3409', N' ', NULL, 0, N'en_PH' UNION ALL
    SELECT 47, N'en-ZA', N'English - South Africa', N'0x1C09', N'ENS', NULL, 0, N'en_ZA' UNION ALL
    SELECT 48, N'en-TT', N'English - Trinidad and Tobago', N'0x2C09', N'ENT', NULL, 0, N'en_TT' UNION ALL
    SELECT 49, N'en-GB', N'English - United Kingdom', N'0x0809', N'ENG', NULL, 0, N'en_GB' UNION ALL
    SELECT 50, N'en-US', N'English - United States', N'0x0409', N'ENU', NULL, 1, N'en_US'
    COMMIT;
    RAISERROR (N'[dbo].[LangInfo]: Insert Batch: 1.....Done!', 10, 1) WITH NOWAIT;
    GO

    BEGIN TRANSACTION;
    INSERT INTO [dbo].[LangInfo]([LangInfoId], [CultureName], [DisplayName], [ISO_639x_Value], [CultureCode], [CollationName], [IsEnabledInApp], [CultureNameU])
    SELECT 51, N'en-ZW', N'English - Zimbabwe', N'0x3009', N' ', NULL, 0, N'en_ZW' UNION ALL
    SELECT 52, N'et-EE', N'Estonian - Estonia', N'0x0425', N'ETI', NULL, 0, N'et_EE' UNION ALL
    SELECT 53, N'fo-FO', N'Faroese - Faroe Islands', N'0x0438', N'FOS', NULL, 0, N'fo_FO' UNION ALL
    SELECT 54, N'fa-IR', N'Farsi - Iran', N'0x0429', N'FAR', NULL, 0, N'fa_IR' UNION ALL
    SELECT 55, N'fi-FI', N'Finnish - Finland', N'0x040B', N'FIN', N'Finnish_Swedish_CI_AS', 1, N'fi_FI' UNION ALL
    SELECT 56, N'fr-BE', N'French - Belgium', N'0x080C', N'FRB', NULL, 0, N'fr_BE' UNION ALL
    SELECT 57, N'fr-CA', N'French - Canada', N'0x0C0C', N'FRC', NULL, 0, N'fr_CA' UNION ALL
    SELECT 58, N'fr-FR', N'French - France', N'0x040C', N' ', NULL, 0, N'fr_FR' UNION ALL
    SELECT 59, N'fr-LU', N'French - Luxembourg', N'0x140C', N'FRL', NULL, 0, N'fr_LU' UNION ALL
    SELECT 60, N'fr-MC', N'French - Monaco', N'0x180C', N' ', NULL, 0, N'fr_MC' UNION ALL
    SELECT 61, N'fr-CH', N'French - Switzerland', N'0x100C', N'FRS', NULL, 0, N'fr_CH' UNION ALL
    SELECT 62, N'gl-ES', N'Galician - Galician', N'0x0456', N' ', NULL, 0, N'gl_ES' UNION ALL
    SELECT 63, N'ka-GE', N'Georgian - Georgia', N'0x0437', N' ', NULL, 0, N'ka_GE' UNION ALL
    SELECT 64, N'de-AT', N'German - Austria', N'0x0C07', N'DEA', NULL, 0, N'de_AT' UNION ALL
    SELECT 65, N'de-DE', N'German - Germany', N'0x0407', N' ', NULL, 0, N'de_DE' UNION ALL
    SELECT 66, N'de-LI', N'German - Liechtenstein', N'0x1407', N'DEC', NULL, 0, N'de_LI' UNION ALL
    SELECT 67, N'de-LU', N'German - Luxembourg', N'0x1007', N'DEL', NULL, 0, N'de_LU' UNION ALL
    SELECT 68, N'de-CH', N'German - Switzerland', N'0x0807', N'DES', NULL, 0, N'de_CH' UNION ALL
    SELECT 69, N'el-GR', N'Greek - Greece', N'0x0408', N'ELL', NULL, 0, N'el_GR' UNION ALL
    SELECT 70, N'gu-IN', N'Gujarati - India', N'0x0447', N' ', NULL, 0, N'gu_IN' UNION ALL
    SELECT 71, N'he-IL', N'Hebrew - Israel', N'0x040D', N'HEB', NULL, 0, N'he_IL' UNION ALL
    SELECT 72, N'hi-IN', N'Hindi - India', N'0x0439', N'HIN', NULL, 0, N'hi_IN' UNION ALL
    SELECT 73, N'hu-HU', N'Hungarian - Hungary', N'0x040E', N'HUN', NULL, 0, N'hu_HU' UNION ALL
    SELECT 74, N'is-IS', N'Icelandic - Iceland', N'0x040F', N'ISL', NULL, 0, N'is_IS' UNION ALL
    SELECT 75, N'id-ID', N'Indonesian - Indonesia', N'0x0421', N' ', NULL, 0, N'id_ID' UNION ALL
    SELECT 76, N'it-IT', N'Italian - Italy', N'0x0410', N' ', NULL, 0, N'it_IT' UNION ALL
    SELECT 77, N'it-CH', N'Italian - Switzerland', N'0x0810', N'ITS', NULL, 0, N'it_CH' UNION ALL
    SELECT 78, N'ja-JP', N'Japanese - Japan', N'0x0411', N'JPN', NULL, 0, N'ja_JP' UNION ALL
    SELECT 79, N'kn-IN', N'Kannada - India', N'0x044B', N' ', NULL, 0, N'kn_IN' UNION ALL
    SELECT 80, N'kk-KZ', N'Kazakh - Kazakhstan', N'0x043F', N' ', NULL, 0, N'kk_KZ' UNION ALL
    SELECT 81, N'kok-IN', N'Konkani - India', N'0x0457', N' ', NULL, 0, N'kok_IN' UNION ALL
    SELECT 82, N'ko-KR', N'Korean - Korea', N'0x0412', N'KOR', NULL, 0, N'ko_KR' UNION ALL
    SELECT 83, N'ky-KZ', N'Kyrgyz - Kazakhstan', N'0x0440', N' ', NULL, 0, N'ky_KZ' UNION ALL
    SELECT 84, N'lv-LV', N'Latvian - Latvia', N'0x0426', N'LVI', NULL, 0, N'lv_LV' UNION ALL
    SELECT 85, N'lt-LT', N'Lithuanian - Lithuania', N'0x0427', N'LTH', NULL, 0, N'lt_LT' UNION ALL
    SELECT 86, N'mk-MK', N'Macedonian (FYROM)', N'0x042F', N'MKD', NULL, 0, N'mk_MK' UNION ALL
    SELECT 87, N'ms-BN', N'Malay - Brunei', N'0x083E', N' ', NULL, 0, N'ms_BN' UNION ALL
    SELECT 88, N'ms-MY', N'Malay - Malaysia', N'0x043E', N' ', NULL, 0, N'ms_MY' UNION ALL
    SELECT 89, N'mr-IN', N'Marathi - India', N'0x044E', N' ', NULL, 0, N'mr_IN' UNION ALL
    SELECT 90, N'mn-MN', N'Mongolian - Mongolia', N'0x0450', N' ', NULL, 0, N'mn_MN' UNION ALL
    SELECT 91, N'nb-NO', N'Norwegian (Bokmål) - Norway', N'0x0414', N' ', NULL, 0, N'nb_NO' UNION ALL
    SELECT 92, N'nn-NO', N'Norwegian (Nynorsk) - Norway', N'0x0814', N' ', NULL, 0, N'nn_NO' UNION ALL
    SELECT 93, N'pl-PL', N'Polish - Poland', N'0x0415', N'PLK', NULL, 0, N'pl_PL' UNION ALL
    SELECT 94, N'pt-BR', N'Portuguese - Brazil', N'0x0416', N'PTB', NULL, 0, N'pt_BR' UNION ALL
    SELECT 95, N'pt-PT', N'Portuguese - Portugal', N'0x0816', N' ', NULL, 0, N'pt_PT' UNION ALL
    SELECT 96, N'pa-IN', N'Punjabi - India', N'0x0446', N' ', NULL, 0, N'pa_IN' UNION ALL
    SELECT 97, N'ro-RO', N'Romanian - Romania', N'0x0418', N'ROM', NULL, 0, N'ro_RO' UNION ALL
    SELECT 98, N'ru-RU', N'Russian - Russia', N'0x0419', N'RUS', NULL, 0, N'ru_RU' UNION ALL
    SELECT 99, N'sa-IN', N'Sanskrit - India', N'0x044F', N' ', NULL, 0, N'sa_IN' UNION ALL
    SELECT 100, N'Cy-sr-SP', N'Serbian (Cyrillic) - Serbia', N'0x0C1A', N' ', NULL, 0, N'Cy_sr_SP'
    COMMIT;
    RAISERROR (N'[dbo].[LangInfo]: Insert Batch: 2.....Done!', 10, 1) WITH NOWAIT;
    GO

    BEGIN TRANSACTION;
    INSERT INTO [dbo].[LangInfo]([LangInfoId], [CultureName], [DisplayName], [ISO_639x_Value], [CultureCode], [CollationName], [IsEnabledInApp], [CultureNameU])
    SELECT 101, N'Lt-sr-SP', N'Serbian (Latin) - Serbia', N'0x081A', N' ', NULL, 0, N'Lt_sr_SP' UNION ALL
    SELECT 102, N'sk-SK', N'Slovak - Slovakia', N'0x041B', N'SKY', NULL, 0, N'sk_SK' UNION ALL
    SELECT 103, N'sl-SI', N'Slovenian - Slovenia', N'0x0424', N'SLV', NULL, 0, N'sl_SI' UNION ALL
    SELECT 104, N'es-AR', N'Spanish - Argentina', N'0x2C0A', N'ESS', NULL, 0, N'es_AR' UNION ALL
    SELECT 105, N'es-BO', N'Spanish - Bolivia', N'0x400A', N'ESB', NULL, 0, N'es_BO' UNION ALL
    SELECT 106, N'es-CL', N'Spanish - Chile', N'0x340A', N'ESL', NULL, 0, N'es_CL' UNION ALL
    SELECT 107, N'es-CO', N'Spanish - Colombia', N'0x240A', N'ESO', NULL, 0, N'es_CO' UNION ALL
    SELECT 108, N'es-CR', N'Spanish - Costa Rica', N'0x140A', N'ESC', NULL, 0, N'es_CR' UNION ALL
    SELECT 109, N'es-DO', N'Spanish - Dominican Republic', N'0x1C0A', N'ESD', NULL, 0, N'es_DO' UNION ALL
    SELECT 110, N'es-EC', N'Spanish - Ecuador', N'0x300A', N'ESF', NULL, 0, N'es_EC' UNION ALL
    SELECT 111, N'es-SV', N'Spanish - El Salvador', N'0x440A', N'ESE', NULL, 0, N'es_SV' UNION ALL
    SELECT 112, N'es-GT', N'Spanish - Guatemala', N'0x100A', N'ESG', NULL, 0, N'es_GT' UNION ALL
    SELECT 113, N'es-HN', N'Spanish - Honduras', N'0x480A', N'ESH', NULL, 0, N'es_HN' UNION ALL
    SELECT 114, N'es-MX', N'Spanish - Mexico', N'0x080A', N'ESM', NULL, 0, N'es_MX' UNION ALL
    SELECT 115, N'es-NI', N'Spanish - Nicaragua', N'0x4C0A', N'ESI', NULL, 0, N'es_NI' UNION ALL
    SELECT 116, N'es-PA', N'Spanish - Panama', N'0x180A', N'ESA', NULL, 0, N'es_PA' UNION ALL
    SELECT 117, N'es-PY', N'Spanish - Paraguay', N'0x3C0A', N'ESZ', NULL, 0, N'es_PY' UNION ALL
    SELECT 118, N'es-PE', N'Spanish - Peru', N'0x280A', N'ESR', NULL, 0, N'es_PE' UNION ALL
    SELECT 119, N'es-PR', N'Spanish - Puerto Rico', N'0x500A', N'ES', NULL, 0, N'es_PR' UNION ALL
    SELECT 120, N'es-ES', N'Spanish - Spain', N'0x0C0A', N' ', NULL, 0, N'es_ES' UNION ALL
    SELECT 121, N'es-UY', N'Spanish - Uruguay', N'0x380A', N'ESY', NULL, 0, N'es_UY' UNION ALL
    SELECT 122, N'es-VE', N'Spanish - Venezuela', N'0x200A', N'ESV', NULL, 0, N'es_VE' UNION ALL
    SELECT 123, N'sw-KE', N'Swahili - Kenya', N'0x0441', N' ', NULL, 0, N'sw_KE' UNION ALL
    SELECT 124, N'sv-FI', N'Swedish - Finland', N'0x081D', N'SVF', NULL, 0, N'sv_FI' UNION ALL
    SELECT 125, N'sv-SE', N'Swedish - Sweden', N'0x041D', N' ', NULL, 0, N'sv_SE' UNION ALL
    SELECT 126, N'syr-SY', N'Syriac - Syria', N'0x045A', N' ', NULL, 0, N'syr_SY' UNION ALL
    SELECT 127, N'ta-IN', N'Tamil - India', N'0x0449', N' ', NULL, 0, N'ta_IN' UNION ALL
    SELECT 128, N'tt-RU', N'Tatar - Russia', N'0x0444', N' ', NULL, 0, N'tt_RU' UNION ALL
    SELECT 129, N'te-IN', N'Telugu - India', N'0x044A', N' ', NULL, 0, N'te_IN' UNION ALL
    SELECT 130, N'th-TH', N'Thai - Thailand', N'0x041E', N'THA', NULL, 0, N'th_TH' UNION ALL
    SELECT 131, N'tr-TR', N'Turkish - Turkey', N'0x041F', N'TRK', NULL, 0, N'tr_TR' UNION ALL
    SELECT 132, N'uk-UA', N'Ukrainian - Ukraine', N'0x0422', N'UKR', NULL, 0, N'uk_UA' UNION ALL
    SELECT 133, N'ur-PK', N'Urdu - Pakistan', N'0x0420', N'URD', NULL, 0, N'ur_PK' UNION ALL
    SELECT 134, N'Cy-uz-UZ', N'Uzbek (Cyrillic) - Uzbekistan', N'0x0843', N' ', NULL, 0, N'Cy_uz_UZ' UNION ALL
    SELECT 135, N'Lt-uz-UZ', N'Uzbek (Latin) - Uzbekistan', N'0x0443', N' ', NULL, 0, N'Lt_uz_UZ' UNION ALL
    SELECT 136, N'vi-VN', N'Vietnamese - Vietnam', N'0x042A', N'VIT', NULL, 0, N'vi_VN'
    COMMIT;
    RAISERROR (N'[dbo].[LangInfo]: Insert Batch: 3.....Done!', 10, 1) WITH NOWAIT;
    GO

    SET IDENTITY_INSERT [dbo].[LangInfo] OFF;




--Since Developers derive from Humans ... 

/****** Object:  Table [dbo].[Msg]    
Script Date: 03/31/2010     21:07:41 ******/
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID    
(N'[dbo].[Msg]') AND type in (N'U'))
DROP TABLE [dbo].[Msg]
GO

/****** Object:  Table [dbo].[Msg]    
Script Date: 03/31/2010 21:07:41 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Msg](
[MsgId] [int] IDENTITY(1,1) NOT NULL,
[Txt][nvarchar](max) NOT NULL , 
 -- This is the Developers language ; )
 -- it is based , but not equal to the humans natural English language 
[Description] [varchar](max) NULL,
[IsGlobal] [bit] NULL,
[Txt_en_Us] [nvarchar](max) NULL,
[Txt_fi_Fi] [nvarchar](max) NULL , 
 CONSTRAINT [PK_Msg] PRIMARY KEY CLUSTERED 
(
    [MsgId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF,
  IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

 -- SET THE COLLATION FOR THE FINNISHI LANGUAGE
 ALTER  TABLE [dbo].[Msg]
 ALTER COLUMN [Txt_fi_FI] [nvarchar](4000)
 COLLATE Finnish_Swedish_CS_AI


 /* 
 <doc> Stores all the messages in the Application. When adding     
 new language a new column must be added </doc>
 */
 GO


 /****** Object:  Index [IX_Msg]    
Script Date: 03/31/2010 21:07:41 ******/
CREATE UNIQUE NONCLUSTERED INDEX [IX_Msg] ON [dbo].[Msg] 
(
    [MsgId] ASC
 )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
 SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, 
 ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON     [PRIMARY]
GO


--soon to come --> sql to get dynamically the vals

-- Get the list of all the English words 
-- and insert it .. 

    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'aA') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'aH') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'aI') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'aN') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'aU') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'aW') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'aX') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'aa') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'ab') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'ac') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'ad') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'ae') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'af') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'ag') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'ah') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'ai') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'aj') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'ak') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'al') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'am') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'an') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'ao') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'ap') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'aq') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'ar') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'as') ;
    INSERT INTO [dbo].[Msg] ([Txt]) VALUES ( N'at') ;



DECLARE @langCode nvarchar(8) 
set @langCode = 'en_US'

-- GET THE MESSAGES ONLY FOR THE DESIRED LANGUA
DECLARE @StrSqlCode nvarchar(max) 
set @StrSqlCode = 'SELECT Txt' + '_' + @langCode + ' from Msg      
where IsGlobal = 1'

exec ( @StrSqlCode) 
1 голос
/ 01 апреля 2010

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

Несмотря на то, что вы могли бы написать интерфейс для перевода, если вы в основном переводите пользовательский интерфейс приложения (в отличие от контента), то вышеупомянутый подход в сочетании с любым настольным приложением (их много, вы можете просто отправлять переводчики связками String, и они могут редактировать и возвращать) или, мой любимый в наши дни, Pootle (который является веб-интерфейсом и может передавать переводы непосредственно в SCM), может обеспечить дружественные интерфейсы

1 голос
/ 26 марта 2010

Лучший и самый профессиональный способ - предоставить веб-интерфейс для бюро переводов.Таким образом, вы можете отдать работу на аутсорсинг где угодно.

Также подумайте о внедрении пользовательского интерфейса в процесс разработки.Вы добавляете новые текстовые ресурсы в свое приложение, они автоматически публикуются в этом пользовательском интерфейсе.Агентства осуществляют перевод и помечают этот конкретный элемент как переведенный.Сборка собирает уже переведенные ресурсы и заменяет заглушки или тексты по умолчанию этими переводами.Если сообщается, что строка неправильно переведена, вы помечаете ее для повторной отправки.

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

Чтобы это работало, вам нужно хранить каждый переводимый фрагмент текста где-то особенным.Либо вы храните их в базе данных, либо храните в каком-то файле XML, вам нужны две вещи:

  • Интегрируйте эти ресурсы в процесс разработки.Например, когда вы компилируете проект, ресурсы извлекаются из этого хранилища и помещаются на свои места в коде, разметке или чем угодно, что вы делаете.

  • Предоставьте внешний доступ к этомуместо хранения.Добавить / удалить права только для себя, добавить / изменить переводы для существующих элементов для внешних пользователей.

...