From ad516863532f9b1ad947b88c329d498cfcd5971b Mon Sep 17 00:00:00 2001 From: Oliver Tappe Date: Sun, 25 Jul 2010 22:47:39 +0000 Subject: [PATCH] * improved the locale kit build rules and headers to use a different set of B_TRANSLATE-macros when running collectcatkeys, simplifying the regex a lot * added B_TRANSLATE_NOCOLLECT...-macros for the case where a non-literal string shall be translated, but not picked up by collectcatkeys git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37746 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- build/jam/LocaleRules | 15 ++-- headers/os/locale/Catalog.h | 111 +++++++++++++++++++++++++--- src/bin/locale/collectcatkeys.cpp | 13 ++-- src/tools/locale/collectcatkeys.cpp | 12 ++- 4 files changed, 119 insertions(+), 32 deletions(-) diff --git a/build/jam/LocaleRules b/build/jam/LocaleRules index 0d280004d2..e533373a81 100644 --- a/build/jam/LocaleRules +++ b/build/jam/LocaleRules @@ -3,7 +3,7 @@ # Extract catalog entries from the sourcefile and put the output textfile in # target. This output file is then used to create the binary catalog with # linkcatkeys. -rule ExtractCatalogEntries target : source : signature : regexp +rule ExtractCatalogEntries target : sources : signature : regexp { # get compiler and defines for the platform local headers ; @@ -55,20 +55,21 @@ rule ExtractCatalogEntries target : source : signature : regexp HAIKU_CATALOG_REGEXP on $(target) = -r $(regexp) ; } - SEARCH on $(source) += $(SEARCH_SOURCE) ; + SEARCH on $(sources) += $(SEARCH_SOURCE) ; MakeLocatePlatform $(target) ; - Depends $(target) : $(source) collectcatkeys ; + Depends $(target) : $(sources) collectcatkeys ; LocalClean clean : $(target).pre ; - ExtractCatalogEntries1 $(target) : collectcatkeys $(source) ; + ExtractCatalogEntries1 $(target) : collectcatkeys $(sources) ; } actions ExtractCatalogEntries1 { $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) - cat "$(2[2-])" | $(CC) -E $(CCDEFS) $(HDRS) - > "$(1)".pre - $(2[1]) $(HAIKU_CATALOG_REGEXP) -s $(HAIKU_CATALOG_SIGNATURE) \ - -w -o "$(1)" "$(1)".pre + cat "$(2[2-])" \ + | $(CC) -E $(CCDEFS) -DB_COLLECTING_CATKEYS $(HDRS) - > "$(1)".pre + $(2[1]) $(HAIKU_CATALOG_REGEXP) -s $(HAIKU_CATALOG_SIGNATURE) \ + -w -o "$(1)" "$(1)".pre } rule LinkApplicationCatalog target : sources : signature : language diff --git a/headers/os/locale/Catalog.h b/headers/os/locale/Catalog.h index f267739b74..d65c374490 100644 --- a/headers/os/locale/Catalog.h +++ b/headers/os/locale/Catalog.h @@ -1,5 +1,5 @@ /* - * Copyright 2003-2009, Haiku, Inc. + * Copyright 2003-2010, Haiku, Inc. * Distributed under the terms of the MIT License. */ #ifndef _CATALOG_H_ @@ -27,6 +27,10 @@ class BCatalog { const char *comment = NULL); const char *GetString(uint32 id); + const char *GetNoAutoCollectString(const char *string, + const char *context = NULL, const char *comment = NULL); + const char *GetNoAutoCollectString(uint32 id); + status_t GetData(const char *name, BMessage *msg); status_t GetData(uint32 id, BMessage *msg); @@ -54,9 +58,12 @@ class BCatalog { }; +#ifndef B_COLLECTING_CATKEYS + #ifndef B_AVOID_TRANSLATION_MACROS // macros for easy catalog-access, define B_AVOID_TRANSLATION_MACROS if -// you don't want these: +// you don't want these (in which case you need to collect the catalog keys +// manually, as collectcatkeys won't do it for you): #undef B_TRANSLATE_CONTEXT // In a single application, several strings (e.g. 'Ok') will be used @@ -76,7 +83,6 @@ class BCatalog { // Tip: Use a descriptive name of the class implemented in that // source-file. - // Translation macros which may be used to shorten translation requests: #undef B_TRANSLATE #define B_TRANSLATE(str) \ @@ -133,8 +139,82 @@ class BCatalog { #define B_TRANSLATE_MARK_ID(id) \ BCatalogAddOn::MarkForTranslation((id)) +// Translation macros which do not let collectcatkeys try to collect the key +// (useful in combination with the marking macros above): +#undef B_TRANSLATE_NOCOLLECT +#define B_TRANSLATE_NOCOLLECT(str) \ + B_TRANSLATE(str) + +#undef B_TRANSLATE_NOCOLLECT_COMMENT +#define B_TRANSLATE_NOCOLLECT_COMMENT(str, cmt) \ + B_TRANSLATE_COMMENT(str, cmt) + +#undef B_TRANSLATE_NOCOLLECT_ALL +#define B_TRANSLATE_NOCOLLECT_ALL(str, ctx, cmt) \ + B_TRANSLATE_ALL(str, ctx, cmt) + +#undef B_TRANSLATE_NOCOLLECT_ID +#define B_TRANSLATE_NOCOLLECT_ID(id) \ + B_TRANSLATE_ID(id) + #endif /* B_AVOID_TRANSLATION_MACROS */ +#else /* B_COLLECTING_CATKEYS */ + +// Translation macros used when executing collectcatkeys + +#undef B_TRANSLATE_CONTEXT + +#undef B_TRANSLATE +#define B_TRANSLATE(str) \ + B_CATKEY((str), B_TRANSLATE_CONTEXT) + +#undef B_TRANSLATE_COMMENT +#define B_TRANSLATE_COMMENT(str, cmt) \ + B_CATKEY((str), B_TRANSLATE_CONTEXT, (cmt)) + +#undef B_TRANSLATE_ALL +#define B_TRANSLATE_ALL(str, ctx, cmt) \ + B_CATKEY((str), (ctx), (cmt)) + +#undef B_TRANSLATE_ID +#define B_TRANSLATE_ID(id) \ + B_CATKEY((id)) + +#undef B_TRANSLATE_MARK +#define B_TRANSLATE_MARK(str) \ + B_CATKEY((str), B_TRANSLATE_CONTEXT) + +#undef B_TRANSLATE_MARK_COMMENT +#define B_TRANSLATE_MARK_COMMENT(str, cmt) \ + B_CATKEY((str), B_TRANSLATE_CONTEXT, (cmt)) + +#undef B_TRANSLATE_MARK_ALL +#define B_TRANSLATE_MARK_ALL(str, ctx, cmt) \ + B_CATKEY((str), (ctx), (cmt)) + +#undef B_TRANSLATE_MARK_ID +#define B_TRANSLATE_MARK_ID(id) \ + B_CATKEY((id)) + +#undef B_TRANSLATE_NOCOLLECT +#define B_TRANSLATE_NOCOLLECT(str) \ + (void) + +#undef B_TRANSLATE_NOCOLLECT_COMMENT +#define B_TRANSLATE_NOCOLLECT_COMMENT(str, cmt) \ + (void) + +#undef B_TRANSLATE_NOCOLLECT_ALL +#define B_TRANSLATE_NOCOLLECT_ALL(str, ctx, cmt) \ + (void) + +#undef B_TRANSLATE_NOCOLLECT_ID +#define B_TRANSLATE_NOCOLLECT_ID(id) \ + (void) + +#endif /* B_COLLECTING_CATKEYS */ + /************************************************************************/ // For BCatalog add-on implementations: @@ -254,6 +334,21 @@ BCatalog::GetFingerprint(uint32 *fp) } +inline const char * +BCatalog::GetNoAutoCollectString(const char *string, const char *context, + const char *comment) +{ + return GetString(string, context, comment); +} + + +inline const char * +BCatalog::GetNoAutoCollectString(uint32 id) +{ + return GetString(id); +} + + inline status_t BCatalog::InitCheck() const { @@ -288,22 +383,16 @@ BCatalogAddOn::Next() return fNext; } -// HACK: newline before '::' to avoid this being a false positive for -// collectcatkeys inline const char * -BCatalogAddOn -::MarkForTranslation(const char *str, const char *ctx, +BCatalogAddOn::MarkForTranslation(const char *str, const char *ctx, const char *cmt) { return str; } -// HACK: newline before '::' to avoid this being a false positive for -// collectcatkeys inline int32 -BCatalogAddOn -::MarkForTranslation(int32 id) +BCatalogAddOn::MarkForTranslation(int32 id) { return id; } diff --git a/src/bin/locale/collectcatkeys.cpp b/src/bin/locale/collectcatkeys.cpp index 145b72d715..97e7b2b4f9 100644 --- a/src/bin/locale/collectcatkeys.cpp +++ b/src/bin/locale/collectcatkeys.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2010, Haiku. + * Copyright 2003-2010, Haiku, Inc. * Distributed under the terms of the MIT License. * * Authors: @@ -29,8 +29,8 @@ const char *inputFile = NULL; BString outputFile; const char *catalogSig = NULL; const char *catalogLang = "English"; -BString rxString("(be_locale_roster->GetCatalog\\(\\)\\s*->\\s*GetString\\s*" - "|BCatalogAddOn\\s*::\\s*MarkForTranslation\\s*)"); +BString rxString("B_CATKEY\\s*"); + BString str, ctx, cmt; @@ -99,7 +99,6 @@ fetchStr(const char *&in, BString &str, bool lookForID) // Strip all whitespace until we find a closing parenthesis, or the // beginning of another string - // TODO: ignore comments while (isspace(*in) || *in == ')') { if (*in == ')') { if (parLevel == 0) @@ -185,10 +184,10 @@ collectAllCatalogKeys(BString& inputStr) if (fetchKey(in)) { if (haveID) { if (showKeys) - printf("CatKey(%ld)\n", id); + printf("CatKey(%d)\n", id); res = catalog->SetString(id, ""); if (res != B_OK) { - fprintf(stderr, "couldn't add key %ld - error: %s\n", + fprintf(stderr, "couldn't add key %d - error: %s\n", id, strerror(res)); exit(-1); } @@ -302,7 +301,7 @@ main(int argc, char **argv) if (showSummary) { int32 count = catalog->CountItems(); if (count) - fprintf(stderr, "%ld key%s found and written to %s\n", + fprintf(stderr, "%d key%s found and written to %s\n", count, (count==1 ? "": "s"), outputFile.String()); else fprintf(stderr, "no keys found\n"); diff --git a/src/tools/locale/collectcatkeys.cpp b/src/tools/locale/collectcatkeys.cpp index 80e88d3733..87356c5399 100644 --- a/src/tools/locale/collectcatkeys.cpp +++ b/src/tools/locale/collectcatkeys.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2009, Haiku. + * Copyright 2003-2010, Haiku, Inc. * Distributed under the terms of the MIT License. * * Authors: @@ -28,8 +28,7 @@ const char *inputFile = NULL; BString outputFile; const char *catalogSig = NULL; const char *catalogLang = "English"; -BString rxString("(be_locale_roster->GetCatalog\\(\\)\\s*->\\s*GetString\\s*" - "|BCatalogAddOn\\s*::\\s*MarkForTranslation\\s*)"); +BString rxString("B_CATKEY\\s*"); BString str, ctx, cmt; @@ -96,7 +95,6 @@ fetchStr(const char *&in, BString &str, bool lookForID) // Strip all whitespace until we find a closing parenthesis, or the // beginning of another string - // TODO: ignore comments while (isspace(*in) || *in == ')') { if (*in == ')') { if (parLevel == 0) @@ -188,10 +186,10 @@ collectAllCatalogKeys(BString& inputStr) if (fetchKey(in)) { if (haveID) { if (showKeys) - printf("CatKey(%ld)\n", id); + printf("CatKey(%d)\n", id); res = catalog->SetString(id, ""); if (res != B_OK) { - fprintf(stderr, "Collectcatkeys: couldn't add key %ld - " + fprintf(stderr, "Collectcatkeys: couldn't add key %d - " "error: %s\n", id, strerror(res)); exit(-1); } @@ -303,7 +301,7 @@ main(int argc, char **argv) if (showSummary) { int32 count = catalog->CountItems(); if (count) - fprintf(stderr, "%ld key%s found and written to %s\n", + fprintf(stderr, "%d key%s found and written to %s\n", count, (count==1 ? "": "s"), outputFile.String()); else fprintf(stderr, "no keys found\n");