跳转到内容

Aros/开发者/文档/库/语言环境

来自维基教科书,开放书籍,开放世界
Aros 维基教科书导航栏
Aros 用户
Aros 用户文档
Aros 用户常见问题解答
Aros 用户应用程序
Aros 用户 DOS Shell
Aros/用户/AmigaLegacy
Aros 开发文档
Aros 开发者文档
从 AmigaOS/SDL 移植软件
针对 Zune 初学者
Zune .MUI 类
针对 SDL 初学者
Aros 开发者构建系统
特定平台
Aros x86 完整系统 HCL
Aros x86 音频/视频支持
Aros x86 网络支持
Aros Intel AMD x86 安装
Aros 存储支持 IDE SATA 等
Aros Poseidon USB 支持
x86-64 支持
摩托罗拉 68k Amiga 支持
Linux 和 FreeBSD 支持
Windows Mingw 和 MacOSX 支持
Android 支持
Arm Raspberry Pi 支持
PPC Power Architecture
其他
Aros 公共许可证

这里有一个全局环境变量(Language),它保存着当前活动的语言。

您可以通过在 Shell 中键入“getenv language”(不带引号)来检查它。或者它可以在脚本中用作变量 $Language。

它也可以通过编程使用 OpenLocale() 函数完成(使用 NULL 作为参数以返回结构 Locale 中的当前语言环境信息)。

locale.library 为我们提供了本地化应用程序的工具。本地化字符串存储在单独的语言目录文件(在 Catalogs 目录下)中。AROS 开发环境宏可以构建所需的文件。本文档为您提供了一个工作流程,用于本地化应用程序或本地化现有应用程序,或为现有本地化应用程序创建目录文件。

对于系统支持的每种语言,系统都有一个 LOCALE:Languages/ 文件

LOCALE:Languages/klingon.language

系统翻译位于 LOCALE:Catalogs/ language 目录中

LOCALE:Catalogs/klingon/

每个应用程序都需要其适当的 Catalogs 目录

my_app/Catalogs/

翻译文件位于 language 目录中

my_app/Catalogs/klingon/my_app.catalog

应用程序

[编辑 | 编辑源代码]

每个支持本地化的应用程序都有自己的 catalogs 目录

AROS/Contrib/my_app/catalogs

字符串最初存储在目录描述文件中

