Как упрощают локализацию iPhone?

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

Фактически, вы можете проверить это, напечатав фактическое число, сохраненное на них, с помощью printf().

Однако следует помнить, что type * операции увеличения / уменьшения указателя выполняются с помощью sizeof(type). Убедитесь сами в этом коде (проверено онлайн на Repl.it):

#include 

int main() {
    volatile int i1 = 1337;
    volatile int i2 = 31337;
    volatile double d1 = 1.337;
    volatile double d2 = 31.337;
    volatile int* pi = &i1;
    volatile double* pd = &d1;
    printf("ints: %d, %d\ndoubles: %f, %f\n", i1, i2, d1, d2);
    printf("0x%X = %d\n", pi, *pi);
    printf("0x%X = %d\n", pi-1, *(pi-1));
    printf("Difference: %d\n",(long)(pi)-(long)(pi-1));
    printf("0x%X = %f\n", pd, *pd);
    printf("0x%X = %f\n", pd-1, *(pd-1));
    printf("Difference: %d\n",(long)(pd)-(long)(pd-1));
}

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

Вывод был:

ints: 1337, 31337
doubles: 1.337000, 31.337000
0xFAFF465C = 1337
0xFAFF4658 = 31337
Difference: 4
0xFAFF4650 = 1.337000
0xFAFF4648 = 31.337000
Difference: 8

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

Также отметим, что & и * являются фактическими операторами для , ссылки («получить адрес памяти этой переменной») и разыменования («получить содержимое этот адрес памяти ").

Это также может быть использовано для прикольных приемов, таких как получение двоичных значений IEEE 754 для чисел с плавающей точкой, путем приведения float* в виде int*:

#include 

int main() {
    float f = -9.5;
    int* p = (int*)&f;

    std::cout << "Binary contents:\n";
    int i = sizeof(f)*8;
    while(i) {
        i--;
        std::cout << ((*p & (1 << i))?1:0);
   } 
}

Результат:

Binary contents:
11000001000110000000000000000000 

Пример взят из https://pt.wikipedia.org/wiki/IEEE_754 . Проверьте на любом конвертере.

13
задан mamcx 22 May 2009 в 14:57
поделиться

2 ответа

Здесь действительно непросто исправить. NIB необходимо составлять индивидуально для каждого языка. В некоторой степени это улучшает общий пользовательский интерфейс, потому что разные языки на самом деле часто нуждаются в разном макете, чтобы выглядеть лучше всего. Русский и немецкий - гораздо более «большие» языки в экранной области, чем английский. Китайский часто может быть намного меньше, и другой макет выглядит лучше с китайскими иероглифами. Арабский и иврит пишутся справа налево, и может потребоваться радикальное изменение макета. Автоматическая верстка - это просто, но достигается это за счет того, что на всех языках есть разные уровни некрасивости. Когда предоставляется выбор между простым для разработчика и уродливым или сложным для разработчика и красивым, Apple почти всегда выбирает последнее. Тем не менее, Apple до сих пор не упростила эту задачу настолько, насколько могла бы.

Итак, первый урок заключается в том, чтобы ваши NIB были простыми . Это проще на iPhone, чем на Mac, потому что iPhone не имеет привязок, а NIB iPhone, как правило, проще. Вы также можете использовать внедрение текста для NIB, которые содержат очень небольшие объемы текста (например, заголовок). "Текстовая инъекция" - это причудливый способ сказать " Я обнаружил, что менее чем в половине моих NIB есть текст или локализованные изображения.

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

17
ответ дан 1 December 2019 в 22:40
поделиться

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

Если вы использовали ibtool для генерации строк из перьев

ibtool - -generate-strings-file

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

ibtool --import-strings-file

Это инструменты командной строки, поэтому их можно использовать в сценариях. Взгляните на 'man ibtool'

2
ответ дан 1 December 2019 в 22:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: