Русский
Русский
English
Статистика
Реклама

Локализация

Сломался сайт или вас забанили?

03.11.2020 04:15:37 | Автор: admin

По всем канонам жанра, когда вы сталкиваетесь с ошибкой на сайте, из-за которой абсолютно ничего не работает, вы прикидываете уровни абстракции на которых вероятнее всего эта ошибка произошла. И если раньше в списке моих приоритетов была ошибка в коде сайта, то теперь в первую очередь я думаю, что попал в условный Shadow Ban. Особенно, если речь идет о заграничных сервисах. Давайте посмотрим почему так происходит, и что можно с этим поделать.


Все больше популярных сайтов в интернете прибегают к теневому бану в том или ином виде. Причем его изощренность зависит от каждого конкретного случая. Это может быть пустая страница, как будто сервер умер, сообщение 500 об ошибке сервера, сообщение об ошибке 404, неправильные редиректы при попытке отправить заполненную форму. Суть одна владелец сайта не хочет, чтобы вы, ваша страна, ваша подсеть или IP адрес, пользовались его сайтом. Но при этом внятного объяснения давать не хочет, потому что оно для кого-то может звучать оскорбительно, а то и неприемлемо с точки зрения местного законодательства.


Как правило есть несколько основных причин почему ваш IP адрес или отпечаток броузера забанен:


  • вы используете TOR или публичный прокси, VPN

  • адрес принадлежит хостинг-провайдеру в датацентре, а не интернет-провайдеру, предоставляющему услугу доступа в интернет обычным людям

  • с вашего IP адреса или подсети идут хакерские атаки, брутфорсы, иная противоправная деятельность

  • у вас IPv6

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

  • автоматическая система безопасности на основании скрытых критериев решила, что вы верблюд, не имеющий справки об обратном


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


И да, всегда есть вероятность, что просто локализация на сайте сделана настолько криво, что он молча и внезапно падает. Особенно это касается США, где традиция локализации слаба, а 256 байт хватит всем. Но, поскольку сайт не работает у тех, у кого он падает, они не могут найти контакты и написать гневное письмо в техподдержку. Это тоже надо учитывать. Как и то, что техподдержка будет отвечать в духе Sorry, we couldn't help you. Seems problem is on your side. Thank you for choosing us! Bgggeeeee...


Вот алгоритм поведения, чтобы понять, можете ли вы воспользоваться сервисом, обойдя Shadow Ban, или он действительно сломан.


1) Выключите TOR или VPN, если они у вас имеются.


2) Скачайте Google Chrome с сайта Google, именно официальную сборку, без плагинов. Создайте новый чистый профиль броузера и попробуйте проделать на сайте требуемые действия из под этого профиля.


3) Поменяйте язык системы на английский, или установите локаль en_US, или запустите броузер с локалью en_US.


4) Попробуйте воспользоваться бесплатным или платным VPN, или прокси, чтобы выходный адрес VPN был в той же стране, что и ваш сервис. Предпочтителен свой VPN на арендованной VPS в той же стране. Обязателен Google Chrome с чистым профилем, иначе можете потерять купленный IP в никуда, система безопасности просто добавит его в бан по отпечатку броузера.


5) Последний рубеж, если вам ОЧЕНЬ надо. Виртуальная машина или отдельный компьютер с Windows 8-10, язык системы установлен в язык региона, где находится сайт. Доступ к сайту через IE или Chrome с чистым профилем, через приватный прокси, чей IP числится за провайдером интернета, а не датацентра, а сам прокси находится в той же стране, что и сайт.


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


И конечно же читайте комментарии, там тоже могут быть полезные советы.

Подробнее..

Автоматизируем локализацию макетов в Figma

29.12.2020 14:10:26 | Автор: admin
В один прекрасный момент наши дизайнеры решили, что пора обновить обложки
нашего приложения в Apple Store и Google Play. На всех 17 языках.

Это история про то, как нырнуть в незнакомый язык программирования, незнакомую платформу и незнакомую задачу, собрать много всего интересного, помочь коллегам и оставить след в open source community.

мемасик



обложки

После подготовки макетов в Figma пришло осознание страшного факта: мы должны поддержать 17 различных языков! Причем максимально качественно и согласованно, так что автоматические переводы через Google Translate (или даже сервис Crowdin) нам не подходили. Что ж, задача была поручена ответственным людям, и вот через некоторое время у нас появилась табличка Google Sheets с переводами всех фраз.

таблица с переводами

Первая попытка ручной замены текстов в макетах привела к следующему:

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

И задача резко обрела пугающий объем и сложность. Требовалась автоматизация.

Конечно же, хотелось бы воспользоваться готовым решением. Однако из рассмотренных (Crowdin, Localize, Yandex.Translate) ни одно нас не устроило, так как они не позволяют использовать кастомизированные переводы и полностью игнорируют форматирование (подсветку, выделения). А в идеале решение должно было давать практически готовый результат, не требующий вмешательства человека.

Как известно, подобные проблемы лучше всего решаются за чашечкой чая в компании коллег-разработчиков на уютной офисной кухне. Несмотря на то, что в нашей команде нет разработчиков, хорошо знакомых с Figma и ее возможностями, никто не брезгует TypeScript'ом, и все способны написать на нем плагин по документации. Даже Golang и Kotlin разработчики заднего конца. Более того, небольшой опыт у некоторых уже имелся.

Написание плагинов для Figma


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

Разработка плагина ведется исключительно в десктоп-версии Figma, которая по сути является обычным WebView, поэтому разработчику доступна консоль JavaScript и прочие привычные инструменты.

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

Автоматический перевод по словарю


Автозамена


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

Итак, для начала нам нужно загрузить словарь. Поскольку заморачиваться с подключением сторонних модулей на первом этапе не хотелось, решил выбрать самый простой формат, в который можно выгрузить имеющуюся табличку из Google Sheets. Между CSV и TSV выбор пал на TSV: в текстах могли присутствовать запятые, это усложнило бы парсинг.