AROS/Contrib/my_app/catalogs/my_app.cd
This file is structured as:
;
MSG_TITLE (//)
My Application
;
MSG_MY_MESSAGE (//)
My application message
;
...

翻译存储在目录翻译文件中

AROS/Contrib/my_app/catalogs/klingon.ct

结构如下

## version $VER: my_app.catalog 1.0 (23.05.2004)
## language klingon
## codeset 0
;
MSG_TITLE
tlhIngan maH
;
MSG_MY_MESSAGE
Sujatlh 'e' yImev
;
...

目录构建文件

本地化由以下提供

AROS/Contrib/my_app/locale.c
AROS/contrib/my_app/locale.h

应用程序:_(MSG_MY_TITLE)

作为 STRPTR。

或使用:__(MSG_MY_MESSAGE)

作为 IPTR(1) 应用程序源文件

在 AROS/Contrib/my_app/my_app.c 中,使用以下命令初始化语言环境

...

#include "locale.h"

main()
{

...

使用 .cd 文件中的字符串名称。例如,在 Zune 应用程序中:MUIA_Application_Title, __(MSG_TITLE), ... } 应用程序构建文件

Add the locale file target to the FILE section of AROS/Contrib/my_app/mmakefile.src:
FILES    := my_app \
               ...
               locale

Add the pre-requisite target for locale:
#MM- my_app: \
  ...
#MM my_app-catalogs
Build the locale
AROS/

To build the application and locale files:
make my_app

To update the translation (.ct) files:
make my_app-catalogsWarning:	If you are updating the description (.cd) files, build my_app target to update its strings file.

构建系统

[编辑 | 编辑源代码]

AROS Metamake 使用其构建文件(存在于以下位置)构建所需文件

AROS/Contrib/my_app/catalogs/mmakefile.src
# Copyright © 2004, The AROS Development Team. All rights reserved.
# $Id: mmakefile.src,v 1.2 2004/02/19 22:05:38 john doe Exp $

include $(TOP)/config/make.cfg

%build_catalogs mmake=my_app-catalogs \
  name=My_App \
  subdir= \
  dir=$(AROSDIR)/Extras/My_App/Catalogs
Application directory
AROS/Contrib/my_app/

FlexCat 是一种用于创建 Amiga 本地化目录以及源文件和头文件的工具,这些文件来自于目录描述。

AROS/tools 中的版本是 2.4,开发人员的 readme 文件说明将其视为免费软件(包含源代码),但不要进行分支。历史记录文件告诉我们,2.4 版来自 1999 年 11 月 28 日。文档中提到的并非所有网站都仍然存在,但 flexcat 确实支持 2.4 版,并且没有提到进一步的开发。移植是否算分支?如果没有,那么一个以前的移植是否算分支(例如,仅仅因为 AROS 成为 68k)?如果最初只有一个移植,但其他人做了另一个移植 - 谁是分支者?也许作者只是太不精确了,应该提供分支的定义……

1 AROS 项目的戳记是 2009 年 3 月 7 日,因此过去十年中 AROS 版本可能发生了变化。

2 Aminet 上的最后一个版本是 2010 年 6 月 29 日发布的 2.7 版,由 项目 发布,该项目声称版权始于 2002 年。

原始主页 已过时。它现在是一个使用 GPL 许可的 产品,在这里维护。当然,2.7 发行版不包含源代码,因为该项目是开源的,并且 源代码 对所有人开放。发行版存档仅包含所有支持平台的二进制文件。

  • 从 FlexCat 的稳定版本更新 AROS 中的源代码
  • 使其再次可构建,也许我可以从之前的提交中合并提交。
  • C_h_orig.sd 在当前的 FlexCat 中不再可用。找到一个可以与 AROS 构建系统一起使用的替换。
  • 将 AROS 的所有修复程序带回到 FlexCat 的当前主干。通过加入 Sourceforge 上的项目或将其发送给维护人员。

如果您愿意加入团队并将更改提交到 sourceforge.net 上的 SVN 存储库,我们将不胜感激。只需询问 Jens Langer(damato#light-speed.de)将您添加到开发者列表中。

可选:等待“vendor”分支在 AROS 存储库中可用,并使用该分支。

/*
    Copyright © 1995-2004, The AROS Development Team. All rights reserved.
    $Id: locale.c 30794 2009-03-08 02:19:07Z neil $
*/

#include <exec/types.h>
#include <proto/locale.h>

#define CATCOMP_ARRAY
#include "strings.h"

#define CATALOG_NAME     "AiRcOS.catalog"
#define CATALOG_VERSION  0

/*** Variables **************************************************************/
struct Catalog *catalog;

/*** Functions **************************************************************/
/* Main *********************************************************************/
CONST_STRPTR _(ULONG id)
{
    if (LocaleBase != NULL && catalog != NULL)
    {
	return GetCatalogStr(catalog, id, CatCompArray[id].cca_Str);
    } 
    else 
    {
	return CatCompArray[id].cca_Str;
    }
}

/* Setup ********************************************************************/
VOID Locale_Initialize(VOID)
{
    if (LocaleBase != NULL)
    {
        catalog = OpenCatalog
        ( 
            NULL, CATALOG_NAME, OC_Version, CATALOG_VERSION, TAG_DONE 
        );
    }
    else
    {
        catalog = NULL;
    }
}

VOID Locale_Deinitialize(VOID)
{
    if(LocaleBase != NULL && catalog != NULL) CloseCatalog(catalog);
}
#ifndef _LOCALE_H_
#define _LOCALE_H_

/*
    Copyright © 2003-2004, The AROS Development Team. All rights reserved.
    $Id: locale.h 30794 2009-03-08 02:19:07Z neil $
*/

#include <exec/types.h>

#define CATCOMP_NUMBERS
#include "strings.h"

/*** Prototypes *************************************************************/
/* Main *********************************************************************/
CONST_STRPTR _(ULONG ID);       /* Get a message, as a STRPTR */
#define __(id) ((IPTR) _(id))   /* Get a message, as an IPTR */

/* Setup ********************************************************************/
VOID Locale_Initialize(VOID);
VOID Locale_Deinitialize(VOID);

#endif /* _LOCALE_H_ */

参考文献

[编辑 | 编辑源代码]
/* constants for GetLocaleStr() */
#define DAY_1		1	/* Sunday    */
#define DAY_2		2	/* Monday    */
#define DAY_3		3	/* Tuesday   */
#define DAY_4		4	/* Wednesday */
#define DAY_5		5	/* Thursday  */
#define DAY_6		6	/* Friday    */
#define DAY_7		7	/* Saturday  */

#define ABDAY_1	8	/* Sun */
#define ABDAY_2	9	/* Mon */
#define ABDAY_3	10	/* Tue */
#define ABDAY_4	11	/* Wed */
#define ABDAY_5	12	/* Thu */
#define ABDAY_6	13	/* Fri */
#define ABDAY_7	14	/* Sat */

#define MON_1		15	/* January   */
#define MON_2		16	/* February  */
#define MON_3		17	/* March     */
#define MON_4		18	/* April     */
#define MON_5		19	/* May	     */
#define MON_6		20	/* June      */
#define MON_7		21	/* July      */
#define MON_8		22	/* August    */
#define MON_9		23	/* September */
#define MON_10		24	/* October   */
#define MON_11		25	/* November  */
#define MON_12		26	/* December  */

#define ABMON_1	27	/* Jan */
#define ABMON_2	28	/* Feb */
#define ABMON_3	29	/* Mar */
#define ABMON_4	30	/* Apr */
#define ABMON_5	31	/* May */
#define ABMON_6	32	/* Jun */
#define ABMON_7	33	/* Jul */
#define ABMON_8	34	/* Aug */
#define ABMON_9	35	/* Sep */
#define ABMON_10	36	/* Oct */
#define ABMON_11	37	/* Nov */
#define ABMON_12	38	/* Dec */

#define YESSTR		39	/* affirmative response for yes/no queries */
#define NOSTR		40	/* negative response for yes/no queries    */

#define AM_STR		41	/* AM */
#define PM_STR		42	/* PM */

#define SOFTHYPHEN	43	/* soft hyphenation */
#define HARDHYPHEN	44	/* hard hyphenation */

#define OPENQUOTE	45	/* start of quoted block */
#define CLOSEQUOTE	46	/* end of quoted block	 */

#define YESTERDAYSTR	47	/* Yesterday */
#define TODAYSTR	48	/* Today     */
#define TOMORROWSTR	49	/* Tomorrow  */
#define FUTURESTR	50	/* Future    */

#define MAXSTRMSG	51	/* current number of defined strings */

/* This structure must only be allocated by locale.library and is READ-ONLY! */

struct Locale
{
    STRPTR  loc_LocaleName;	      /* locale's name		     */
    STRPTR  loc_LanguageName;	      /* language of this locale     */
    STRPTR  loc_PrefLanguages[10];    /* preferred languages	     */
    ULONG   loc_Flags;		      /* always 0 for now	     */

    ULONG   loc_CodeSet;	      /* always 0 for now	     */
    ULONG   loc_CountryCode;	      /* user's country code	     */
    ULONG   loc_TelephoneCode;	      /* country's telephone code    */
    LONG    loc_GMTOffset;	      /* minutes from GMT	     */
    UBYTE   loc_MeasuringSystem;      /* what measuring system?      */
    UBYTE   loc_CalendarType;	      /* what calendar type?	     */
    UBYTE   loc_Reserved0[2];

    STRPTR  loc_DateTimeFormat;       /* regular date & time format  */
    STRPTR  loc_DateFormat;	      /* date format by itself	     */
    STRPTR  loc_TimeFormat;	      /* time format by itself	     */

    STRPTR  loc_ShortDateTimeFormat;  /* short date & time format    */
    STRPTR  loc_ShortDateFormat;      /* short date format by itself */
    STRPTR  loc_ShortTimeFormat;      /* short time format by itself */

    /* for numeric values */
    STRPTR  loc_DecimalPoint;	      /* character before the decimals */
    STRPTR  loc_GroupSeparator;       /* separates groups of digits    */
    STRPTR  loc_FracGroupSeparator;   /* separates groups of digits    */
    UBYTE  *loc_Grouping;	      /* size of each group	       */
    UBYTE  *loc_FracGrouping;	      /* size of each group	       */

    /* for monetary values */
    STRPTR  loc_MonDecimalPoint;
    STRPTR  loc_MonGroupSeparator;
    STRPTR  loc_MonFracGroupSeparator;
    UBYTE  *loc_MonGrouping;
    UBYTE  *loc_MonFracGrouping;
    UBYTE   loc_MonFracDigits;	      /* digits after the decimal point   */
    UBYTE   loc_MonIntFracDigits;     /* for international representation */
    UBYTE   loc_Reserved1[2];

    /* for currency symbols */
    STRPTR  loc_MonCS;		      /* currency symbol	      */
    STRPTR  loc_MonSmallCS;	      /* symbol for small amounts     */
    STRPTR  loc_MonIntCS;	      /* international (ISO 4217) code */

    /* for positive monetary values */
    STRPTR  loc_MonPositiveSign;      /* indicate positive money value	 */
    UBYTE   loc_MonPositiveSpaceSep;  /* determine if separated by space */
    UBYTE   loc_MonPositiveSignPos;   /* position of positive sign	 */
    UBYTE   loc_MonPositiveCSPos;     /* position of currency symbol	 */
    UBYTE   loc_Reserved2;

    /* for negative monetary values */
    STRPTR  loc_MonNegativeSign;      /* indicate negative money value	 */
    UBYTE   loc_MonNegativeSpaceSep;  /* determine if separated by space */
    UBYTE   loc_MonNegativeSignPos;   /* position of negative sign	 */
    UBYTE   loc_MonNegativeCSPos;     /* position of currency symbol	 */
    UBYTE   loc_Reserved3;
};

/* constants for Locale.loc_MeasuringSystem */
#define MS_ISO		0	/* international metric system */
#define MS_AMERICAN	1	/* american system	       */
#define MS_IMPERIAL	2	/* imperial system	       */
#define MS_BRITISH	3	/* british system	       */

/* constants for Locale.loc_CalendarType */
#define CT_7SUN 0   /* 7 days a week, Sunday is the first day	 */
#define CT_7MON 1   /* 7 days a week, Monday is the first day	 */
#define CT_7TUE 2   /* 7 days a week, Tuesday is the first day	 */
#define CT_7WED 3   /* 7 days a week, Wednesday is the first day */
#define CT_7THU 4   /* 7 days a week, Thursday is the first day  */
#define CT_7FRI 5   /* 7 days a week, Friday is the first day	 */
#define CT_7SAT 6   /* 7 days a week, Saturday is the first day  */

/* constants for Locale.loc_MonPositiveSpaceSep and Locale.loc_MonNegativeSpaceSep */
#define SS_NOSPACE 0  /* cur. symbol is NOT separated from value with a space */
#define SS_SPACE   1  /* cur. symbol IS separated from value with a space     */

/* constants for Locale.loc_MonPositiveSignPos and Locale.loc_MonNegativeSignPos */
#define SP_PARENS    0	/* () surround the quantity and currency_symbol   */
#define SP_PREC_ALL  1	/* sign string comes before amount and symbol	  */
#define SP_SUCC_ALL  2	/* sign string comes after amount and symbol	  */
#define SP_PREC_CURR 3	/* sign string comes right before currency symbol */
#define SP_SUCC_CURR 4	/* sign string comes right after currency symbol  */

/* constants for Locale.loc_MonPositiveCSPos and Locale.loc_MonNegativeCSPos */
#define CSP_PRECEDES 0	/* currency symbol comes before value */
#define CSP_SUCCEEDS 1	/* currency symbol comes after value  */

/* elements of the byte arrays pointed to by:
 *   Locale.loc_Grouping
 *   Locale.loc_FracGrouping
 *   Locale.loc_MonGrouping
 *   Locale.loc_MonFracGrouping
 * are interpreted as follows:
 *
 *    255     indicates that no further grouping is to be performed
 *    0       indicates that the previous element is to be repeatedly used for the remainder of the digits
 *    <other> the number of digits that comprises the current group
 */

/* This structure must only be allocated by locale.library and is READ-ONLY! */

struct Catalog
{
    struct Node cat_Link;	/* for internal linkage    */
    UWORD	cat_Pad;	/* to longword align	   */
    STRPTR	cat_Language;	/* language of the catalog */
    ULONG	cat_CodeSet;	/* currently always 0	   */
    UWORD	cat_Version;	/* version of the catalog  */
    UWORD	cat_Revision;	/* revision of the catalog */
};
void CloseCatalog(struct Catalog *catalog) (A0)
void CloseLocale(struct Locale *locale) (A0)

ULONG ConvToLower(const struct Locale *locale, ULONG character) (A0, D0)
ULONG ConvToUpper(const struct Locale *locale, ULONG character) (A0, D0)

void FormatDate(const struct Locale *locale, CONST_STRPTR formatString, const struct DateStamp *date, const struct Hook *hook) (A0, A1, A2, A3)

APTR FormatString(const struct Locale *locale, CONST_STRPTR fmtTemplate, CONST_APTR dataStream, const struct Hook *putCharFunc) (A0, A1, A2, A3)

CONST_STRPTR GetCatalogStr(const struct Catalog *catalog, ULONG stringNum, CONST_STRPTR defaultString) (A0, D0, A1)
CONST_STRPTR GetLocaleStr(const struct Locale *locale, ULONG stringNum) (A0, D0)

ULONG IsAlNum(const struct Locale *locale, ULONG character) (A0, D0)
ULONG IsAlpha(const struct Locale *locale, ULONG character) (A0, D0)
ULONG IsCntrl(const struct Locale *locale, ULONG character) (A0, D0)
ULONG IsDigit(const struct Locale *locale, ULONG character) (A0, D0)
ULONG IsGraph(const struct Locale *locale, ULONG character) (A0, D0)
ULONG IsLower(const struct Locale *locale, ULONG character) (A0, D0)
ULONG IsPrint(const struct Locale *locale, ULONG character) (A0, D0)
ULONG IsPunct(const struct Locale *locale, ULONG character) (A0, D0)
ULONG IsSpace(const struct Locale *locale, ULONG character) (A0, D0)
ULONG IsUpper(const struct Locale *locale, ULONG character) (A0, D0)
ULONG IsXDigit(const struct Locale *locale, ULONG character) (A0, D0)

struct Catalog *OpenCatalogA(const struct Locale *locale, CONST_STRPTR name, const struct TagItem *tags) (A0, A1, A2)

struct Locale *OpenLocale(CONST_STRPTR name) (A0)

BOOL ParseDate(struct Locale *locale, struct DateStamp *date, CONST_STRPTR fmtTemplate, struct Hook *getCharFunc) (A0, A1, A2, A3)
struct Locale *LocalePrefsUpdate(struct Locale *locale) (A0)

ULONG StrConvert(const struct Locale *locale, CONST_STRPTR string, APTR buffer, ULONG bufferSize, ULONG type) (A0, A1, A2, D0, D1)
LONG StrnCmp(const struct Locale *locale, CONST_STRPTR string1, CONST_STRPTR string2, LONG length, ULONG type) (A0, A1, A2, D0, D1)

private
APTR LocRawDoFmt(CONST_STRPTR FormatString, APTR DataStream, VOID_FUNC PutChProc, APTR PutChData) (A0, A1, A2, A3)
LONG LocStrnicmp(CONST_STRPTR string1, CONST_STRPTR string2, LONG length) (A0, A1, D0)
LONG LocStricmp(CONST_STRPTR string1, CONST_STRPTR string2) (A0, A1)
ULONG LocToLower(ULONG character) (D0)
ULONG LocToUpper(ULONG character) (D0)
LONG LocDateToStr(struct DateTime *datetime) (D1)
LONG LocStrToDate(struct DateTime *datetime) (D1)
CONST_STRPTR LocDosGetLocalizedString(LONG stringNum) (D1)
华夏公益教科书