/* * Localization test program for CUPS. * * Copyright 2007-2017 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * These coded instructions, statements, and computer programs are the * property of Apple Inc. and are protected by Federal copyright * law. Distribution and use rights are outlined in the file "LICENSE.txt" * which should have been included with this file. If this file is * missing or damaged, see the license at "http://www.cups.org/". * * This file is subject to the Apple OS-Developed Software exception. */ /* * Include necessary headers... */ #include "cups-private.h" #include "ppd-private.h" #ifdef __APPLE__ # include #endif /* __APPLE__ */ /* * Local functions... */ static int test_string(cups_lang_t *language, const char *msgid); /* * 'main()' - Load the specified language and show the strings for yes and no. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line arguments */ char *argv[]) /* I - Command-line arguments */ { int i; /* Looping var */ int errors = 0; /* Number of errors */ cups_lang_t *language; /* Message catalog */ cups_lang_t *language2; /* Message catalog */ struct lconv *loc; /* Locale data */ char buffer[1024]; /* String buffer */ double number; /* Number */ static const char * const tests[] = /* Test strings */ { "1", "-1", "3", "5.125" }; if (argc == 1) { language = cupsLangDefault(); language2 = cupsLangDefault(); } else { language = cupsLangGet(argv[1]); language2 = cupsLangGet(argv[1]); setenv("LANG", argv[1], 1); setenv("SOFTWARE", "CUPS/" CUPS_SVERSION, 1); } _cupsSetLocale(argv); if (language != language2) { errors ++; puts("**** ERROR: Language cache did not work! ****"); puts("First result from cupsLangGet:"); } printf("Language = \"%s\"\n", language->language); printf("Encoding = \"%s\"\n", _cupsEncodingName(language->encoding)); errors += test_string(language, "No"); errors += test_string(language, "Yes"); if (language != language2) { puts("Second result from cupsLangGet:"); printf("Language = \"%s\"\n", language2->language); printf("Encoding = \"%s\"\n", _cupsEncodingName(language2->encoding)); printf("No = \"%s\"\n", _cupsLangString(language2, "No")); printf("Yes = \"%s\"\n", _cupsLangString(language2, "Yes")); } loc = localeconv(); for (i = 0; i < (int)(sizeof(tests) / sizeof(tests[0])); i ++) { number = _cupsStrScand(tests[i], NULL, loc); printf("_cupsStrScand(\"%s\") number=%f\n", tests[i], number); _cupsStrFormatd(buffer, buffer + sizeof(buffer), number, loc); printf("_cupsStrFormatd(%f) buffer=\"%s\"\n", number, buffer); if (strcmp(buffer, tests[i])) { errors ++; puts("**** ERROR: Bad formatted number! ****"); } } if (argc == 3) { ppd_file_t *ppd; /* PPD file */ ppd_option_t *option; /* PageSize option */ ppd_choice_t *choice; /* PageSize/Letter choice */ if ((ppd = ppdOpenFile(argv[2])) == NULL) { printf("Unable to open PPD file \"%s\".\n", argv[2]); errors ++; } else { ppdLocalize(ppd); if ((option = ppdFindOption(ppd, "PageSize")) == NULL) { puts("No PageSize option."); errors ++; } else { printf("PageSize: %s\n", option->text); if ((choice = ppdFindChoice(option, "Letter")) == NULL) { puts("No Letter PageSize choice."); errors ++; } else { printf("Letter: %s\n", choice->text); } } printf("media-empty: %s\n", ppdLocalizeIPPReason(ppd, "media-empty", NULL, buffer, sizeof(buffer))); ppdClose(ppd); } } #ifdef __APPLE__ else { /* * Test all possible language IDs for compatibility with _cupsAppleLocale... */ CFIndex j, /* Looping var */ num_locales; /* Number of locales */ CFArrayRef locales; /* Locales */ CFStringRef locale_id, /* Current locale ID */ language_id; /* Current language ID */ char locale_str[256], /* Locale ID C string */ language_str[256], /* Language ID C string */ *bufptr; /* Pointer to ".UTF-8" in POSIX locale */ size_t buflen; /* Length of POSIX locale */ # if TEST_COUNTRY_CODES CFIndex k, /* Looping var */ num_country_codes; /* Number of country codes */ CFArrayRef country_codes; /* Country codes */ CFStringRef country_code, /* Current country code */ temp_id; /* Temporary language ID */ char country_str[256]; /* Country code C string */ # endif /* TEST_COUNTRY_CODES */ locales = CFLocaleCopyAvailableLocaleIdentifiers(); num_locales = CFArrayGetCount(locales); # if TEST_COUNTRY_CODES country_codes = CFLocaleCopyISOCountryCodes(); num_country_codes = CFArrayGetCount(country_codes); # endif /* TEST_COUNTRY_CODES */ printf("%d locales are available:\n", (int)num_locales); for (j = 0; j < num_locales; j ++) { locale_id = CFArrayGetValueAtIndex(locales, j); language_id = CFLocaleCreateCanonicalLanguageIdentifierFromString(kCFAllocatorDefault, locale_id); if (!locale_id || !CFStringGetCString(locale_id, locale_str, (CFIndex)sizeof(locale_str), kCFStringEncodingASCII)) { printf("%d: FAIL (unable to get locale ID string)\n", (int)j + 1); errors ++; continue; } if (!language_id || !CFStringGetCString(language_id, language_str, (CFIndex)sizeof(language_str), kCFStringEncodingASCII)) { printf("%d %s: FAIL (unable to get language ID string)\n", (int)j + 1, locale_str); errors ++; continue; } if (!_cupsAppleLocale(language_id, buffer, sizeof(buffer))) { printf("%d %s(%s): FAIL (unable to convert language ID string to POSIX locale)\n", (int)j + 1, locale_str, language_str); errors ++; continue; } if ((bufptr = strstr(buffer, ".UTF-8")) != NULL) buflen = (size_t)(bufptr - buffer); else buflen = strlen(buffer); if ((language = cupsLangGet(buffer)) == NULL) { printf("%d %s(%s): FAIL (unable to load POSIX locale \"%s\")\n", (int)j + 1, locale_str, language_str, buffer); errors ++; continue; } if (strncasecmp(language->language, buffer, buflen)) { printf("%d %s(%s): FAIL (unable to load POSIX locale \"%s\", got \"%s\")\n", (int)j + 1, locale_str, language_str, buffer, language->language); errors ++; continue; } printf("%d %s(%s): PASS (POSIX locale is \"%s\")\n", (int)j + 1, locale_str, language_str, buffer); } CFRelease(locales); # if TEST_COUNTRY_CODES CFRelease(country_codes); # endif /* TEST_COUNTRY_CODES */ } #endif /* __APPLE__ */ if (errors == 0) puts("ALL TESTS PASSED"); return (errors > 0); } /* * 'test_string()' - Test the localization of a string. */ static int /* O - 1 on failure, 0 on success */ test_string(cups_lang_t *language, /* I - Language */ const char *msgid) /* I - Message */ { const char *msgstr; /* Localized string */ /* * Get the localized string and then see if we got what we expected. * * For the POSIX locale, the string pointers should be the same. * For any other locale, the string pointers should be different. */ msgstr = _cupsLangString(language, msgid); if (strcmp(language->language, "C") && msgid == msgstr) { printf("%-8s = \"%s\" (FAIL - no message catalog loaded)\n", msgid, msgstr); return (1); } else if (!strcmp(language->language, "C") && msgid != msgstr) { printf("%-8s = \"%s\" (FAIL - POSIX locale is localized)\n", msgid, msgstr); return (1); } printf("%-8s = \"%s\" (PASS)\n", msgid, msgstr); return (0); }