Изменение локализации языка приложения в App Store [дубликат]

Каковы варианты клонирования или копирования списка в Python?

В Python 3 мелкая копия может быть выполнена с помощью:

a_copy = a_list.copy()

В Python 2 и 3 вы можете получить мелкую копию с полным фрагментом оригинала:

a_copy = a_list[:]

Объяснение

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

Короткая копия списка

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

Существуют разные способы сделать это в Python 2 и 3. Пути Python 2 также будут работать в Python 3.

Python 2

В Python 2 , идиоматический способ создания мелкой копии списка состоит из полного фрагмента оригинала:

a_copy = a_list[:]

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

a_copy = list(a_list)

, но использование конструктора менее эффективно:

>>> timeit
>>> l = range(20)
>>> min(timeit.repeat(lambda: l[:]))
0.30504298210144043
>>> min(timeit.repeat(lambda: list(l)))
0.40698814392089844

Python 3

В Python 3 списки получают метод list.copy:

a_copy = a_list.copy()

В Python 3.5:

>>> import timeit
>>> l = list(range(20))
>>> min(timeit.repeat(lambda: l[:]))
0.38448613602668047
>>> min(timeit.repeat(lambda: list(l)))
0.6309100328944623
>>> min(timeit.repeat(lambda: l.copy()))
0.38122922903858125

Создание другого указателя делает not сделать копию

Используя new_list = my_list, тогда изменяет new_list каждый раз, когда изменяется my_list. Почему это?

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

>>> l = [[], [], []]
>>> l_copy = l[:]
>>> l_copy
[[], [], []]
>>> l_copy[0].append('foo')
>>> l_copy
[['foo'], [], []]
>>> l
[['foo'], [], []]

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

Глубокие копии

Чтобы сделать глубокую копию списка в Python 2 или 3, используйте deepcopy в модуле copy :

import copy
a_deep_copy = copy.deepcopy(a_list)

Чтобы продемонстрировать, как это позволяет нам создавать новые под-списки:

>>> import copy
>>> l
[['foo'], [], []]
>>> l_deep_copy = copy.deepcopy(l)
>>> l_deep_copy[0].pop()
'foo'
>>> l_deep_copy
[[], [], []]
>>> l
[['foo'], [], []]

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

Не использовать eval

Вы можете видеть, что это используется как способ to deepcopy, но не делайте этого:

problematic_deep_copy = eval(repr(a_list))
  1. Это опасно, особенно если вы оцениваете что-то из источника, которому вы не доверяете.
  2. Это не надежный, если подэлемент, который вы копируете, не имеет представления, которое может быть доказано для воспроизведения эквивалентного элемента.
  3. Он также менее эффективен.

В 64-битном Python 2.7:

>>> import timeit
>>> import copy
>>> l = range(10)
>>> min(timeit.repeat(lambda: copy.deepcopy(l)))
27.55826997756958
>>> min(timeit.repeat(lambda: eval(repr(l))))
29.04534101486206

на 64-битном Python 3.5:

>>> import timeit
>>> import copy
>>> l = list(range(10))
>>> min(timeit.repeat(lambda: copy.deepcopy(l)))
16.84255409205798
>>> min(timeit.repeat(lambda: eval(repr(l))))
34.813894678023644
32
задан AppsDev 16 September 2014 в 15:44
поделиться

4 ответа

Для Xcode 9:

Закрыть Xcode.

  1. Откройте файл project.pbxproj в текстовом редакторе
  2. Посмотрите на developmentRegion и установите его значение (es для испанского, fr для французского, ...)
  3. Ищите известныеRegions и добавьте новый язык в список

Open Xcode: теперь ваша информация о проекте покажите название языка с языком разработки рядом с ним.

1
ответ дан ahbou 21 August 2018 в 03:09
поделиться
  • 1
    Спасибо, чувак, ты спас меня за волосы! – SwingerDinger 8 August 2018 в 10:03

откройте свою цель -> info -> измените «локальный регион разработки локализации» на ваш язык