Парсим табличку
type Dictionary = {    header: string[];    rows: string[][];};async function parseDictionary(serializedDictionary: string): Promise<Dictionary> {    const table = serializedDictionary.split('\n').map(line => line.split('\t').map(field => field.trim()));    if (table.length === 0) {        throw {error: 'no header in the dictionary'};    }    // в заголовке будут языковые коды    const header = table[0];    const expectedColumnCount = header.length;    const rows = table.slice(1, table.length);    console.log('Dictionary:', {header, rows});    rows.forEach((row, index) => {        if (row.length != expectedColumnCount) {            throw {error: 'row ' + (index + 2) + ' of the dictionary has ' + row.length + ' (not ' + expectedColumnCount + ') columns'};        }    });    return {header, rows};}

Строим словарь для выбранной пары языков
type Mapping = {    [source: string]: string;};async function getMapping(dictionary: Dictionary, sourceLanguage: string, targetLanguage: string): Promise<Mapping> {    const sourceColumnIndex = dictionary.header.indexOf(sourceLanguage);    if (sourceColumnIndex == -1) {        throw {error: sourceLanguage + ' not listed in [' + dictionary.header + ']'};    }    const targetColumnIndex = dictionary.header.indexOf(targetLanguage);    if (targetColumnIndex == -1) {        throw {error: targetLanguage + ' not listed in [' + dictionary.header + ']'};    }    const result: Mapping = {};    dictionary.rows.forEach(row => {        const sourceString = row[sourceColumnIndex];        const targetString = row[targetColumnIndex];        if (targetString.trim() !== '') {            if (sourceString in result) {                throw {error: 'multiple translations for `' + sourceString + '` in the dictionary'};            }            result[sourceString] = targetString;        }    });    // крайне удобный способ отладки в случае с Figma    console.log('Extracted mapping:', result);    return result;}

Подставляем переводы во все текстовые ноды по прямому совпадению
type Replacement = null | {    // в какой ноде заменяем текст    node: TextNode;    // на что заменяем    translation: string;};type ReplacementFailure = {    // в какой ноде произошла ошибка    nodeId: string;    // описание самой ошибки    error: string;};type ReplacementAttempt = Replacement | ReplacementFailure;// Settings получаются элементарно из UIasync function translateSelection(settings: Settings): Promise<void> {    const dictionary = await parseDictionary(settings.serializedDictionary);    const mapping = await getMapping(dictionary, settings.sourceLanguage, settings.targetLanguage);    await replaceAllTexts(mapping);}async function replaceAllTexts(mapping: Mapping): Promise<void> {    const textNodes = await findSelectedTextNodes();    let replacements = (await Promise.all(textNodes.map(node => computeReplacement(node, mapping)))).filter(r => r !== null);    let failures = replacements.filter(r => 'error' in r) as ReplacementFailure[];    if (failures.length > 0) {        console.log('Failures:', failures);        throw {error: 'found some untranslatable nodes', failures};    }    replacements.forEach(replaceText);}async function findSelectedTextNodes(): Promise<TextNode[]> {    const result: TextNode[] = [];    figma.currentPage.selection.forEach(root => {        if (root.type === 'TEXT') {            // либо в выделение попала текстовая нода            result.push(root as TextNode);        } else if ('findAll' in root) {            // либо фрейм/группа,            // тогда в ней можно найти все текстовые подноды встроенной функцией findAll            (root as ChildrenMixin).findAll(node => node.type === 'TEXT').forEach(node => result.push(node as TextNode));        }    });    return result;}async function computeReplacement(node: TextNode, mapping: Mapping): Promise<ReplacementAttempt> {    // текст ноды может содержать лишние пробелы и переносы слов,    // и это не должно влиять на возможность перевода,    // поэтому предварительно нормализуем строки    const content = normalizeContent(node.characters);    if (!(content in mapping)) {        // не нашли перевод? жаль        return {nodeId: node.id, error: 'No translation for `' + content + '`'};    }    const result: Replacement = {        node,        translation: mapping[content],    };    console.log('Replacement:', result);    return result;}function normalizeContent(content: string): string {    // интересные факты из жизни Unicode:    //   \u2028  разделитель строк (но не \n)    //   \u202F  невидимый разделитель пробелов (?)    // по-хорошему, стоит добавить и прочие разделители,    // но они на практике пока не встречались    return content.replace(/[\u000A\u00A0\u2028\u202F]/g, ' ').replace(/ +/g, ' ');}async function replaceText(replacement: Replacement): Promise<void> {    const {node, translation} = replacement;    // интересная особенность Figma:    // перед тем, как менять что-либо в текстовой ноде, нужно предварительно    // загрузить все шрифты, которые в ней используются    await loadFontsForNode(node);    node.characters = translation;}async function loadFontsForNode(node: TextNode): Promise<void> {    await Promise.all(Array.from({length: node.characters.length}, (_, k) => k).map(i => {        // очень забавный момент, конечно:        // Figma позволяет узнать свойства любой секции текста в ноде,        // при этом если в секции оно неоднородно (например, используется несколько шрифтов),        // то возвращается специальный объект mixed        return figma.loadFontAsync(node.getRangeFontName(i, i + 1) as FontName);    }));}

Вся эта конструкция довольно быстро заработала, что порадовало и вселило уверенность.

базовая реализация

Исключения


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

исключения

Имена собственные, числа, валюты, какие-то символы, эмодзи Не беда. Достаточно задать исключения в виде списка регулярок.

Учитываем исключения
async function translateSelection(settings: Settings): Promise<void> {    const dictionary = await parseDictionary(settings.serializedDictionary);    const mapping = await getMapping(dictionary, settings.sourceLanguage, settings.targetLanguage);    // дополнительно учитываем список исключений    const exceptions = await parseExceptions(settings.serializedExceptions);    await replaceAllTexts(mapping, exceptions);}async function parseExceptions(serializedExceptions: string): Promise<RegExp[]> {    return serializedExceptions.split('\n').filter(pattern => pattern !== '').map(pattern => {        try {            return new RegExp(pattern);        } catch (_) {            throw {error: 'invalid regular expression `' + pattern + '`'};        }    });}async function replaceAllTexts(mapping: Mapping, exceptions: RegExp[]): Promise<void> {    const textNodes = await findSelectedTextNodes();    // пробрасываем список в функцию вычисления подстановки    let replacements = (await Promise.all(textNodes.map(node => computeReplacement(node, mapping, exceptions)))).filter(r => r !== null);    let failures = replacements.filter(r => 'error' in r) as ReplacementFailure[];    if (failures.length > 0) {        console.log('Failures:', failures);        throw {error: 'found some untranslatable nodes', failures};    }    replacements.forEach(replaceText);}async function computeReplacement(node: TextNode, mapping: Mapping, exceptions: RegExp[]): Promise<ReplacementAttempt> {    const content = normalizeContent(node.characters);    // если содержимое подходит под одну из регулярок    if (keepAsIs(content, exceptions)) {        // то говорим, что заменять текст в этой ноде не нужно совсем        return null;    }    if (!(content in mapping)) {        // не нашли перевод? жаль        return {nodeId: node.id, error: 'No translation for `' + content + '`'};    }    const result: Replacement = {        node,        translation: mapping[content],    };    console.log('Replacement:', result);    return result;}function keepAsIs(content: string, exceptions: RegExp[]): boolean {    for (let regex of exceptions) {        if (content.match(regex)) {            return true;        }    }    return false;};

Форматирование


Теперь не хватало лишь вишенки на торте.

автоперевод без форматирования

Видно, что наивная подстановка текста переформатирует его в соответствии со стилем
самой первой буквы. Можем ли мы как-то сохранить сложное форматирование? Кажется, да. Можно дополнительно к основному тексту перевести отдельно выделенную часть. Затем в переводе основного текста найти перевод выделенной части и переформатировать его. Только вот далеко не всегда ясно, какая часть текста является выделенной. Но мы можем перебирать имеющиеся стили в поисках основного, мы же точно знаем, что он один.

Итого.

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

    • Пробуем перевести все секции других стилей.
    • Пробуем найти переводы секций других стилей внутри общего перевода (перевода всего текста).
    • Считаем, что нашли основной стиль, если предыдущие два пункта завершились успешно.

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

алгоритм

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

Разбиваем тексты на моностильные секции
type Style = {    // это поле будет хранить уникальный идентификатор    // так можно будет быстро сравнивать стили между собой    id: string;    fills: Paint[];    fillStyleId: string;    fontName: FontName;    fontSize: number;    letterSpacing: LetterSpacing;    lineHeight: LineHeight;    textDecoration: TextDecoration;    textStyleId: string;};type Section = {    // начало секции, включительно, индексация с 0    from: number;    // конец секции, не включительно, индексация с 0    to: number;    // стиль всей секции    style: Style;};function sliceIntoSections(node: TextNode, from: number = 0, to: number = node.characters.length): Section[] {    if (to == from) {        return [];    }    const style = getSectionStyle(node, from, to);    if (style !== figma.mixed) {        // это моностильная секция        return [{from, to, style}];    }    // разделяй и властвуй!    const center = Math.floor((from + to) / 2);    const leftSections = sliceIntoSections(node, from, center);    const rightSections = sliceIntoSections(node, center, to);    const lastLeftSection = leftSections[leftSections.length-1];    const firstRightSection = rightSections[0];    if (lastLeftSection.style.id === firstRightSection.style.id) {        firstRightSection.from = lastLeftSection.from;        leftSections.pop();    }    return leftSections.concat(rightSections);}function getSectionStyle(node: TextNode, from: number, to: number): Style | PluginAPI['mixed'] {    const fills = node.getRangeFills(from, to);    if (fills === figma.mixed) {        return figma.mixed;    }    const fillStyleId = node.getRangeFillStyleId(from, to);    if (fillStyleId === figma.mixed) {        return figma.mixed;    }    const fontName = node.getRangeFontName(from, to);    if (fontName === figma.mixed) {        return figma.mixed;    }    const fontSize = node.getRangeFontSize(from, to);    if (fontSize === figma.mixed) {        return figma.mixed;    }    const letterSpacing = node.getRangeLetterSpacing(from, to);    if (letterSpacing === figma.mixed) {        return figma.mixed;    }    const lineHeight = node.getRangeLineHeight(from, to);    if (lineHeight === figma.mixed) {        return figma.mixed;    }    const textDecoration = node.getRangeTextDecoration(from, to);    if (textDecoration === figma.mixed) {        return figma.mixed;    }    const textStyleId = node.getRangeTextStyleId(from, to);    if (textStyleId === figma.mixed) {        return figma.mixed;    }    const parameters = {        fills,        fillStyleId,        fontName,        fontSize,        letterSpacing,        lineHeight,        textDecoration,        textStyleId,    };    return {        id: JSON.stringify(parameters),        ...parameters,    };}

Сохраняем форматирование при подстановке текста
// придется немного расширить нашу структуру подстановкиtype Replacement = null | {    node: TextNode;    translation: string;    // тот самый "основной" стиль    baseStyle: Style;    // разметка translation на секции со стилями, отличными от основного    sections: Section[];};async function computeReplacement(node: TextNode, mapping: Mapping, exceptions: RegExp[]): Promise<ReplacementAttempt> {    const content = normalizeContent(node.characters);    if (keepAsIs(content, exceptions)) {        return null;    }    if (!(content in mapping)) {        return {nodeId: node.id, error: 'No translation for `' + content + '`'};    }    // режем на моностильные секции    const sections = sliceIntoSections(node);    // готовим результат    const result: Replacement = {        node,        translation: mapping[content],        baseStyle: null,        sections: [],    };    // формируем лог ошибок на случай безуспешных поисков    const errorLog = [        'Cannot determine a base style for `' + content + '`',        'Split into ' + sections.length + ' sections',    ];    // собираем множество задействованных стилей    const styles = [];    const styleIds = new Set<string>();    sections.forEach(({from, to, style}) => {        if (!styleIds.has(style.id)) {            styleIds.add(style.id);            styles.push({humanId: from + '-' + to, ...style});        }    });    for (let baseStyleCandidate of styles) {        const prelude = 'Style ' + baseStyleCandidate.humanId + ' is not base: ';        let ok = true;        // будем попутно собирать разметку для неосновных стилей        result.sections.length = 0;        for (let {from, to, style} of sections) {            if (style.id === baseStyleCandidate.id) {                continue;            }            const sectionContent = normalizeContent(node.characters.slice(from, to));            let sectionTranslation = sectionContent;            // либо мы должны уметь переводить секцию,            // либо она должна входить в список исключений            if (sectionContent in mapping) {                sectionTranslation = mapping[sectionContent];            } else if (!keepAsIs(sectionContent, exceptions)) {                errorLog.push(prelude + 'no translation for `' + sectionContent + '`');                ok = false;                break;            }            const index = result.translation.indexOf(sectionTranslation);            if (index == -1) {                errorLog.push(prelude + '`' + sectionTranslation + '` not found within `' + result.translation + '`');                ok = false;                break;            }            if (result.translation.indexOf(sectionTranslation, index + 1) != -1) {                errorLog.push(prelude + 'found multiple occurrencies of `' + sectionTranslation + '` within `' + result.translation + '`');                ok = false;                break;            }            result.sections.push({from: index, to: index + sectionTranslation.length, style});        }        if (ok) {            // нашли основной стиль!            result.baseStyle = baseStyleCandidate;            break;        }    }    if (result.baseStyle === null) {        return {nodeId: node.id, error: errorLog.join('. ')};    }    console.log('Replacement:', result);    return result;}async function replaceText(replacement: Replacement): Promise<void> {    // нет необходимости вызывать загрузку для каждого символа,    // когда мы уже получили разбиение по стилям    await loadFontsForReplacement(replacement);    const {node, translation, baseStyle, sections} = replacement;    node.characters = translation;    if (sections.length > 0) {        setSectionStyle(node, 0, translation.length, baseStyle);        for (let {from, to, style} of sections) {            setSectionStyle(node, from, to, style);        }    }}async function loadFontsForReplacement(replacement: Replacement): Promise<void> {    await figma.loadFontAsync(replacement.baseStyle.fontName);    await Promise.all(replacement.sections.map(({style}) => figma.loadFontAsync(style.fontName)));}function setSectionStyle(node: TextNode, from: number, to: number, style: Style): void {    node.setRangeTextStyleId(from, to, style.textStyleId);    node.setRangeFills(from, to, style.fills);    node.setRangeFillStyleId(from, to, style.fillStyleId);    node.setRangeFontName(from, to, style.fontName);    node.setRangeFontSize(from, to, style.fontSize);    node.setRangeLetterSpacing(from, to, style.letterSpacing);    node.setRangeLineHeight(from, to, style.lineHeight);    node.setRangeTextDecoration(from, to, style.textDecoration);}

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

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

автоперевод с форматированием

На данном этапе мы уже сделали приятный интерфейс и могли переводить макеты на почти все языки одним нажатием на кнопку! Выглядело фантастически, честно говоря.

Сообщения об ошибках и отладка


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

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

if (message.type === 'focus-node') {    // максимально приближаемся    figma.viewport.zoom = 1000.0;    // перемещаем viewport в положение, где нода видна целиком    figma.viewport.scrollAndZoomIntoView([figma.getNodeById(message.id)]);    // немного отдаляем для комфортного восприятия    figma.viewport.zoom = 0.75 * figma.viewport.zoom;}


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

Предлагаем доперевести некоторые фразы
function suggest(node: TextNode, content: string, sections: Section[], mapping: Mapping, exceptions: RegExp[]): string[] {    const n = content.length;    const styleScores = new Map<string, number>();    for (let {from, to, style} of sections) {        styleScores.set(style.id, n + to - from + (styleScores.get(style.id) || 0));    }    let suggestedBaseStyleId: string = null;    let suggestedBaseStyleScore = 0;    for (let [styleId, styleScore] of styleScores) {        if (styleScore > suggestedBaseStyleScore) {            suggestedBaseStyleId = styleId;            suggestedBaseStyleScore = styleScore;        }    }    const result: string[] = [];    if (!(content in mapping)) {        result.push(content);    }    for (let {from, to, style} of sections) {        if (style.id === suggestedBaseStyleId) {            continue;        }        const sectionContent = normalizeContent(node.characters.slice(from, to));        if (!keepAsIs(sectionContent, exceptions) && !(sectionContent in mapping)) {            result.push(sectionContent);        }    }    return result;}

ошибки


Казалось, все должно было прекрасно работать и с RTL языками, так как мы лишь выполнили замену вхождений по точному совпадению. Однако внезапно выяснилось, что Figma не умеет корректно отображать RTL тексты рендерит их слева направо. А лезть в дебри особенностей рендеринга RTL текстов последнее, чего бы хотелось.

Да, нашлось несколько плагинов для интерактивного ввода арабского текста и один разломанный плагин, пытающийся разворачивать RTL тексты, но все это не решило нашу проблему. Хотя бы потому, что при этом напрочь слетало форматирование.

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

Что может быть сложного? Давайте просто развернем текст посимвольно.

наивный подход к RTL

Так. Теперь все рендерится справа налево, но Figma вставляет по привычке автопереносы строк так, словно это LTR текст. В итоге строки нужно читать снизу вверх. Беда. Факт расстановки автопереносов Figma не отражает в содержимом ноды, да и вообще, никак нигде не отражает Разве что Если нода имеет адаптивную высоту, то при возникновении автопереноса высота ноды изменяется!

Итак, план такой.

  1. Разворачиваем перевод, как раньше.
  2. Создаем невидимую текстовую ноду с адаптивной высотой и той же шириной (если, конечно, ширина исходной ноды тоже фиксирована).
  3. Разбиваем развернутый перевод на слова и начинаем добавлять их в скрытую ноду по одному (справа налево). Если вдруг высота скрытой ноды изменилась, откатываемся, вставляем разделитель строк и продолжаем.
  4. Получившееся разбиение на строки просто конкатенируем.
  5. Удаляем временную ноду.
  6. Инвертируем выравнивание текста (если было по левому краю, то делаем по правому, и наоборот).

Большая сложность заключается в том, что в процессе нужно внимательно следить за тем, как видоизменяются секции.

К тому же, на ровном месте возникло несколько подводных камней.

  • Большинство шрифтов из коробки не поддерживают арабский и иврит. Пришлось искать похожие по начертанию (а их не так много).
  • Нельзя просто брать и разворачивать текст, если он содержит, например, латиницу, цифры и т.п. Эти части должны писаться слева направо даже в RTL тексте.
  • От стиля зависит размер слов, так что внутри скрытой ноды текст нужно правильно форматировать.
  • Первое слово в очередной строке может не влезть по ширине, тогда это ошибка, о которой нужно сообщить.
  • Нашлись слова в арабском, которые в отсутствие пробела после них отображались в Figma некорректно.

Полный код поддержки RTL языков я здесь приводить не стану он доступен в репозитории.

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

автоперевод на арабский

На десерт.

  • Правильное обращение арабского текста куда более сложная задача, чем кажется, если учесть всевозможные примеси из других языков и специальные лигатуры.
  • Интерфейсы на RTL языках необходимо отразить по горизонтали, что пока приходится делать вручную, хотя потенциально и это автоматизируется.
  • Попутно нами был обнаружен и зарепорчен баг в Figma, из-за которого при добавлении латиницы в арабский текст лигатуры развязывались.

Конвертирование валют


Так уж случилось, что мы маркетплейс, и у нас есть товары. И товары имеют цену. Можно, конечно, отдать с десяток текстов вида 1 234 переводчикам и надеяться, что они правильно локализуют цены, использовав верные разделители, верные знаки валют и верное количество цифр после запятой Но зачем, если можно все это проделать автоматически, один раз настроив несложный конвертер?

Конвертируем валюты автоматически
type Currency = {    // уникальный код, у нас для удобства совпадает с языковым    code: string;    // схема, в которой 123 нужно заменить на нужную сумму в нужном формате, вроде "$123"    schema: string;    // разделитель тысяч    digitGroupSeparator: string;    // разделитель дробной части (обычно точка или запятая)    decimalSeparator: string;    // кол-во десятичных знаков в дробной части    precision: number;    // курс к некоторой базовой валюте (должна быть общей для всего конфига)    rate: number;};async function convertCurrencyInSelection(settings: Settings): Promise<void> {    const currencies = parseCurrencies(settings.serializedCurrencies);    console.log('Currencies:', currencies);    const sourceCurrency = currencies.filter(currency => currency.code === settings.sourceCurrencyCode)[0];    if (sourceCurrency === undefined) {        throw {error: 'unknown currency code `' + settings.sourceCurrencyCode + '`'};    }    const targetCurrency = currencies.filter(currency => currency.code === settings.targetCurrencyCode)[0];    if (targetCurrency === undefined) {        throw {error: 'unknown currency code `' + settings.targetCurrencyCode + '`'};    }    await replaceCurrencyInAllTexts(sourceCurrency, targetCurrency);}function parseCurrencies(serializedCurrencies: string): Currency[] {    const codeSet = new Set<string>();    return JSON.parse(serializedCurrencies).map((x: any, index: number) => {        const currency: Currency = {            code: null,            schema: null,            digitGroupSeparator: null,            decimalSeparator: null,            precision: null,            rate: null,        };        Object.keys(currency).forEach(key => {            if (x[key] === undefined || x[key] === null) {                throw {error: 'invalid currency definition: no `' + key + '` in entry #' + (index + 1)};            }            if (key === 'schema' && x[key].indexOf('123') === -1) {                throw {error: 'schema in entry #' + (index + 1) + ' should contain `123`'};            }            if (key === 'rate' && x[key] <= 0) {                throw {error: 'non-positive rate in entry #' + (index + 1)};            }            currency[key] = x[key];        });        if (currency.precision > 0 && currency.decimalSeparator === '') {            throw {error: 'entry #' + (index + 1) + ' must have a non-empty decimal separator'};        }        if (codeSet.has(currency.code)) {            throw {error: 'multiple entries for `' + currency.code + '`'};        }        codeSet.add(currency.code);        return currency;    });}async function replaceCurrencyInAllTexts(sourceCurrency: Currency, targetCurrency: Currency): Promise<void> {    const textNodes = await findSelectedTextNodes();    const escapedSchema = escapeForRegExp(sourceCurrency.schema);    const escapedDigitGroupSeparator = escapeForRegExp(sourceCurrency.digitGroupSeparator);    const escapedDecimalSeparator = escapeForRegExp(sourceCurrency.decimalSeparator);    const sourceValueRegExpString = '((?:[0-9]|' + escapedDigitGroupSeparator + ')+' + escapedDecimalSeparator + '[0-9]{' + sourceCurrency.precision + '})';    const sourceRegExp = new RegExp('^' + escapedSchema.replace('123', sourceValueRegExpString) + '$');    console.log('Source regular expression:', sourceRegExp.toString());    await Promise.all(textNodes.map(async node => {        const content = node.characters;        const match = content.match(sourceRegExp);        if (match !== null && match[1] !== null && match[1] !== undefined) {            const style = getSectionStyle(node, 0, node.characters.length);            if (style === figma.mixed) {                throw {error: 'node `' + content + '` has a mixed style'};            }            let sourceValueString = match[1].replace(new RegExp(escapedDigitGroupSeparator, 'g'), '');            if (sourceCurrency.decimalSeparator !== '') {                sourceValueString = sourceValueString.replace(sourceCurrency.decimalSeparator, '.');            }            const sourceValue = parseFloat(sourceValueString);            const targetValue = sourceValue * targetCurrency.rate / sourceCurrency.rate;            const truncatedTargetValue = Math.trunc(targetValue);            const targetValueFraction = targetValue - truncatedTargetValue;            const targetValueString = (                truncatedTargetValue.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,').replace(/,/g, targetCurrency.digitGroupSeparator) +                targetCurrency.decimalSeparator +                targetValueFraction.toFixed(targetCurrency.precision).slice(2)            );            await figma.loadFontAsync(style.fontName);            node.characters = targetCurrency.schema.replace('123', targetValueString);        }    }));}function escapeForRegExp(s: string): string {    return s.replace(/([[\^$.|?*+()])/g, '\\$1');}

конвертация валют

Публикация


Перед публикацией плагина был проделан ряд улучшений UX. Например, настройки в интерфейсе плагина сохранялись в localStorage (да, Figmа такое умеет!). Это позволяет не загружать словари каждый раз и быстро выполнять переводы на несколько языков. А чтобы интерфейс не зависал во время активных операций с документом, по рекомендации самой же Figma, была ограничена интенсивность асинхронных параллельных операций с помощью простой самописной функции mapWithRateLimit. На сдачу в плагин была добавлена возможность заменять шрифты.

Процедура публикации плагина заняла больше двух недель, но никаких проблем не возникло.

В заключение


Без плагина не обошлась и подготовка к Новому году.

новый год

Возможно, когда-нибудь мы расскажем, как в рамках той же задачи научились выгружать из Figma весь документ в виде одного структурированного архива из картинок.

Хочется поблагодарить Аню Ноджак, дизайн-директора Joom, за веру в мои силы. Очень рекомендую почитать ее взгляд на задачу.

Ссылки


Исходный код плагина Static Localizer на GitHub
Плагин Static Localizer на сайте Figma
Подробнее..

Как локализовать ролик об игре

19.01.2021 16:11:16 | Автор: admin

Главные секреты и чек-лист для разработчика

Когда вы продвигаете свою игру на локальных рынках логично, чтобы рекламные материалы об игре были переведены на родной язык целевой аудитории. Допустим, что вы уже перевели основной контент для страницы игры в сторе: локализовали описание, пересняли скриншоты. И вот дело дошло до локализации ролика А с ним всё немного сложнее. Давайте разберёмся с типичными вопросами, которые возникают при решении задачи локализовать ролик об игре.

Переснимать ли геймплей?

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

Напрашивается идея: а почему бы не использовать ту же самую запись геймплея, что в оригинальной версии? Может быть, элементы с текстами можно просто перекрыть заплатками с локализованной версии игры?

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

Похоже на толковое решение, правда? Действительно, иногда это может сработать Но на этот приём далеко не всегда можно рассчитывать. И вот почему.

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

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

  • Области с текстом могут задеваться анимированными эффектами, присутствующими в кадре постоянно или появляющимися в разные моменты при прохождении игры.

Рассмотрим третий случай на примере.

В ролике об игре One Life Story есть текстовые элементы мудрые изречения, сопровождающие каждый уровень и подсказывающие, как решить головоломку. Обратите внимание, что на уровнях 48 и 54 в геймплее присутствуют светлые точки, похожие на снежинки (0:17-0:25 в видеоролике выше). Снежинки проходят прямо под текстом.

Если бы мы использовали приём с заплатками, в локализованном ролике эти сцены выглядели бы довольно топорно. Снежинки пропадали бы из виду, долетев до заплатки, и снова проявлялись бы уже под ней. Чтобы избежать такой неаккуратности, для локализации этих сцен мы пересняли геймплей с соответствующей языковой версии игры и заново смонтировали видеозахваты с этих уровней под тайминг ролика.

Что делать, если сама игра не локализована на язык целевой аудитории?

Не исключена ситуация, когда вы только прощупываете рынок определённой страны и решаете для начала локализовать только рекламные материалы (и ролик в том числе), оценить динамику установок, LTV пользователей и только затем определиться, стоит ли инвестировать в локализацию игры на этот язык. В этом случае язык UI вашей игры не будет совпадать с родным языком целевой аудитории, и здесь есть два варианта. Первый показать UI в ролике на том языке, который в игре есть. Второй отключить UI в геймплее для ролика.

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

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

Ролик без UI: в чём подвох?

Подводный камень у второго варианта вот какой. Возможно, блоки с текстами окажутся критически важным при демонстрации определённых игровых возможностей или особенностей. Вот пример: одна из фишек VR-игры Guard of Wonderland poetic narrative. Наглядно показать эту особенность в ролике, не демонстрируя собственно текстовые элементы, было бы затруднительно.

Правда, это довольно редкий случай. Чаще бывает так, что показать в ролике те или иные особенности игры можно иносказательно или метафорически, используя анимированную графику вместо записи геймплея. Это, кстати, довольно перспективное решение, упрощающее последующие локализации ролика на любой язык. Посмотрите, например, ролик об игре Wild West: Steampunk Alliances это как раз пример того, как в ролике можно совсем не использовать запись геймплея.

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

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

Комбинирование сцен с включённым и отключенным UI может казаться странным в теории, но на практике всё должно получиться хорошо. Например, в трейлере об игре Pixel Wars сцены с отключенным UI (ими ролик начинается) сочетаются со сценами, где UI присутствует. Как видите, такой подход не вредит целостности визуального ряда.

Как локализовать озвучку: три совета

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

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

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

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

Как синхронизировать текст озвучки и видеоряд

Озвучивание одной и той же фразы на разных языках может занимать разное количество времени.

Проще говоря, если в вашем 30-секундном трейлере на английском языке 5 сцен, которые сопровождают пять фраз длительностью 5 секунд каждая (25 секунд звучания плюс секундные паузы для переходов между сценами) не исключено, что на немецком у вас получится три фразы по 6 секунд и две по 7. Это уже 32 секунды даже без учёта пауз, причём 7-секундные фразы вылезают за 5-секундные границы сцены в видеоряде. Так себе ситуация, правда?

Идеальный способ решить такую проблему синхронизировать видеоряд под озвучку на новом языке.

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

То есть, если озвучка для 5-секундной геймплейной сцены занимает 6,3 секунды не ускоряйте речь диктора и не режьте паузы. Просто сделайте видеоряд на 2 секунды дольше, например за счёт показа дополнительных секунд геймплея.

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

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

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

Лучше всего позаботиться об объёме текста на этапе его перевода, а диктору позволить читать в естественном темпе.

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

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

Посмотрите, например, как удачно благодаря этому приёму удалось локализовать ролик об игре 100 Doors XL.

Реплики диктора в английской и русской версиях трейлера занимают разное количество времени. В частности, озвучка первой сцены в русской версии на 0,9 сек. длиннее, чем в английской. Но благодаря неторопливому темпу озвучивания и паузам между репликами в английской версии ролика менять длительность видеоряда при локализации не понадобилось.

Локализация видео это всегда так сложно?

Как мы уже писали, локализовать ролик и сделать ролик понятным аудитории из другой страны не синонимы. Полная локализация это демонстрация геймплея на целевом языке, перевод всех текстов в кадре и, конечно, переозвучка ролика с диктором-носителем целевого языка. Локализация ролика это фактически его пересоздание на новом языке, в ходе которого вы проходите те же производственные стадии, что при создании оригинальной версии видео.

А вот решить задачу сделать ролик понятным иностранной аудитории можно более простыми средствами. Например, заменить только надписи на плашках и перезаписать озвучку. Или даже самый бюджетный вариант ограничиться лишь субтитрами. Недостаток этих вариантов в том, что зрителю будет очевидно: ролик изначально был создан не на его родном языке. И часть идей, которые вы закладывали в ролик, зритель может просто не уловить.

Повлияет ли это на решение зрителя об установке игры? Трудно дать однозначный ответ.

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

Сколько стоит локализация ролика

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

Что усложняет локализацию, так это необходимость пересъёмки геймплея с нужной языковой версии игры, последующий монтаж заново отснятых фрагментов и их синхронизация под дорожку новой озвучки. Объём работы здесь сопоставим с созданием оригинального ролика разве что без стадий создание сценария и выбор фоновой музыки.

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

Конечно, стоимость локализации сильно зависит от конкретного проекта. Если попробовать оценить объем затрат хотя бы в среднем локализация ролика об игре может стоить от 20% до 70% бюджета оригинального видео. Нижняя планка для роликов, которым нужны лишь перезапись озвучки, замена бейджей сторов и перевод слоганов, и всё это без изменений в тайминге видеоряда. Верхняя планка для роликов, которые нужно полностью пересобрать, включая замену геймплейных фрагментов и пересинхронизацию видеоряда, музыки и звуковых эффектов под озвучку на новом языке.

Чек-лист: 8 вещей, о которых нужно не забыть при локализации ролика

  1. Локализовано ли название игры? Если да, не забывайте называть игру в ролике не универсальным, а именно локализованным названием. Оно может упоминаться и в озвучке, и в видеоряде. Если название игры используется в логотипе не забудьте заменить лого в локализованном ролике.

  2. Локализована ли сама игра? Если да подумайте над тем, чтобы показать в ролике геймплей на нужном языке.

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

  4. Есть ли в ролике плашки с текстами и призывы к действию? Если да не забудьте перевести эти тексты и подобрать для них гарнитуру, совместимую с целевым языком.

  5. Есть ли у вас в ролике бейджи магазинов приложений? Если ваша игра для мобильных ОС, то наверняка есть. Не забудьте заменить оригинальные бейджи на переведённые, причём переводить их самостоятельно не нужно. Официальные версии бейджей на разных языках можно найти в гайдлайнах App Store и Google Play.

  6. Есть ли в оригинальном ролике голосовая озвучка? Если да не забудьте перевести её текст и озвучить перевод с диктором-носителем целевого языка.

  7. Жёсткий ли у вас тайминг? Например, ограничение рекламной платформы тизер до 15 секунд, или требование App Store трейлер до 30 секунд. Если ограничение по хронометражу есть, переведите текст озвучки с оглядкой на него.

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

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

Об авторе

Статья написана в Alconost, где локализуют игры на 70+ языков и делают видеоролики об играх в любом жанре и на любом языке.

Подробнее..

Перевод Локализационное тестирование зачем оно нужно приложению или сайту?

02.10.2020 10:21:39 | Автор: admin


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

Сегодня США уже больше не является крупнейшим игроком на рынке мобильных приложений. Китай и Индия соревнуются за звание мирового лидера. И сегодня нужно, и даже не один раз, проверять все языковые версии перед релизом. Ведь цена даже крошечной ошибки может быть очень высока.

О тестировании локализации компании-разработчики, как правило, задумываются не сразу. И всё же этот процесс нужно обязательно включить в разработку. Давайте подробнее рассмотрим, что представляет собой тестирование локализации, какие важные этапы оно включает и зачем вообще оно нужно.


Что такое локализационное тестирование?


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

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

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

Почему локализационное тестирование так важно?



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

Локализация повышает лояльность клиентов к вашему бренду. Вот конкретные цифры: около 72,1% пользователей Интернета предпочитают делать покупки на сайтах на своем родном языке. Даже те, кто хорошо владеет английским, по-прежнему предпочитают просматривать веб-страницы на своем родном языке.

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

На что следует обратить внимание во время тестирования локализации?


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

Подготовительный этап

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

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


Проверка региональных и культурных особенностей

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


Лингвистическая проверка

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


Пользовательский интерфейс или внешний вид

Это нужно для того, чтобы ваш программный продукт смотрелся безукоризненно на любом языке. Обязательно удостоверьтесь в следующем:
  • Все текстовые надписи на картинках локализованы.
  • Макет языковых версий совпадает с оригиналом.
  • Переносы и разрывы строк на страницах/экранах размещены правильно.
  • Диалоги, всплывающие окна и уведомления отображаются корректно.
  • Длина строк не превышает существующие ограничения и текст отображается правильно (иногда текст перевода длиннее оригинала и не помещается на кнопках).


Пример
Команда Alconost столкнулась с одним таким случаем во время работы с DotEmu и их игрой Blazing Chrome. В испанской версии количество символов в переводе текста кнопок превосходило ограничения для них. Слово Далее было слишком длинным на испанском: Siguiente. Команда Alconost обнаружила эту ошибку во время тестирования локализации и предложила заменить Siguiente на Seguir для корректного отображения в интерфейсе. Именно благодаря обнаружению подобных проблем и их устранению интерфейс программного продукта и эффективность взаимодействия с пользователем улучшаются.





Функциональность

Это один из завершающих и важнейших этапов, когда нужно проверить правильно ли работает локализованное приложение. Советуем обратить внимание на следующее:
  • Функционал локализованного приложения или сайта.
  • Н=Гиперссылки (убедитесь, что они работают во всех языковых версиях, легальны для указанного региона и не будут блокироваться местными или региональными файрволами).
  • Работу вводных функций.
  • Поддержку специальных символов для различных локалей и языков.
  • Работу сочетаний клавиш.
  • Функцию сортировки списков.
  • Поддержку различных шрифтов.
  • Поддержку различных разделителей формата.


Какие трудности могут возникнуть во время тестирования локализации?


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

Одна из главных сложностей это недостаточное знание целевого языка. Естественно, знать все языки мира невозможно. Но есть компании по локализации, интернационализации и переводу. Например, Alconost предлагает своим клиентам полный спектр услуг по локализационному тестированию и оценке качества. Локализованные тексты всегда дополнительно проверяются переводчиками-носителями языка, которые также имеют большой опыт тестирования локализации. И можно быть увереным на 99,99%, что все региональные особенности будут учтены.

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

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

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

Нужна помощь с локализацией / переводом? Мы в Alconost всегда рады помочь!

О нас


Alconost профессионально занимается локализацией игр, приложений и сайтов на более 70 языков. Лингвистическое тестирование, облачная платформа с API, непрерывная локализация, менеджмент проектов 24/7, любые форматы строковых ресурсов.
Мы также делаем видеоролики.

Подробнее
Подробнее..

Разделение кода и текста мысли вслух

20.12.2020 08:14:54 | Автор: admin

Код, который большинство из нас пишет, как правило содержит ещё текст разные элементы интерфейса, описания, содержание имейлов и так далее. Но мы, программисты, не все получали пятёрки в школе за сочинение. Мы хорошо пишем код, но далеко не каждый из нас хорош в прозе.

В итоге мы видим тысячи сайтов и приложений, которые говорят с пользователями на неестественном языке вроде: Использованы запрещенные символы или Операция успешно завершена. Как часто вам в жизни, на улице говорят такие фразы?

А что если попробовать разделить код (логику) и текст? Крупные компании, наверняка, уже давно это делают, используя какие-то свои собственные решения, но для всех остальных - нет никакой готовой утилиты или фреймворка.

Реальность

Текущая реальность такова, что программист частично сам пишет тексты (допустим, названия кнопок), частично берет тексты из заданий. Это является частью репозитория - хранится вместе с кодом, а значит если кому-то в команде надо будет что-то поправить - надо делать коммит в репозиторий. Не совсем идеально - это же не логика, это просто кусок текста?

@extends('layouts.main')@section('contents')    <h2>Welcome home</h2>    <p>        We are thrilled to have you back, {{ $user->first_name }}    </p>    <a href="{{ route('download-bitcoin') }}" class="btn btn-primary">        Download my money    </a>@endsection

Проблемы

  • Чтобы исправить текст - надо делать коммит в репозиторий с кодом. Для некоторых членов команды (компании), не программистов, это может быть непросто

  • Сложно отслеживать в каких местах и как на текущий момент наш продукт общается с пользователями - кусочки текста разбросаны по сотням файлов

  • Сложно соблюдать единый тон в сообщениях

  • Невозможно отследить появление новых текстов, когда программисты сами проявили инициативу

Альтернатива

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

  1. Программист добавил одну строку в шаблон home.blade.php (пример на PHP и фреймворке Laravel, но это подходит к любому языку и фреймворку)

  2. Во время билда внешний сервис был извещен, что на такой-то строке в таком-то шаблоне новый кусок текста.

  3. Нетехнические члены команды могут сами редактировать этот текст теперь, без помощи программистов. В код при этом никому лезть не надо.

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

Если проводить параллель с тем же Laravel, то это похоже на использование встроенной функции для переводов __(), но тексты хранятся не в локальных файлах внутри этого же репозитория, а в облаке, что создает целый ряд преимуществ.

Технические аспекты

Гипотетическая реализация могла бы выглядеть следующим образом (за пример опять возьмем фреймворк Laravel на PHP).

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

  2. Реализуем консольную команду, которая отправляет все тексты завернутые в эту функцию по API куда-то во вне, в сервис управления текстами. Помимо текстов отправляются важные данные о контексте - в каком шаблоне текст, на каких строках, в каких маршрутах этот шаблон используется и так далее. Эта команда автоматически запускается в определенных моментах, например во время CI/CD билда.

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

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

Гипотетическая админка:

Шаблон, приведенный выше, превращается в что-то вроде:

@extends('layouts.main')@section('contents')    <h2>@lang('Welcome home')</h2>    <p>        @lang("We are thrilled to have you back, {$user->first_name}")    </p>    <a href="{{ route('download-bitcoin') }}" class="btn btn-primary">        @lang('Download my money')    </a>@endsection

Дополнительные плюсы

Помимо того, что теперь контроллировать наши коммуникации стало намного легче, появляются интересные дополнительные преимущества:

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

  2. Возможность перевода на другие языки - в этот процесс очень легко добавить работу над другими языками, переводы будут загружаться той же командой. Программисты не будут ничего трогать в основном репозитории.

  3. Возможность реализовать альтернативные, параллельные тоны голоса на сайте в зависимости от типа пользователя (тинейджер, молодая мама, дедушка и тд) - можно динамически менять стиль коммуникаций в продукте.

Заключение

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

Подробнее..

15 советов Локализация сервисов под разные страны

16.10.2020 16:14:58 | Автор: admin

Пока ещё на политической карте мира границы есть. В мире интернета они давно стёрты.


И вашим сервисом, если он по-настоящему массовый, может воспользоваться и американец, и француз, и аргентинец, и китаец. А значит, вы должны это учитывать в локализации вашего продукта.


И это совсем не так просто, как кажется. Одним переводом массивов текстов о компании и описаний услуг\товаров ограничиться не получится.



Структурируем всё по пунктам:


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


2. Перевод одного и того же языка для разных стран будет разным. Например, переводы маркетинговых текстов на английский для России и Великобритании будут отличаться. Просто потому что совсем другой культурный, исторический, ментальный бэкграунд. Другие триггеры нужны, чтобы цеплять пользователя. Скажи-ка, дядя, ведь не даром Москва, спаленная пожаром, французу отдана? даже переведённая, эмоционально ничего не скажет американцу. Точно так же, как Twas brillig, and the slithy toves, Did gyre and gimble in the wabe: All mimsy were the borogoves, And the mome raths outgrabe вызовет у американца просто пожатие плеч от бессмыслицы. Зато англичанин захлопает в ладоши.


Небольшой околопример перевода и ситуации в проекте:


На одном из прошлых моих стартапов собрались в 2014м году выкатываться в Индонезию. Продуктовая часть вроде бы была готова, добивали техническую.Примерно за 2 недели до часа Х стучится ко мне в скайп наш Гениальный (время примерно  18:00 мск):- Дим! Ну чё там по срокам?- Всё норм, всё по срокам.- Ты знаешь... Я тут в Джакарту прилетел, у меня завтра в 7:00мск презентация нашего сервиса местным министрам! Успеваешь?OMG...  Ситуация - жесть полная. Но что-то же делать надо? Что у нас в наличии? В принципе действительно всё неплохо, надо пару мест подпилить - и выкатится без пары фич. Тогда преза получится норм. Договариваюсь со всей командой... Ну, как договариваюсь... Кому-то денег обещаю, кому-то отпуск, кому-то увольнение... Решили, короче. Собрались и начали жечь. Не хватает самой малости - листа текста А4 на индонезийском языке. Без него сервис не будет говорить на родном языке индонезийцев. И обойтись никак. Стучусь к Гениальному:- Нужен текст на индонезийском!- Ничем не могу помочь. Я даже на английском не разговариваю!- Эм.... А ты сейчас где? В такси? Можешь попросить таксиста текст перевести с английского на индонезийский?- Не могу. Он не знает никакого языка кроме индонезийского...Ооооооооок! Чешу репу. Снова стучусь к Гениальному:- А отели какие-то знаешь в Джакарте?- Да! Хилтон!Время уже где-то 00:30 мск. Чё делать-то? Терять нечего. Позади Москва. Звоним в отель, объясняем, что мы несчастные русские стартаперы, хотим осчастливить Индонезию своим стартапом, не хватает листа А4 на индонезийском. - Вот наш e-mail, присылайте текст, мы переведём!Через 2 часа мы получили текст и запустились. 

3. Если у вас хоть сколько-нибудь нормальный клиент-сайд интерфейс, то переводы потребуется и для него на стороне клиента.


4. Вам потребуется хранить переводы двух типов короткие фразы (используются для интерфейсов и поясняющих подписей) и длинные тексты (маркетинг, faq, юридическая документация типа оферты и другое).


5. Вам потребуется перевод картинок на языки (причём для разных стран, опять-таки разные). Причём есть картинки, как интерфейсного плана, так и тупо скриншоты. Причём совершенно точно известно, что не все картинки поддадутся автоматизированному наложению генерящихся надписей. И, кстати, для некоторых языков потребуется отдельно доставлять шрифтовые пекеджи.


6. Когда вы соберётесь передавать тексты в перевод, то для каждого короткого текста потребуется комментарий, который описывает контекст, в котором нужен перевод (одно и то же слово, как вы знаете, может иметь несколько значений). Более того, в такой комментарий потребуется точный перечень мест в интерфейс (и как до него добраться), где оно используется. А то напишите для индийской локализации: Это так же легко, как съесть корову и трудно даже представить.


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


8. Таймзона в БД имеет значение. И вывод времени в нужной таймзоне тоже. В отдельных сложных случаях без костылей не обойтись. Например, по тайландскому летоисчислению, сейчас 2560 год. Хотя есть мнение, что в базах лучше не иметь никаких таймзон, UTC и только UTC.


9. Проект must be in UTF-8. Иначе вымрете сразу же. Вывод чисел с десятичной точкой в разных странах отличается. Будьте готовы.


10. Поиск по сайту. Каким бы вы не пользовались движком, важно знать все европейские языки, включая русский, процессятся специальным стеммером Snowball. Это такая штука, без которой орфография не будет работать вообще. Но для некоторых языков Snowball не хватит и движок заточенный под работу с ним станет бесполезной обузой. Чтобы решить проблему придётся порыться по интернету и разобраться, какие бывают стеммеры. Да, кстати, для некоторых языков символ пробела (" ") не является разделителем слов (сюрприз!).


Andrey Shetukhin добавляет:
Во-первых, орфография к стеммеру отношения не имеет никакого. Вообще. Ноль.
Во-вторых, тот же сфинкс имеет лемматизатор AOT, изначально написанный Сокирко.
В-третьих, стемминг и лемматизация абсолютно разные вещи, их нельзя путать.
В-четвёртых, 99.995% разработчиков сайтов самостоятельно решить проблему с поиском не могут. Даже в Авито не справились.
Касаемо разделителя слов. Пробел не самая большая проблема.
Гораздо важнее знаки препинания, дефисы, специальные символы и модификаторы UTF. Внезапно, й или ё в UTF-8 можно записать несколькими способами. Слово чёрно-красный, в зависимости от контекста должно искаться не только исключительно как чёрно-красный, но и чернокрасный, чёрнокрасный, чёрный красный.
Знаки переноса так же должны учитываться, иначе в поиске будет треш. Кроме того, если речь идёт о русском языке или текстах на русском и английском языках одновременно, необходимо учитывать опечатки в общих буквах для латинского и кириллического алфавитов.
Необходимо уметь обрабатывать сокращения и понимать, где точка используется как знак конца предложения, а где как элемент сокращения С.С.С.Р., A.C.A.B и т.п.
Всё это очень сложно и большинство разработчиков не имеет достаточного уровня чтобы написать не то, что поиск, а даже токенизатор текста.

11. Никогда не храните исходники текстов в html вы его тупо не сможете отдать на перевод, который тарифицируется посимвольно. Используйте форматы типа wiki-markup или markdown.


12. Никогда не храните в .po файлах (это способ хранения коротких фраз для переводов с использование упомянутого тут всеми gettext) в лексемах что-либо кроме самого текста.


13. Для gettext не используйте в качестве идентификаторов лексем русскую фразу вы не сможете такой набор экспортировать на client-side.


14. Время в базе всегда должно быть в UTC. А таймзоны настройка рендеринга. Как темная и светлая тема, например. (от Сергея Васильева)


15. Не стоит забывать про RTL, про учёт разной плотности на разных языках, про разные сочетания календаря и отображения цифр на разных языках, про сложность выбора формата перевода (.po не очень удобен), про переводческие системы.


Примеры граблей, советов и не всегда с ходу понятных полезностей привёл Дмитрий Симонов ctorecords, СТО и создатель канала Техдирские заметки и его многочисленные умудрённые опытом коллеги.


P.S. А кому хочется с пользой усложнить себе жизнь и добавить знания 1113 декабря пройдёт онлайн-интенсив SRE.

Подробнее..

5 ключиков к игровому рынку Бразилии

10.08.2020 16:05:18 | Автор: admin


Девятая по величине экономика в мире, высокий уровень покупательной способности (восьмое место), один их самых больших показателей по загрузкам в Google Play и App Store (третье место сразу после Индии и США) все это Бразилия.

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


1. Кто и как играет


Согласно данным Newzoo, в 2018 г. в Бразилии насчитывалось 76 миллионов геймеров. В год они тратят на игры примерно $1,5 млрд (из них в 2020 г. на мобильные игры было потрачено $380 млн, а число пользователей составило 60 млн), что ставит Бразилию на 13-е место на мировом рынке игр, и на первое в Латинской Америке.

Кто из бразильцев и на каких устройствах играет? Согласно Forbes, опрос Game Brazil 2019 г. показал, что большинство игроков составили женщины (53%). Самое популярное игровое устройство смартфон (83 %), затем идут игровые консоли (48,5%). Возраст большинства игроков (61,9%) от 25 до 54 лет.

Опрос также показал, что хардкорные игроки это обычно мужчины в возрасте 2534 лет, и играют они на консолях. При этом их противоположность казуальные игроки это в основном женщины (58,8%) в возрасте 2534 лет, предпочитающие мобильные игры.
Согласно данным международного опроса потребителей Statista, по доходам игроки на мобильных устройствах распределены примерно поровну, но игроков со средним доходом больше (38,4%), чем с низким (32,1%) или высоким (29,6%).

Самая популярная операционная система Android (79,9%), на втором месте iOS (16,4%), на третьем Windows (2,2%). Малая доля Apple отражает общую латиноамериканскую тенденцию как и рыночная доля Android. Обязательно учитывайте это неравенство при разработке игр для бразильского рынка.

Также следует помнить о том, что бразильцы, как и латиноамериканцы в целом, обычно склонны покупать телефоны среднего класса с меньшим объемом памяти (часто менее 10 ГБ). Кроме того, одно устройство часто используется несколькими членами семьи, и каждый устанавливает то, что нужно ему, поэтому чем меньше места занимают игры и приложения, тем лучше.

Подавляющее большинство бразильцев используют Android, поэтому Google Play самый популярный магазин и значительно обгоняет App Store. Но используются и другие магазины: например, Aptoide (для Android) и Baixaki (популярный веб-сайт для загрузки игр и приложений для Android и iOS).

2. Популярные игры и приложения


Загрузки игр из Google Play и App Store в 2019 г. в Бразилии следуют мировым тенденциям это, в частности, привычные Minecraft, Free Fire, Grand Theft Auto, Fortnite, Roblox, League of Legends, PUBG, Sonic the Hedgehog, Counter-Strike, Pokmon.

Бразильцы очень коммуникабельны, у них крепкие семейные и дружеские связи, для них важно быть частью общества, поэтому неудивительно, что большинство популярных приложений мессенджеры (и WhatsApp на первом месте).

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

В Бразилии мобильные игры запускают, чтобы отвлечься и снять стресс (так ответили 87% респондентов в опросе потребителей, проведенном Google), поэтому в рекламе следует делать акцент на отдыхе от работы и снятии напряжения.
По этой причине в Бразилии предпочитают игры, которые способны увлечь и полностью захватить внимание: это экшены, стратегии и ролевые игры. Кроме того, Бразилия третий по величине киберспортивный рынок в мире.

3. Бразилия перспективный рынок


В последние годы Бразилия, как и другие латиноамериканские страны, пережила сверхбыстрый технологический рост. По показателям Google Play и App Store рынок этой страны крупнее, чем мексиканский, и находится на первом месте по загрузкам мобильных игр в Латинской Америке.

Население страны 212 млн человек, причем смартфоны есть у 81% (к 2025 г. прогнозируется цифра в 88%), поэтому Бразилия третья в мире по общему количеству загрузок в App Store и Google Play.


Общее количество загрузок по странам (оценка по 500 самым популярным приложениям из категории все, январь июнь 2019 г.), источник

По прогнозам Statista, к 2025 г. доход на бразильском рынке мобильных игр достигнет $450 млн.

4. Адаптация к реалиям бразильского рынка


Бразильцы обожают социальные сети и мессенджеры Facebook, Twitter, Instagram, WhatsApp. Старайтесь добавлять развлекательный контент например, конкурсы и рекламные акции, и поощряйте пользователей делиться им с друзьями. Используйте YouTube: бразильцы много времени проводят за просмотром местных каналов, поэтому привлекайте к продвижению игры инфлюэнсеров. Один из самых популярных бразильских ютуберов-геймеров Joo Sampaio, канал Flakes Power.

Хороший вариант привлечь внимание аудитории рекламные акции и специальные предложения в мобильных играх: бразильцы говорят, что им нравятся выгодные предложения и возможность сэкономить. Не забудьте локализовать цены и перевести их в бразильские реалы (R$).

И еще: Бразилия расположена в Южном полушарии, поэтому в зимние месяцы там жарко, а в июне, июле и августе может быть прохладно помните об этом, если делаете отсылки к погоде во время сезонных праздников и тематических ивентов.

5. Язык пользователей


Что касается языка, то бразильцы явно предпочитают играть в игры на родном португальском: лишь 5% населения свободно владеют английским. Таким образом, если вы хотели знать, нужно ли переводить приложение на португальский, ответ очевиден: если этого не сделать, большинство игроков пройдут мимо вас.

Важно помнить, что это должен быть бразильский (а не европейский) вариант португальского: они различаются и по произношению, и по лексике. Ты на бразильском португальском voc, а на европейском tu. Девушка в Португалии это rapariga, а в Бразилии это же слово может означать женщина легкого поведения. Такие различия могут вызвать как минимум путаницу будьте внимательны.

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

Слова в португальском обычно на 2530% длиннее английских, поэтому при дизайне элементов интерфейса рекомендуется выделять дополнительное пространство, особенно для коротких строк типа пунктов меню.

Для локализации игры, перевода страницы в сторе и других маркетинговых материалов можно использовать Nitro сервис профессионального перевода, где вам помогут перевести текст в рекордно короткие сроки (часто всего за пару часов).



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

Наши клиенты Full HP поделились интересной историей о том, как их мобильный шутер Mad GunZ завоевал успех у бразильской аудитории. Когда они выпустили Mad GunZ на альтернативной платформе (Catappult), в игре был только английский язык.

Они получили фичеринг (см. самый большой скачок на снимке экрана), но вскоре цифры снова упали. Большинство игроков были из Бразилии, поэтому Full HP локализовали игру и страницу приложения на бразильский вариант португальского и в результате число игроков снова выросло.


Рост загрузок Mad GunZ после локализации на португальский. На графике отмечены фичеринг и локализация на португальский.

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

Заключение


Рынок мобильных игр в Бразилии, конечно, не сравнить с китайским, но он постоянно растет и открывает заманчивые перспективы перед разработчиками.
Помните, что бразильцы любят многопользовательские игры, и что загрузки в основном идут из Google Play.

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

Наконец, имейте в виду, что игровой рынок в Бразилии все еще растет. Бразильцы доказали, что готовы платить за игры: у более чем двух третей игроков уровень дохода средний или высокий, поэтому средний чек и LTV в мобильных играх будет продолжать расти.

Об авторе

Статья написана в Alconost.

Nitro служба профессионального перевода онлайн на 35 языков. Создана компанией Alconost.

Переводчики-носители языка, заказ от 1 слова, онлайн-чат со службой поддержки.
50% заказов готово в течение 2 часов, 96% менее чем за 24 часа.

P.S: Nitro хорошо подходит для перевода небольших текстов. Если вам нужна локализация или перевод проекта посерьезней, добро пожаловать в Alconost.
Подробнее..

Арабские страны новый Клондайк для разработчиков

26.08.2020 16:11:24 | Автор: admin


Рынок Юго-Восточной Азии постепенно становится насыщенным, и крупные компании обратили внимание на страны Ближнего Востока и Северной Африки (регион MENA).

Чем привлекателен рынок арабских стран?
  • Это один из самых быстрорастущих игровых рынков в мире (ежегодный рост 25%);
  • 22 страны с населением свыше 400 млн человек;
  • Оборот игрового рынка в регионе MENA достиг $4.8 млрд и составляет 23% от мирового рынка игр;
  • и, наконец, арабский регион может похвастаться одним из самых высоких показателей ARPU (average revenue per user, средняя прибыль с одного пользователя) в мире $181 (сравните с $48 в Китае).

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

По мнению Хабиба Чамса, основателя Digital Games Conference Dubai, если ваша игра переведена на арабский, включает в себя отсылки к истории и диалоги на арабском, она взлетит как ракета.

Мы в Nitro, сервисе профессионального перевода, пообщались с Хэди Шарафельдином, лингвистом и переводчиком с английского на арабский, и расспросили Хэди о его опыте в локализации игр на арабский язык и о том, как найти подход к арабской аудитории.



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

Передаем микрофон нашему гостю, Хэди Шарафельдину.

Что выбрать: стандартный арабский или один из диалектов?


Я говорю на египетском диалекте арабского языка, но при переводе с английского на арабский использую современный стандартный арабский (MSA, Modern Standard Arabic), который также называют фусха.

Стандартный арабский можно считать универсальным языком в арабском мире. Когда вы локализуете продукт, вы, вероятно, нацелены на все арабскоязычные страны, правда? Так вот, MSA современный стандартный арабский как раз служит этой цели, чтобы все арабские пользователи понимали локализованный контент.

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

Некоторый люди утверждают, что MSA, также называемый литературным арабским, звучит слишком сухо и формально. Но когда я участвовал в локализации Battlefield 4 на арабский, мы придерживались стандартного арабского. Если Electronic Arts используют этот вариант и их пользователей все устраивает, почему бы вам не последовать их примеру?

Другие крупные компании также придерживаются этого подхода: Мы рассматриваем вариант использования диалектов в наших будущих играх, но текстовая локализация всегда будет на MSA, чтобы быть уверенными, что все наши арабскоговорящие игроки понимают контент, говорит Малек Теффаха из Ubisoft Middle East.

Относительно диалектов я отмечу, что египетский диалект один из самых понятных для арабов. Так что если вашей игре или приложению нужен более неформальный язык, может быть даже с использованием сленга, вы можете прибегнуть к египетскому диалекту арабского как сделала компания Sony в их игре Detroit: Become Human.

Square Enix выпустили тайтл Just Cause 3 с озвучкой на ливанском диалекте, что оказалось удачным решением, и коммьюнити из Саудовской Аравии и Залива очень положительно отреагировали на игру. Арабскоговорящие игроки отметили, что, несмотря на некоторую непривычность отдельных названий, они понимали суть, а ливанский диалект хорошо вписался в забавные игровые моменты, рассказывает уже знакомый нам Малек Теффаха из Ubisoft.

Однако выбор в пользу диалекта может оказаться неверным шагом. Когда Ubisoft анонсировала, что The Division 2 будет озвучена на сирийском диалекте, геймеры не одобрили это решение, и издателю пришлось вернуться к озвучке на стандартном арабском.

Резюмируем: поэкспериментировать с различными диалектами можно, но стоит быть осмотрительным, чтобы игроки не остались недовольны. И, конечно, интерфейс и субтитры всегда должны быть на стандартном арабском MSA, чтобы все арабские игроки понимали тексты.

Так ли плох Google Translate для переводов на арабский?


Хотя Google Translate неплохо справляется с общими темами, он может здорово вас подвести как в плане идиом, так и отдельных слов. Попробуйте перевести арабское слово которое означает скидки. Так вот: Google Translate считает, что оно переводится загрузки так как машинный перевод не может разобраться в контексте.

А вот еще одна забавная ошибка перевода, которая встречалась мне в работе: later alligator (шутливое Увидимся!, дословно позже, крокодил!) в машинном переводе превратилось в эй женщина, осторожнее, а то крокодил поймает тебя!

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

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

Успешный маркетинг на арабском


Первая сложность при переводе творчески передать смысл, а вторая сложность сохранить посыл, который был заложен в оригинале. Например, слоган Domino Pizza Happiness is just a bite away (дословно Счастье лишь в кусочке от тебя). Переводчики сохранили оригинальный месседж, но адаптировали его под арабский менталитет: The taste will tell you (дословно Вкус подскажет, а по смыслу Попробуйте, и вы сами все поймете).

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

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

Грамотный маркетинг на арабском делает отсылки к тому, что затронет наше сердце. Отличный пример удачной локализации от Vodafone: их слоган Power to you перевели на арабский как что означает Сила в твоих руках, ты тот, кто владеет этой силой.

Если в рекламных кампаниях или на скриншотах в App Store или Google Play представлены изображения людей, замените людей типичной западной внешности на тех, с кем арабская аудитория сможет себя идентифицировать. Как и люди в любой другой стране, арабские пользователи хотят видеть персонифицированную рекламу, а универсальная реклама оставляет их равнодушными.

Комментарий Nitro: Наш клиент Wachanga, платформа для развития семьи, придерживается именно этого подхода для своих приложений. Посмотрите на картинки для их трекера женского цикла Clover:



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

Локализация игр и арабские геймеры


Арабы заядлые геймеры, и это неудивительно, учитывая, что 50% населения моложе 30 лет. Почти 90% владельцев смартфонов в ОАЭ, Саудовской Аравии и Египте играют в мобильные игры.

Такая аудитория лакомый кусочек для разработчиков, не так ли? Однако не так много компаний заботятся о локализации своих игр и приложений на арабский язык. Одна из немногих крупных компаний, которая издала много игр на арабском Ubisoft. Интересно, что эта компания присутствует во всех соцсетях на арабском и локализует каждый трейлер к каждой игре на арабский язык, а некоторые из трейлеров даже озвучивают на арабском.

Еще одна такая компания CD Projekt. Когда их спросили, что побудило их локализовать Ведьмак 3 на арабский (мир Ведьмака нарушает множество табу арабского мира!), они ответили: Это логичный шаг. Мы хотели расти и расширять аудиторию. А так как в нашей игре очень важна история и сюжет, без локализации на арабский многие игроки попросту остались бы за бортом из-за слабого знания английского.

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

Одной из сложностей был перевод ругательств. Для арабских пользователей такие слова надо обязательно смягчать, чтобы они не шли вразрез с нашей культурой и религией. Например, мы не используем такие ругательства как f**k и переводим их как черт!

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

Имена и названия: переводить или транслитерировать?


Обычно название игры оставляют на английском. Но это может меняться в зависимости от игры. Вот интересный пример: когда выпустили арабскую версию Assassin's Creed, локализаторы выбрали транслитерацию слова ассасин, потому что перевод этого слова придал бы всей игре ярко выраженную негативную окраску (ведь в игре убийцы-ассасины вообще-то герои).

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

Имена людей не переводят на арабский. Их можно транслитерировать или оставить на английском. Я предпочитаю транслитерировать и ставить их в кавычки.

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

Зачем переводить на арабский, если арабы знают английский?


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

Учитывайте, что более 70% населения арабских стран устанавливает арабский в качестве языка интерфейса на своих смартфонах. Если вы будете обращаться к арабской аудитории на языке, который они понимают, постоянно используют и восхищаются, ваши шансы преуспеть будут намного выше.

Еще одна веская причина локализовать ваш продукт/ сайт: изначальный английский текст может оказаться грубым и даже оскорбительным без культурной адаптации. Например, в одной из игр имя персонажа совпадало с именем жены пророка, и, конечно, это звучало совершенно неприемлемо для арабов, и имя пришлось заменить.

Поговорим подробнее о том, что приемлемо в арабской культуре, а чего следует избегать.

Как адаптировать игры и рекламу под арабскую культуру?


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

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

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

Игра Ведьмак 3 собрала почти все табу, которые только можно: обнаженка, алкоголь, божества и мистические существа. Создателям игры пришлось внести существенные изменения в арабскую версию, чтобы получить допуск от Media Council комиссии, которая проверяет все новые игры на предмет нарушения ценностей арабского мира и запрещает те игры, которые их нарушают.

В одной из первых сцен в игре появляется обнаженная Йеннифер, но для арабской версии команде CD Projekt пришлось ее приодеть. Еще им пришлось заменить слово бог(и) более абстрактными понятиями типа вселенная, судьба во всей игре.

Любые сверхъестественные, мистические существа (ведьмы, вампиры и пр.) тоже попадают под запрет. Любопытная деталь: нужно быть осторожным со словами создавать/созидать и величайший, потому что в арабском языке эти слова используются по отношению к Богу.

В мобильных играх уместным шагом будет поздравить арабских игроков и предложить им тематические квесты или спецпредложения к большим исламским праздникам Рамадан, Ураза-Байрам и Курбан-Байрам (также известные как Eid). Это золотой период, когда траты в играх взлетают до небес, ведь во время этих праздников людям нечего делать (сокращенные рабочие дни, летние каникулы), и они играют в игры целыми днями.

Арабы очень уважают эти праздники, и даже если вы просто напишете Щедрого Рамадана! ( ), ваши арабские пользователи это оценят.

Посмотрите, какой ивент придумали в PUBG Mobile в честь Рамадана: они ввели награды за ежедневный вход в игру на протяжении всего Рамадана (который длится около месяца, как мы рассказывали в статье Как конвертировать праздники в прибыль для разработчика и радость для игроков)


Источник: PUBG Mobile

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

Делаем выводы


Стоит ли делать ставку на арабскоговорящие страны? Определенно стоит!

В регионе MENA (Ближний Восток и Северная Африка) сосредоточено самое активное игровое сообщество в мире. К 2022 рынок мобильных игр в арабскоговорящих странах достигнет $2.3 млрд.

Арабские геймеры известны своими бешеными тратами на игры, а такие страны как Саудовская Аравия и Объединенные Арабские Эмираты могут похвастаться самым высоким средним чеком в играх во всем мире!

Но качественных игр и контента на арабском языке все еще не хватает. Некоторые крупные компании типа Ubisoft и Blizzard уже оценили возможности арабского рынка и не собираются упускать этот шанс.

Вы тоже можете успеть локализовать игру или другой контент на арабский язык, пока рынок не заполонили другие компании, как это начинает происходить с Юго-Восточной Азией. А если вы думаете, что прибыль светит только крупным компаниям, посмотрите на кейс инди-студии Duck Rockets. Иранские пользователи в их игре самые активные и удерживают лучшие показатели retention.

Переводите на современный стандартный арабский (MSA), чтобы все игроки региона MENA могли оценить вашу локализованную версию. Экспериментировать с диалектами можно, но только для озвучки.

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

А вам уже захотелось попытать счастья на арабском рынке?

Мониторите новые интересные рынки? Тогда вам понравятся эти статьи:

5 ключиков к игровому рынку Бразилии

Как продвигать игры и приложения в Японии, Китае и Корее

Быстрый лайфхак для роста приложений: ASO на других языках

Об авторе


Статья написана в Alconost.

Nitro служба профессионального перевода онлайн на 35 языков. Создана компанией Alconost.
Переводчики-носители языка, заказ от 1 слова, онлайн-чат со службой поддержки.
50% заказов готово в течение 2 часов, 96% менее чем за 24 часа.

P.S: Nitro хорошо подходит для перевода небольших текстов. Если вам нужна локализация или перевод проекта посерьезней, добро пожаловать в Alconost.
Подробнее..

Гарри Поттер и Сливочное пиво, или Как переводить авторские неологизмы с английского на маггловский

23.10.2020 18:08:20 | Автор: admin


20 лет назад впервые вышла на русском языке легендарная книга Гарри Поттер и философский камень. На полки книжных магазинов попала малоизвестная на русскоговорящем рынке история про мальчика-который-выжил.

Джоан Роулинг придумала в своих книгах огромное количество авторских неологизмов. Перевод этих новых слов настоящее искусство.

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

Сегодня мы рассмотрим, как именно переводятся авторские неологизмы в литературе на примере Гарри Поттера. Пока многие блогеры мусолили тему со Злодеусом Злеем и Северусом Снеггом, сливочное пиво и летучий порох воспринимались чем-то привычным. А это результат тонкой работы переводчиков. Давайте вникнем подробнее. Люмос и поехали!

Как переводить неологизмы: теория и магглы (или муглы)


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

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

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

Джоан Роулинг создала больше сотни уникальных слов в романах о Гарри Поттере. Поэтому стоит поговорить про инструменты, которые использовали переводчики для передачи смыслов.

Транслитерация наше все (или почти все)


Самый простой транслитерация. Когда слово на русском звучит так же, как и на английском.

Одним из первых новых неологизмов, которые встречает читатель на страницах Гарри Поттер и философский камень, muggle. Корень mug означает простак, простофиля. То есть, слово в несколько пренебрежительном тоне говорит о людях, у которых нет магических способностей.

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

Игорь Оранский, переводчик первой книги про Гарри Поттера на русский, передал слово через прямую транслитерацию маггл. Виктор Морозов, который переводил книгу на украинский, использовал тот же инструмент мал, для благозвучия убрав удвоение согласных. На немецкий, к примеру, Клаус Фритц перевел слово как muggel суффикс был заменен на немецкий манер.

Некоторые переводчики пошли через калькирование. Мария Спивак в первой версии перевода использовала слово мугл. В официальной версии от издательства МАХАОН редактор исправил его на более привычное магл. А Юрий Мачкасов в еще одной версии перевода передал слово как мугль.

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

Транслитерация не может? Калькирование поможет!


Калькирование встречается тоже довольно часто. В Норе, доме семейства Уизли, Гарри Поттер вместе с друзьями выгоняют гномов-вредителей из сада. Процесс называется degnomming.

Слово буквально означает избавиться от гномов. Приставка de- означает в английском отделение или лишение. А gnome превратилось в глагол.

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

Или возьмем для примера квиддич (или квидиш, кому как привычнее). Keeper игрок, который защищает ворота. В спорте уже есть эквивалент этого слова вратарь. Оранский использовал именно его. А Спивак придумала новый эквивалент охранник. Не самый удачный вариант, потому что не ассоциируется со спортом.

А вот для слова seeker эквивалентов нет, поэтому пришлось переводить. Прямой перевод слова искатель. Именно так перевел слово Юрий Мачкасов. Мария Спивак перевела тоже по смыслу, но с небольшим изменением ищейка. Семантически верно, но ищейка русскоговорящим читателем воспринимается как собака, поэтому контекст здесь немного страдает. Игорь Оранский наоборот, решил подобрать другой эквивалент, который будет лучше соответствовать роли игрока на поле ловец. Именно это определение ушло в народ.

В квиддиче новых слов просто куча. И названия мячей снитч, бладжер и квоффл. В одной версии bludger назвали лупильником, а snitch щелчком. В другой снитч стал пронырой.

Есть и две другие игровые позиции chaser и beater. Охотник и загонщик не самый точный перевод, но со смыслом. Эти названия намекают на процесс охоты. Такого не было в оригинале, но перевод полюбился читателям. Не банально, вполне благозвучно и смысл есть. Правда, другие переводчики вдоволь поиздевались над ними: beater в одном варианте перевода вдруг стал отбивным, а chaser догонялой. Отбивным, Карл!

Контекстуальный перевод опасно, но интересно


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

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

Возьмем Floo powder специальный порошок, с помощью которого можно путешествовать по каминной сети. Floo очевидно, видоизмененное fly летать.

Оранский перевел его как летучий порох. Вполне благозвучный и точный перевод. Спивак же создала словосочетание кружаная мука. Кружаная от слова кружить, видимо. Или кружка, потому что хранится в кружке возле камина. Тем более, мука это порошок из какого-то измельченного вещества. Здесь видно явно неточное использование лексемы, из-за чего этот вариант перевода часто высмеивается.

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

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

У переводчика по сути есть два основных пути: пытаться передать оригинальное значение термина, но при этом пожертвовать частью или всеми смыслами лексемы, или же пытаться перевести его по смыслу, создав новое слово, но при этом есть риск, что его не примут читатели.

И самое сложное специалист никогда заранее не знает, как будет принят его перевод. Изначально локализация книги Гарри Поттера и философский камень от издательства РОСМЭН была оценена довольно скептично, но после того, как права на серию выкупили МАХАОН, мнение многих читателей изменилось.

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

Онлайн-школа EnglishDom.com вдохновляем выучить английский через технологии и человеческую заботу




Только для читателей Хабра первый урок с преподавателем по Skype бесплатно! А при покупке занятий получите до 3 уроков в подарок!

Получи целый месяц премиум-подписки на приложение ED Words в подарок.
Введи промокод potterneo на этой странице или прямо в приложении ED Words. Промокод действителен до 23.10.2021.

Наши продукты:

Подробнее..

Перевод Как локализовать онлайн-магазин? 13 шагов на пути к идеальному e-commerce сайту

28.10.2020 12:04:04 | Автор: admin
Изображение создано компанией AlconostИзображение создано компанией Alconost

Сегодня рынок электронной коммерции растт с беспрецедентной скоростью. В 2019 году объм продаж в сфере e-commerce во всм мире составил 3,53 триллиона долларов США. А уже к 2022 году эта цифра может увеличиться до 6,54 триллионов долларов США.

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

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

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

Что такое локализация контента?

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

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

Можно выделить три уровня: простой перевод, локализация и адаптация контента под местные культурные особенности. Последний термин адаптация контента под местную культуру это самый сложный способ подстройки, в то время как перевод это самый лёгкий способ.

В общем, говоря о локализации для e-commerce бизнеса, мы имеем в виду адаптацию контента. Именно максимальная проработка контента поможет сделать интернет-магазин понятным и релевантным на зарубежных рынках.

Почему онлайн-магазинам нужна локализация?

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

Согласно исследованиям, около 65% онлайн-покупателей из неанглоязычных стран предпочитают приобретать только те товары, о которых есть информация на их родном языке. Даже если перевод не слишком качественный. И около 40% из них никогда не совершат покупку на сайте, который весь на иностранном языке. Очевидно, что ни один владелец онлайн-магазина не хочет потерять эти 40% потенциальных клиентов.

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

А ещё локализация поможет избежать парочки неловких ситуаций. Один из популярных казусов в локализации произошл со скандинавским производителем пылесосов Electrolux. Компания использовала вот такой слоган на американском рынке: Nothing Sucks like an Electrolux. В переводе это должно было звучать как Ничто не всасывает пыль лучше, чем Electrolux. Но в итоге буквальный перевод фразы на английский означает Нет ничего хуже, чем Electrolux, причём в достаточно грубой форме.

Как сделать качественную локализацию онлайн-магазина

Для того, чтобы не упустить ни одной детали при локализации контента лучше заранее составить чткий план. Тут понадобится продуманная стратегия, и дальше мы расскажем о её самых важных элементах. Поехали!

1. Проведите маркетинговое исследование рынка

Маркетинговое исследование это первый и самый важный шаг перед тем, как начать процесс локализации контента.

Изучите существующие данные о своих клиентах: из каких стран их приходит больше всего? Проанализируйте эти данные и решите на каких языках целесообразнее сосредоточиться. Также изучите, какие продукты могут стать самыми успешными на новом рынке. Например, если вы продаёте одежду в интернет-магазине, то товары для Австралии могут отличаться от товаров для Исландии. Очевидно, что продавать летнюю одежду в Исландии не самое перспективное направление. Чтобы понять какие продукты имеют шансы на успех в определенном регионе, можно воспользоваться Планировщиком ключевых слов от Google или инструментом Google Trends.

2. Выберите контент, который стоит локализовать

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

Кроме того, для начала можно локализовать примерно 10% контента основные разделы и страницы. Это поможет в целом понять, работает локализованный контент или нет. И когда вы увидите, что у зарубежной аудитории есть интерес, можно приступить к локализации всего контента онлайн-магазина.

3. Без SEO-оптимизации не обойтись

Профессиональная SEO-оптимизация поможет увеличить вовлеченность, трафик и конверсии на локализованном сайте.

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

Очевидно, что в каждом регионе люди гуглят по-разному. Например, если вы продаёте очки в России и Украине, то нужно выбирать разные ключевые слова. На российском сайте можно добавить, к примеру, фразы с названиями крупных городов: очки в Москве, купить очки в Питере и т.д. А для украинской версии сайта можно выбрать ключевые слова ещё и на украинском языке.

И нужно будет не только подобрать релевантные "ключи", но и внести их на сайт, обновить все URL-адреса согласно региону, изменить заголовки и подзаголовки, а также обновить все метатеги.

4. Думайте креативно, но не забывайте о местной культуре

А ещё надо подумать о рекламных кампаниях для нового рынка. Конечно, сайт придётся продвигать, иначе как о вас узнает новая аудитория? Очень важно, чтобы реклама была максимально нативной, чтобы привлечь как можно больше людей и сконвертировать их в реальных покупателей.

Согласно исследованию локализованная реклама работает намного лучше, чем реклама на иностранном языке. Результаты сравнения двух таких кампаний на Facebook впечатляют: у объявлений, в которых использовался локализованный текст, CTR (click-through rate, показатель кликабельности) выше на 22% среди женщин и на 87% среди мужчин, чем в аналогичной нелокализованной рекламе.

Изображение с сайта adparlor.comИзображение с сайта adparlor.com

5. Проверьте культурный контекст

Обратите внимание на культурные особенности нового рынка, традиционные для региона праздники и ивенты.

Чрная пятница и Киберпонедельник стали чуть ли не самыми важными днями для e-commerce в США, Великобритании и даже России. Но, например, в Китае существует своя версия этого дня День холостяков, который празднуют 11 ноября. Интересно, что кроме китайского бизнеса в этот день скидки активно предоставляют и многие западные компании, которые работают в китайском сегменте. Так что если вы выходите на иностранный рынок, не забудьте адаптировать и промо-акции.

А ешё, к примеру, если вы продаёте товары и в России, и в США, стоит учитывать, что Рождество в России не такой популярный праздник, как в Америке. В российских реалиях Новый Год важнее. Поэтому локализуйте контент с учётом этих особенностей: в США вы можете устроить распродажу на Рождество, а в России будет логичнее предложить новогодние скидки.

6. Валюта, единицы измерения и размеры одежды

Для онлайн-магазинов цены это первое, о чм следует подумать при локализации. Очевидно, что пользователям привычнее и удобнее видеть цены в своей местной валюте. Либо можно указать две цены: в оригинальной и местной валютах.

При локализации валют используйте соответствующие символы для обозначения валюты. А ещё обратите внимание на то, что некоторые символы валюты указываются перед ценой, например $ и , а некоторые после, например . Для обозначения десятичных знаков используются разные разделители: в одних регионах это запятые, а в других точки.

Не забудьте локализовать единицы измерения. К примеру, в Европе и США температура обозначается по-разному C и F соответственно.

Если вы продаете одежду, подумайте о локализации размеров, указанных на сайте. Европейские размеры обуви обычно выглядят так: 34, 35, 36 и т.д. А в США размерный ряд начинается с 5,6, 7, 8 и т.д.

7. Локализованная корзина покупок

Не все покупатели, добавившие товары в корзину, потом покупают их. Для этого был даже придуман специальный термин брошенная корзина. На самом деле, около 70% покупателей уходят из интернет-магазина, так и не завершив покупки. Поэтому, если не локализовать корзину покупок, то велик шанс, что этот показатель будет ещё выше.

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

8. Проверка терминов

Не секрет, что даже у одного языка может быть множество диалектов. Возьмём, к примеру, английский язык. Британский и американский английский значительно отличаются между собой.

Например, elevator и lift означают одно и то же лифт, но первое слово используется в американском варианте, а второе в британском. То же самое можно сказать о словах vacationи holiday. На такие детали стоит обращать внимание, чтобы звучать по-настоящему аутентично на зарубежном рынке.

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

9. Формат времени и даты

Это важно, потому что неправильный формат может ввести в заблуждение зарубежных клиентов. Предположим, вы продаёте из России в США. Покупатель в Америке указывает дату 02.03.2020. Для вас, в России, это означает 2 марта. В США это же значит 3 февраля. Наверное, покупатель будет разочарован, получив свой заказ на месяц позже... Поэтому не забудьте поменять форматы даты под разные рынки.

В большинстве стран в формате даты день стоит первым, а год последним ДД/ММ/ГГГГ. Однако в некоторых странах, таких как Китай, Корея и Иран, используются такой формат даты: ГГГГ/ММ/ДД. Формат времени может быть 24-часовым или 12-часовым. В США обычно используется формат AM/PM, а в Европе более распространён 24-часовой формат.

10. Правовые нормы и законы

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

Убедитесь, что ваши товары абсолютно легальны на данном рынке. К примеру, однажды, не проверив все юридические моменты, Kinder Surprise хотели выйти на рынок США. И вдруг они обнаружили, что шоколадные яйца с игрушками внутри являются незаконными там, хотя соседние Канада и Мексика разрешают их продажу на своей территории. Наверное, никто не хотел бы оказаться в ситуации, когда вы потратили много денег на запуск продукта и вдруг понимаете, что вы вообще не имеете права продавать его в данном регионе.

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

11. Региональная служба поддержки

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

Кстати, хорошая идея сделать раздел F.A.Q. на сайте наиболее часто задаваемые вопросы (frequently asked questions). Можно разместить заготовленные ответы на самые распространённые вопросы, и пользователи сами найдут эту информацию, когда она понадобится. Это частично позволит сократить затраты на команду поддержки в новом регионе.

12. Изображения, соответствующие местной культуре

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

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

Изображение взято с сайта www.gilt.comИзображение взято с сайта www.gilt.com

13. Локализованные соцсети

Без социальных сетей сегодня не может существовать ни один бизнес.

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

Локализованные социальные сети дадут местной аудитории более персонализированный опыт взаимодействия с вашим брендом. Посмотрите, как, например, у McDonald's выглядят разные аккаунты в Instagram для разных стран.

Аккаунт McDonalds в Канаде в InstagramАккаунт McDonalds в Канаде в InstagramАккаунт McDonalds в России в InstagramАккаунт McDonalds в России в Instagram

Полезные советы по локализации интернет-магазинов

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

Непрерывная локализация

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

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

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

Локализационное тестирование

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

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

  • Целевая аудитория и исследование рынка

  • Культурный контекст

  • Правовые нормы и законы

  • Маркетинг в популярных социальных сетях

  • Правильный перевод всех описаний

  • Правильные форматы времени, даты, валюты, размеров одежды и т.д.

  • Локализация корзины покурок

  • Региональная служба поддержки

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

О нас

Alconost профессионально занимается локализацией приложений, игр и сайтов на более 70 языков. Лингвистическое тестирование, облачная платформа с API, непрерывная локализация, менеджмент проектов 24/7, любые форматы строковых ресурсов. Мы также делаем видеоролики.

Подробнее..

Перевод Как локализовать игру? Пошаговое руководство

12.11.2020 12:19:49 | Автор: admin
Иллюстрация создана компанией AlconostИллюстрация создана компанией Alconost

Сегодня очевидно, что недостаточно просто выпустить качественную игру с увлекательным геймплеем: нужно сделать её доступной и понятной для аудитории из разных регионов. И с этой задачей помогает справиться локализация.

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

Так как же убедиться в том, что локализация игры выполнена успешно? Что всё переведено правильно и в игре нет даже самых мелких ошибок и недочётов? Секрет в организации самого процесса локализации.

Дальше мы расскажем о том, как устроен процесс локализации в Alconost. Надеемся, что сможем дать ответы на самые сложные вопросы локализации. Поехали!

Этап 1. Подготовка к локализации

Большинство создателей игр задумываются о локализации на том или ином этапе разработки. Но некоторые забывают о предварительной подготовке к ней. Итак, что же важно учесть перед тем, как приступить к локализации игры?

Исследование и анализ рынка

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

Детальное понимание целевой аудитории влияет на такие факторы, как:

  • используемая платформа для приложения (Android для Европы и большей части Азии, iOS для США);

  • функциональность игры;

  • способы геймификации;

  • список языков для локализации.

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

Например, игроки в Японии привыкли к тому, что видеоигра может содержать определённые фразы на английском. Поэтому если вы планируете работать с японской аудиторией, проанализируйте весь контент и решите, какие элементы нужно перевести, а какие можно оставить на английском.

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

Возможно, вы задумались, как можно быстро провести исследование рынка, не имея предварительного опыта?

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

А ещё советуем изучить информацию о наиболее распространённых языках для локализации, чтобы понимать, в каких регионах ваши шансы на успех будут выше.

Подготовка документации для локализации

Документация для локализации это файлы и документы, необходимые для перевода с учётом всех особенностей продукта. Документы со строками для перевода (строковые ресурсы) занимают важное место в документации. Они могут быть представлены файлами различных форматов, например, XML или CSV. И важно проследить, чтобы все документы были сохранены в одном формате.

А ещё документация для локализации (в профессиональной терминологии называется lockit, сокращённое от localization kit) может включать в себя такие элементы:

  • глоссарий терминов;

  • предыдущие переводы;

  • файлы, предоставляющие информацию о самом продукте;

  • используемые шрифты;

  • игровые видео;

  • звуковые дорожки;

  • собранный бидл игры (намного реже).

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

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

Ещё один важный момент подготовка глоссария. Как правило, он содержит наиболее важные и часто встречаемые слова и фразы, такие как имена героев, локации, названия предметов в игре. Использование глоссария обеспечивает согласованность перевода игры для всех локалей. Кроме того, глоссарий значительно ускоряет процесс локализации, потому что переводчики всегда могут свериться с ним самостоятельно. Отталкиваясь от информации, указанной в опроснике, менеджеры проектов назначают наиболее подходящих специалистов и распределяют задачи согласно их предыдущему опыту.

Если вы хотите узнать больше именнно о подготовке к локализации, советуем изучить 10 основных правил, которые составила наша команда. Тут о выборе правильной кодировки (Unicode), об использовании шрифтов, о выборе форматов времени и даты, а также другие тонкости, которые нужно учитывать при подготовке к локализации.

Этап 2. Непосредственно локализация проекта

Допустим, вы определились с целевой аудиторией, нужными языками и собрали документацию для локализации (либо самостоятельно, либо с небольшой помощью со стороны агентства). Что же делать дальше?

Выбор подходящей платформы для локализации

Существует множество платформ для локализации с широким функционалом (анализ файлов для перевода, различные форматировщики для облегчения перевода и т.д.).

Схема создана компанией AlconostСхема создана компанией Alconost

Мы предпочитаем использовать Crowdin, так как эта платформа обладает всеми функциями, необходимыми для быстрой и успешной локализации.

Вот, на наш взгляд, наиболее полезные фичи Crowdin:

  • возможность добавлять комментарии к текстовым строкам, по которым требуется уточнение;

  • возможность добавлять к текстовым строкам скриншоты с исходным контентом;

  • автоматический разбор файлов на отдельные текстовые строки;

  • дополнительные функции для выбора и настройки необходимых языков перевода;

  • возможность ограничить количество символов в строке, если дизайн накладывает лимиты на длину строк;

  • возможность загрузки существующих переводов и ресурсов локализации;

  • возможность загрузки обновлённых версий файлов (Crowdin может распознавать и различать вновь добавленные или обновлённые файлы);

  • локализация без отрыва от контекста;

  • различные интеграции;

  • инструменты для коммуникации между участниками команды.

Мы тесно сотрудничаем с командой поддержки Crowdin, и любой вопрос, по нашему опыту, решается быстро.Crowdin делает управление проектом удобным, облегчает и ускоряет локализацию за счёт автоматизации отдельных задач.

Процесс перевода

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

Чтобы избежать критических ошибок, очень важно выбрать правильный метод перевода.

1. Машинный перевод

Машинный перевод перевод текста специальным автоматизированным программным обеспечением. Самое большое преимущество такого перевода низкая стоимость и высокая скорость. Тем не менее, машинный перевод далеко не идеален: в нём нет персонального подход и часто теряется контекст.

Мы считаем, что машинный перевод для видеоигр однозначное нет. Видеоигры требуют творческого подхода в переводе, в то время как машинный перевод даёт автоматизированный и бездушный текст с возможными семантическими ошибками.

2. Краудсорсинговый (коллективный) перевод

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

С одной стороны, сообщество имеет неоспоримое преимущество: оно превосходно знает продукт, ведь участники сообщества заядлые игроки. С другой стороны, людям из сообщества часто не хватает профессиональных навыков, необходимых для точного и качественного перевода. Кроме того, как бы это ни звучало парадоксально, многие носители языка из коммьюнити геймеров не знают его в совершенстве, поэтому ошибки в краудсорсинговом переводе не редкость. К другим существенным недостаткам можно отнести отсутствие гарантий соблюдения сроков и проблемы с переводом на определённые редкие языки.

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

Краткая история из переводческих будней: локализация игры Goat Simulator

Скриншот игры Goat Simulator в Google PlayСкриншот игры Goat Simulator в Google Play

Goat Simulator знаменитая видеоигра, разработанная студией Coffee Stain Studios. Эта игра доступна на нескольких языках: английском, немецком, испанском, французском и польском.

Изначально переводить игру разработчикам помогало только игровое сообщество. Но по мере того, как появлялось всё больше и больше обновлений, сообществу стало трудно следить за новыми версиями и вовремя переводить их.Именно тогда разработчики обратились к Alconost, передав весь перевод нашей команде.

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

В случае с Goat Simulator мы также перенесли проект в Crowdin, чтобы организовать более лёгкий, быстрый и удобный процесс локализации.

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

3. Перевод своими силами

В редких случаях у компании-разработчика есть собственная команда опытных переводчиков (речь не идёт о таких гигантах, как Ubisoft или Blizzard). Когда дело доходит до локализации, большинство девелоперов нанимают команду фрилансеров. Но переводчики-фрилансеры могут не знать всех аспектов локализации.

К другим недостаткам работы с фрилансерами можно отнести:

  • сложности с контролем качества и организацией проекта;

  • высокий риск наличия ошибок;

  • риски, связанные с размером затрат или срывом сроков выполнения.

Сотрудничество с фрилансерами предполагает наличие в штате опытного менеджера по локализации, а содержание такой штатной позиции не всегда оправдано с финансовой точки зрения.

4. Профессиональная локализация

Под профессиональной локализацией подразумевается сотрудничество с агентством по локализации, которое позаботится не только о переводе текста, но и об управлении самим процессом. Работа с агентством даёт немало преимуществ:

  • высокое качество перевода, обеспечиваемое опытной командой переводчиков;

  • удобное и простое управление проектами;

  • наличие всех необходимых специалистов в одной команде (переводчиков, менеджеров проектов, специалистов по контролю качества);

  • необходимые инструменты для удобной работы.

К примеру, в Alconost за каждым проектом закрепляется персональный менеджер. Он выбирает специалистов с необходимой квалификацией для выполнения поставленных задач, контролирует качество работы и дедлайны и в целом выступает посредником между клиентом и командой. Таким образом, проект всегда чётко спланирован и организован, а клиент в любой момент может уточнить, на каком этапе выполнения находится его задача у своего проектного менеджера.

Передовые практики локализации

Чтобы обеспечить высокое качество переводов, важно знать современные практики и тенденции в локализации. Недостаточно просто взять текст и перевести его, чтобы порадовать или поразить играков нативным геймплеем.

1. Предоставьте переводчикам справочные материалы и контекст

Дополнительные поясняющие материалы никогда не будут лишними и бесполезными. К примеру, платформа Crowdin, о которой мы уже говорили, позволяет добавлять комментарии к строкам и скриншоты, поясняющие геймплей. Зачем это нужно?

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

2. Проверьте дважды

Во время локализации нужно обратить внимание на важные моменты для конкретного рынка.

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

3. Учтите особенности дизайна

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

Краткая история из переводческих будней: локализация игры Family Island

Family Island это игра-симулятор жизни на ферме для мобильных устройств (iOS и Android), которая была выпущена на нескольких языках.

Скриншот игры Family Island в Google PlayСкриншот игры Family Island в Google Play

Когда Melsoft Games попросили помочь с локализацией для японского рынка, мы столкнулись с проблемами в интерфейсе. Разработчики не учли, что японские иероглифы занимают больше места, чем английские или французские буквы. В результате переведенный текст не помещался в предполагаемое текстовое поле.

Как только мы обнаружили проблему, то сразу же сообщили о ней разработчикам.

А ещё мы постарались сократить количество символов, сохранив при этом контекст и первоначальный смысл.

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

4. Пусть переводчики сами поиграют в игру

Нет лучшего способа понять игру, чем просто поиграть в неё. Предоставьте доступ к игре, чтобы переводчики полностью поняли её концепцию, сленг, геймплей и другие важные детали.

5. Выполните лингвистическое тестирование

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

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

В компании Alconost мы, к примеру, проверяем качество контента на протяжении всего процесса локализации. Ответственный за проверку качества менеджер проекта. Он следит, чтобы всё шло гладко: переведённый контент соответствовал требованиям, переводчики вычитывали и проверяли все переводы и т.д.

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

Заключение

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

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

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

О нас

Alconost профессионально занимаетсялокализацией игр,приложений и сайтовна более 70 языков. Лингвистическое тестирование, облачная платформа с API, непрерывная локализация, менеджмент проектов 24/7, любые форматы строковых ресурсов. Мы также делаемвидеоролики.

Подробнее..

Перевод Как локализовать продукт для канадского рынка?

30.12.2020 12:20:04 | Автор: admin

Канада это одна из самых развитых стран в мире. Согласно последним данным, в 2019 году Канада стала 10-й страной в мире по величине экономики с ВВП в 1731 триллион долларов США. Более того, по прогнозу, к 2034 году Канада имеет все шансы стать 8-ой экономикой в мире. В последние годы канадская экономика растёт за счёт значительного развития в сфере новых технологий и разработки программного обеспечения.

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

Рост экономики Канады за счёт сферы технологий, программного обеспечения, приложений и игр

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

Как мы уже говорили, Канада одна из самых перспективных стран для продвижения бизнеса благодаря тому, что входит в топ самых богатых стран мира. Даже в условиях нынешнего экономического спада на мировом рынке Канада по-прежнему имеет относительно стабильную, диверсифицированную и хорошо развитую экономику. В конце концов, Канада гораздо меньше пострадала от COVID-19, например, по сравнению с её южным соседом, Соединенными Штатами Америки.

Основные отрасли экономики Канады, в которых наблюдается рост, программное обеспечение, электронная коммерция, онлайн-игры, а также природные ресурсы. Да, согласно данным Statista, ВВП падает. В 2020 году он упал на 7%, но, по прогнозам, в 2021 году ВВП сможет вырасти на 5%.

Очевидно, что компании-разработчики, инвестирующие в канадский рынок, также смогут насладиться всеобщим ростом экономики. В последние несколько лет доходы в сфере разработки программного обеспечения и компьютерных услуг в Канаде увеличивались примерно на 5,9% в год.

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

Рынок мобильных игр также демонстрирует значительный рост в Канаде: прогнозируемый доход от мобильных игр вырастет с 309 млн долларов США в 2019 году до 364 млн долларов США в 2025 году. И компании, которые инвестируют в локализацию своих игр сейчас, имеют много шансов получить большую прибыль на канадском рынке.

Кроме того, в Канаде большой средний класс с высокими зарплатами, которые растут с каждым годом. Например, в 2018 году канадские налоговые органы получили 938,5 миллиарда канадских долларов с заработной платы, окладов и комиссионных населения.

Данные из Statista.com Данные из Statista.com

Поэтому если вы задумывались о расширении своего бизнеса в 2021 году, то мы советуем присмотреться к рынку Канады.

С чего начать локализацию для Канады?

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

В Канаде официальными признаны сразу два языка: английский и французский. Это означает, что все федеральные документы и информация должны публиковаться на обоих официальных языках. Однако в каждой из десяти провинций и трёх территорий Канады действуют свои лингвистические правила. Вот, например, некоторые из них:

  • В Канаде всего две официально двуязычные провинции: Нью-Брансуик и Манитоба. Упаковка продуктов, реклама и другие публичные коммуникации должны быть как на английском, так и французском. Также, правительство провинции должно предлагать услуги на обоих языках.

  • Квебек официально является только франкоязычным, хотя в самом крупном городе этой провинции, Монреале, 50/50 французского и английского населения.

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

  • Центральные провинции Альберта и Саскачеван, а также приморские провинции Новая Шотландия и остров Принца Эдуарда официально являются только английскими. Тем не менее, многие продукты и услуги предлагаются на обоих языках, поскольку в этих регионах также есть некоторые франкоязычные группы.

  • Онтарио имеет региональную языковую политику. Некоторые части провинции двуязычны, а другие только английские.

Канада и США: разве это не одно и то же?

Несмотря на то, что канадцы и американцы имеют много общего, особенно в сфере СМИ, поп-культуры и коммерческой продукции, это все ещё две очень разные нации. У каждой своё сильное чувство культурной самобытности. Вот несколько существенных различий лингвистических, культурных и социальных норм между Канадой и США.

Например, написание канадского английского языка такое же, как написание британского английского, но во многих случаях отличается от американского английского.

  • Слова, оканчивающиеся на -or в США, заканчиваются на -our в Канаде. Например, в таких словах, как colour, favour, flavour или behaviour.

  • Вместо слов, оканчивающихся на -er, они пишутся с -re, как в словах centre.

  • Существительные, такие как defence и offence, заканчиваются на -ce вместо -se. Кроме того, чтобы различать существительные и глагольные формы некоторых слов, например, practice и practise, используется буква s для глагола и c для существительного.

  • Конечная буква l удваивается в таких словах, как в travelled и cancelled, тогда как американцы используют только одну букву l.

  • Окончание -оg в словах типа catalog изменяется на catalogue.

  • Такие слова, как esthetic в США, пишутся через -ae: как в aesthetic в Канаде.

В Канаде используется метрическая система и измеряется температура в градусах Цельсия вместо имперской системы и градусов Фаренгейта, как в США. Однако старшие поколения могут всё ещё использовать американские единицы измерения, так как метрическая система пришла в Канаду только в 1970 году.

Конечно же, в Канаде есть свои сленговые слова, как и в США. Скорее всего вы захотите быть близкими по культуре к местным брендам. В этом случае для маркетинговых кампаний или перевода сайта необходимо использовать локальный сленг и местные шутки, чтобы быстрее влиться в новый рынок и завоевать доверие новой аудитории. Для этого очень важно знать, чем живёт ваша аудитория. Например, самый любимый поставщик кофе канадцев, Тим Хортон (Tim Hortons), и канадцы часто называют его просто Тиммис (Timmies).

Вот список некоторых терминов, характерных для Канады:

  • Washroom (Санузел): вместо restroom or bathroom.

  • Pop: аналог soda (газировка) в США.

  • Chocolate bar (Шоколадный батончик): в отличие от candy bar в США.

  • Click: ещё один способ сказать километр в Канаде.

  • Runners (беговые кроссовки): вместо слов tennis shoes (теннисные туфли) или sneakers (кроссовки) в США или trainers в Великобритании.

  • Loonies and Toonies: как канадцы называют свои монеты в один и два канадских доллара. Слово loon происходит от одноименной птицы.

Канадский французский и Европейский французский

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

Французский, на котором говорят в Квебеке, называется joual, в то время как в каждом регионе есть свой способ называть свой язык. Например, в Альберте его называют Franco-Albertain, а в Саскачеване Fransaskois. Акадский французский это ещё один диалект канадского французского, на котором говорят около 350 000 человек, в основном в Нью-Брансуике.

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

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

Вот, например, некоторые различия между европейским французским и французским канадским языком:

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

  • Канадский французский включает слова коренных народов Канады.

  • Канадцы обычно более неформальны и при обращении друг к другу используют форму tu вместо vous; это социально неприемлемо во Франции или франкоговорящих странах Европы.

  • Французские канадцы будут чаще использовать для слова мы форму on, чем nous.

Разница некоторых слов в Канаде и Франции

Русский

Французский (Франция)

Французский (Канада)

машина

voiture

char

нижнее бельё

culottes

bobettes

хот-дог

hot-dog / saucisse

chien-chaud

стиральная машина

machine laver

laveuse

насекомое

moustique

maringuouin

Стратегия локализации для рынка Канады

При выходе на канадский рынок необходимо учитывать некоторые культурные и лингвистические особенности. Индивидуальный подход к контенту и осознание уникальности страны будет иметь решающее значение. Важно понимать, что Канада, как бы она ни была близка к США, это самобытная и уникальная страна.

Поэтому важно знать, какие языки используются в каких регионах. При выходе на канадский рынок разумно локализовать свой продукт как на канадский английский, так и на французский, чтобы соблюсти все законы и охватить всё возможное население. В Канаде 22,8% населения говорит по-французски, а 75,4% по-английски. Поэтому, если вы будете ориентироваться только на одну языковую группу, то вы значительно сократите количество своих потенциальных клиентов.

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

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

Помните, что канадская культура не идентична с американской. Хотя у этих соседних стран есть много общего, между ними всё же есть поразительные различия с точки зрения языка и культурных норм, не говоря уже о совершенно иной политической и экономической системе. Последний, наверное самый важный совет: при запуске в Канаду не копируйте американскую стратегию. Вам нужно локализовать продукт отдельно для Канады, как и для любой другой страны.

О переводчике

Перевод статьи выполнен в Alconost.

Alconost занимаетсялокализацией игр,приложений и сайтовна 70 языков. Переводчики-носители языка, лингвистическое тестирование, облачная платформа с API, непрерывная локализация, менеджеры проектов 24/7, любые форматы строковых ресурсов.

Мы также делаемрекламные и обучающие видеоролики для сайтов, продающие, имиджевые, рекламные, обучающие, тизеры, эксплейнеры, трейлеры для Google Play и App Store.

Подробнее..

Самые популярные языки для локализации в 2021 году обзор от Alconost

24.02.2021 16:18:54 | Автор: admin
Какие языки выбрать для локализации сервиса, приложения или игры?Какие языки выбрать для локализации сервиса, приложения или игры?

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

Несколько слов о том, кто мы и почему из нашей статистики можно делать выводы. Мы в Alconost локализуем приложения, игры и веб-сервисы. Наши клиенты и крупные игроки IT-рынка, и небольшие команды, и инди-разработчики. С 2004 года мы помогли 2000 IT-компаний со всего мира вывести их продукты на новые рынки.

Клиенты регулярно спрашивают у нас: На какие языки посоветуете переводить? Ответим с опорой на факты. Мы проанализировали заказы за 2020 год и подготовили для вас статистику, инфографику и аналитику по языкам, которые выбирают наши клиенты.

Для этого обзора рассматривались заказы на перевод с английского языка, выполненные в отделе локализации Alconost.

Топ-12 языков для локализации с английского

В 2020-м клиенты переводили у нас с английского на 89 языков. Подчеркнём, что абсолютное большинство клиентов переводят у нас именно с английского, в то время как локализацию с других языков заказывают менее чем в 3% случаев.

Итак, давайте посмотрим, какие языки самые популярные при переводе сервисов, приложений и игр с английского.

Диаграмма 1. Самые популярные языки для локализации с английскогоДиаграмма 1. Самые популярные языки для локализации с английского

Диаграмма 1. Доля переводов на языки из топ-12 языков составляет 62,3% от общего объёма заказов на локализацию с английского.

Удивлены? Да, локализация даже на все 12 самых популярных языков будет отвечать потребностям лишь 2/3 потенциальной аудитории. Для охвата оставшейся трети понадобится локализация ещё на 70+ языков.

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

Лидеры рейтинга: классика FIGS и не только

Есть 4 языка, которые считаются классикой локализации. Это французский, итальянский, немецкий и испанский. Их даже обозначают аббревиатурой FIGS или, добавляя английский, EFIGS. Переводы с английского на эти языки возглавляют наш топ.

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

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

Диаграмма 2. Пять самых популярных языков для локализации с английского: распределение долейДиаграмма 2. Пять самых популярных языков для локализации с английского: распределение долей

Диаграмма 2. Самые популярные языки для перевода с английского среди клиентов Alconost французский, итальянский, испанский и немецкий.

Но мир становится всё глобальнее, и к европейской классике добавляются новые языки. Для наших клиентов новой классикой локализации в 2020-м стал бразильский португальский: он наступает на пятки лидирующей четвёрке, совсем немного уступая немецкому и испанскому.

Выбор языка или выбор страны?

Интересный факт: бразильский португальский единственный язык в нашем топ-5, не совпадающий со страной происхождения. Так, французский может быть ещё и канадским; к слову, если вас интересует это направление вот наш обзор рынка и советы по локализации для Канады. У испанского несколько разновидностей: взять хотя бы аргентинский, колумбийский и мексиканский. И хотя мы переводим на все эти диалекты (а переводы на мексиканский испанский даже входят в наш топ-20), французский и испанский наши клиенты чаще всего заказывают именно для Европы, а португальский именно для Латинской Америки (Бразилия).

На наш взгляд, вот почему бразильский португальский популярен для локализации. Бразилия входит в топ-10 стран по величине экономики, в топ-3 по показателям загрузок в Google Play и App Store, а ещё в стране высокий уровень покупательной способности. Кстати, мы внимательно изучали рынок мобильных игр и приложений Бразилии; почитайте наш обзор.

Смотрим на Восток

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

Кроме того, нельзя недооценивать и платёжеспособность японского рынка, где ежемесячный ARPU в 5 раз выше китайского. И хотя занять место под солнцем на японском рынке не самая простая задача для иностранного разработчика, возможные трудности не уменьшают привлекательность этой страны для продвижения IT-продуктов.

Что до китайского, то локализация на его упрощённый вариант занимает в нашем рейтинге 8-е место, а переводы на традиционный китайский 13-е.

Диаграмма 3. Локализация с английского на китайский: нюансы Диаграмма 3. Локализация с английского на китайский: нюансы

Диаграмма 3. С английского на упрощённый китайский мы перевели почти в 2 раза больше заказов, чем на традиционный китайский.

Различия между разновидностями китайского разработчики учитывают при выборе региона, в котором планируется продвигать продукт. Так, на упрощённый китайский его ещё называют мандарин переводят для пользователей из материковой части Китая. А на традиционный китайский и его другие диалекты заказывают локализацию для пользователей с Тайваня или из Гонконга.

Обратно на Восток через Нидерланды

Интересно, что между двумя популярными языками азиатского региона японским на 6-м месте и упрощённым китайским на 8-м неожиданно оказался нидерландский. На наш взгляд, есть несколько причин его популярности для локализации. Среди них платежеспособность и развитая Интернет-инфраструктура, а ещё высокая лояльность голландских пользователей к контенту на родном языке.

К слову, любопытный факт о геймдев-индустрия Нидерландов: именно эта страна стала первой в Европе, сделавшей гейм-дизайн учебной дисциплиной.

Замыкают десятку турецкий и корейский языки. Эти страны в последние годы особенно интересуют разработчиков игр. Ведь среди стран Среднего Востока и Северной Африки именно Турция приносит гейм-девелоперам наибольший доход, а корейский игровой рынок четвёртый по доходности в мире.

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

А что за пределами топ-10?

Вторую десятку рейтинга открывают переводы с английского на польский язык. Количество заказов по этому языковому направлению совсем немного отстаёт от пары английский корейский.

Интересно, что переводы с английского на русский, на котором говорят около 260 млн человек в мире, популярны меньше переводов на польский, общее число говорящих на котором около 40 млн. И это далеко не единичный случай, когда количество говорящих и популярность языка для перевода не коррелируют друг с другом. Рассмотрим эту особенность подробнее.

Влияет ли общая численность говорящих на популярность языка для локализации?

По нашим наблюдениям скорее нет, чем да. Выше мы уже привели пример с польским и русским. Ещё пример: общее число говорящих на японском около 140 млн (сравните с 260 млн русскоговорящих). Но переводы с английского на русский занимают в нашем рейтинге лишь 12-е место, а на японский 6-е.

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

Такую же тенденцию мы заметили и за пределами топа. Например, общее число говорящих на вьетнамском около 90 млн человек; индонезийский язык распространён в 2,2 раза больше, а хинди почти в 7 раз. Тем не менее, количество заказов по переводу с английского на каждый из этих языков было у нас в 2020-м почти одинаковым.

Продолжая анализировать азиатские страны, похожую картину увидим и с языками Малайзии и Таиланда. Локализация на тайский интересует наших клиентов почти вдвое чаще переводов на малайский и это несмотря на то, что на тайском говорит в 4 раза меньше людей на Земле, чем на малайском.

Что принимать во внимание при выборе языка для локализации?

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

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

С чего начать локализацию игры или приложения? Конечно, это зависит от бюджета. Наши клиенты, как правило, начинают с локализации интерфейса продукта, параллельно с этим переводя справочную документацию и сайт. Для мобильных приложений вместе с UI локализуют описания и скриншоты для сторов. А если проводятся локальные маркетинговые кампании, переводится и рекламный контент: текстовые объявления, баннеры, видеоролики.

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

На какой бы стадии выпуска продукта на новый рынок вы ни находились, обращайтесь за локализацией к нам в Alconost. Мы переводим сервисы, сайты, игры и приложения на 70+ языков.

Больше статистики по локальным рынкам

Как мы упоминали в начале, языки из топ-12 это только 2/3 локализаций. О менее популярных, но не менее интересных направлениях для локализации с английского мы решили рассказать в дополнительной подборке. Из неё можно можно узнать:

  • какой из языков Северной Европы был самым популярным среди наших клиентов в 2020-м, а какой заметно отставал от тройки лидеров;

  • какие языки Центральной Европы, помимо входящего в топ польского, были востребованы для локализации приложений, игр и сервисов с английского;

  • на какие языки Южной Европы стоит обратить внимание помимо испанского, итальянского и турецкого, входящих в топ-10;

  • как обстоят дела с локализацией на языки стран Ближнего Востока.

Посмотреть эту подборку можно в нашем блоге.

Обзоры рынков конкретных стран и рекомендации по локализации для них от Alconost

  1. Чехия и Словакия

  2. Финляндия

  3. Япония

  4. Арабский рынок

  5. Бразилия

  6. Япония, Корея, Китай

  7. Канада

Подробнее..

Перевод Почему интернационализация и локализация имеют значение

12.10.2020 16:11:28 | Автор: admin

Хабр, отличного всем времени суток! Скоро в OTUS стартует курс Python Web-Developer: мы приглашаем на бесплатный Demo-урок Паттерны Page Controller и Front Controller: реализация в Django и публикуем перевод статьи Nicolle Cysneiros Full Stack Developer (Labcodes).


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

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

Локализация или интернационализация

Локализация процесс адаптации приложения, продукта или документа для удобства пользователей разных стран и культур.

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

Как гласит документация Django: локализацию делают переводчики, а интернационализацию разработчики.

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

  • Формат даты и валюты;

  • Конвертация валюты;

  • Преобразование единиц измерения;

  • Символы юникода и двунаправленны текст (см. ниже);

  • Часовые пояса, календарь и особые праздники.

Домашняя страница Википедии на английскомДомашняя страница Википедии на английскомДомашняя страница Википедии на арабскомДомашняя страница Википедии на арабском

С помощью таких адаптаций мы можем улучшить пользовательский опыт нашего приложения.

Как это делается в Python?

GNU gettext

Есть несколько инструментов, которые могут помочь локализовать ваше приложения на Python. Начнем с пакета GNU gettext, который является частью Translation Project. В этом пакете есть:

  • библиотека, которая в рантайме поддерживает извлечение переведенных сообщений;

  • набор соглашений о том, как нужно писать код для поддержки каталогов сообщений;

  • библиотека, поддерживающая синтаксический анализ и создание файлов, содержащих переведенные сообщения.

Следующий фрагмент кода это просто Hello World в файле app.py, где используется модуль gettext в Python для создания объекта перевода (gettext.translation) в домене приложения с указанием директории локали и языка, на который мы хотим перевести строки. Затем мы присваиваем функцию gettext символу нижнего подчеркивания (обычная практика для уменьшения накладных расходов на ввод gettext для каждой переводимой строки), и, наконец, ставим флаг строке Hello World!, чтобы она была переведена.

import gettextgettext.bindtextdomain("app", "/locale")gettext.textdomain("app")t = gettext.translation("app", localedir="locale", languages=['en_US'])t.install()_ = t.gettextgreeting = _("Hello, world!")print(greeting)

После пометки переводимых строк в коде, мы можем собрать их с помощью инструмента командной строки GNU xgettext. Этот инструмент сгенерирует PO-файл, который будет содержать все отмеченные нами строки.

xgettext -d app app.py

PO-файл (или файл Portable Object) содержит список записей, а структура записи выглядит следующим образом:

#  translator-comments#. extracted-comments#: reference#, flag#| msgid previous-untranslated-stringmsgid untranslated-stringmsgstr translated-string

Мы можем добавить для строки комментарий для переводчиков, ссылки и флаги. После этого мы обращаемся к ID записи (msgid), который представляет из себя непереведенную строку, помеченную в коде и строку записи (msgstr) переведенную версию этой строки.

Когда мы запускаем xgettext в командной строке, передавая app.py в качестве входного файла, получается такой PO-файл:

"Project-Id-Version: PACKAGE VERSION\n""Report-Msgid-Bugs-To: \n""POT-Creation-Date: 2019-05-03 13:23-0300\n""PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n""Last-Translator: FULL NAME <EMAIL@ADDRESS>\n""Language-Team: LANGUAGE <LL@li.org>\n""Language: \n""MIME-Version: 1.0\n""Content-Type: text/plain; charset=UTF-8\n""Content-Transfer-Encoding: 8bit\n"#: app.py:7msgid "Hello, world!"msgstr ""

В начале файла у нас есть метаданные о файле, проекте и процессе перевода. Потом стоит непереведенная строка Hello World! в качестве ID записи и пустая строка для строки записи. Если для записи не указан перевод, то при переводе будет использоваться ID записи.

После генерации PO-файла можно начинать переводить термины на разные языки. Важно отметить, что библиотека GNU gettext будет искать переведенные PO-файлы в пути к папке определенного вида (<localedir>/<languagecode>/LCMESSAGES/<domain>.po), то есть для каждого языка, который вы хотите поддерживать, должен быть один PO-файл.

|-- app.py|-- locale   |-- en_US   |   |-- LC_MESSAGES   |       |-- app.po   |-- pt_BR       |-- LC_MESSAGES       |   |-- app.po

Вот пример PO-файла с переводом на португальский:

"Project-Id-Version: PACKAGE VERSION\n""Report-Msgid-Bugs-To: \n""POT-Creation-Date: 2019-05-03 13:23-0300\n""PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n""Last-Translator: FULL NAME <EMAIL@ADDRESS>\n""Language-Team: LANGUAGE <LL@li.org>\n""Language: \n""MIME-Version: 1.0\n""Content-Type: text/plain; charset=UTF-8\n""Content-Transfer-Encoding: 8bit\n"#: app.py:7msgid "Hello, world!"msgstr "Ol, mundo!"

Чтобы использовать переведенные строки в коде, нужно скомпилировать PO-файл в MO-файл с помощью команды msgfmt.

msgfmt -o app.mo app.po

Когда MO-файл готов, можно изменить язык программы на португальский, подав его на вход функции перевода. Если мы запустим следующий код, отмеченная строка будет переведена как Ol, mundo!:

import gettextgettext.bindtextdomain("app", "/locale")gettext.textdomain("app")t = gettext.translation("app", localedir="locale", languages=['pt_BR'])t.install()_ = t.gettextgreeting = _("Hello, world!")print(greeting)

Модуль locale

У этого модуля есть доступ к базе данных локалей (locale) POSIX, и он особенно полезен для обработки форматов дат, чисел и валют. В примере ниже показано как использовать библиотеку locale:

import datetimeimport localelocale.setlocale(locale.LC_ALL, locale='en_US')local_conv = locale.localeconv()now = datetime.datetime.now()some_price = 1234567.89formatted_price = locale.format('%1.2f', some_price, grouping=True)currency_symbol = local_conv['currency_symbol']print(now.strftime('%x'))print(f'{currency_symbol}{formatted_price}')

В данном примере мы импортируем модуль, меняем все настройки локалей на US English и извлекаем соглашения локали. С помощью метода locale.format мы можем отформатировать число и не беспокоиться о разделителях в разрядах десятков и тысяч. С помощью директивы %x для форматирования даты день, месяц и год будут стоять в правильном порядке для текущей локали. Из соглашений локали мы получим и корректный символ для обозначения валюты.

Ниже вы видите выходные данные того кода на Python. Мы видим, что дата соответствует формату Month/Day/Year, десятичный разделитель это точка, а разделитель разряда тысяч запятая, а также есть знак доллара для валюты США.

$ python format_example.py05/03/2019$1,234,567.89

Теперь с тем же кодом, но изменив локаль на Portuguese Brazil, мы получим другой вывод, основанный на бразильских соглашениях форматирования: дата будет отображаться в формате Month/Day/Year, запятая будет разделителем для десятков, а точка для тысяч, символ R$ будет говорить о том, что сумма указана в бразильских реалах.

import datetimeimport localelocale.setlocale(locale.LC_ALL, locale='pt_BR')local_conv = locale.localeconv()now = datetime.datetime.now()some_price = 1234567.89formatted_price = locale.format('%1.2f', some_price, grouping=True)currency_symbol = local_conv['currency_symbol']print(now.strftime('%x'))print(f'{currency_symbol}{formatted_price}')

Легче ли дела обстоят в Django?

Переводы и форматирование

Интернационализация включается по умолчанию при создании проекта на Django. Модуль перевода инкапсулирует библиотеку GNU и предоставляет функционал gettext с настройками перевода на основе языка, полученного из заголовка Accept-Language, который браузер передает в объекте запроса. Итак, весь тот код на Python, который мы видели раньше, оказывается инкапсулирован в модуль перевода из django utils, так что мы можем перепрыгнуть далеко вперед и просто использовать функцию gettext:

from django.http import HttpResponsefrom django.utils.translation import gettext as _def my_view(request):    greetings = _('Hello, World!')    return HttpResponse(greetings)

Для переводов, мы можем помечать переводимые строки в коде Python и в шаблоне (после загрузки тегов интернационализации). Тег trans template переводит одну строку, тогда как тег blocktrans может пометить как переводимый целый блок строк, включая переменный контент.

<p>{% trans "Hello, World!" %}</p><p>{% blocktrans %}This string will have {{ value }} inside.{% endblocktrans %}</p>

Помимо стандартной функции gettext в Django есть ленивые переводы: помеченная строка будет переведена только тогда, когда значение используется в контексте строки, например, при рендеринге шаблона. Особенно полезно это бывает для перевода атрибутов help_text и verbose_name в моделях Django.

Аналогично интерфейсу командной строки GNU, django admin предоставляет команды эквивалентные тем, которые часто используются в процессе разработки. Чтобы собрать все строки, помеченные как переводимые в коде, вам просто нужно выполнить команды django admin makemessages для каждой локали, которую вы хотите поддерживать в своей системе. Как только вы создадите папку locale в рабочей области проекта, эта команда автоматически создаст правильную структуру папок для PO-файла для каждого языка.

Чтобы скомпилировать все PO-файлы, вам просто нужно выполнить django admin compilemessages. Если вам нужно скопировать PO-файл для конкретной локали, вы можете передать его в качестве аргумента django-admin compilemessages --locale=pt_BR. Чтобы получить более полное представление о том, как работают переводы в Django, вы можете ознакомиться с документацией.

Django также использует заголовок Accept-Language для определения локали пользователя и правильного форматирования дат, времени и чисел. В примере ниже мы видим простую форму с DateField и DecimalField. Чтобы указать, что мы хотим получить эти входные данные в формате, согласующимся с локалью пользователя, нам просто нужно передать параметр localize со значением True в экземпляр поля формы.

from django import formsclass DatePriceForm(forms.Form):    date = forms.DateField(localize=True)    price = forms.DecimalField(max_digits=10, decimal_places=2, localize=True)

Как меняется процесс разработки?

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

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

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


Интересно развиваться в данном направлении? Узнайте больше о курсе Python Web-Developer и записывайтесь на бесплатные Demo-уроки в OTUS!

Подробнее..

AppCode 2020.3 локализация для Swift, переход к определению до индексации, улучшенные рефакторинги и многое другое

14.12.2020 12:16:00 | Автор: admin

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


КПДВ



Поддержка Swift


Поддержали пачку новых возможностей языка:


  • SE-0279, SE-0286: Multiple trailing closure syntax.
  • Allow synthesis of Equatable and Hashable in conditional conformances (see the SE-0185 amendment).
  • SE-0276: Multi-pattern catch clauses.
  • SE-0269: Increased availability of implicit self in @escaping closures when reference cycles are unlikely to occur.
  • SE-0044: Import as member (OC-20445).
  • SE-0280: Enum cases as protocol witnesses.

Локализация


В AppCode давно есть локализация для строк в Objective-C, в этом релизе реализовали то же самое для Swift:


  • Добавили действие для выделения строки в .strings-файл: Локализация строки
  • Сделали фолдинг для NSLocalizedString: Фолдинг для локализованных строк
  • Реализовали навигацию, автодополнение и поиск использований для ключей локализации.

Действия для изменения кода


Добавили несколько небольших, но полезных действий по модификации кода:


  • Проверку и удаление ненужных self:Проверка и удаление ненужных self
  • Действие для удаления ненужных аргументов в замыканиях: Удаление ненужных списков аргументов
  • Конвертацию замыканий в конце выражения в аргументы метода (и наоборот):Замыкание в аргумент метода
  • Превью для быстрых исправлений: Превью

Change Signature


Rename, который работает для смешанного Objective-C/Swift кода, у нас уже есть. А в этом релизе доработали Change Signature, чтобы он тоже работал сразу же со смешанным кодом. Кроме этого:


  • Добавили выбор типа throw в диалог рефакторинга: Change Signature
  • Стали нормально обрабатывать значения по умолчанию для аргументов и variadic-параметры
  • Стали правильно показывать превью для init-методов.

Rename


Сделали новое отображение для настроек рефакторинга Rename открыть их можно по :


Rename


Переход к определению типа


Работает даже до конца индексации реализовали по тому же принципу, что и автодополнение с использованием SourceKit.


Отладчик


В отладчике появилось несколько полезных платформенных возможностей:


  • Возможность просмотреть поля переменной прямо в редакторе и добавить ее в Inline Watches:
    Inline watches
  • Отображение Inline Watches в табе Variables:Inline Watches
  • Стрелочка счетчика команд, которую можно двигать во время отладки: Program counter

Code With Me


Code With Me


Многие, наверное, слышали про новый сервис от JetBrains для совместного редактирования кода Code With Me. Теперь он работает в AppCode через соответствующий плагин. Подробнее про него можно прочитать вот тут.


Контроль версий


Теперь вместо changelistов можно включить git stage:


Git stage


А Search Everywhere получил новый таб для поиска по коммитам:


Git tab


Поддержка XCFrameworks


Это про сущности из .xcframework теперь они корректно определяются IDE.


Просмотр определения


Возможен прямо из Project view с помощью Space:


Просмотр определения


На этом всё! Все вопросы и пожелания пишите прямо тут в комментариях будем рады ответить!


Команда AppCode

Подробнее..

Гарантированная локализациярусификация консоли Windows

03.03.2021 20:06:54 | Автор: admin

Введение

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

В целом, локализация консоли Windows при наличии соответствующего языкового пакета не представляется сложной. Тем не менее, полное и однозначное решение этой проблемы, в сущности, до сих пор не найдено. Причина этого, главным образом, кроется в самой природе консоли, которая, являясь компонентом системы, реализованным статическим классом System.Console, предоставляет свои методы приложению через системные программы-оболочки, такие как командная строка или командный процессор (cmd.exe), PowerShell, Terminal и другие.
По сути, консоль находится под двойным управлением - приложения и оболочки, что является потенциально конфликтной ситуацией, в первую очередь в части использования кодировок.

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

Виды консолей

В общем случае функции консоли таковы:

  • управление операционной системой и системным окружением приложений на основе применения стандартных системных устройств ввода-вывода (экран и клавиатура), использования команд операционной системы и/или собственно консоли;

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

Основная консоль Windows - командная строка или иначе командный процессор (CMD). Большие возможности предоставляют оболочки PowerShell (PS), Windows PowerShell (WPS) и Terminal. Отдельным видом консоли можно считать консоль отладки Visual Studio (CMD-D).

Конфликт кодировок

Полностью локализованная консоль в идеале должна поддерживать все мыслимые и немыслимые кодировки приложений, включая свои собственные команды и команды Windows, меняя "на лету" кодовые страницы потоков ввода и вывода. Задача нетривиальная, а иногда и невозможная - кодовые страницы DOS (CP437, CP866) плохо совмещаются с кодовыми страницами Windows и Unicode.

История кодировок здесь: О кодировках и кодовых страницах / Хабр (habr.com)

Исторически кодовой страницей Windows является CP1251 (Windows-1251, ANSI, Windows-Cyr), уверенно вытесняемая 8-битной кодировкой Юникода CP65001 (UTF-8, Unicode Transformation Format), в которой выполняется большинство современных приложений, особенно кроссплатформенных. Между тем, в целях совместимости с устаревшими файловыми системами, именно в консоли Windows сохраняет базовые кодировки DOS - CP437 (DOSLatinUS, OEM) и русифицированную CP866 (AltDOS, OEM).

Совет 1. Выполнять разработку текстовых файлов (программных кодов, текстовых данных и др.) исключительно в кодировке UTF-8. Мир любит Юникод, а кроссплатформенность без него вообще невозможна.

Совет 2. Периодически проверять кодировку, например в текстовом редакторе Notepad++. Visual Studio может сбивать кодировку, особенно при редактировании за пределами VS.

Поскольку в консоли постоянно происходит передача управления от приложений к собственно командному процессору и обратно, регулярно возникает "конфликт кодировок", наглядно иллюстрируемый таблица 1 и 2, сформированных следующим образом:

Были запущены три консоли - CMD, PS и WPS. В каждой консоли менялась кодовая страница с помощью команды CHCP, выполнялась команда Echo c двуязычной строкой в качестве параметра (табл. 1), а затем в консоли запускалось тестовое приложение, исходные файлы которого были созданы в кодировке UTF-8 (CP65001): первая строка формируется и направляется в поток главным модулем, вторая вызывается им же, формируется в подключаемой библиотеке классов и направляется в поток опять главным модулем, третья строка полностью формируется и направляется в поток подключаемой библиотекой.

Команды и код приложения под катом

команды консоли:

  • > Echo ffffff фффффф // в командной строке

  • PS> Echo ffffff фффффф // в PowerShell

  • PS> Echo ffffff ?????? // так выглядит та же команда в Windows PowerShell

код тестового приложения:

using System;using ova.common.logging.LogConsole;using Microsoft.Extensions.Logging;using ova.common.logging.LogConsole.Colors;namespace LoggingConsole.Test{    partial class Program    {        static void Main2(string[] args)        {            ColorLevels.ColorsDictionaryCreate();            Console.WriteLine("Hello World! Привет, мир!");     //вывод строки приветствия на двух языках            LogConsole.Write("Лог из стартового проекта", LogLevel.Information);            Console.WriteLine($"8. Active codepage: input {Console.InputEncoding.CodePage}, output {Console.OutputEncoding.CodePage}");            Console.ReadKey();        }     }}

Командную часть задания все консоли локализовали практически без сбоев во всех кодировках, за исключением: в WPS неверно отображена русскоязычная часть команды во всех кодировках.

Табл. 1. Результат выполнения команды консоли Echo ffffff ффффффТабл. 1. Результат выполнения команды консоли Echo ffffff фффффф

Вывод тестового приложения локализован лишь в 50% испытаний, как показано в табл.2.

Табл. 2. Результат запуска приложения LoggingConsole.TestТабл. 2. Результат запуска приложения LoggingConsole.Test

Сoвет 3. Про PowerShell забываем раз и навсегда.

По умолчанию Windows устанавливает для консоли кодовые страницы DOS. Чаще всего CP437, иногда CP866. Актуальные версии командной строки cmd.exe способны локализовать приложения на основе русифицированной кодовой страницы 866, но не 437, отсюда и изначальный конфликт кодировок консоли и приложения. Поэтому

Совет 4. Перед запуском приложения необходимо проверить кодовую страницу консоли командой CHCP и ей же изменить кодировку на совместимую - 866, 1251, 65001.

Совет 5. Можно установить кодовую страницу консоли по умолчанию. Кратко: в разделе реестра \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor добавить или изменить значение параметра Autorun на: chcp <номер кодовой страницы>. Очень подробно здесь: Изменить кодовую страницу консоли Windows по умолчанию на UTF-8 (qastack.ru)

Проблемы консолей Visual Studio

В Visual Studio имеется возможность подключения консолей, по умолчанию подключены командная строка для разработчика и Windows PowerShell для разработчика. К достоинствам можно отнести возможности определения собственных параметров консоли, отдельных от общесистемных, а также запуск консоли непосредственно в директории разработки. В остальном - это обычные стандартные консоли Windows, включая, как показано ранее, установленную кодовую страницу по умолчанию.

Отдельной опцией Visual Studio является встроенная односеансная консоль отладки, которая перехватывает команду Visual Studio на запуск приложения, запускается сама, ожидает компиляцию приложения, запускает его и отдает ему управление. Таким образом, отладочная консоль в течение всего рабочего сеанса находится под управлением приложения и возможность использования команд Windows или самой консоли, включая команду CHCP, не предусмотрена. Более того, отладочная консоль не воспринимает кодовую страницу по умолчанию, определенную в реестре, и всегда запускается в кодировке 437 или 866.

Совет 6. Тестирование приложения целесообразно выполнять во внешних консолях, более дружелюбных к локализации.

Анализ проблем консолей был бы не полон без ответа на вопрос - можно ли запустить консольное приложение без консоли? Можно - любой файл ".exe" запустится двойным кликом, и даже откроется окно приложения. Однако консольное приложение, по крайней мере однопоточное, по двойному клику запустится, но консольный режим не поддержит - все консольные вводы-выводы будут проигнорированы, и приложение завершится

Локализация отладочной консоли Visual Studio

Отладочная консоль - наиболее востребованная консоль разработчика, гораздо более удобная, чем внешняя консоль, поэтому резонно приложить максимум усилий для ее локализации.

На самом деле, правильнее говорить о локализации приложения в консоли - это важное уточнение. Microsoft по этому поводу высказывается недвусмысленно: "Programs that you start after you assign a new code page use the new code page.However, programs (except Cmd.exe) that you started before assigning the new code page will continue to use the original code page". Иными словами, консоль можно локализовать когда угодно и как угодно, но приложение будет локализовано в момент стабилизации взаимодействия с консолью в соответствии с текущей локализацией консоли, и эта локализация сохранится до завершения работы приложения. В связи с этим возникает вопрос - в какой момент окончательно устанавливается связь консоли и приложения?

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

Ниже приведен пример вывода тестового приложения в консоль, иллюстрирующий изложенное. Метод Write получает номера текущих страниц, устанавливает новые кодовые страницы вводного и выводного потоков, выполняет чтение с консоли и записывает выводную строку, содержащий русский текст, в том числе считанный с консоли, обратно в консоль. Операция повторяется несколько раз для всех основных кодовых страниц, упомянутых ранее.

F:\LoggingConsole.Test\bin\Release\net5.0>chcpActive code page: 1251F:\LoggingConsole.Test\bin\Release\net5.0>loggingconsole.testCodepages: current 1251:1251, setted 437:437,  5  -: =Codepages: current 437:437, setted 65001:65001,  5  -: =Codepages: current 65001:65001, setted 1252:1252,  5  -: =Codepages: current 1252:1252, setted 1251:1251, вводим 5 символов по-русски: йцуке=йцукеCodepages: current 1251:1251, setted 866:866, ттюфшь 5 ёшьтюыют яю-Ёёёъш: щъх=щъхCodepages: current 866:866, setted 1251:1251, вводим 5 символов по-русски: йцуке=йцукеCodepages: current 1251:1251, setted 1252:1252,  5  -: =F:\LoggingConsole.Test\bin\Release\net5.0>chcpActive code page: 1252
  • приложение запущено в консоли с кодовыми страницами 1251 (строка 2);

  • приложение меняет кодовые страницы консоли (current, setted);

  • приложение остановлено в консоли с кодовыми страницами 1252 (строка 11, setted);

  • по окончании работы приложения изменения консоли сохраняются (строка 14 - Active codepage 1252);

  • Приложение адекватно локализовано только в случае совпадения текущих кодовых страниц консоли (setted 1251:1251) с начальными кодовыми страницами (строки 8 и 10).

Код тестового приложения под катом
using System;using System.Runtime.InteropServices;namespace LoggingConsole.Test{    partial class Program    {        [DllImport("kernel32.dll")] static extern uint GetConsoleCP();        [DllImport("kernel32.dll")] static extern bool SetConsoleCP(uint pagenum);        [DllImport("kernel32.dll")] static extern uint GetConsoleOutputCP();        [DllImport("kernel32.dll")] static extern bool SetConsoleOutputCP(uint pagenum);                static void Main(string[] args)        {            Write(437);            Write(65001);            Write(1252);            Write(1251);            Write(866);            Write(1251);            Write(1252);         }        static internal void Write(uint WantedIn, uint WantedOut)        {            uint CurrentIn = GetConsoleCP();            uint CurrentOut = GetConsoleOutputCP();            Console.Write($"current {CurrentIn}:{CurrentOut} - текущая кодировка, "); /*wanted {WantedIn}:{WantedOut},*/            SetConsoleCP(WantedIn);            SetConsoleOutputCP(WantedOut);            Console.Write($"setted {GetConsoleCP()}:{GetConsoleOutputCP()} - новая кодировка, ");            Console.Write($"вводим 3 символа по-русски: ");            string str = "" + Console.ReadKey().KeyChar.ToString();            str += Console.ReadKey().KeyChar.ToString();            str += Console.ReadKey().KeyChar.ToString();            Console.WriteLine($"={str}");        }              static internal void Write(uint ChangeTo)        {            Write(ChangeTo, ChangeTo);        }    }}

Программное управление кодировками консоли - это единственный способ гарантированной адекватной локализацией приложения в консоли. Языки .Net такой возможности не предоставляют, однако предоставляют функции WinAPI: SetConsoleCP(uint numcp) и SetConsoleOutputCP(uint numcp), где numcp - номер кодовой страницы потоков ввода и вывода соответственно. Подробнее здесь: Console Functions - Windows Console | Microsoft Docs. Пример применения консольных функций WInAPI можно посмотреть в тестовом приложении под катом выше.

Совет 7. Обязательный и повторный! Функции SetConsoleCP должны размещаться в коде до первого оператора ввода-вывода в консоль.

Стратегия локализации приложения в консоли

  1. Удалить приложение PowerShell, заменив его Windows PowerShell;

  2. Установить в качестве кодовую страницу консоли по умолчанию CP65001 (utf-8 Unicode) или CP1251 (Windows-1251-Cyr), см. совет 5;

  3. Разработку приложений выполнять в кодировке utf-8 Unicode;

  4. Контролировать кодировку файлов исходных кодов, текстовых файлов данных, например с помощью Notepad++;

  5. Реализовать программное управление локализацией приложения в консоли, пример ниже под катом:

Пример программной установки кодовой страницы и локализации приложения в консоли
using System;using System.Runtime.InteropServices;namespace LoggingConsole.Test{    partial class Program    {      static void Main(string[] args)        {          [DllImport("kernel32.dll")] static extern bool SetConsoleCP(uint pagenum);        [DllImport("kernel32.dll")] static extern bool SetConsoleOutputCP(uint pagenum);            SetConsoleCP(65001);        //установка кодовой страницы utf-8 (Unicode) для вводного потока            SetConsoleOutputCP(65001);  //установка кодовой страницы utf-8 (Unicode) для выводного потока             Console.WriteLine($"Hello, World!");        }    }}
Подробнее..

Кейс Автоматизация добавления учебных курсов на иностранных языках для Workfusion Automation Academy

14.05.2021 18:17:37 | Автор: admin

Automation Academy это онлайн-платформа с курсами по автоматизации, запущенная компанией WorkFusion, Inc. Материалы курсов предназначены для инженеров автоматизации, машинного обучения и дата-аналитиков и тех, кто хочет ими стать. Сейчас у Automation Academy 30+ курсов, 1000+ часов учебных материалов и больше 35 тысяч учеников.

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

Проект

  • обучающая онлайн-платформа на базе LMS Moodle,

  • контент курсов хранится в базе данных,

  • исходный язык английский,

  • целевые языки испанский и японский,

  • платформа, используемая для перевода, Crowdin,

  • объём проекта на исходном языке на январь 2020 без учёта скрытых строк: больше 1,1 млн знаков,

  • объём переведённого контента с апреля 2019 по январь 2020: больше 9 млн знаков.

Проблема 1: лаг между этапами новый курс готов,перевод курса готов и переведённый курс доступен ученикам

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

Если в оригинальный текст курса вносились изменения уже после готовности переводов, изменённую часть приходилось отдавать в перевод отдельно. А поскольку редактировать курс могут сразу несколько человек, на контент-менеджера ложилась дополнительная нагрузка по отслеживанию изменений.

Проблема 2: практическое неудобство добавления локализованного контента вручную

Хотя на стороне пользователя курс отображается только на нужном ему языке, в панели администрирования Moodle и оригинальный, и переведённый контент курса размещается в одном и том же редактируемом поле.

Плагин, используемый клиентом для поддержки мультиязычности, обозначает языковые блоки специальными тегами. Но размещение всех локализаций единым текстовым массивом неудобно практически, особенно с учётом объёма контента и наличия HTML-разметки внутри текстов.

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

Решение

Мы в Alconost разработали коннектор для Moodle, который позволяет выгружать контент на исходном языке из клиентской системы в Crowdin и загружать переведённый контент обратно.

Контент, выгружаемый через плагин, преобразуется в HTML (исходный контент содержит HTML-разметку, которую нужно сохранить в локализациях) и отправляется в платформу управления переводами Crowdin. Когда переводы готовы, коннектор принимает от Crowdin локализованный контент в HTML, конвертирует его обратно в формат, понятный плагину, и передаёт его посредством REST API.

Результат

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

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

Как применить у себя

Обратитесь в Alconost за решением задач такого типа. Инженеры Alconost интегрируют в вашу систему специальный плагин Moodle Connect, который сконвертирует выбранные вам курсы для загрузки в переводческую платформу. Там курсы будут переведены профессиональными переводчиками на нужные вам языки. Затем плагин заберёт результаты перевода, сконвертирует их в формат для Moodle и загрузит локализованные курсы в вашу систему.

Посмотрите видео о том, как это работает.

Подробнее о плагине здесь.

Подробнее..

Перевод Как делать гипер-казуальные игры, популярные во всём мире

16.10.2020 10:22:46 | Автор: admin
Изображение создано компанией AlconostИзображение создано компанией Alconost

Гипер-казуальные игры стали трендом на рынке мобильных приложений. В 2019 году число активных пользователей в день в топовых гипер-казуалках составило 94 тысяч. И это самый высокий показатель среди других мобильных игр. В 2020 году гипер-казуальные игры, судя по всему, не теряют популярность: только в первом квартале число установок по всему миру выросло на 103%. А ещё игроки стали проводить в игре на 72% больше времени, чем раньше.

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

Итак, что же нужно делать, чтобы ваша гипер-казуальная игра смогла войти в топ сторов мобильных приложений?

Краткое введение в мир гипер-казуальных игр

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

Так что именно отличает гипер-казуальные игры и делает их такими запоминающимися?

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

Игра Flappy Bird отличный пример гипер-казуалки: всё, что нужно делать, это нажать на экран, чтобы обойти препятствия и пройти на следующий уровень. Если у вас это не получается, вы просто начинаете игру сначала.

Скриншоты из игры Flappy Bird в App StoreСкриншоты из игры Flappy Bird в App Store

В гипер-казуалках есть и другие игровые механики:

  • тайминговая механика (касание экрана в определенное время);

  • механика укладки блоков (сбор объектов в башню или стену);

  • механика ловкости (делается упор на скорость реакции);

  • механика восхождения/падения (управление движением объекта);

  • механика уклонения (обход препятствий: Flappy Bird отличный пример!).

Основная идея гипер-казуальных игр предложить игрокам мгновенную возможность начать игру, сразу же после загрузки из стора. Не нужно входить в систему, регистрироваться или создавать персонаж просто нажимаешь Играть и начинаешь проходить уровни.

Гипер-казуальные игры, как правило, имеют минималистичный и привлекательный дизайн, чтобы ещё больше заинтересовать пользователя. Кроме того, они предполагают прогрессирующий и быстрый геймплей, чтобы пользователю хотелось продолжать играть как можно дольше.

Не забудьте о выборе правильной стратегии монетизации. Тут есть несколько вариантов:

  • реклама в приложении (реклама, которая крутится в игре между разными уровнями);

  • покупки в приложении (игроки могут покупать дополнительные инструменты или другие бонусы);

  • оплата премиум-модели (самое большое её преимущество для пользователя полное отсутствие рекламы);

  • кросс-промо или перекрестное продвижение (реклама одной игры появляется в другой игре).

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

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

ASO (Оптимизация мобильных приложений)

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

Давайте посмотрим, как разные элементы ASO влияют на успех и узнаваемость гипер-казуальной игры на глобальном рынке.

1. Локализация описания приложения

Когда вы загружаете приложение в стор, нужно добавить для него описание. Хотя у игры обязательно будет по умолчанию описание на основном языке (например, английском), можно добавить ещё и локализованные описания на разных языках, чтобы охватить другие страны. К счастью, Google Play и App Store позволяют загружать несколько описаний игры.

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

В общем, локализация приложения действительно важна: она помогает привлечь не только англоязычных пользователей, но и значительно расширяет охват аудитории. Например, исследование, проведенное в 2017 году, показало, что почти 50% всех загрузок приложений в App Store выполняют игроки, которые не говорят по-английски. А теперь представьте, какую часть аудитории вы можете упустить, если решите не локализовывать свой продукт на другие языки.

2. Ключевые слова

Ключевые слова это то, что делает игру заметной в сторе. Если вы используете правильные ключевые слова, вы увеличиваете ваши шансы на то, что пользователи найдут именно вашу игру и, следовательно, скачают её.

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

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

Ещё один полезный совет воспользуйтесь специализированными сервисами для перевода ключевых слов и описаний в сторах. Это значительно ускорит процесс локализации и обеспечит качественный перевод, потому что переводчики-фрилансеры могут не знать всех тонкостей локализации для сторов.

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

  • Вся работа ведётся через интерфейс сервиса, а не через менеджера. Это значит, что всё, что нужно сделать клиенту, загрузить необходимый контент на платформу Nitro. После этого платформа отправит вам переведённый текст в течение нескольких часов.

  • Быстрые переводы: 68% всех запросов готовы в течение 2-х часов, что особенно актуально для срочных задач.

  • Доступны более 70 языков для перевода, поэтому Nitro отлично подходит для локализации продукта для самых разных и даже нишевых аудиторий.

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

3. Локализация скриншотов

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

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

Отличный пример локализации скриншотов игра Magic Jigsaw Puzzles от ZIMAD. Чтобы понравиться японской аудитории, компания специально локализовала скриншоты в сторе под этот регион. В результате количество конверсий выросло на 36%.

Скриншоты игры Magic Jigsaw Puzzles в App StoreСкриншоты игры Magic Jigsaw Puzzles в App Store

Локализация гипер-казуальных игр: полезные советы

Кроме ASO есть и другие лайфхаки, которые помогут с локализацией. Делимся некоторыми из них.

1. Планируйте локализацию заранее

Один из самых важных моментов в локализации и запуске маркетинговых кампаний планировать всё заранее. Локализация это сложный процесс, который включает много этапов. Поэтому важно составить чёткий план. Планирование локализации состоит из нескольких основных этапов:

  • выбор целевой аудитории и соответствующих языков;

  • создание игрового интерфейса, адаптированного под все языки;

  • выбор сервиса для локализации.

Подробнее о каждом пункте.

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

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

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

Наконец, вам понадобится партнёр по локализации, фрилансер или профессиональное агентство с опытом локализации игр и мобильных приложений.

2. Узнайте как можно больше о своей аудитории

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

Например, японские игроки всё ещё не очень хорошо знакомы с гипер-казуальными играми, поэтому нужно дважды подумать, прежде чем запускать гипер-казуалку на японском рынке.

А ещё предпочтения внутри самого жанра гипер-казуалок тоже могут отличаться в разных странах. К примеру, игрокам в одном регионе может нравится механика тапов по экрану, а другим механика укладки блоков.

Гипер-казуальные игры в Китае: краткий обзор

Изображение создано компанией AlconostИзображение создано компанией Alconost

На азиатском рынке игр MMO-RPG (массовая многопользовательская онлайн-игра), MOBA (многопользовательская онлайновая боевая арена) и RTS (стратегия в реальном времени) давно стали популярными жанрами. Но кажется, игроки в Китае уже успели полюбить и гипер-казуальные игры. Потому что около 50% всех загрузок игр в Китае это гипер-казуалки. И размер китайского рынка открывает множество перспектив для разработчиков.

Итак, на какие особенности китайского рынка обратить внимание?

  • Локализация ключ к успеху. Если вы уважаете местную культуру и демонстрируете это в игре, игрокам это точно понравится! К примеру, можно ввести новые специальные символы для китайских праздников (скажем, для Китайского Нового года).

  • Китайские игроки любят чувство ностальгии, поэтому такие игровые приемы, как прогул школы, очень хорошо принимаются. А ещё в Китае отлично заходит жанр "фэнтези" идея на вооружение.

  • Длинные сессии: по сравнению с западной аудиторией, где игровая сессия длится около 3-х минут, китайские игроки проводят в игре до 5-и минут.

  • Более высокая терпимость к внутриигровой рекламе. Китайская аудитория более терпима к рекламе, и это действительно многообещающая возможность для монетизации игр.

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

3. Создавайте специальные ивенты и промоакции

В гипер-казуальных играх часто можно встретить изменение дизайна к таким праздникам, как Рождество, Пасха, Китайский Новый год или даже Фестиваль цветения сакуры в Японии.

А ещё разработчики иногда вводят новых персонажей примером может стать игра Crossy Road и ее рождественское обновление с девятью новыми талисманами (с изображениями эльфа, оленя и других символов Рождества).


Поэтому советуем заняться не только переводом текста, но и подумать о культурной локализации внутриигровых ивентов. Культурная локализация подразумевает изменение игрового дизайна и добавление новых элементов и фраз (например, замену стандартных фоновых деревьев цветущими вишнёвыми деревьями в честь Фестиваля цветения сакуры в Японии).

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

4. Вовлекайте местное сообщество игроков

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

Поэтому советуем комбинировать профессиональный перевод с переводом силами локального сообщества геймеров. Это помогает получить более качественный и быстрый результат.

Профессиональный перевод подразумевает работу с фрилансерами или агентством по локализации. А перевод сообществом означает привлечение ваших игроков (на Reddit, Discord и других платформах), которые помогают с переводом или фидбэком. По нашему собственному опыту, перевод от сообщества это самый быстрый способ уточнить или проверить именно мелкие, но важные, культурные детали и нативные термины.

Вместо итогов

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

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

О нас

Alconost профессионально занимаетсялокализацией приложений, игр и сайтовна более 70 языков. Лингвистическое тестирование, облачная платформа с API, непрерывная локализация, менеджмент проектов 24/7, любые форматы строковых ресурсов. Мы также делаемвидеоролики.

Подробнее..

Первая в России серийная система управления двухтопливным двигателем с функциональным разделением контроллеров

23.09.2020 16:18:12 | Автор: admin
Привет, Хабр!

Сегодня мы хотим рассказать о своей разработке система управления двухтопливным двигателем (бензин-газ СНГ или КПГ), которая внедрена на автомобилях ВАЗ и УАЗ (и может быть установлена на большинство бензиновых двигателей различных автопроизводителей, например, для повышения степени локализации или для расширения функциональных свойств автомобиля, что приведет к усилению интереса потребителя), а также ответить на ваши уточняющие вопросы.

image
Новый автомобиль УАЗ-Профи

Мы начали эту работу в 2016 году, когда появился проект легкого коммерческого грузовичка УАЗ-Профи Евро 5. Но история разработки системы управления двухтопливным двигателем в ИТЭЛМА уходит в более ранний период. Первые решения о создании системы управления ГБО были приняты специалистами компании в 2007 году. И уже в 2009 начаты работы по адаптации новой системы управления на основе двухтопливного контроллера МИКАС 12 для газобаллонного автомобиля УАЗ-3741. А по-настоящему массовым продуктом двухтопливный контроллер стал в 2012 году, когда был запущен в серийное производство коммерческий автомобиль Газель с МИКАС 12. Дальнейшее развитие система управления двухтопливным двигателем получила с появлением нового автомобиля УАЗ-Профи, для которого потребовалось применение дешевого топлива пропан-бутановой смеси.


Нам поставили задачу: реализовать двухтопливную систему для этого грузовичка. На тот момент в линейке контроллеров ИТЭЛМА был ранее упомянутый двухтопливный контроллер МИКАС 12. Но для нового автомобиля требовалось применение контроллера с более широким функционалом, который мог бы быть в будущем использован в том числе и на перспективном турбированном двигателе. Разработка нового двухтопливного контроллера потребовала бы больших временных и финансовых затрат. Тогда-то и было принято решение использовать более функциональный, перспективный и коммерчески выгодный серийный М86. Но он однотопливный, а расширение его до двухтопливного сопоставимо с новой разработкой контроллера. А что если к существующему контроллеру добавить нехватающую аппаратно-программную часть для управления ГБО? И вновь пригодились существующие в компании решения. Еще в 2013 году компания вывела на рынок блок управления ГБО MikrideRTM (блок-наездник) для переоборудования автомобилей, находящихся в эксплуатации, то есть для вторичного рынка. Но данное решение не могло отвечать требованиям надежности, безопасности и простоты монтажа в условиях серийного производства на конвейере автозавода. Для выполнения этих требований как раз и подошло применение контроллера М86 в качестве базы для работы в связке с новым модулем MR газовой системы питания. Новый модуль MR имел принципиальные отличия от существующих систем с применением блоков-наездников, так как для перевода двигателя на питание газом не требовалось делать врезки в существующий жгут проводов системы питания бензином. А вся коммуникация с бензиновым контроллером осуществлялась посредством высокоскоростной шины CAN.


Расширение функций КСУД М86 до конфигурации системы управления двухтопливным двигателем благодаря подключению модуля MR и самих газовых компонентов

Идея разработки состояла в максимальном использовании аппаратно-программного обеспечения базового серийного контроллера М86 для управления современным 4-цилиндровым двигателем при его питании как бензином, так и газовым топливом (КПГ или СНГ) в сочетании с выносным компактным электронным устройством (модуль MR), непосредственно подключаемым к компонентам системы подачи газа.


Компоненты газовой системы питания

Модуль MR работает только как дополнение к основному контроллеру М86. Он получает сигналы от подключенных к нему датчиков газовой системы, преобразует их в цифровой код, передаёт его по CAN-шине в М86 и получает назад от М86 готовые коды управляющих сигналов для функционирования газовых клапанов и форсунок.


Взаимодействие контроллеров системы управления двухтопливным двигателем

Модуль MR представляет собой программно-аппаратное устройство, предназначенное для предварительной обработки (формирования) сигналов с датчиков газовой системы; управления силовыми драйверами газовых клапанов; преобразования сигналов для приёма/передачи в CAN-шину скоростного обмена всей информацией с базовым контроллером М86. Отличительной особенностью системы является реализация алгоритмического и программного обеспечения управления системами двигателя при его питании как бензином, так и газом в базовом контроллере М86. То есть все необходимые вычисления для управления системами двигателя (включая элементы безопасности, самодиагностики и т. п.) осуществляются именно в нём. Возможность активизации газовых алгоритмов в базовом контроллере М86 осуществляется по признаку подключения к нему по CAN-шине модуля MR.

Что даёт такой подход при решении задачи двухтопливности автомобиля?

Максимально используются вычислительные возможности базового контроллера управления двигателем путём его догрузки газовыми алгоритмами.

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

Реализуется возможность одновременной подачи двух видов топлива: и бензина, и газа.

Минимизируются коммутационные цепи благодаря подключению модуля к базовому блоку по CAN-шине и подключению газовых компонентов отдельным жгутом к газовым компонентам.

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

Повышается надёжность, комфортабельность управления двигателем (автомобилем) в эксплуатации, обеспечивается технологичность обслуживания и ремонта.

Для автопроизводителей появляется возможность реализации двухтопливности транспортного средства путём применения модуля без аппаратной модернизации существующего бензинового контроллера.

image
Схема жгута проводов подключения газовых компонентов к контроллеру

Двигатель автомобиля УАЗ-Профи


Для нужд нового грузового автомобиля потребовался новый двигатель повышенной мощности, который был создан специалистами Заволжского моторного завода на базе ЗМЗ-40906. В двигателе повышена степень сжатия, что благоприятно для работы на газовом топливе. Благодаря ряду технических изменений двигатель получил улучшенные мощные показатели.

image

Это новый двигатель ЗМЗ-409052

Технические характеристики двигателя
  • Тип двигателя с искровым зажиганием
  • Топливо Бензин/СНГ
  • Рабочий объем 2,693 л
  • Степень сжатия 9,8
  • Максимальная мощность, на бензине/СНГ 108,1/104,4 кВт при 5000 об./мин.
  • Максимальный крутящий момент на бензине/СНГ 235/225,6 Нм при 2650 об./мин.


Что важно, в двигателе уже предусмотрено заводское решение по установке газовых форсунок.

image
Размещение газовых форсунок и подвод газа во впускной коллектор

image
Газовые форсунки

Базовый контроллер М86


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

image
Это контроллер СУД М86 для двигателя ЗМЗ-409052 автомобиля УАЗ-Профи

Структурная схема контроллера СУД М86
image

Состав ПО контроллера СУД М86
Ключевые функции и особенности ПО КСУД М86

  • Определение циклового наполнения по расходомеру или датчику абсолютного давления
  • Управление впрыском и зажиганием 4-цилиндрового ДВС
  • Управление электроприводом дроссельной заслонки
  • Управление клапаном продувки адсорбера
  • Управление геометрией впускного коллектора (опция)
  • Управление впускным и выпускным VVT (опция)
  • Управление нагревателями лямбда-зондов
  • Управление электронным термостатом, отсечным клапаном печки (опция)
  • Управления системой турбо-наддува (электронный привод клапана WasteGate) (опция)
  • Управление перепускным клапаном, подключение к датчику давления перед ДЗ, интегрированный датчик атмосферного давления (опция)
  • Система иммобилизации по интерфейсу CAN
  • Управление генератором по интерфейсу LIN (опция)
  • Управление системой автоматического поддержания температуры (опция)
  • Цифровая обработка канала детонации
  • Система безопасности (уровень 1, 2, 3)
  • Алгоритмы управления рабочим процессом ДВС на базе модели крутящего момента
  • Алгоритмы работы с АКПП, AMT, ESP
  • Алгоритмы функций круиз-контроля, ограничителя скорости и подсказчика переключения передач
  • Возможность проведения калибровочных работ в инженерном контроллере (CCP, INCA)
  • Алгоритмы управления системой старт-стоп

Информационный обмен

  • Автомобильный CAN
  • Калибровочный CAN
  • Диагностика CAN ISO 15765


Модуль MR газовой системы питания


При разработке модуля MR учитывались все требования к внешним воздействующим факторам, предъявляемые к базовому бензиновому контроллеру: герметичность IP 67, работоспособность при температуре от -40 до +105 С, стойкость к вибрациям, что необходимо для размещения устройства в подкапотном пространстве автомобиля. При этом новый модуль должен был быть минимально возможных размеров для компоновки в существующем автомобиле.

image
Габаритный чертеж модуля MR

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

image

image
Принципиальная конструкция модуля MR

image

Внешний вид готового рабочего модуля МR

Функции модуля MR управления газовыми компонентами:

  • Первичная обработка сигналов с датчиков газовой системы питания:
    датчик уровня/высокого давления газа в баллоне
    датчик низкого давления газа в газовой рампе
    датчик температуры газа в рампе
    датчик температуры редуктора
    состояние переключателя вида топлива
    датчик температуры отработавших газов (опция).
  • Передача по выделенной CAN-шине в блок управления M86 информации о рабочих параметрах и параметрах диагностики датчиков газовой системы для применения в алгоритме расчёта управления исполнительными устройствами с использованием остальной информации, регистрируемой и формируемой в M86.
  • Реализация управления исполнительными устройствами подачи газа и первичная диагностика выходов по сигналам, получаемым (передаваемым) по CAN-шине от блока (блоку) управления M86.
  • ПО модуля не содержит калибровочных параметров управления рабочим процессом двигателя.

Преимущества

  • ПО модуля MR не требует специальной настройки, так как является относительно простым универсальным программно-коммутационным устройством типа получил-преобразовал-передал.
  • Жгут проводов модуля MR имеет минимальную конфигурацию, а его монтаж не требует специальной доработки или дополнительных перекоммутаций разъёмов штатного (бензинового) жгута проводов. Обмен информацией с контроллером М86 и управление модулем MR осуществляется по CAN-шине.
  • Активация функций управления газовыми компонентами в контроллере М86 осуществляется автоматически, после подключения модуля MR, посредством его жгута проводов и монтажа газовых компонентов.

И вот бензиновый автомобиль выходит с конвейера. Чтобы сделать его газовым автомобилем, достаточно навесить газовые компоненты, подключить модуль МR отдельным жгутом и присоединиться к CAN-шине автомобиля. Бензиновый контроллер воспринимает это и начинает работать как двухтопливный.

image

Испытания автомобиля УАЗ-Профи с модулем MR на беговых барабанах НПП ИТЭЛМА

image
А это перспективный УАЗ Пикап, на котором внедрена двухтопливная система

image
Испытания автомобиля Ларгус CNG с модулем MR на беговых барабанах НПП ИТЭЛМА

image

Стенд лабораторной проверки КСУД М86 с модулем MR УАЗ

Решение под ключ для автозаводов


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

В нашем случае бензиновый контроллер не только знает про газ, но и сам выдаёт управляющие импульсы на газовый контроллер. Наша технология ориентирована преимущественно на автопроизводителей, потому что наш модуль может работать только с нашим бензиновым контроллером. Нельзя поставить дополнительный модуль МR на любой бензиновый контроллер, так как в других контроллерах нет газовых алгоритмов, нет настройки коммуникации и прочее. Часто от этого машины пахнут газом, потому что не подобраны составы смесей. В нашем случае это делается один раз, и после серийного выпуска уже систему не надо подстраивать извне, она подстраивается изнутри при помощи алгоритмов. И у дилера подстраивать ничего не надо.

Допустим, крупный международный концерн захочет выйти на российский рынок, повысить уровень локализации производства своих автомобилей.

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

  1. Под требования заказчика конфигурируется ПО и адаптируются алгоритмы. Подготавливается ПО, аппаратная часть блока. Производятся калибровки начального уровня на безмоторном стенде (1-2 месяца).
  2. Заказчик передает 2-3 двигателя с компонентами: автомобильная система впуска, выпуска, система охлаждения и прочее.
  3. Один двигатель монтируется на моторный стенд (остальные в запасе), в котором есть тормоз и есть обеспечение режимов по частоте и нагрузке. Начинаем настраивать калибровочные карты на всех режимах. Процесс калибровки на двигателе может занимать от 3 до 6 месяцев.
  4. После завершения испытаний на моторном стенде мы переходим на автомобили, которые так же передает заказчик (2 шт.). Тестируем ездовые качества, требования токсичности, безопасности. Все алгоритмы также донастраиваются. Испытания происходят на роликовом стенде. Зажимается автомобиль, ставится на ролики, происходит имитация движения автомобиля по дороге (6 месяцев).
  5. Автомобиль проходит дорожные испытания в несколько этапов: в летний период горные испытания в различных условиях жаркого климата, высокогорья, в зимний период низкотемпературные испытания. Эти испытания позволяют нам вместе с заказчиком оценить качество произведенной работы, внести коррективы при необходимости (2-3 недели на каждый вид испытания).
  6. После завершения всех основных калибровочных работ проводится сертификация автомобиля на соответствие Правилам ООН 83. Испытания проводятся на бензине и на газе. В результате испытаний подтверждается соответствие автомобиля уровню токсичности Евро-5.
  7. Но и это еще не всё. Для запуска в серию необходимо пройти пробеговые испытания. Обычно на пробег запускается 3-5 автомобилей, которые проезжают по несколько десятков тысяч километров. Через каждые 15 тысяч км осуществляется контрольное испытание с отбором проб ОГ для оценки уровня токсичности по Правилам ООН 83.
  8. После завершения всех испытаний запускается опытная партия, а потом начинается серийный выпуск.



image

НПП ИТЭЛМА всегда рада молодым специалистам, выпускникам автомобильных, технических вузов, а также физико-математических факультетов любых других высших учебных заведений.

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

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

Если вам интересно попробовать свои силы в решении тех задач, которые у нас есть, пишите в личку.

О компании ИТЭЛМА
Мы большая компания-разработчик automotive компонентов. В компании трудится около 2500 сотрудников, в том числе 650 инженеров.

Мы, пожалуй, самый сильный в России центр компетенций по разработке автомобильной электроники. Сейчас активно растем и открыли много вакансий (порядка 30, в том числе в регионах), таких как инженер-программист, инженер-конструктор, ведущий инженер-разработчик (DSP-программист) и др.

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

Подробнее..

Перевод Как e-commerce бизнесу выйти на новые рынки? 6 важных шагов на пути к локализации интернет-магазинов

04.12.2020 12:06:11 | Автор: admin

В 2020 Covid-19 сделал интернет-продажи ещё популярнее и ускорил выход магазинов в онлайн. Мировой объём розничных онлайн-продаж составил 3,53 триллиона долларов США в 2019 году. И планируется, что к 2022 году эта цифра вырастет до 6,54 триллионов долларов США.

Многие владельцы бизнесов осознали, насколько важно присутствие онлайн. В апреле 2020 года число новых интернет-магазинов увеличилось в два раза по сравнению с предыдущим месяцем и в полтора раза по сравнению с апрелем 2019 года.

Коронавирус по-настоящему оживил отрасль электронной коммерции. Поэтому выход на рынки новых стран и поиск способов для удовлетворения потребностей местных покупателей стали как никогда важны. Но с чего же начать?

Источник: freepik.comИсточник: freepik.com

Какие рынки лидируют в e-commerce?

Компания Goldman Sach Group в докладе, опубликованном в конце июля 2020 года, заявила, что рост доли онлайн-покупок в объёме всей розничной торговли достигнет 19% в 2020 году по сравнению с ранее прогнозируемыми 16%. Это обусловлено высокими темпами роста e-commerce бизнеса в США, Западной Европе, Бразилии и большинстве стран Азиатско-Тихоокеанского региона, говорится в докладе. Ожидается, что онлайн-продажи займут около 22% рынка розничных продаж к 2023 году.

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

Сегодня 85% мировой покупательской способности находится за пределами США. Китай крупнейший в мире рынок электронной коммерции, где ежегодный оборот от онлайн-покупок оценивается примерно в 672миллиарда долларов США. За Китаем следует США с оборотом в 340миллиардов долларов, и незначительно от них отстают Великобритания, Япония, Германия, Франция, Южная Корея, Канада, Россия и Бразилия.

Что такое рост и расширение бизнеса?

Расширение в глобальном смысле означает увеличение числа рынков сбыта, и соответственно, увеличение числа клиентов. Но не всё так просто: для достижения успеха потребуется поработать с каждым из рынков в отдельности. Невозможно придумать единую стратегию развития для всех рынков одновременно.

Покупатели со всего мира хотят, чтобы процесс покупки был им понятен и знаком. Что же для этого нужно?

Правильный ответ локализация онлайн-магазина.

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

Локализация онлайн-магазина: процесс от А до Я

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

Перевод сайта это лишь самый минимум, который вы должны сделать. Это критически важно, так как около 80% транзакций в Интернете происходят на родном языке пользователя. Согласно статистике, на неанглоязычные страны приходится 20% от общего числа мировых продаж на рынке электронной коммерции. Именно поэтому необходимо предоставлять информацию, хотя бы самую важную, на родном языке пользователя.

Давайте теперь рассмотрим отдельные элементы онлайн-магазинов, которые обязательно нужно адаптировать к предпочтениям иностранных покупателей.

1. Локализация взаимодействия с пользователем

User experience (UX) это то, как пользователь взаимодействует с продуктом и то, какие эмоции он от этого испытывает. Даже если интерфейс сайта или приложения полностью соответствует культурным нормам страны, он может показаться странным для пользователей. Приведём несколько примеров.

  • Информация о покупателе при оформлении покупок в корзине. В некоторых регионах, например, в России, традиционно используются три поля: имя, фамилия и отчество. Но в других регионах, таких как Азия или Америка, пользователи ожидают увидеть только два поля: имя и фамилия. Более того, для жителей некоторых восточноевропейских стран привычнее вначале увидеть поле для ввода фамилии, а не имени. Покупатели могут прийти в замешательство (или даже отказаться от использования сайта или оформления покупок), если увидят непривычную форму заказа.

  • Длина слов и размер шрифта. Слова на различных языках часто сильно отличаются по количеству букв. Например, слово пользователь на английском, русском и немецком выглядят так User, Пользователь и Benutzer соответственно. Игнорирование размера слов может негативно сказаться на дизайне сайта и читабельности.

  • Направление текста. Не все языки читаются слева направо, как русский или английский. В зависимости от направления текста может изменяться и последовательность действий пользователей. К примеру, на экране русскоязычного сайта кнопки Назад и Далее будут расположены слева и справа соответственно. Но на сайте на иврите кнопки должны находиться на противоположных сторонах.

  • Цвета, графика и форматирование. Для американца или европейца сайт в азиатском стиле может быть слишком непривычным из-за пёстрого оформления в виде яркого лоскутного одеяла, сотканного из текста, изображений, GIF-файлов, анимаций и иконок. А азиатский дизайн может показаться перегруженным информацией для западных пользователей, которые больше привыкли к чётко структурированным блокам, в то время как посетителям из Азии вполне комфортно пользоваться таким ярким сайтом.

Вид сайта может сильно отличаться в зависимости от географического положения пользователей. Представим, что вам нужно купить кондиционер для дома. Результаты выдачи на англоязычном сайте Amazon будут сильно отличаться от результатов на сайте Amazon Japan, локализованном для японского рынка.

Сайт Amazon (США)Сайт Amazon (США)Сайт Amazon (Япония)Сайт Amazon (Япония)

Вот несколько очевидных отличий:

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

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

  • Названия английских товаров выделены жирным чёрным шрифтом.

  • Японские названия, похоже, ничем не отличаются от остальной части описания товара (используется такой же синий шрифт).

2. Локализация корзины

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

  • Ручная локализация включает в себя разработку отдельных страниц (или даже целых сайтов) для всех ведущих рынков. Такая локализация, как правило, длится долго и может заметно ударить по вашему бюджету.

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

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

Источник: проект 2Chekout по стратегии адаптации корзины для Visicom MediaИсточник: проект 2Chekout по стратегии адаптации корзины для Visicom Media

Как правило, для оформления заказа в корзине используется либо одностраничный, либо двустраничный шаблон. Если используется двустраничный шаблон, то за общим перечнем расходов и оформлением заказа следует страница с общей информацией. У одностраничного шаблона такая страница отсутствует.

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

На самом деле предпочтения пользователей могут различаться даже в странах из одного региона: по данным платформы 2Checkout пользователи из Германии предпочитают одностраничный шаблон, а во Франции двустраничная версия даёт больше конверсий.

Исследования показывают, что для различных целевых рынков нужен уникальный подход. Поэтому анализируйте свои рынки, чтобы удовлетворить ожидания ваших пользователей!

3. Локализация цен на товары

При определении цен на товары и услуги важно сохранять прозрачность и учитывать привычки покупателей. Добавьте возможность видеть цену в местной валюте со всеми применимыми налогами и сборами. Например, технология GeoIP помогает определять местоположение покупателей и автоматически отображать цены в их местной валюте.

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

4. Локализация способов оплаты

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

Источник: 2CheckoutИсточник: 2Checkout

Согласно статистике, предпочтения по платёжным системам широко варьируются от региона к региону.

Хотя около 86% мировых онлайн-платежей осуществляются с помощью кредитных карт и PayPal, в Китае 79% онлайн-заказов совершаются с использованием Alipay или WeChatPay. Поэтому при выходе на китайский рынок советуем предложить эти два варианта покупателям, чтобы получить более высокий коэффициент конверсии. В Бразилии очень популярны Boleto и карты с возможностью оплаты в рассрочку: на их долю приходится более 50% онлайн-заказов. В Европе востребован SEPA Direct Debit, а японские покупатели предпочитают Konbini.

Конечно, настроить различные платёжные системы под каждую страну, где вы продаёте товары, достаточно сложная задача. Если вы планируете расширить свою деятельность в различных регионах, предпочтительнее использовать международную систему электронных платежей, к примеру, 2Checkout.

Такая система даёт ряд преимуществ:

  • Интеллектуальная маршрутизация платежей позволяет перенаправлять платежи между различными платежными шлюзами. Она служит в качестве механизма переключения при сбое и повышает скорость авторизации карт.

  • Система Account Updater, разработанная совместно Visa и MasterCard, которая автоматически обновляет номера и срок действия карт клиентов на основании информации от банка-эмитента.

  • Логика повторных попыток позволяет свести к минимуму сбои и восстановить до 20% неудачных транзакций;

  • Управление возвратными платежами и возмещением средств поможет уменьшить число таких случаев, обеспечивает точные и своевременные платежи, а также соответствие всех сумм списания денежных средств фактической стоимости товаров.

5. Локализация в соответствии с нормативно-правовой базой и налоговой системой страны

Независимо от того, где вы находитесь: в России, США или любой другой стране, вам придётся платить налог на добавленную стоимость (НДС) по каждой транзакции и другие налоги. Ситуация усложняется ещё тем, что по отношению к потребителям и бизнесу применяются различные правила.

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

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

Нормативно-правовое соответствие это ещё один важный пункт для компаний, которые выходят на мировой уровень.

Генеральный регламент ЕС о защите персональных данных (GDPR), Закон штата Калифорния о защите конфиденциальности потребителей (CCPA), Федеральный закон О персональных данных это лишь примеры законодательной базы, которая регулирует порядок сбора, хранения и использования компаниями личных данных потребителей в различных странах.

Источник: 2CheckoutИсточник: 2Checkout

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

Для обеспечения полного соответствия требованиям рекомендуется сотрудничать с e-commerce платформой, которая помогает обеспечить соблюдение стандартов различных законов о конфиденциальности.

6. Локализация службы поддержки пользователей

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

Мы советуем сделать отдельный телефонный номер и завести отдельную почту для каждого региона. Если у вас нет бюджета, чтобы содержать команду техподдержки пользователей, то вы можете использовать простой и удобный вариант страницу F.A.Q. с наиболее популярными вопросами от пользователей. Электронная почта также отличный вариант.

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

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

Заключение

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

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

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

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

О переводчике

Перевод статьи выполнен в Alconost. Alconost занимаетсялокализацией игр,приложений и сайтовна более 70 языков. Переводчики-носители языка, лингвистическое тестирование, облачная платформа с API, непрерывная локализация, менеджеры проектов 24/7, любые форматы строковых ресурсов.

Мы также делаем рекламные и обучающие видеоролики, продающие, имиджевые ролики, тизеры, эксплейнеры, трейлеры для Google Play и App Store.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru