52.2. ÐÑогÑаммиÑÑÑ
52.2.1. ÐÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ñ
ÐаннÑй Ñаздел опиÑÑÐ²Ð°ÐµÑ ÐºÐ°Ðº добавиÑÑ ÑзÑковÑÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ Ð² пÑогÑамме или библиоÑеке, коÑоÑÐ°Ñ ÑвлÑеÑÑÑ ÑаÑÑÑÑ Ð´Ð¸ÑÑÑибÑÑива Postgres Pro. РнаÑÑоÑÑий Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑÑо оÑноÑиÑÑÑ ÑолÑко к пÑогÑаммам на ÑзÑке С.
Ðобавление ÑзÑковой поддеÑжки Ð´Ð»Ñ Ð¿ÑогÑаммÑ
ÐÑÑавÑÑе ÑÑÐ¾Ñ ÐºÐ¾Ð´ в наÑало пÑогÑаммÑ:
#ifdef ENABLE_NLS #include <locale.h> #endif ... #ifdef ENABLE_NLS setlocale(LC_ALL, ""); bindtextdomain("progname", LOCALEDIR); textdomain("progname"); #endif(
prognameÑакÑиÑеÑки Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²ÑбÑана пÑоизволÑно.)Ðезде, где ÑообÑение нÑждаеÑÑÑ Ð² пеÑеводе, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ вÑÑавиÑÑ Ð²Ñзов
gettext(). ÐапÑимеÑ:fprintf(stderr, "panic level %d\n", lvl);
нÑжно замениÑÑ Ð½Ð°:
fprintf(stderr, gettext("panic level %d\n"), lvl);(
gettextопÑеделÑеÑÑÑ ÐºÐ°Ðº Ñ Ð¾Ð»Ð¾ÑÑÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°, еÑли NLS поддеÑжка не наÑÑÑоена.)ÐÑо ÑаÑÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº немалой пÑÑаниÑе. Ðдин из ÑаÑпÑоÑÑÑанÑннÑÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¾Ð² в ÑÑом ÑлÑÑае:
#define _(x) gettext(x)
ÐÑÑ Ð¾Ð´Ð½Ð¾ ÑеÑение допÑÑÑимо, еÑли пÑогÑамма ÑаÑÑо вÑполнÑÐµÑ Ð¾Ð±Ð¼ÐµÐ½ даннÑми ÑеÑез Ð¾Ð´Ð½Ñ Ð¸Ð»Ð¸ неÑколÑко ÑÑнкÑий, ÑÐ°ÐºÐ¸Ñ ÐºÐ°Ðº
ereport()в ÑеÑвеÑном пÑоÑеÑÑе. Тогда Ð²Ñ Ð²ÑполнÑеÑе внÑÑÑенний вÑзов ÑÑнкÑииgettextÐ´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ð²Ñ Ð¾Ð´ÑÑей ÑÑÑоки.ÐобавÑÑе Ñайл
nls.mkв каÑалог Ñ Ð¸ÑÑ Ð¾Ð´Ð½Ñми кодами пÑогÑаммÑ. ÐаннÑй Ñайл бÑÐ´ÐµÑ ÑÑиÑаÑÑÑÑ ÑбоÑоÑнÑм Ñайлом (makefile). РнÑм Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ вÑполниÑÑ Ð¿ÑиÑвоение знаÑений Ð´Ð»Ñ ÑледÑÑÑÐ¸Ñ Ð¿ÐµÑеменнÑÑ :CATALOG_NAMEÐÐ¼Ñ Ð¿ÑогÑаммÑ, коÑоÑое Ñказано в вÑзове
textdomain().AVAIL_LANGUAGESСпиÑок вÑполненнÑÑ Ð¿ÐµÑеводов (изнаÑалÑно пÑÑÑой).
GETTEXT_FILESСпиÑок Ñайлов, коÑоÑÑе ÑодеÑÐ¶Ð°Ñ Ð¿Ð¾Ð´Ð»ÐµÐ¶Ð°Ñие пеÑÐµÐ²Ð¾Ð´Ñ ÑÑÑоки, Ñ. е. помеÑеннÑе
gettextили алÑÑеÑнаÑивнÑм ÑеÑением. РиÑоге, в него бÑдÑÑ Ð²ÐºÐ»ÑÑÐµÐ½Ñ Ð¿Ð¾ÑÑи вÑе иÑÑ Ð¾Ð´Ð½Ñе ÑÐ°Ð¹Ð»Ñ Ð¿ÑогÑаммÑ. ÐÑли ÑпиÑок ÑÑÐ°Ð½ÐµÑ ÑлиÑком длиннÑм, можно пеÑвÑй «file» ÑделаÑÑ+а вÑоÑое Ñлово â Ñайлом, коÑоÑÑй ÑодеÑÐ¶Ð¸Ñ Ð¿Ð¾ Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¸Ð¼ÐµÐ½Ð¸ Ñайла на ÑÑÑокÑ.GETTEXT_TRIGGERSУÑилиÑам, коÑоÑÑе генеÑиÑÑÑÑ ÐºÐ°Ñалоги ÑообÑений Ð´Ð»Ñ ÑабоÑÑ Ð¿ÐµÑеводÑиков, должно бÑÑÑ Ð¸Ð·Ð²ÐµÑÑно, какие вÑÐ·Ð¾Ð²Ñ ÑÑнкÑии ÑодеÑÐ¶Ð°Ñ ÑÑÑоки, подлежаÑие пеÑеводÑ. Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑаÑпознаÑÑÑÑ ÑолÑко вÑзовÑ
gettext(). ÐÑли Ð²Ñ Ð¸ÑполÑзовали_или дÑÑгие иденÑиÑикаÑоÑÑ, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ пеÑеÑиÑлиÑÑ Ð¸Ñ Ð·Ð´ÐµÑÑ. ÐÑли подлежаÑÐ°Ñ Ð¿ÐµÑÐµÐ²Ð¾Ð´Ñ ÑÑÑока не ÑвлÑеÑÑÑ Ð¿ÐµÑвÑм аÑгÑменÑом, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾, ÑÑÐ¾Ð±Ñ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸Ð¼ÐµÐ» ÑоÑмÑfunc:2(Ð´Ð»Ñ Ð²ÑоÑого аÑгÑменÑа). ÐÑли ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑообÑÐµÐ½Ð¸Ñ Ð² ÑоÑме множеÑÑвенного ÑиÑла, ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ вÑглÑдеÑÑ ÑледÑÑÑим обÑазомfunc:1,2(иденÑиÑикаÑÐ¸Ñ Ð°ÑгÑменÑов в виде ÑообÑений в ÑоÑме единÑÑвенного и множеÑÑвенного ÑиÑла).
СиÑÑема ÑбоÑки авÑомаÑиÑеÑки ÑобеÑÑÑ Ð¸ ÑÑÑÐ°Ð½Ð¾Ð²Ð¸Ñ ÐºÐ°Ñалоги ÑообÑений.
52.2.2. РекомендаÑии по напиÑÐ°Ð½Ð¸Ñ ÑообÑений
Ðиже опиÑÐ°Ð½Ñ Ð½ÐµÐºÐ¾ÑоÑÑе ÑекомендаÑии по напиÑÐ°Ð½Ð¸Ñ ÑообÑений, коÑоÑÑе легко пеÑевеÑÑи.
Ðе ÑоÑÑавлÑйÑе пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð²Ð¾ вÑÐµÐ¼Ñ Ð²ÑполнениÑ. ÐапÑимеÑ:
printf("Files were %s.\n", flag ? "copied" : "removed");ÐоÑÑдок Ñлов в пÑедложении Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑлиÑаÑÑÑÑ Ð² дÑÑÐ³Ð¸Ñ ÑзÑÐºÐ°Ñ . Также, даже еÑли Ð²Ñ Ð½Ðµ забÑваеÑе вÑзÑваÑÑ
gettext()Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÑагменÑа, возможно, ÑÑо по оÑделÑноÑÑи они не бÑдÑÑ Ð¿ÐµÑÐµÐ²ÐµÐ´ÐµÐ½Ñ Ñ Ð¾ÑоÑо. ÐÑÑÑе пÑодÑблиÑоваÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑÑÑ ÑаÑÑÑ ÐºÐ¾Ð´Ð°, ÑÑÐ¾Ð±Ñ ÐºÐ°Ð¶Ð´Ð¾Ðµ ÑообÑение бÑло пеÑеведено как единое Ñелое. ÐиÑÑ ÑиÑÑÑ, имена Ñайлов и подобнÑе ÑекÑÑие пеÑеменнÑе ÑледÑÐµÑ Ð²ÑÑавлÑÑÑ Ð² ÑекÑÑ ÑообÑÐµÐ½Ð¸Ñ Ð²Ð¾ вÑÐµÐ¼Ñ Ð²ÑполнениÑ.Ðо Ñем же пÑиÑинам ÑледÑÑÑий Ð¿Ð¾Ð´Ñ Ð¾Ð´ не бÑÐ´ÐµÑ ÑабоÑаÑÑ:
printf("copied %d file%s", n, n!=1 ? "s" : "");Ñак как ÑÑо подÑазÑмеваеÑ, как ÑоÑмиÑÑеÑÑÑ ÑоÑма множеÑÑвенного ÑиÑла. ÐÑли Ð²Ñ Ð´ÑмаеÑе, ÑÑо ÑможеÑе ÑеÑиÑÑ ÑÑо Ñаким ÑпоÑобом:
if (n==1) printf("copied 1 file"); else printf("copied %d files", n):возможно, Ð²Ñ Ð±ÑдеÑе ÑазоÑаÑованÑ. РнекоÑоÑÑÑ ÑзÑÐºÐ°Ñ ÑÑÑеÑÑвÑÐµÑ Ð±Ð¾Ð»ÐµÐµ двÑÑ ÑоÑм, и они обÑазÑÑÑÑÑ Ð¿Ð¾ оÑобÑм пÑавилам. ÐбÑÑно лÑÑÑе ÑÑоÑмÑлиÑоваÑÑ ÑообÑение, коÑоÑое Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ ÑÑой пÑоблемÑ, напÑимеÑ:
printf("number of copied files: %d", n);ÐÑли Ð²Ñ Ð´ÐµÐ¹ÑÑвиÑелÑно Ñ Ð¾ÑиÑе ÑоÑмиÑоваÑÑ Ð¿ÑавилÑно ÑоÑÑавленнÑе ÑообÑÐµÐ½Ð¸Ñ Ð² ÑоÑме множеÑÑвенного ÑиÑла, еÑÑÑ ÑпоÑоб ÑÑого добиÑÑÑÑ, но ÑÑо неÑколÑко неÑдобно. ÐÑи генеÑиÑовании пеÑвиÑного или деÑализиÑованного ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибке в
ereport(), можно напиÑаÑÑ Ñак:errmsg_plural("copied %d file", "copied %d files", n, n)ÐеÑвÑм аÑгÑменÑом ÑвлÑеÑÑÑ ÑÑÑока ÑоÑмаÑа, ÑооÑвеÑÑÑвÑÑÑÐ°Ñ ÑоÑме единÑÑвенного ÑиÑла в английÑком ÑзÑке, вÑоÑÑм аÑгÑменÑом â ÑÑÑока ÑоÑмаÑа, ÑооÑвеÑÑÑвÑÑÑÐ°Ñ ÑоÑме множеÑÑвенного ÑиÑла в английÑком ÑзÑке, и ÑÑеÑÑим аÑгÑменÑом â ÑпÑавлÑÑÑее ÑелоÑиÑленное знаÑение, коÑоÑое опÑеделÑеÑ, какÑÑ ÑоÑÐ¼Ñ (единÑÑвенного или множеÑÑвенного ÑиÑла) иÑполÑзоваÑÑ. ÐоÑледÑÑÑие аÑгÑменÑÑ ÑоÑмаÑиÑÑÑÑÑÑ Ð½Ð° оÑнове ÑÑÑоки ÑоÑмаÑа, как обÑÑно. (Ðак пÑавило, знаÑение аÑгÑменÑа Ð´Ð»Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑоÑмой множеÑÑвенного ÑиÑла бÑÐ´ÐµÑ Ñакже одним из знаÑений, подлежаÑÐ¸Ñ ÑоÑмаÑиÑованиÑ, поÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð¾ должно бÑÑÑ Ð·Ð°Ð¿Ð¸Ñано дваждÑ.) РанглийÑком ÑзÑке важно лиÑÑ, ÑвлÑеÑÑÑ Ð»Ð¸ знаÑение
nединиÑей или неÑ, но в дÑÑÐ³Ð¸Ñ ÑзÑÐºÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ ÑазлиÑнÑÑ ÑоÑм множеÑÑвенного ÑиÑла. ÐеÑеводÑик ÑаÑÑмаÑÑÐ¸Ð²Ð°ÐµÑ Ð´Ð²Ðµ английÑкие ÑоÑÐ¼Ñ ÐºÐ°Ðº гÑÑÐ¿Ð¿Ñ Ð¸ Ð¸Ð¼ÐµÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð·Ð°Ð´Ð°ÑÑ Ð½ÐµÑколÑко ваÑианÑов Ð·Ð°Ð¼ÐµÐ½Ñ ÑÑÑок, пÑи ÑÑом Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑий ваÑÐ¸Ð°Ð½Ñ Ð²ÑбиÑаеÑÑÑ Ð¸ÑÑ Ð¾Ð´Ñ Ð¸Ð· ÑекÑÑего знаÑениÑn.ÐÑли вам нÑжно ÑоÑÑавиÑÑ ÑообÑение в ÑоÑме множеÑÑвенного ÑиÑла, коÑоÑое не иÑполÑзÑеÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно пÑи вÑводе ÑообÑений в
errmsgилиerrdetail, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²Ð¾ÑполÑзоваÑÑÑÑ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð¹ ÑÑнкÑиейngettext. См. докÑменÑаÑÐ¸Ñ Ð¿Ð¾ gettext.ÐÑли Ð²Ñ Ñ Ð¾ÑиÑе пеÑедаÑÑ ÐºÐ°ÐºÑÑ-либо инÑоÑмаÑÐ¸Ñ Ð¿ÐµÑеводÑикÑ, напÑÐ¸Ð¼ÐµÑ Ð¾ Ñом, наÑколÑко ÑообÑение ÑооÑноÑиÑÑÑ Ñ Ð´ÑÑгими вÑÑ Ð¾Ð´Ð½Ñми даннÑми, пеÑед ÑÑÑокой должен поÑвиÑÑÑÑ ÐºÐ¾Ð¼Ð¼ÐµÐ½ÑаÑий, коÑоÑÑй наÑинаеÑÑÑ Ñ
translator, напÑимеÑ:/* translator: This message is not what it seems to be. */
ÐÑи комменÑаÑии копиÑÑÑÑÑÑ Ð² ÑÐ°Ð¹Ð»Ñ ÐºÐ°Ñалога ÑообÑений, ÑÑÐ¾Ð±Ñ Ð¿ÐµÑеводÑик мог Ð¸Ñ Ð²Ð¸Ð´ÐµÑÑ.