5
ответ дан AleyRobotics 21 August 2018 в 03:09
поделиться

В файле .xcodeproj вашего проекта найдите строку developmentRegion. Предположительно, сейчас он говорит «английский». Если вы измените его на «испанский», Xcode 6 должен распознать испанский язык языка локализации вашего проекта по умолчанию на вкладке «Информация», если вы добавите «испанский» в список.

Вы можете узнать больше о эту тему в http://eschatologist.net/blog/?p=224

26
ответ дан Elwisz 21 August 2018 в 03:09
поделиться
  • 1
    Благодарю. Я только что сделал то, что вы объясняете, и теперь я на испанском языке задан в качестве цели развития в Info & gt; Localoizations. Однако, если я изменил язык устройства на язык, который я не определил в локализации (скажем, французский, так как я только определил английскую и испанскую локализацию), я получаю приложение, все еще локализованное на английском, а не испанский, как я ожидается ... – AppsDev 19 September 2014 в 10:41
  • 2
    Возможно, устройство предпочитает от английского к испанскому в отношении языкового резерва. Ниже приведено представление о том, как выполняется поиск пакета в локализованном контенте: developer.apple.com/library/ios/documentation/CoreFoundation/… – Elwisz 19 September 2014 в 14:38
  • 3
    @AppsDev так, как его решить? – Yifei He 27 August 2015 в 11:27
  • 4
    Если вы хотите изменить язык по умолчанию и уже имеете свое приложение в магазине, не забудьте также его изменить в iTunes Connect. – Vive 6 November 2015 в 18:38
  • 5
    @Arefly in Language & amp; Region на устройстве, нажмите кнопку «Изменить» в правом верхнем углу и измените порядок языков, чтобы английский был ниже испанского в списке языков. – lensovet 3 January 2017 в 08:01

Вот как вы можете это сделать:

  1. Сначала укажите язык, на котором вы хотите быть базовым. Снимите все файлы, которые Xcode предлагает для локализации для вас.
  2. В Info.plist измените область разработки на язык, на котором вы хотите быть основным языком. Обратите внимание, что свойство немного неверно, потому что его значение должно быть кодом языка (с необязательным кодом страны), а не кодом региона или страны.
  3. Закройте свой проект в Xcode. В другом редакторе кода откройте projectname.xcodeproj/project.pbxproj и выполните поиск developmentRegion. Вы должны увидеть строку типа developmentRegion = English;. Измените это, чтобы ссылаться на тот же язык, который вы вложили в ваш файл Info.plist.
  4. Повторно открыть проект в Xcode. Пройдите все локализуемые файлы и установите флажки рядом с английским, чтобы создать локализованные ресурсы. Обратите внимание, что для раскадровки и xibs Xcode может создавать раскадровку вместо файла строк. Если это произойдет, просто измените файл filetype на файл строк.

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

41
ответ дан lensovet 21 August 2018 в 03:09
поделиться
  • 1
    Вы изменили линию на developmentRegion = francais или developmentRegion = fr? – Flimm 3 November 2016 в 13:28
  • 2
    fr - это то, что вы хотите использовать здесь – lensovet 5 November 2016 в 04:45
  • 3
    Обратите внимание, что вам также может потребоваться добавить код языка в список knownRegions (в файле .pbxproj), чтобы он отображал свойство в настройках проекта. – Patrick Pijnappel 13 December 2016 в 15:54
  • 4
    Вам не нужно это делать, если сначала добавить локализацию, которая является шагом 1 инструкций в этом ответе. – lensovet 15 December 2016 в 02:53
  • 5
    В дополнение к тому, что указал @PatrickPijnappel, я могу сказать, что просто добавить свой языковой код в список knownRegions достаточно, чтобы он отображался в списке «Локализаторы», без необходимости вашего первого шага, который (по крайней мере, на Xcode 8.3 .2) невозможно выполнить, не проверяя хотя бы один файл и добавляя, возможно, нежелательный файл строк локализации в ваш проект. – Ultimecia 4 May 2017 в 08:57
Другие вопросы по тегам:

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