• Hello [name]! Thanks for joining the GMC. Before making any posts in the Tech Support forum, can we suggest you read the forum rules? These are simple guidelines that we ask you to follow so that you can get the best help possible for your issue.

iOS Multiple languages in store listing

clee2005

Member
Hey does anyone know how to get more than just ENGLISH to show in the Languages property of the Apple App Store listing? I tried adding to the .plist, but that didn't do anything... then I found this in the docs :

App Information
The next page requires you to input the basic details for your game. you will be required to fill out the following fields:

  • Default Language: the default language for your game (more languages can be added later in the upload process)
But I'm unclear as to how that's done exactly. Application loader or the Organizer don't offer language options at the time of uploading. How can I specify French and Spanish as additional languages of our game so it shows in the store listing?

Thanks!
 

clee2005

Member
Hi @rlKmAN thanks for the response, but it's not about creating new language images and descriptions for the app, that's done already for Spanish and French (as well as English)... it's the language property as in :

upload_2016-11-25_18-11-11.png

Just never shows anything more than English for me.
 

clee2005

Member
Thanks, but this is the part I'm talking about :

Important: The language information you provide here isn’t the same as the language information built into the app itself. The list of languages displayed in the store under Languages is set in the app build.
To have localized information describe your app in the store, you need to provide it through iTunes Connect.

So I have those graphics and descriptions localized on the iTunesConnect page, but the Store Listing still doesn't show them cause it needs to be in the build itself. This is what I'm looking for.
 

silengames

Member
You should add supported languages in Xcode. Project -> YOUR APP -> Info -> Localizations. Click "+" icon and select required language. Do not forgot to create new archive before publishing (in top menu select Product -> Archive)
 

rIKmAN

Member
but the Store Listing still doesn't show them cause it needs to be in the build itself. This is what I'm looking for.
This isn't going to something you set in GM, but rather in xCode before you build your app.

I just quickly Googled and found this link which says:
Important: The value of the Languages field in the App Store (under the Information section of your app) is determined by the existence of .lprojfolders in your app bundle rather than by your app configuration in iTunes Connect.

If you see the Languages field of your app doesn't contain exactly your supported languages, check if your app bundle contains the appropriate .lproj folders. If your app doesn't use .lproj folders to manage localized resources, make sure your app's CFBundleLocalizations specifies all your supported languages.
So in xCode open your info.plist and add the relevant key and localisation data.

Something like this for example (not my image - taken from this thread via Google):

 

clee2005

Member
@rlKmAN I did add to the .plist as you illustrated and that didn't do it either. I think @silengames has the answer with the modification before publishing ... I haven't tried that yet, and had someone else say the same thing. I'll report back here when it's updated in the store and working.

I had hoped there was a way to automate this from GMS rather than having to remember to do it on every update to the App Store. I will eventually forget on another update and be back to English only. Not even sure how much it affects things, but it's a Word game in 3 languages so people might be looking at that Language label to see if it supports theirs.

Thanks guys!
 

clee2005

Member
This is an old thread, but I just wanted to report back that :

You should add supported languages in Xcode. Project -> YOUR APP -> Info -> Localizations. Click "+" icon and select required language. Do not forgot to create new archive before publishing (in top menu select Product -> Archive)
Is the way to have the Apple App store show your app listed as supporting multiple languages.
 

Zixtix

Member
This is an old thread, but I just wanted to report back that :



Is the way to have the Apple App store show your app listed as supporting multiple languages.
Hello, thanks for sharing the experience. When I hit the "+" button, it asks me to check off the infoPlist.strings file for every new language that I add. If I don't check that file, the archive will still show as English only on the App Store. Is this what you experience as well?
 

Zixtix

Member
@Zixtix Yeah, basically do whatever Xcode asks you to do, but that place needs to be specified for sure.
Thanks, can confirm that as well.

If you did it correctly, you can see the languages supported by going to App Store Connect -> Your App -> Activities -> Select the build you uploaded -> Store Information

For anyone who might be interested in automating this step, consider using a pbxproj parser such as npm Xcode to add your supported languages to the KnownRegion and the *.lproj file to the InfoPlist.strings PBXVariantGroup's children. That will achieve the same effect as clicking the + button through the UI and check off the infoPlist.strings file.
 

Zixtix

Member
Here is an implementation of this using Typescript and npm XCode:

JavaScript:
import { dirname, basename, join } from 'path';
import fs from 'fs-extra';
//@ts-ignore
import xcode from 'xcode';

export async function addLocalizationWithXCode(
  projectPath: string,
  languages: L10nLang[],
) {
  const languageFileRootDir = getLanguageFileRootDir(projectPath);
  // No types available. See https://www.npmjs.com/package/xcode for API
  const parsedProj = xcode.project(projectPath);
  const gameLanguages = languages;
  const englishFileName = join(
    languageFileRootDir,
    'en.lproj',
    'InfoPlist.strings',
  );

  return new Promise((resolve, reject) => {
    parsedProj.parse(function (err: any) {
      if (err) {
        return reject(err);
      } else {
        gameLanguages.forEach((language) => {
          if (language != 'en-US') {
            //GMS's xcodeproj has en-us by default
            //For example, adding "zh-Hans" requires the presence of the file ".../demo/zh-Hans.lproj/InfoPlist.strings"
            const xcodeLang = l10nToXcode(language);
            const languageFileDir = `${xcodeLang.replace(
              /"/g,
              '',
            )}.lproj/InfoPlist.strings`;
            const languageFileDirAbsolute = join(
              languageFileRootDir,
              languageFileDir,
            );
            fs.ensureFileSync(languageFileDirAbsolute);
            fs.copyFileSync(englishFileName, languageFileDirAbsolute);

            const groupKey = parsedProj.findPBXVariantGroupKey({
              name: 'InfoPlist.strings',
            });
            /**
             *
             * @param path {String}
             * @param group {String} group key
             * @param opt {Object} see pbxFile for avail options
             * @returns {Object} file; see pbxFile
             */
            parsedProj.addFile(languageFileDir, groupKey);
            parsedProj.addKnownRegion(xcodeLang);
          }
        });
        fs.writeFileSync(projectPath, parsedProj.writeSync());
        return resolve(
          `Successfully added localization for ${languages.join(',')}`,
        );
      }
    });
  });
}

const l10nToXcodeDic = {
  'zh-CN': '"zh-Hans"',
  'ru-RU': 'ru',
  'es-XL': 'es',
  'es-ES': '"es-419"',
  'pt-BR': '"pt-BR"',
  'de-DE': 'de',
  'it-IT': 'it',
  'fr-FR': 'fr',
  'ja-JP': 'ja',
  'ko-KR': 'ko',
  'zh-TW': '"zh-Hant"',
  'en-US': 'en',
};

export type L10nLang = keyof typeof l10nToXcodeDic;

function l10nToXcode(l10nLang: L10nLang) {
  const xcodeLang = l10nToXcodeDic[l10nLang];
  if (xcodeLang) {
    return xcodeLang;
  } else {
    throw new Error(`${l10nLang} does not exist in the l10nToXcodeDic!`);
  }
}

/**
 * @desc ".../demo.xcodeproj/project.pbxproj" should return ".../demo/"
 * @param projectPath
 */
function getLanguageFileRootDir(projectPath: string) {
  const projectDir = dirname(projectPath);
  const projectName = basename(projectDir, '.xcodeproj');
  const languageFileRootDir = join(dirname(projectDir), projectName);
  return languageFileRootDir;
}
 
Top