<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://159.203.101.162/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Masaru20100</id>
	<title>PCGen Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://159.203.101.162/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Masaru20100"/>
	<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php/Special:Contributions/Masaru20100"/>
	<updated>2026-05-17T14:26:16Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.1</generator>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Pathfinder_PFS_Information&amp;diff=4026</id>
		<title>Pathfinder PFS Information</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Pathfinder_PFS_Information&amp;diff=4026"/>
		<updated>2016-08-25T14:59:15Z</updated>

		<summary type="html">&lt;p&gt;Masaru20100: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PCGen for Pathfinder Society Organized Play&lt;br /&gt;
&lt;br /&gt;
This page is meant to include all the information for players that want to use PCGen to track their characters.&lt;br /&gt;
&lt;br /&gt;
The guide is written with the assumption that you are familiar with PCGen.&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
When selecting sources, you have two options. You can either use the source that tries to include all the items that are available to characters (this source tries to keep up with the additionnal resources page and new source included in PCGen), or you can manually add sources and only select allowed equipment/feat/races/etc.&lt;br /&gt;
&lt;br /&gt;
Using the first option, everything is included in the single source Guide To Pathfinder Society Organized Play (GTPSOP). When you load this source, all other sources mentioned in this source and in the Additional Resources Guide are modified according to the rules in GTPSOP.&lt;br /&gt;
&lt;br /&gt;
== XP ==&lt;br /&gt;
&lt;br /&gt;
There is a Pathfinder Society mode for XP leveling, but you can’t track ½ (gained through slow advancement) as the XP in PCGen is an integer at the moment.&lt;br /&gt;
&lt;br /&gt;
== Game Mode ==&lt;br /&gt;
&lt;br /&gt;
The second thing is that there are two game modes that support PSOP.&lt;br /&gt;
&lt;br /&gt;
- Pathfinder PFS: This is the game mode designed to eliminate all source books not specifically approved from PSOP or existing sources that are not yet converted to PSOP from the source selection user interface. You can use this game mode if you want to use only using PSOP converted sources that are legal for use in PSOP. It should be noted that while I spent quite a lot of time working on these sources it is possible that some things slipped through. So if you see something that PCGen includes that seems too good to be true, you should check with the real GTPSOP and the Additional Resources Guide to be sure.&lt;br /&gt;
&lt;br /&gt;
- Pathfinder RPG: This is the normal game mode used if you want to use GTPSOP but also want to be able to use unconverted sources. This is ideal for players that use PSOP rules as a basis for their home games, but choose to also include additional unapproved sources. This game mode can also be used if you want to include additional sources that exist in PCGen and the Additional Resources Guide, but have not yet been converted to PSOP use in PCGen. If you use this game mode for characters being played in PSOP and you add sources that are not yet converted to PFOP by PCGen, you will have to check with the Additional Resources Guide yourself to make sure the abilities and items you have chosen are approved for PSOP use. The list of PSOP sources that have been converted are listed in the info box for the source Guide to Pathfinder Society Organized Play in the advances sources selection dialog.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Now... how to use it:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pathfinder Society expect players to own all books that contain rules or items that their characters use. The way you do this is to select the Multi-Set called Pathfinder Society Core Assumption (which includes the Core Rulebook and Guide to Pathfinder Society Organized Play and Chronicle Sheets boons and abilities [more on that below]). Then select each book source that you personally own. Load them and then create or load your character using those sources. You can also use the Multi-Set called &amp;quot;Pathfinder Society&amp;quot;. This is the set that includes every PSOP source that PCGen supports. If you use this set in a PSOP game be aware that you will be presented with abilities and items from sources that you personally don't own and if you include them on a character you play in PSOP, this is cheating and a GM can ask you to leave the game or worse.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Now, on to your character sheet... Pathfinder society characters will make frequent use of the Background and Chronicles tabs. So here's how they work:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
- Society Faction: This is selected on the Background tab. If you had a character that was originally associated with a faction that is no longer allowed, such as the Shadow Lodge, you add your original faction here. You will then use the chronicle sheet and the boon from that chronicle sheet to allow an additional faction selection.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
- Prestige Awards: This is selected on the Background tab. As your character gains fame, you add Fame points to this ability pool and spend the fame points on various prestige awards defined in GTPSOP, Faction Guide and other sources. Unspent fame can be spent on the &amp;quot;Current Prestige Award&amp;quot; ability which will allow you to resolve the reminder and have an ability show on the output sheet that shows the total remaining points available.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
- Chronicle Sheets: This is selected on the Chronicles tab. PCGen includes boons and items specified on chronicle sheets from seasons 0-4, many modules and some special event sheets. When your character gains a chronicle sheet form a game or special event, you add the sheet to your character and select the subtier that you played. In the gase of playing a scenario between tiers, you need to select the subtier actually played so the selection of boons and items will be accurate. PCGen does not track XP or GP gained on chronicle sheets. When you add a chronicle sheet that has boons to your character a new ability pool will be shown that allows you to add the boon to your character. Boons for save bonuses, skill bonuses, etc are shown on the fantasy PDF output sheets, the standard htm.ftl output sheet and on the standard preview htm.ftl output sheets. These output sheets also include a section that documents the chronicle sheets you have applied to the character.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
OPTIONAL: Under PCGen &amp;gt; Tools &amp;gt; Preferences &amp;gt; House Rules you can select the option DisplayFullAbility. If you do this, the chronicle sheet section of the output sheet will include a list of all purchasable items listed on the standard chronicle sheet according to the subtier you selected. Note that in some scenarios, some items may not actually be available to your character and may have been crossed out by the GM for items that you didn't find. Display of these items if for convenience only and you should always confirm the items on your actual chronicle sheets prior to purchasing the items for your character.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
NOTE: While the chronicle sheets applied are documented on the output sheet, the order of the chronicle sheets is not.&lt;br /&gt;
&lt;br /&gt;
== Inventory Tracking Sheet ==&lt;br /&gt;
&lt;br /&gt;
Lastly, there is no fully automated method in PCGen that duplicated the inventory tracking sheet required by PSOP. However, there is several workarounds.&lt;br /&gt;
&lt;br /&gt;
The first one is to track ITS separately on its own sheet (of paper), in a libreoffice sheet, etc.&lt;br /&gt;
&lt;br /&gt;
Second one uses the ability to customize equipment. When you buy each inventory item you can customize it and alter the name to, for example (#12) to specify on which chronicle sheet you purchased this item. Then to track items sold or used, you would customize a bag or other container items and replace its name with &amp;quot;Sold #12&amp;quot; or whatever and move the items sold for that chronicle into that bag. That bag would go into the equipment Not Carried. Oh, and there is a trick to handling items like wands. Once you use the first charge of a wand, add a new identical wand with the same name adjustment to identify which chronicle sheet it was purchased on and add that into a non-carried bag titled &amp;quot;Ammunition Used (#12)&amp;quot; or whatever and adjust its charges to the number of charges used, while reducing the in-use equipped or carried item by the number of charges used. If you're careful and diligent about selecting the proper buy/sell rates when purchasing and upgrading equipment, and moving used or sold items into the appropriate not-carried containers, PCGen will be able to total the equipment value of all the equipment you have ever purchased for your character.&lt;br /&gt;
&lt;br /&gt;
Third way is to use the campaign chronicle tracker (in description). For each sheet, you can have an entry where you list what you used/bought. This will be exported (only with the PDF export for now). You could also use a custom description page instead.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
Pathfinder Society Organized Play home page&lt;br /&gt;
&lt;br /&gt;
Guide to the Pathfinder Society Organized Play (find the link to Paizo)&lt;/div&gt;</summary>
		<author><name>Masaru20100</name></author>
		
	</entry>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Pathfinder_PFS_Information&amp;diff=4025</id>
		<title>Pathfinder PFS Information</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Pathfinder_PFS_Information&amp;diff=4025"/>
		<updated>2016-08-25T11:32:31Z</updated>

		<summary type="html">&lt;p&gt;Masaru20100: Improve page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PCGen for Pathfinder Society Organized Play&lt;br /&gt;
&lt;br /&gt;
This page is meant to include all the information for players that want to use PCGen to track their characters.&lt;br /&gt;
&lt;br /&gt;
The guide is written with the assumption that you are familiar with PCGen.&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
When selecting sources, you have two options. You can either use the source that tries to include all the items that are available to characters (this source tries to keep up with the additionnal resources page and new source included in PCGen), or you can manually add sources and only select allowed equipment/feat/races/etc.&lt;br /&gt;
&lt;br /&gt;
Using the first option, everything is included in the single source Guide To Pathfinder Society Organized Play (GTPSOP). When you load this source, all other sources mentioned in this source and in the Additional Resources Guide are modified according to the rules in GTPSOP.&lt;br /&gt;
&lt;br /&gt;
== Game Mode ==&lt;br /&gt;
&lt;br /&gt;
The second thing is that there are two game modes that support PSOP.&lt;br /&gt;
&lt;br /&gt;
- Pathfinder PFS: This is the game mode designed to eliminate all source books not specifically approved from PSOP or existing sources that are not yet converted to PSOP from the source selection user interface. You can use this game mode if you want to use only using PSOP converted sources that are legal for use in PSOP. It should be noted that while I spent quite a lot of time working on these sources it is possible that some things slipped through. So if you see something that PCGen includes that seems too good to be true, you should check with the real GTPSOP and the Additional Resources Guide to be sure.&lt;br /&gt;
&lt;br /&gt;
- Pathfinder RPG: This is the normal game mode used if you want to use GTPSOP but also want to be able to use unconverted sources. This is ideal for players that use PSOP rules as a basis for their home games, but choose to also include additional unapproved sources. This game mode can also be used if you want to include additional sources that exist in PCGen and the Additional Resources Guide, but have not yet been converted to PSOP use in PCGen. If you use this game mode for characters being played in PSOP and you add sources that are not yet converted to PFOP by PCGen, you will have to check with the Additional Resources Guide yourself to make sure the abilities and items you have chosen are approved for PSOP use. The list of PSOP sources that have been converted are listed in the info box for the source Guide to Pathfinder Society Organized Play in the advances sources selection dialog.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Now... how to use it:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Pathfinder Society expect players to own all books that contain rules or items that their characters use. The way you do this is to select the Multi-Set called Pathfinder Society Core Assumption (which includes the Core Rulebook and Guide to Pathfinder Society Organized Play and Chronicle Sheets boons and abilities [more on that below]). Then select each book source that you personally own. Load them and then create or load your character using those sources. You can also use the Multi-Set called &amp;quot;Pathfinder Society&amp;quot;. This is the set that includes every PSOP source that PCGen supports. If you use this set in a PSOP game be aware that you will be presented with abilities and items from sources that you personally don't own and if you include them on a character you play in PSOP, this is cheating and a GM can ask you to leave the game or worse.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Now, on to your character sheet... Pathfinder society characters will make frequent use of the Background and Chronicles tabs. So here's how they work:&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
- Society Faction: This is selected on the Background tab. If you had a character that was originally associated with a faction that is no longer allowed, such as the Shadow Lodge, you add your original faction here. You will then use the chronicle sheet and the boon from that chronicle sheet to allow an additional faction selection.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
- Prestige Awards: This is selected on the Background tab. As your character gains fame, you add Fame points to this ability pool and spend the fame points on various prestige awards defined in GTPSOP, Faction Guide and other sources. Unspent fame can be spent on the &amp;quot;Current Prestige Award&amp;quot; ability which will allow you to resolve the reminder and have an ability show on the output sheet that shows the total remaining points available.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
- Chronicle Sheets: This is selected on the Chronicles tab. PCGen includes boons and items specified on chronicle sheets from seasons 0-4, many modules and some special event sheets. When your character gains a chronicle sheet form a game or special event, you add the sheet to your character and select the subtier that you played. In the gase of playing a scenario between tiers, you need to select the subtier actually played so the selection of boons and items will be accurate. PCGen does not track XP or GP gained on chronicle sheets. When you add a chronicle sheet that has boons to your character a new ability pool will be shown that allows you to add the boon to your character. Boons for save bonuses, skill bonuses, etc are shown on the fantasy PDF output sheets, the standard htm.ftl output sheet and on the standard preview htm.ftl output sheets. These output sheets also include a section that documents the chronicle sheets you have applied to the character.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
OPTIONAL: Under PCGen &amp;gt; Tools &amp;gt; Preferences &amp;gt; House Rules you can select the option DisplayFullAbility. If you do this, the chronicle sheet section of the output sheet will include a list of all purchasable items listed on the standard chronicle sheet according to the subtier you selected. Note that in some scenarios, some items may not actually be available to your character and may have been crossed out by the GM for items that you didn't find. Display of these items if for convenience only and you should always confirm the items on your actual chronicle sheets prior to purchasing the items for your character.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
NOTE: While the chronicle sheets applied are documented on the output sheet, the order of the chronicle sheets is not.&lt;br /&gt;
&lt;br /&gt;
== Inventory Tracking Sheet ==&lt;br /&gt;
&lt;br /&gt;
Lastly, there is no fully automated method in PCGen that duplicated the inventory tracking sheet required by PSOP. However, there is several workarounds.&lt;br /&gt;
&lt;br /&gt;
The first one is to track ITS separately on its own sheet (of paper), in a libreoffice sheet, etc.&lt;br /&gt;
&lt;br /&gt;
Second one uses the ability to customize equipment. When you buy each inventory item you can customize it and alter the name to, for example (#12) to specify on which chronicle sheet you purchased this item. Then to track items sold or used, you would customize a bag or other container items and replace its name with &amp;quot;Sold #12&amp;quot; or whatever and move the items sold for that chronicle into that bag. That bag would go into the equipment Not Carried. Oh, and there is a trick to handling items like wands. Once you use the first charge of a wand, add a new identical wand with the same name adjustment to identify which chronicle sheet it was purchased on and add that into a non-carried bag titled &amp;quot;Ammunition Used (#12)&amp;quot; or whatever and adjust its charges to the number of charges used, while reducing the in-use equipped or carried item by the number of charges used. If you're careful and diligent about selecting the proper buy/sell rates when purchasing and upgrading equipment, and moving used or sold items into the appropriate not-carried containers, PCGen will be able to total the equipment value of all the equipment you have ever purchased for your character.&lt;br /&gt;
&lt;br /&gt;
Third way is to use the campaign chronicle tracker (in description). For each sheet, you can have an entry where you list what you used/bought. This will be exported (only with the PDF export for now). You could also use a custom description page instead.&lt;/div&gt;</summary>
		<author><name>Masaru20100</name></author>
		
	</entry>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Subversion_Setup_(deprecated)&amp;diff=3245</id>
		<title>Subversion Setup (deprecated)</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Subversion_Setup_(deprecated)&amp;diff=3245"/>
		<updated>2012-12-12T09:03:01Z</updated>

		<summary type="html">&lt;p&gt;Masaru20100: /* NEW Update with SF Upgrade */ nowiki for svn command&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {| align=&amp;quot;right&amp;quot;&lt;br /&gt;
  | __TOC__&lt;br /&gt;
  |}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Subversion is used as the version control system for the sources of the project — it holds all of the program source code and data that make up PCGen. It allows us to track changes in the various files, share our work with each other and to coordinate our activity in a single location.&lt;br /&gt;
&lt;br /&gt;
Developers use a subversion client to download the sources (called checkout) and update the sources with changes (called commit). The [http://subversion.apache.org/ official site] propose binaries or links to them for many operating systems. Most GNU/Linux distributions propose it as a package; in Debian it is the &amp;lt;a href=&amp;quot;apt:subversion&amp;gt;subversion package&amp;lt;/a&amp;gt;. One commonly used Windows subversion client, [[#TortoiseSVN|TortoiseSVN]], is described below. Most integrated development environments (IDEs) include Subversion support. In the case of [[Eclipse]], it is by using the the [http://subclipse.tigris.org/servlets/ProjectProcess?pageID=p4wYuA subclipse] plugin.&lt;br /&gt;
&lt;br /&gt;
=NEW Update with SF Upgrade=&lt;br /&gt;
&lt;br /&gt;
On Beta projects (versus Classic projects), Sourceforge seems to be encouraging the use of svn+ssh rather than https. It seems that using http is still possible with Beta projects, maybe limited to read only access.&lt;br /&gt;
&lt;br /&gt;
The command to get the trunk and put it in the pcgen-trunk directory is:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svn checkout https://svn.code.sf.net/p/pcgen/code/Trunk pcgen-trunk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==SVN+SSH Access==&lt;br /&gt;
&lt;br /&gt;
It is possible to use SSH to get the repository simply with read only access. The command to get the trunk is:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svn checkout svn://svn.code.sf.net/p/pcgen/code/Trunk pcgen-trunk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get a read/write access, the command, where USERNAME has to be changed to your Sourceforge account id is:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svn checkout --username=USERNAME svn+ssh://USERNAME@svn.code.sf.net/p/pcgen/code/Trunk pcgen-trunk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It will be asking your Sourceforge password.&lt;br /&gt;
&lt;br /&gt;
It is also possible to use a SSH key to avoid sending your encrypted password over the network. It is more secure, because to access PCGen repository, they need a file on your computer, not just your password. If the SSH key file is protected by a password, the protection is more improved.&lt;br /&gt;
The following paragraphs describe the procedure needed in order to use the key file.&lt;br /&gt;
&lt;br /&gt;
===On Windows===&lt;br /&gt;
&lt;br /&gt;
'''Install PuttyGen'''&lt;br /&gt;
&lt;br /&gt;
puttygen.exe - http://the.earth.li/~sgtatham/putty/latest/x86/puttygen.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Generate a SSH Key (file ends with .ppk)'''&lt;br /&gt;
&lt;br /&gt;
* run puttygen&lt;br /&gt;
* Generate a New Key - SSH2&lt;br /&gt;
* IN the comment section add 'sourceforgeUserId@shell.sourceforge.net'&lt;br /&gt;
* OPTIONAL - You may set a passphrase, SF recommends it.&lt;br /&gt;
* click the Save private key button&lt;br /&gt;
* enter a filename for your new .ppk file when prompted&lt;br /&gt;
* press Save&lt;br /&gt;
* Copy the Public Key Information&lt;br /&gt;
* Go to your SF Developer Account Services&lt;br /&gt;
* Edit Keys&lt;br /&gt;
* Paste your Public Key here&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Install Pageant'''&lt;br /&gt;
&lt;br /&gt;
pageant.exe - http://the.earth.li/~sgtatham/putty/latest/x86/pageant.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Run the ageant'''&lt;br /&gt;
&lt;br /&gt;
* double-click on pageant.exe&lt;br /&gt;
* you should now see a computer with a black hat in the tray&lt;br /&gt;
* Add your .ppk to the ageant&lt;br /&gt;
&lt;br /&gt;
* right-click on the computer with the black hat in your taskbar&lt;br /&gt;
* select Add Key from the context menu&lt;br /&gt;
* browse to your recently-created .ppk file and select it&lt;br /&gt;
* click Open&lt;br /&gt;
* enter your password when prompted (If you set the Passphrase earlier in this set up for your key, this is what it is asking for)&lt;br /&gt;
* verify that your key has been added by double-clicking on the computer with the black hat&lt;br /&gt;
&lt;br /&gt;
If you don't want to repeat this procedure after every reboot of your client, you should place Pageant in the auto-start group of your Windows installation. You can append the keys with complete paths as command line arguments to Pageant.exe.&lt;br /&gt;
&lt;br /&gt;
'''Install Plink'''&lt;br /&gt;
&lt;br /&gt;
plink.exe - http://the.earth.li/~sgtatham/putty/latest/x86/plink.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Install TortoiseSVN'''&lt;br /&gt;
&lt;br /&gt;
TortoiseSVN download page&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Configure TortoiseSVN'''&lt;br /&gt;
&lt;br /&gt;
You need to tell TortoiseSVN to use TortoisePlink to handle SSH traffic. To do this see the following steps:&lt;br /&gt;
&lt;br /&gt;
* right-click on an explorer window somewhere&lt;br /&gt;
* hover over TortoiseSVN in the context menu&lt;br /&gt;
* select Settings from the sub-menu&lt;br /&gt;
* select Network from the list on the left&lt;br /&gt;
* under the SSH box in the right side, click the Browse... button&lt;br /&gt;
* browse to and select TortoisePlink.exe (mine is in c:\Program Files\TortoiseSVN\bin\TortoisePlink.exe)&lt;br /&gt;
* click Open&lt;br /&gt;
* click Apply&lt;br /&gt;
&lt;br /&gt;
===On GNU/Linux===&lt;br /&gt;
&lt;br /&gt;
On top of subversion client, an ssh client is needed. OpenSSH is included in most distributions, on Debian, the package is openssh-client.&lt;br /&gt;
&lt;br /&gt;
If you don’t have a key yet, create one with:&lt;br /&gt;
 ssh-keygen&lt;br /&gt;
It will ask you where to store it (default is fine), and an eventual password. The public and private key will then be generated.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This command is used to copy the public key to an SSH server (in the case of the default location to store the key):&lt;br /&gt;
 ssh-copy-id USERNAME@svn.code.sf.net&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then you can use this command to grab the project:&lt;br /&gt;
 svn checkout --username=USERNAME svn+ssh://USERNAME@svn.code.sf.net/p/pcgen/code/Trunk pcgen-trunk&lt;br /&gt;
&lt;br /&gt;
In my case, my password to the id key was asked then my Sourceforge account key was asked.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To be Done: testing commits with this configuration.&lt;br /&gt;
&lt;br /&gt;
===On Mac OS X===&lt;br /&gt;
&lt;br /&gt;
[http://developer.apple.com/library/mac/#documentation/MacOSXServer/Conceptual/XServer_ProgrammingGuide/Articles/SSH.html Apple Developer SSH Page]&lt;br /&gt;
&lt;br /&gt;
=Related Articles=&lt;br /&gt;
&lt;br /&gt;
* Macintosh instructions can be found at [[SVN on the Mac]]&lt;br /&gt;
* [[Web access to SVN]]&lt;br /&gt;
* [[Merging]] with Subversion&lt;br /&gt;
* [[Basic Developer Setup#Setting up with Eclipse|Setting up with Eclipse]]&lt;br /&gt;
&lt;br /&gt;
= Using SVN =&lt;br /&gt;
&lt;br /&gt;
The Subversion command line client is not terribly hard to use either, especially if you are familiar with CVS. You can download [http://subversion.tigris.org/project_packages.html binaries] for various platforms, including Windows.&lt;br /&gt;
&lt;br /&gt;
Note the section on that page that says that the Subversion development team does *not* directly support these binaries. They mean it. However, questions about these posted to the [http://subversion.tigris.org/servlets/ProjectMailingListList Subversion users mailing list] are usually answered pretty quickly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==TortoiseSVN==&lt;br /&gt;
&lt;br /&gt;
TSVN is a GUI client for Subversion repositories. Before installing TSVN, please note that it is a Windows Explorer Shell extension, and as such, will not work on any other operating system.&lt;br /&gt;
&lt;br /&gt;
Make sure you have version 3.0 or later of the Windows Installer. This should be included in Windows Update for both Windows XP and Windows 2000. If for some reason you are still stuck on Windows 2000 (or earlier!), and can't update to the latest Service Pack, you are out of luck. I don't know if TSVN will work on Windows NT or Windows 98.&lt;br /&gt;
&lt;br /&gt;
# Close down all applications that might be running.&lt;br /&gt;
# Download the [http://tortoisesvn.net/downloads TortoiseSVN Program] and the [http://tortoisesvn.sourceforge.net/?q=support manual].&lt;br /&gt;
# Run the MSI.&lt;br /&gt;
# Restart your computer.&lt;br /&gt;
# Make sure you actually restarted your machine, not just logged off. TSVN is a shell extension, which means that you *must* restart your machine after installing.&lt;br /&gt;
&lt;br /&gt;
After you've installed TSVN, your Windows Explorer right-click context menus will all have a new entry called &amp;quot;Tortoise SVN&amp;quot;. Click this new entry to see the options available. Exactly how you will connect to a repository depends on how SourceForge has Subversion set up. I'll update this entry with more information when it becomes available.&lt;br /&gt;
&lt;br /&gt;
TSVN uses it's own SSH client, based on PuTTY, so you don't have to have it installed separately. The first time you attempt to browse a repository or do a check out, it will ask you for your credentials. You have the option of saving those credentials for future sessions as well.&lt;br /&gt;
&lt;br /&gt;
See the TSVN user's [http://tortoisesvn.tigris.org/list_etiquette.html mailing list information page] to subscribe to the mailing list. There are bunches of knowledgeable people there to help with virtually any problem you might have. Please make sure you follow proper nettiquette on this list, and research any questions you might have before posting something as a bug.&lt;br /&gt;
&lt;br /&gt;
==RapidSVN==&lt;br /&gt;
&lt;br /&gt;
If you are using an operating system other than Windows, and you want a GUI client, there is a cross platform GUI client called [http://rapidsvn.tigris.org/ RapidSVN], but I have no experience, good or bad, with that program.&lt;br /&gt;
&lt;br /&gt;
== Subclipse ==&lt;br /&gt;
&lt;br /&gt;
There is also an [http://subclipse.tigris.org/ Eclipse plug-in] that is highly thought of, see [[Basic Developer Setup]] for details.&lt;/div&gt;</summary>
		<author><name>Masaru20100</name></author>
		
	</entry>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Subversion_Setup_(deprecated)&amp;diff=3244</id>
		<title>Subversion Setup (deprecated)</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Subversion_Setup_(deprecated)&amp;diff=3244"/>
		<updated>2012-12-12T09:02:11Z</updated>

		<summary type="html">&lt;p&gt;Masaru20100: /* SVN+SSH Access */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {| align=&amp;quot;right&amp;quot;&lt;br /&gt;
  | __TOC__&lt;br /&gt;
  |}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Subversion is used as the version control system for the sources of the project — it holds all of the program source code and data that make up PCGen. It allows us to track changes in the various files, share our work with each other and to coordinate our activity in a single location.&lt;br /&gt;
&lt;br /&gt;
Developers use a subversion client to download the sources (called checkout) and update the sources with changes (called commit). The [http://subversion.apache.org/ official site] propose binaries or links to them for many operating systems. Most GNU/Linux distributions propose it as a package; in Debian it is the &amp;lt;a href=&amp;quot;apt:subversion&amp;gt;subversion package&amp;lt;/a&amp;gt;. One commonly used Windows subversion client, [[#TortoiseSVN|TortoiseSVN]], is described below. Most integrated development environments (IDEs) include Subversion support. In the case of [[Eclipse]], it is by using the the [http://subclipse.tigris.org/servlets/ProjectProcess?pageID=p4wYuA subclipse] plugin.&lt;br /&gt;
&lt;br /&gt;
=NEW Update with SF Upgrade=&lt;br /&gt;
&lt;br /&gt;
On Beta projects (versus Classic projects), Sourceforge seems to be encouraging the use of svn+ssh rather than https. It seems that using http is still possible with Beta projects, maybe limited to read only access.&lt;br /&gt;
&lt;br /&gt;
The command to get the trunk and put it in the pcgen-trunk directory is:&lt;br /&gt;
 svn checkout https://svn.code.sf.net/p/pcgen/code/Trunk pcgen-trunk&lt;br /&gt;
&lt;br /&gt;
==SVN+SSH Access==&lt;br /&gt;
&lt;br /&gt;
It is possible to use SSH to get the repository simply with read only access. The command to get the trunk is:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svn checkout svn://svn.code.sf.net/p/pcgen/code/Trunk pcgen-trunk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get a read/write access, the command, where USERNAME has to be changed to your Sourceforge account id is:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;svn checkout --username=USERNAME svn+ssh://USERNAME@svn.code.sf.net/p/pcgen/code/Trunk pcgen-trunk&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It will be asking your Sourceforge password.&lt;br /&gt;
&lt;br /&gt;
It is also possible to use a SSH key to avoid sending your encrypted password over the network. It is more secure, because to access PCGen repository, they need a file on your computer, not just your password. If the SSH key file is protected by a password, the protection is more improved.&lt;br /&gt;
The following paragraphs describe the procedure needed in order to use the key file.&lt;br /&gt;
&lt;br /&gt;
===On Windows===&lt;br /&gt;
&lt;br /&gt;
'''Install PuttyGen'''&lt;br /&gt;
&lt;br /&gt;
puttygen.exe - http://the.earth.li/~sgtatham/putty/latest/x86/puttygen.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Generate a SSH Key (file ends with .ppk)'''&lt;br /&gt;
&lt;br /&gt;
* run puttygen&lt;br /&gt;
* Generate a New Key - SSH2&lt;br /&gt;
* IN the comment section add 'sourceforgeUserId@shell.sourceforge.net'&lt;br /&gt;
* OPTIONAL - You may set a passphrase, SF recommends it.&lt;br /&gt;
* click the Save private key button&lt;br /&gt;
* enter a filename for your new .ppk file when prompted&lt;br /&gt;
* press Save&lt;br /&gt;
* Copy the Public Key Information&lt;br /&gt;
* Go to your SF Developer Account Services&lt;br /&gt;
* Edit Keys&lt;br /&gt;
* Paste your Public Key here&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Install Pageant'''&lt;br /&gt;
&lt;br /&gt;
pageant.exe - http://the.earth.li/~sgtatham/putty/latest/x86/pageant.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Run the ageant'''&lt;br /&gt;
&lt;br /&gt;
* double-click on pageant.exe&lt;br /&gt;
* you should now see a computer with a black hat in the tray&lt;br /&gt;
* Add your .ppk to the ageant&lt;br /&gt;
&lt;br /&gt;
* right-click on the computer with the black hat in your taskbar&lt;br /&gt;
* select Add Key from the context menu&lt;br /&gt;
* browse to your recently-created .ppk file and select it&lt;br /&gt;
* click Open&lt;br /&gt;
* enter your password when prompted (If you set the Passphrase earlier in this set up for your key, this is what it is asking for)&lt;br /&gt;
* verify that your key has been added by double-clicking on the computer with the black hat&lt;br /&gt;
&lt;br /&gt;
If you don't want to repeat this procedure after every reboot of your client, you should place Pageant in the auto-start group of your Windows installation. You can append the keys with complete paths as command line arguments to Pageant.exe.&lt;br /&gt;
&lt;br /&gt;
'''Install Plink'''&lt;br /&gt;
&lt;br /&gt;
plink.exe - http://the.earth.li/~sgtatham/putty/latest/x86/plink.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Install TortoiseSVN'''&lt;br /&gt;
&lt;br /&gt;
TortoiseSVN download page&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Configure TortoiseSVN'''&lt;br /&gt;
&lt;br /&gt;
You need to tell TortoiseSVN to use TortoisePlink to handle SSH traffic. To do this see the following steps:&lt;br /&gt;
&lt;br /&gt;
* right-click on an explorer window somewhere&lt;br /&gt;
* hover over TortoiseSVN in the context menu&lt;br /&gt;
* select Settings from the sub-menu&lt;br /&gt;
* select Network from the list on the left&lt;br /&gt;
* under the SSH box in the right side, click the Browse... button&lt;br /&gt;
* browse to and select TortoisePlink.exe (mine is in c:\Program Files\TortoiseSVN\bin\TortoisePlink.exe)&lt;br /&gt;
* click Open&lt;br /&gt;
* click Apply&lt;br /&gt;
&lt;br /&gt;
===On GNU/Linux===&lt;br /&gt;
&lt;br /&gt;
On top of subversion client, an ssh client is needed. OpenSSH is included in most distributions, on Debian, the package is openssh-client.&lt;br /&gt;
&lt;br /&gt;
If you don’t have a key yet, create one with:&lt;br /&gt;
 ssh-keygen&lt;br /&gt;
It will ask you where to store it (default is fine), and an eventual password. The public and private key will then be generated.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This command is used to copy the public key to an SSH server (in the case of the default location to store the key):&lt;br /&gt;
 ssh-copy-id USERNAME@svn.code.sf.net&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then you can use this command to grab the project:&lt;br /&gt;
 svn checkout --username=USERNAME svn+ssh://USERNAME@svn.code.sf.net/p/pcgen/code/Trunk pcgen-trunk&lt;br /&gt;
&lt;br /&gt;
In my case, my password to the id key was asked then my Sourceforge account key was asked.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To be Done: testing commits with this configuration.&lt;br /&gt;
&lt;br /&gt;
===On Mac OS X===&lt;br /&gt;
&lt;br /&gt;
[http://developer.apple.com/library/mac/#documentation/MacOSXServer/Conceptual/XServer_ProgrammingGuide/Articles/SSH.html Apple Developer SSH Page]&lt;br /&gt;
&lt;br /&gt;
=Related Articles=&lt;br /&gt;
&lt;br /&gt;
* Macintosh instructions can be found at [[SVN on the Mac]]&lt;br /&gt;
* [[Web access to SVN]]&lt;br /&gt;
* [[Merging]] with Subversion&lt;br /&gt;
* [[Basic Developer Setup#Setting up with Eclipse|Setting up with Eclipse]]&lt;br /&gt;
&lt;br /&gt;
= Using SVN =&lt;br /&gt;
&lt;br /&gt;
The Subversion command line client is not terribly hard to use either, especially if you are familiar with CVS. You can download [http://subversion.tigris.org/project_packages.html binaries] for various platforms, including Windows.&lt;br /&gt;
&lt;br /&gt;
Note the section on that page that says that the Subversion development team does *not* directly support these binaries. They mean it. However, questions about these posted to the [http://subversion.tigris.org/servlets/ProjectMailingListList Subversion users mailing list] are usually answered pretty quickly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==TortoiseSVN==&lt;br /&gt;
&lt;br /&gt;
TSVN is a GUI client for Subversion repositories. Before installing TSVN, please note that it is a Windows Explorer Shell extension, and as such, will not work on any other operating system.&lt;br /&gt;
&lt;br /&gt;
Make sure you have version 3.0 or later of the Windows Installer. This should be included in Windows Update for both Windows XP and Windows 2000. If for some reason you are still stuck on Windows 2000 (or earlier!), and can't update to the latest Service Pack, you are out of luck. I don't know if TSVN will work on Windows NT or Windows 98.&lt;br /&gt;
&lt;br /&gt;
# Close down all applications that might be running.&lt;br /&gt;
# Download the [http://tortoisesvn.net/downloads TortoiseSVN Program] and the [http://tortoisesvn.sourceforge.net/?q=support manual].&lt;br /&gt;
# Run the MSI.&lt;br /&gt;
# Restart your computer.&lt;br /&gt;
# Make sure you actually restarted your machine, not just logged off. TSVN is a shell extension, which means that you *must* restart your machine after installing.&lt;br /&gt;
&lt;br /&gt;
After you've installed TSVN, your Windows Explorer right-click context menus will all have a new entry called &amp;quot;Tortoise SVN&amp;quot;. Click this new entry to see the options available. Exactly how you will connect to a repository depends on how SourceForge has Subversion set up. I'll update this entry with more information when it becomes available.&lt;br /&gt;
&lt;br /&gt;
TSVN uses it's own SSH client, based on PuTTY, so you don't have to have it installed separately. The first time you attempt to browse a repository or do a check out, it will ask you for your credentials. You have the option of saving those credentials for future sessions as well.&lt;br /&gt;
&lt;br /&gt;
See the TSVN user's [http://tortoisesvn.tigris.org/list_etiquette.html mailing list information page] to subscribe to the mailing list. There are bunches of knowledgeable people there to help with virtually any problem you might have. Please make sure you follow proper nettiquette on this list, and research any questions you might have before posting something as a bug.&lt;br /&gt;
&lt;br /&gt;
==RapidSVN==&lt;br /&gt;
&lt;br /&gt;
If you are using an operating system other than Windows, and you want a GUI client, there is a cross platform GUI client called [http://rapidsvn.tigris.org/ RapidSVN], but I have no experience, good or bad, with that program.&lt;br /&gt;
&lt;br /&gt;
== Subclipse ==&lt;br /&gt;
&lt;br /&gt;
There is also an [http://subclipse.tigris.org/ Eclipse plug-in] that is highly thought of, see [[Basic Developer Setup]] for details.&lt;/div&gt;</summary>
		<author><name>Masaru20100</name></author>
		
	</entry>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Subversion_Setup_(deprecated)&amp;diff=3243</id>
		<title>Subversion Setup (deprecated)</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Subversion_Setup_(deprecated)&amp;diff=3243"/>
		<updated>2012-12-12T09:00:24Z</updated>

		<summary type="html">&lt;p&gt;Masaru20100: Added GNU/Linux details, reorganised the page a bit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;  {| align=&amp;quot;right&amp;quot;&lt;br /&gt;
  | __TOC__&lt;br /&gt;
  |}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Subversion is used as the version control system for the sources of the project — it holds all of the program source code and data that make up PCGen. It allows us to track changes in the various files, share our work with each other and to coordinate our activity in a single location.&lt;br /&gt;
&lt;br /&gt;
Developers use a subversion client to download the sources (called checkout) and update the sources with changes (called commit). The [http://subversion.apache.org/ official site] propose binaries or links to them for many operating systems. Most GNU/Linux distributions propose it as a package; in Debian it is the &amp;lt;a href=&amp;quot;apt:subversion&amp;gt;subversion package&amp;lt;/a&amp;gt;. One commonly used Windows subversion client, [[#TortoiseSVN|TortoiseSVN]], is described below. Most integrated development environments (IDEs) include Subversion support. In the case of [[Eclipse]], it is by using the the [http://subclipse.tigris.org/servlets/ProjectProcess?pageID=p4wYuA subclipse] plugin.&lt;br /&gt;
&lt;br /&gt;
=NEW Update with SF Upgrade=&lt;br /&gt;
&lt;br /&gt;
On Beta projects (versus Classic projects), Sourceforge seems to be encouraging the use of svn+ssh rather than https. It seems that using http is still possible with Beta projects, maybe limited to read only access.&lt;br /&gt;
&lt;br /&gt;
The command to get the trunk and put it in the pcgen-trunk directory is:&lt;br /&gt;
 svn checkout https://svn.code.sf.net/p/pcgen/code/Trunk pcgen-trunk&lt;br /&gt;
&lt;br /&gt;
==SVN+SSH Access==&lt;br /&gt;
&lt;br /&gt;
It is possible to use SSH to get the repository simply with read only access. The command to get the trunk is:&lt;br /&gt;
 svn checkout svn://svn.code.sf.net/p/pcgen/code/Trunk pcgen-trunk&lt;br /&gt;
&lt;br /&gt;
To get a read/write access, the command, where USERNAME has to be changed to your Sourceforge account id is:&lt;br /&gt;
 svn checkout --username=USERNAME svn+ssh://USERNAME@svn.code.sf.net/p/pcgen/code/Trunk pcgen-trunk&lt;br /&gt;
&lt;br /&gt;
It will be asking your Sourceforge password.&lt;br /&gt;
&lt;br /&gt;
It is also possible to use a SSH key to avoid sending your encrypted password over the network. It is more secure, because to access PCGen repository, they need a file on your computer, not just your password. If the SSH key file is protected by a password, the protection is more improved.&lt;br /&gt;
The following paragraphs describe the procedure needed in order to use the key file.&lt;br /&gt;
&lt;br /&gt;
===On Windows===&lt;br /&gt;
&lt;br /&gt;
'''Install PuttyGen'''&lt;br /&gt;
&lt;br /&gt;
puttygen.exe - http://the.earth.li/~sgtatham/putty/latest/x86/puttygen.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Generate a SSH Key (file ends with .ppk)'''&lt;br /&gt;
&lt;br /&gt;
* run puttygen&lt;br /&gt;
* Generate a New Key - SSH2&lt;br /&gt;
* IN the comment section add 'sourceforgeUserId@shell.sourceforge.net'&lt;br /&gt;
* OPTIONAL - You may set a passphrase, SF recommends it.&lt;br /&gt;
* click the Save private key button&lt;br /&gt;
* enter a filename for your new .ppk file when prompted&lt;br /&gt;
* press Save&lt;br /&gt;
* Copy the Public Key Information&lt;br /&gt;
* Go to your SF Developer Account Services&lt;br /&gt;
* Edit Keys&lt;br /&gt;
* Paste your Public Key here&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Install Pageant'''&lt;br /&gt;
&lt;br /&gt;
pageant.exe - http://the.earth.li/~sgtatham/putty/latest/x86/pageant.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Run the ageant'''&lt;br /&gt;
&lt;br /&gt;
* double-click on pageant.exe&lt;br /&gt;
* you should now see a computer with a black hat in the tray&lt;br /&gt;
* Add your .ppk to the ageant&lt;br /&gt;
&lt;br /&gt;
* right-click on the computer with the black hat in your taskbar&lt;br /&gt;
* select Add Key from the context menu&lt;br /&gt;
* browse to your recently-created .ppk file and select it&lt;br /&gt;
* click Open&lt;br /&gt;
* enter your password when prompted (If you set the Passphrase earlier in this set up for your key, this is what it is asking for)&lt;br /&gt;
* verify that your key has been added by double-clicking on the computer with the black hat&lt;br /&gt;
&lt;br /&gt;
If you don't want to repeat this procedure after every reboot of your client, you should place Pageant in the auto-start group of your Windows installation. You can append the keys with complete paths as command line arguments to Pageant.exe.&lt;br /&gt;
&lt;br /&gt;
'''Install Plink'''&lt;br /&gt;
&lt;br /&gt;
plink.exe - http://the.earth.li/~sgtatham/putty/latest/x86/plink.exe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Install TortoiseSVN'''&lt;br /&gt;
&lt;br /&gt;
TortoiseSVN download page&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Configure TortoiseSVN'''&lt;br /&gt;
&lt;br /&gt;
You need to tell TortoiseSVN to use TortoisePlink to handle SSH traffic. To do this see the following steps:&lt;br /&gt;
&lt;br /&gt;
* right-click on an explorer window somewhere&lt;br /&gt;
* hover over TortoiseSVN in the context menu&lt;br /&gt;
* select Settings from the sub-menu&lt;br /&gt;
* select Network from the list on the left&lt;br /&gt;
* under the SSH box in the right side, click the Browse... button&lt;br /&gt;
* browse to and select TortoisePlink.exe (mine is in c:\Program Files\TortoiseSVN\bin\TortoisePlink.exe)&lt;br /&gt;
* click Open&lt;br /&gt;
* click Apply&lt;br /&gt;
&lt;br /&gt;
===On GNU/Linux===&lt;br /&gt;
&lt;br /&gt;
On top of subversion client, an ssh client is needed. OpenSSH is included in most distributions, on Debian, the package is openssh-client.&lt;br /&gt;
&lt;br /&gt;
If you don’t have a key yet, create one with:&lt;br /&gt;
 ssh-keygen&lt;br /&gt;
It will ask you where to store it (default is fine), and an eventual password. The public and private key will then be generated.&lt;br /&gt;
&lt;br /&gt;
This command is used to copy the public key to an SSH server (in the case of the default location to store the key):&lt;br /&gt;
 ssh-copy-id USERNAME@svn.code.sf.net&lt;br /&gt;
&lt;br /&gt;
Then you can use this command to grab the project:&lt;br /&gt;
 svn checkout --username=USERNAME svn+ssh://USERNAME@svn.code.sf.net/p/pcgen/code/Trunk pcgen-trunk&lt;br /&gt;
&lt;br /&gt;
In my case, my password to the id key was asked then my Sourceforge account key was asked.&lt;br /&gt;
&lt;br /&gt;
To be Done: testing commits with this configuration.&lt;br /&gt;
&lt;br /&gt;
===On Mac OS X===&lt;br /&gt;
&lt;br /&gt;
[http://developer.apple.com/library/mac/#documentation/MacOSXServer/Conceptual/XServer_ProgrammingGuide/Articles/SSH.html Apple Developer SSH Page]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Related Articles=&lt;br /&gt;
&lt;br /&gt;
* Macintosh instructions can be found at [[SVN on the Mac]]&lt;br /&gt;
* [[Web access to SVN]]&lt;br /&gt;
* [[Merging]] with Subversion&lt;br /&gt;
* [[Basic Developer Setup#Setting up with Eclipse|Setting up with Eclipse]]&lt;br /&gt;
&lt;br /&gt;
= Using SVN =&lt;br /&gt;
&lt;br /&gt;
The Subversion command line client is not terribly hard to use either, especially if you are familiar with CVS. You can download [http://subversion.tigris.org/project_packages.html binaries] for various platforms, including Windows.&lt;br /&gt;
&lt;br /&gt;
Note the section on that page that says that the Subversion development team does *not* directly support these binaries. They mean it. However, questions about these posted to the [http://subversion.tigris.org/servlets/ProjectMailingListList Subversion users mailing list] are usually answered pretty quickly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==TortoiseSVN==&lt;br /&gt;
&lt;br /&gt;
TSVN is a GUI client for Subversion repositories. Before installing TSVN, please note that it is a Windows Explorer Shell extension, and as such, will not work on any other operating system.&lt;br /&gt;
&lt;br /&gt;
Make sure you have version 3.0 or later of the Windows Installer. This should be included in Windows Update for both Windows XP and Windows 2000. If for some reason you are still stuck on Windows 2000 (or earlier!), and can't update to the latest Service Pack, you are out of luck. I don't know if TSVN will work on Windows NT or Windows 98.&lt;br /&gt;
&lt;br /&gt;
# Close down all applications that might be running.&lt;br /&gt;
# Download the [http://tortoisesvn.net/downloads TortoiseSVN Program] and the [http://tortoisesvn.sourceforge.net/?q=support manual].&lt;br /&gt;
# Run the MSI.&lt;br /&gt;
# Restart your computer.&lt;br /&gt;
# Make sure you actually restarted your machine, not just logged off. TSVN is a shell extension, which means that you *must* restart your machine after installing.&lt;br /&gt;
&lt;br /&gt;
After you've installed TSVN, your Windows Explorer right-click context menus will all have a new entry called &amp;quot;Tortoise SVN&amp;quot;. Click this new entry to see the options available. Exactly how you will connect to a repository depends on how SourceForge has Subversion set up. I'll update this entry with more information when it becomes available.&lt;br /&gt;
&lt;br /&gt;
TSVN uses it's own SSH client, based on PuTTY, so you don't have to have it installed separately. The first time you attempt to browse a repository or do a check out, it will ask you for your credentials. You have the option of saving those credentials for future sessions as well.&lt;br /&gt;
&lt;br /&gt;
See the TSVN user's [http://tortoisesvn.tigris.org/list_etiquette.html mailing list information page] to subscribe to the mailing list. There are bunches of knowledgeable people there to help with virtually any problem you might have. Please make sure you follow proper nettiquette on this list, and research any questions you might have before posting something as a bug.&lt;br /&gt;
&lt;br /&gt;
==RapidSVN==&lt;br /&gt;
&lt;br /&gt;
If you are using an operating system other than Windows, and you want a GUI client, there is a cross platform GUI client called [http://rapidsvn.tigris.org/ RapidSVN], but I have no experience, good or bad, with that program.&lt;br /&gt;
&lt;br /&gt;
== Subclipse ==&lt;br /&gt;
&lt;br /&gt;
There is also an [http://subclipse.tigris.org/ Eclipse plug-in] that is highly thought of, see [[Basic Developer Setup]] for details.&lt;/div&gt;</summary>
		<author><name>Masaru20100</name></author>
		
	</entry>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Internationalization&amp;diff=3151</id>
		<title>Internationalization</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Internationalization&amp;diff=3151"/>
		<updated>2012-09-15T11:16:51Z</updated>

		<summary type="html">&lt;p&gt;Masaru20100: /* Application Packaging */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
&lt;br /&gt;
PCGen for 6.0+ releases will be attempting Internationalization (probably not in 6.0). Internalization is the process of changing software to allow it to be usable in any language and any locale. It is often abbreviated i18n. It is needed in PCGen because the software was not thought from the ground up to be usable from a language other than English. Localization is the process of creating the translations for a particular language, to do so the software need to able to handle internationalization. To deal with those, a Yahoo group called [http://groups.yahoo.com/group/pcgen_international pcgen_international] has been created.&lt;br /&gt;
&lt;br /&gt;
Requests for translations, problems with translations, and drafts of translated data sets or other translated content, as well as anything coming up with the Internationalization of PCGen are to be discussed in that group.&lt;br /&gt;
&lt;br /&gt;
Anybody interested to help out with translations to other languages, but also those who are just interested in the discussion of the matter, please join the group. Those interested in joining our efforts on the Internationalization of PCGen, please make yourself known on that list.&lt;br /&gt;
&lt;br /&gt;
This page is an attempt to regroup the information discussed on the list.&lt;br /&gt;
&lt;br /&gt;
There is a JIRA issue to regroup work on i18n: http://jira.pcgen.org/browse/CODE-733&lt;br /&gt;
&lt;br /&gt;
=Goal=&lt;br /&gt;
&lt;br /&gt;
The goal is to allow a user that doesn’t speak English to use the program in his native language with the specifics of his locale. This is an ideal goal, as it is not possible to provide all possible localizations with the low number of volunteers. What is needed is to provide the means for people to create localizations, in order to be able to do that, PCGen must be fully internationalized. Once this is done, the number of localization will slowly grow.&lt;br /&gt;
&lt;br /&gt;
PCGen interface, especially the part that are data set independent, are already internationalized and partially translated. Updating those translations is one of the needed step but not the only one.&lt;br /&gt;
Another element is already internationalized, it’s the use of imperial or metric distance. There is also an option to change it.&lt;br /&gt;
&lt;br /&gt;
Other steps are need to attain internationalization.&lt;br /&gt;
&lt;br /&gt;
* First the '''installation process''' should be detailed in many languages, even if it’s only expanding a compressed file then using a script to launch the program.&lt;br /&gt;
* All program '''UI strings''' should also be translatable, and so are the '''data strings'''. It seems that the non data strings are already translatable.&lt;br /&gt;
* The skills should be '''sorted''' in the UI and in the output sheet according to the natural sorting of the language.&lt;br /&gt;
* The '''output sheets''' should be in the user’s language too.&lt;br /&gt;
* In case the user create it’s own translation, it should be possible to add the language in the option pane without having to compile the program (or worse have to change some code!). From a technical point of view, it also means that the translations should be external to the jar, or that a simple way to add a translation provided.&lt;br /&gt;
&lt;br /&gt;
* Saved characters are usually reusable with a new version of the program, and the il8n should not change that. (technical: the saved elements should stay the same, should probably be keys of some sort — I have no idea what the pcg files are)&lt;br /&gt;
&lt;br /&gt;
* It would be better for the '''measure and weights system''' to be initially set to a logical value rather than a set one, it would depend on the first chosen locale. It is also needed to verify that the imperial and metric system option are actually working.&lt;br /&gt;
&lt;br /&gt;
There is also other elements that would improve usability for the user, mainly that '''help/documentation''' would be available in his language. This is usually big work to be achieve but doesn’t need any change in PCGen.&lt;br /&gt;
Another linked part is to be able to handle '''bug report''' in another language. To do that, the project need some people that would translate the bug reports to English before the development team is able to handle the bug reports. &lt;br /&gt;
&lt;br /&gt;
= Tools for internationalization and localization =&lt;br /&gt;
&lt;br /&gt;
To facilitate the internationalization and localization, some tools would be welcome. This tools are not necessary for the user, but are a great addition to maintainers.&lt;br /&gt;
&lt;br /&gt;
For internationalization:&lt;br /&gt;
* a way to determine which strings are translatable or not. Some IDE and some code quality library provide this kind of tool.&lt;br /&gt;
* a tool to eliminate (or point at) line that are not used any more in the main bundle file (it is quite big and there seems to bit not displayed text)&lt;br /&gt;
&lt;br /&gt;
For localization,&lt;br /&gt;
* If a specific way of storing the data translation is used, a tool to produce and update a more standard file would be needed. In free project, gettext files (POT, PO) are often used. In Java, ResourceBundle are often used. Another standard format is XLIFF. Such a tool would be able to add new needed translation to a file of the standard format, and flag old translations. From the standard format, it would update the translation of the specific format file. This is needed because there is tool to ease and speed up translation, like Virtaal, ResourceBundle editors, or poedit, and they need a standard file format to be usable.  &lt;br /&gt;
* a tool test to see if some entries are not translated (maybe a page that would provide statistics) it might be more useful if UI and data separated&lt;br /&gt;
* keeping glossary for each languages could help (some terms are found at many places)&lt;br /&gt;
* A way to detect incorrect token translation (like using Dager instead of Dagger) is welcome. One way to do this is by generating error or warning when loading the translation file. It would be welcome to generate this list of error without having to launch PCGen, it would also be a nice addition to automatic testing.&lt;br /&gt;
&lt;br /&gt;
=Choices yet to be made=&lt;br /&gt;
&lt;br /&gt;
== Application Packaging ==&lt;br /&gt;
&lt;br /&gt;
As of December 2011, the application and translation of some part of the UI are bundled together.&lt;br /&gt;
&lt;br /&gt;
The question is should the application be bundled this way, or should there be language specific bundles.&lt;br /&gt;
&lt;br /&gt;
Pro of a all-in-one&lt;br /&gt;
* user can change language on the fly&lt;br /&gt;
* no need for explanations on how to install a new language set&lt;br /&gt;
&lt;br /&gt;
Cons&lt;br /&gt;
* file could get quite big. But if it is text, it compress usually really well.&lt;br /&gt;
&lt;br /&gt;
== Genre class names ==&lt;br /&gt;
&lt;br /&gt;
In some languages, the class names can have a genre, like the feminine of priest is priestess in English (even if Cleric is the name of the class, it’s just to illustrate the point). Do we want to use those names in the class names or do we stick to whatever name the class is?&lt;br /&gt;
&lt;br /&gt;
= The goals in more details for PCGen =&lt;br /&gt;
&lt;br /&gt;
== Default language after clean install ==&lt;br /&gt;
&lt;br /&gt;
The language should be the system one. To the user, if doesn’t understand the default language, it will be a pain for him to find the option to change the language.&lt;br /&gt;
It may be even better if the user is prompted with a choice at the start of the program (or at install) in order to simplify this process. It might be displayed only if the system language doesn’t exist in PCGen.&lt;br /&gt;
As noted before, the measure and weight system used need to be chosen by the user at the first install with the default choice depending on the language/locale selected. After first launch or install, the option is changeable in the option preference panel.&lt;br /&gt;
&lt;br /&gt;
After clean install (no preference files):&lt;br /&gt;
# PCGen determine the system language&lt;br /&gt;
# if translation exist (and are believed good enough) switch to that language, if not, display an element to ask the user for the language to use.&lt;br /&gt;
&lt;br /&gt;
== Published language priority ==&lt;br /&gt;
&lt;br /&gt;
* The data that is not translated in a language, for example books not yet translated, should stay in the language it first get out.&lt;br /&gt;
&lt;br /&gt;
Books are almost never instantly translated by companies and some aren’t even translated. PCGen is also short on staff. All that means that the translations will probably be coming far after the original one.&lt;br /&gt;
To an user that only use translated material, it will not be a problem.&lt;br /&gt;
To an user that mix translated material, and not translated one, it shouldn’t become a problem.&lt;br /&gt;
&lt;br /&gt;
== Using different data languages ==&lt;br /&gt;
&lt;br /&gt;
* The data should be the same that the English one to avoid having to duplicate data correction.&lt;br /&gt;
&lt;br /&gt;
Having data in several languages could be a way to do il8n&lt;br /&gt;
&lt;br /&gt;
Cons&lt;br /&gt;
* might need language specific bundles&lt;br /&gt;
* a character used with one language cannot be seen by someone with a different language set&lt;br /&gt;
* multiple corrections needed when correcting a bug (and if automatic generation of the translation is done, why not do it on the fly)&lt;br /&gt;
&lt;br /&gt;
It probably should be avoided to do it that way.&lt;br /&gt;
&lt;br /&gt;
== Separating data and UI translations ==&lt;br /&gt;
&lt;br /&gt;
* The interface language and the data language should be separate to allow people with book in a different language than their own to use the program more simply.&lt;br /&gt;
To the user that speak only one language, it is no advantage nor a problem.&lt;br /&gt;
For a user which use book that are not in the language he is most comfortable with, he would put the UI and the data to different languages. Same for someone who doesn’t use translation of the data but prefer to have a program in a language he is more comfortable with.&lt;br /&gt;
&lt;br /&gt;
== Custom content and localization ==&lt;br /&gt;
&lt;br /&gt;
* It should be possible to use another language in a data to allow non English speaker to develop custom content in another language. That seem to be a problem when combined with separate language from data. A way to avoid it is to provide easy reference to create custom content.&lt;br /&gt;
&lt;br /&gt;
This might be a hard to make real combined with other points.&lt;br /&gt;
&lt;br /&gt;
(might be wrong on this point [[User:Masaru20100|Masaru20100]]) At the moment, when creating custom content, the English token are used. For a non English-speaker, it is a problem, that’s why, ideally, he should be able to create custom by using his own language.&lt;br /&gt;
&lt;br /&gt;
The problem this cause is that if the user change the language of the program, the custom content either doesn’t work anymore, or all possible translations are checked which would cause massive slowness in the software.&lt;br /&gt;
&lt;br /&gt;
As it seams undoable, the user should be provided with way to easily find the needed English token for his custom content.&lt;br /&gt;
&lt;br /&gt;
== Indicating what is translated ==&lt;br /&gt;
&lt;br /&gt;
It would be good to provide the user with visual information of how much a dataset is translated in his language. It is not really a needed feature but could help him. If he knew that all is not translated, he would be less surprised.&lt;br /&gt;
&lt;br /&gt;
=Technical Aspects=&lt;br /&gt;
&lt;br /&gt;
== Language choice UI ==&lt;br /&gt;
&lt;br /&gt;
There is already options to change the language and the weights and measure system used.&lt;br /&gt;
&lt;br /&gt;
It might be best to have a drop down list rather than radio choices. New translation should appear in the list.&lt;br /&gt;
&lt;br /&gt;
== Formatting Issue ==&lt;br /&gt;
&lt;br /&gt;
Martijn pointed that number should be translatable. In Japanese, the classic number system is almost always used especially in RPG. In fact, translating numbers is not needed, what is needed is formatting numbers.&lt;br /&gt;
&lt;br /&gt;
That means that 10000 gets formatted 10,000 in English, 10 000 in French. In Japanese, it would either be 10,000 or 1万. There is even a locale to obtain 一万 if needed.&lt;br /&gt;
&lt;br /&gt;
In Java, this is usually done by using the NumberFormat class with the appropriate locale.&lt;br /&gt;
&lt;br /&gt;
== Sorting Issue ==&lt;br /&gt;
&lt;br /&gt;
Sorting is usually language dependent, meaning that the list of skills for example is not sorted the same way in different languages, even if the name are the same. The differences are usually minor between roman letter using languages.&lt;br /&gt;
&lt;br /&gt;
Actually, the international guys brought up the sorting thing again - another project would be to look into the GUI/core and replacing all the sorting of items with internationalized methods of sorting (Collators).&lt;br /&gt;
&lt;br /&gt;
Technically, Java already provide ways of sorting based on locale, it’s the Collator classes.&lt;br /&gt;
&lt;br /&gt;
== Unique Identifier ==&lt;br /&gt;
&lt;br /&gt;
Apparently there is already unique identifiers in use for items, so the idea would be to have a file with that id as the key and the translation as the value.&lt;br /&gt;
&lt;br /&gt;
== Output Sheet and Data Language ==&lt;br /&gt;
&lt;br /&gt;
The question is: should output sheets be locale dependent?&lt;br /&gt;
If it is, when a sheet is corrected for one locale, it will need to be edited in all languages. Having languages taken into account in the same sheet make it more complicated.&lt;br /&gt;
&lt;br /&gt;
=== Gender, race and level example ===&lt;br /&gt;
&lt;br /&gt;
There is also other problem as illustrated by the gender, race and level.&lt;br /&gt;
&lt;br /&gt;
In English, the gender propose Male, Female, Neuter, Unknown.&lt;br /&gt;
In a English statblock, it is usually a line like: Gender Race Level N, as “Female drow cleric 3” for a drow noble [http://www.d20pfsrd.com/bestiary/monster-listings/humanoids/drow-common/drow-noble]. As of this writing, the software output “Female Drow Noble Cleric3”, or “Female Drow Noble Cleric 3” instead in most statblock sheets.&lt;br /&gt;
The Unknown gender, and maybe the neuter one too, should probably not output as is in statblock sheets, while not &lt;br /&gt;
On my system, with the preferences to use the system language, the female translation is used instead.&lt;br /&gt;
&lt;br /&gt;
In French, it is Mâle, Femelle, Neuter, Inconnu. The same noble drow is “Drow, prêtre 3” (prêtre is the translation of cleric) [http://www.pathfinder-fr.org/Wiki/Pathfinder-RPG.Drow%20noble.ashx]. I remember reading “Drow (f), prêtre 3”, where the sex is included by using a single letter in parenthesis. It could also have been “Drow, guerrière 3”, where guerrière is the feminine of fighter.&lt;br /&gt;
As you can remark, the order is different.&lt;br /&gt;
&lt;br /&gt;
In Japanese, it looks like “ドラウ（女性）の貴族の3レベル・クレリック” [http://www29.atwiki.jp/prdj/pages/306.html#drow]. ドラウ is drow, 女性 means woman, の is the possessive, 貴族 is noble, レベル is level, クレリック is cleric. That would look like drow(female)’s noble’s 3rd level cleric. When the gender is unknown, it is not mentioned, goblin is such an example [http://www29.atwiki.jp/prdj/pages/244.html#goblin].&lt;br /&gt;
&lt;br /&gt;
In Italian, it seems to be “Drow nobile femmina Chierico 3”, ie Drow noble female Cleric 3. [http://prd.5clone.com/mostri/1982-drow]&lt;br /&gt;
&lt;br /&gt;
I think that in German, Female used as the choice and female as in female something is not written the same.&lt;br /&gt;
&lt;br /&gt;
Note that my examples uses Pathfinder because I do not know of translations of the SRD/RSRD online.&lt;br /&gt;
&lt;br /&gt;
This is only the first element of the stat block, and it seems already complicated. And there was no example of right-to-left languages, like Arabic or Hebrew. One thing seems common is that the gender value used on display, on the one used in stat blocks are different, whatever the language, and it is the same for race. For a standard character sheet, it seems that the UI value can be reused as is. In the case of gender, there is already two (three?) token, GENDER.SHORT and GENDER.LONG (and GENDER?). GENDER.SHORT, which has the same value as GENDER.LONG, could be changed to be the output value. A new value could be introduced, maybe something like GENDER.STATBLOCK.&lt;br /&gt;
That still doesn’t handle the problem of the order of gender/race/class levels.&lt;br /&gt;
&lt;br /&gt;
=== Data translation and output sheet values locale ===&lt;br /&gt;
&lt;br /&gt;
The issue is of what language to use when outputting the gender or other localized fields. At the moment, the data is in English, but there is a mix of English and whatever language the UI is defined to use. My primary example is Gender.&lt;br /&gt;
Once a data language is introduced, it might make sense to use this language in the output sheets rather than the UI one (if they differ).&lt;br /&gt;
&lt;br /&gt;
== Tom’s technical proposal ==&lt;br /&gt;
&lt;br /&gt;
So looking back at the earlier thread, I never actually came back with my suggestion, so here is my perspective on localization and how it should be done. This has been made easier by some changes we have in the 6.x line, and having new UI (with what I believe to be a lot more isolation of code that does display of items) is a huge boost here to making this practical.&lt;br /&gt;
&lt;br /&gt;
First a few base facts as background:&lt;br /&gt;
# For [almost] every item (Class, Skill, etc.) there is a unique identifier (generally referred to as a Key - note that if the &amp;quot;KEY&amp;quot; token is not used, then the Key is the name (first entry on the line in the data) (There is an exception to this we'll call [[#problem1|problem #1]])&lt;br /&gt;
# There are basically 4 types of things that need translation:&lt;br /&gt;
## (2a) item names&lt;br /&gt;
## (2b) constants (like spell schools)&lt;br /&gt;
## (2c) variables (like meters/feet/etc.)&lt;br /&gt;
## (2d) Strings (like descriptions)&lt;br /&gt;
## [if anyone can think of more, let me know]&lt;br /&gt;
# Most (but not all) tokens are &amp;quot;unique&amp;quot; or otherwise &amp;quot;addressable&amp;quot; in that they can only occur once per object. (Anyone notice that the tokens have started to be specific in the test code &amp;amp; docs about whether they overwrite, add, etc. - this is one reason why - and yes, I've been slowly trying to make progress on this even in the 2007-2009 work) [The exception to this is [[#problem2|problem #2]])&lt;br /&gt;
&lt;br /&gt;
A few principles about l10n:&lt;br /&gt;
# We must not make producing a data set materially more complicated than it is today (no requirement to put %L10NNAME% type gunk into data)&lt;br /&gt;
# We should target an ability to tell us if l10n is complete for any given data set&lt;br /&gt;
&lt;br /&gt;
With that:&lt;br /&gt;
* Following from #1, almost everything we have in the data today is &amp;quot;addressable&amp;quot;. By that, I mean that the OUTPUTNAME for a Skill called &amp;quot;FooBar&amp;quot; can be uniquely called out. The name hierarchy is something like: SKILL//Foo//OUTPUTNAME (exceptions are problems #[[#problem1|1]],[[#problem2|2]] to be addressed later)&lt;br /&gt;
&lt;br /&gt;
Given that, we can actually set principle #1 to &amp;quot;The data remains unchanged&amp;quot; (again, except for [[#problem2|problem #2]]). The entire data set is produced (assume US English for a moment). We then have a unique file for l10n that has things like:&lt;br /&gt;
* SKILL:FooBar|Oobarf-ay&lt;br /&gt;
* SKILL:FooBar:OUTPUTNAME|ooBarOutF-ay&lt;br /&gt;
* etc.&lt;br /&gt;
&lt;br /&gt;
This (to the first order) covers 2a, 2d.&lt;br /&gt;
&lt;br /&gt;
For 2b items, we simply have to expand the list of items (SKILL, SPELL) that we are familiar with, so we get things like:&lt;br /&gt;
* SPELLSCHOOL:Divination|Ivinationd-ay&lt;br /&gt;
&lt;br /&gt;
2c is a bit more complicated, but I can't believe it's all that bad given it's a thing many applications already do (and it's a known thing)&lt;br /&gt;
&lt;br /&gt;
Each file could be named in such a way that it identifies it's l10n, e.g.:&lt;br /&gt;
* srd_de_ch.l10n&lt;br /&gt;
* ...and probably placed in a L10N subfolder of the initial dataset.&lt;br /&gt;
* (Note I'd recommend we be clear on where these go, AND ALSO require that NO PCC FILES (I'd recommend we say no PCC or LST, but the formal limit would be no PCC) are recognized if they are in the L10N folder... so that the initial directory parse [which is probably one of the slower parts of our boot process] can immediately ignore the l10n directory and not have to look through the file list looking for .PCC files... alternately, we have a l10n folder that is parallel to the data folder, but that then adds complication in needing new preferences to point at multiple l10n folders and requires more complicated structure within that l10n structure to identify WHICH files in that folder map to which datasets... because we can't simply say a given English word will always translate the same way - English is way too overloaded for that.)&lt;br /&gt;
&lt;br /&gt;
I would recommend we keep things in a small subset of files, and not try to do 1:1 for each data file (that would produce a lot of file sprawl) - but that's not my call.&lt;br /&gt;
&lt;br /&gt;
Addressing principle #2:&lt;br /&gt;
* Since we have a set of items we know would need to be covered (names, certain tokens), we should be able to load those into memory, and load the l10n file into memory and compare. This should be able to produce warnings of 2 kinds:&lt;br /&gt;
* (W1) Errors where the base data set contains things that are not translated&lt;br /&gt;
* (W2) Errors where the translation file attempts to translate things not in the base data set&lt;br /&gt;
* I can't imagine that utility is all that hard to write (just would need to make the list of todos)&lt;br /&gt;
&lt;br /&gt;
This brings us to problems #1 and #2:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;a id=&amp;quot;problem1&amp;quot;&amp;gt;Problem #1&amp;lt;/a&amp;gt;: Non-unique names&lt;br /&gt;
* We glossed over this in 6.x, but the truth is that Spell names are not unique. Some of the *RDs have duplicate names (not all, but I forget which). Same is true for languages.&lt;br /&gt;
* (1a) Spells can theoretically be differentiated by evaluating the &amp;quot;TYPE&amp;quot; token for Divine, Arcane, or Psionic (those are &amp;quot;magical&amp;quot; items in our code.&lt;br /&gt;
* (1b) Languages can theoretically be differentiated between &amp;quot;Spoken&amp;quot; and &amp;quot;Written&amp;quot; as those are &amp;quot;magical&amp;quot; types.&lt;br /&gt;
I believe both of those forms of magic are things on our backlog of FREQs to clean up... and the reason they are on the cleanup list really for L10N (as much as it is to just cleanup the overuse of TYPE)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;a id=&amp;quot;problem2&amp;quot;&amp;gt;Problem #2&amp;lt;/a&amp;gt;: Non-unique tokens&lt;br /&gt;
* There are only a few tokens that are not unique. DESC is one of them, if I recall correctly. The probably solution here is to simply give an identifier to each token. This might require a change to LST Something like:&lt;br /&gt;
* DESC*Overall:x&lt;br /&gt;
* DESC*Second:x&lt;br /&gt;
* (Note: I'm not sure this syntax works or is by any means &amp;quot;good&amp;quot;. DESC:OVERALL|x might be better as it avoids potential issues with using * as a reserved character - take this is a principle of what would have to happen to DESC token, not as a full-blown proposal)&lt;br /&gt;
&lt;br /&gt;
Note that this naming of each DESC item (And other reusable items), while it breaks the &amp;quot;can't change the data&amp;quot; principle actually helps as much as it hurts... it would give us the ability to do things like:&lt;br /&gt;
* DESC:.CLEARID.Overall&lt;br /&gt;
* or things similar to that, which is actually a neat benefit for the small overhead of pain it puts into datasets. (Which, by the way, could be converted to whatever we decide on anyway with our nifty converter, so this doesn't seem all that bad)&lt;br /&gt;
&lt;br /&gt;
So in my mind, the question really is: Is going slightly more than half way good enough? There are areas where we could do translation, and some areas where we need some pretty material core code changes to support it.&lt;br /&gt;
&lt;br /&gt;
== Translation files ==&lt;br /&gt;
&lt;br /&gt;
Hi Tom,&lt;br /&gt;
&lt;br /&gt;
Welcome BACK!!!&lt;br /&gt;
&lt;br /&gt;
I don't mind the solutions put forth. Unique Identifiers for DESC is no more absurd then the Unique&lt;br /&gt;
Identifiers we'll be needing to use more than one CHOOSER on a single line. Plus, the ability to&lt;br /&gt;
clear off a Section of DESC would be awesome.&lt;br /&gt;
&lt;br /&gt;
I'd vote for as complete a job as possible.&lt;br /&gt;
&lt;br /&gt;
Here is where I'm not understanding - where are we going to put the translation stuff?&lt;br /&gt;
&lt;br /&gt;
thpr wrote:&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Here is where I'm not understanding - where are we going to put the translation stuff?&lt;br /&gt;
&lt;br /&gt;
Idea #1 (bad idea IMHO) is to put it in a separate directory:&lt;br /&gt;
data/srd/...&lt;br /&gt;
l10n/srd/...&lt;br /&gt;
&lt;br /&gt;
The problem with that is that you get into synchronization issues... so any time files/directory names change in one place they have to change in another.  That's a contract on the data developer.  (It would also require multiple l10n directories, since we support multiple data directories, so it's a bunch of code)&lt;br /&gt;
&lt;br /&gt;
Idea #2: Implicit Subdirectories:&lt;br /&gt;
data/srd/*.lst&lt;br /&gt;
data/srd/l10n/*.l10n&lt;br /&gt;
&lt;br /&gt;
That ensures that the l10n directory is associated with the dataset.&lt;br /&gt;
&lt;br /&gt;
Idea #3: Explicit designation:&lt;br /&gt;
data/srd/srd.pcc contains LOCALIZATION:l10n/srd.l10n&lt;br /&gt;
then:&lt;br /&gt;
data/l10n/srd.l10n&lt;br /&gt;
&lt;br /&gt;
(would support more than one .l10n file)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--- In pcgen_international@yahoogroups.com, Martijn Verburg &amp;lt;martijnverburg@...&amp;gt; wrote:&lt;br /&gt;
&amp;gt; &amp;gt; (2) We should target an ability to tell us if l10n is complete for any&lt;br /&gt;
&amp;gt; &amp;gt; given data set&lt;br /&gt;
&amp;gt; &amp;gt;&lt;br /&gt;
&amp;gt; Not sure what you mean by this?&lt;br /&gt;
&lt;br /&gt;
If there is an object called &amp;quot;Dagger&amp;quot; we need to ensure the file contains:&lt;br /&gt;
EQUIPMENT:Dagger|Aggerd-ay&lt;br /&gt;
&lt;br /&gt;
If it contains:&lt;br /&gt;
EQUIPMENT:Dgager|Aggerd-ay&lt;br /&gt;
&lt;br /&gt;
That is also an error (just like the &amp;quot;unconstructed reference&amp;quot; items are errors.  By capturing both type 1 and type 2 error (things that aren't translated as well as things that shouldn't have been translated) we are capturing the vast majority of the simple problems.&lt;br /&gt;
&lt;br /&gt;
=== Also need translation ===&lt;br /&gt;
&lt;br /&gt;
Page number: either the original book is referenced, but it doesn’t help people that have the translation where the page is not the same, or the translated book is referenced and that number need to be localized.&lt;br /&gt;
Usually data sets represents individual books, but there is sometimes compilation done of those. That means that several dataset would represent a single one. I know the French editor of Pathfinder does this. No idea what the content is and how it is organized, but it might work by changing the description to include something like chapter X of book Z in the description.&lt;br /&gt;
&lt;br /&gt;
The data sets points to the English books. Should the translation points to the localized one, if it exists?&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Localization]]&lt;/div&gt;</summary>
		<author><name>Masaru20100</name></author>
		
	</entry>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Internationalization&amp;diff=3150</id>
		<title>Internationalization</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Internationalization&amp;diff=3150"/>
		<updated>2012-09-15T11:15:24Z</updated>

		<summary type="html">&lt;p&gt;Masaru20100: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
&lt;br /&gt;
PCGen for 6.0+ releases will be attempting Internationalization (probably not in 6.0). Internalization is the process of changing software to allow it to be usable in any language and any locale. It is often abbreviated i18n. It is needed in PCGen because the software was not thought from the ground up to be usable from a language other than English. Localization is the process of creating the translations for a particular language, to do so the software need to able to handle internationalization. To deal with those, a Yahoo group called [http://groups.yahoo.com/group/pcgen_international pcgen_international] has been created.&lt;br /&gt;
&lt;br /&gt;
Requests for translations, problems with translations, and drafts of translated data sets or other translated content, as well as anything coming up with the Internationalization of PCGen are to be discussed in that group.&lt;br /&gt;
&lt;br /&gt;
Anybody interested to help out with translations to other languages, but also those who are just interested in the discussion of the matter, please join the group. Those interested in joining our efforts on the Internationalization of PCGen, please make yourself known on that list.&lt;br /&gt;
&lt;br /&gt;
This page is an attempt to regroup the information discussed on the list.&lt;br /&gt;
&lt;br /&gt;
There is a JIRA issue to regroup work on i18n: http://jira.pcgen.org/browse/CODE-733&lt;br /&gt;
&lt;br /&gt;
=Goal=&lt;br /&gt;
&lt;br /&gt;
The goal is to allow a user that doesn’t speak English to use the program in his native language with the specifics of his locale. This is an ideal goal, as it is not possible to provide all possible localizations with the low number of volunteers. What is needed is to provide the means for people to create localizations, in order to be able to do that, PCGen must be fully internationalized. Once this is done, the number of localization will slowly grow.&lt;br /&gt;
&lt;br /&gt;
PCGen interface, especially the part that are data set independent, are already internationalized and partially translated. Updating those translations is one of the needed step but not the only one.&lt;br /&gt;
Another element is already internationalized, it’s the use of imperial or metric distance. There is also an option to change it.&lt;br /&gt;
&lt;br /&gt;
Other steps are need to attain internationalization.&lt;br /&gt;
&lt;br /&gt;
* First the '''installation process''' should be detailed in many languages, even if it’s only expanding a compressed file then using a script to launch the program.&lt;br /&gt;
* All program '''UI strings''' should also be translatable, and so are the '''data strings'''. It seems that the non data strings are already translatable.&lt;br /&gt;
* The skills should be '''sorted''' in the UI and in the output sheet according to the natural sorting of the language.&lt;br /&gt;
* The '''output sheets''' should be in the user’s language too.&lt;br /&gt;
* In case the user create it’s own translation, it should be possible to add the language in the option pane without having to compile the program (or worse have to change some code!). From a technical point of view, it also means that the translations should be external to the jar, or that a simple way to add a translation provided.&lt;br /&gt;
&lt;br /&gt;
* Saved characters are usually reusable with a new version of the program, and the il8n should not change that. (technical: the saved elements should stay the same, should probably be keys of some sort — I have no idea what the pcg files are)&lt;br /&gt;
&lt;br /&gt;
* It would be better for the '''measure and weights system''' to be initially set to a logical value rather than a set one, it would depend on the first chosen locale. It is also needed to verify that the imperial and metric system option are actually working.&lt;br /&gt;
&lt;br /&gt;
There is also other elements that would improve usability for the user, mainly that '''help/documentation''' would be available in his language. This is usually big work to be achieve but doesn’t need any change in PCGen.&lt;br /&gt;
Another linked part is to be able to handle '''bug report''' in another language. To do that, the project need some people that would translate the bug reports to English before the development team is able to handle the bug reports. &lt;br /&gt;
&lt;br /&gt;
= Tools for internationalization and localization =&lt;br /&gt;
&lt;br /&gt;
To facilitate the internationalization and localization, some tools would be welcome. This tools are not necessary for the user, but are a great addition to maintainers.&lt;br /&gt;
&lt;br /&gt;
For internationalization:&lt;br /&gt;
* a way to determine which strings are translatable or not. Some IDE and some code quality library provide this kind of tool.&lt;br /&gt;
* a tool to eliminate (or point at) line that are not used any more in the main bundle file (it is quite big and there seems to bit not displayed text)&lt;br /&gt;
&lt;br /&gt;
For localization,&lt;br /&gt;
* If a specific way of storing the data translation is used, a tool to produce and update a more standard file would be needed. In free project, gettext files (POT, PO) are often used. In Java, ResourceBundle are often used. Another standard format is XLIFF. Such a tool would be able to add new needed translation to a file of the standard format, and flag old translations. From the standard format, it would update the translation of the specific format file. This is needed because there is tool to ease and speed up translation, like Virtaal, ResourceBundle editors, or poedit, and they need a standard file format to be usable.  &lt;br /&gt;
* a tool test to see if some entries are not translated (maybe a page that would provide statistics) it might be more useful if UI and data separated&lt;br /&gt;
* keeping glossary for each languages could help (some terms are found at many places)&lt;br /&gt;
* A way to detect incorrect token translation (like using Dager instead of Dagger) is welcome. One way to do this is by generating error or warning when loading the translation file. It would be welcome to generate this list of error without having to launch PCGen, it would also be a nice addition to automatic testing.&lt;br /&gt;
&lt;br /&gt;
=Choices yet to be made=&lt;br /&gt;
&lt;br /&gt;
== Application Packaging ==&lt;br /&gt;
&lt;br /&gt;
As of December 2011, the application and translation of some part of the UI are bundled together.&lt;br /&gt;
&lt;br /&gt;
The question is should the application be bundled this way, or should there be language specific bundles.&lt;br /&gt;
&lt;br /&gt;
Pro of a all-in-one&lt;br /&gt;
* user can change language on the fly&lt;br /&gt;
* no need for explanations on how to install a new language set&lt;br /&gt;
&lt;br /&gt;
Cons&lt;br /&gt;
* file could get quite big&lt;br /&gt;
&lt;br /&gt;
== Genre class names ==&lt;br /&gt;
&lt;br /&gt;
In some languages, the class names can have a genre, like the feminine of priest is priestess in English (even if Cleric is the name of the class, it’s just to illustrate the point). Do we want to use those names in the class names or do we stick to whatever name the class is?&lt;br /&gt;
&lt;br /&gt;
= The goals in more details for PCGen =&lt;br /&gt;
&lt;br /&gt;
== Default language after clean install ==&lt;br /&gt;
&lt;br /&gt;
The language should be the system one. To the user, if doesn’t understand the default language, it will be a pain for him to find the option to change the language.&lt;br /&gt;
It may be even better if the user is prompted with a choice at the start of the program (or at install) in order to simplify this process. It might be displayed only if the system language doesn’t exist in PCGen.&lt;br /&gt;
As noted before, the measure and weight system used need to be chosen by the user at the first install with the default choice depending on the language/locale selected. After first launch or install, the option is changeable in the option preference panel.&lt;br /&gt;
&lt;br /&gt;
After clean install (no preference files):&lt;br /&gt;
# PCGen determine the system language&lt;br /&gt;
# if translation exist (and are believed good enough) switch to that language, if not, display an element to ask the user for the language to use.&lt;br /&gt;
&lt;br /&gt;
== Published language priority ==&lt;br /&gt;
&lt;br /&gt;
* The data that is not translated in a language, for example books not yet translated, should stay in the language it first get out.&lt;br /&gt;
&lt;br /&gt;
Books are almost never instantly translated by companies and some aren’t even translated. PCGen is also short on staff. All that means that the translations will probably be coming far after the original one.&lt;br /&gt;
To an user that only use translated material, it will not be a problem.&lt;br /&gt;
To an user that mix translated material, and not translated one, it shouldn’t become a problem.&lt;br /&gt;
&lt;br /&gt;
== Using different data languages ==&lt;br /&gt;
&lt;br /&gt;
* The data should be the same that the English one to avoid having to duplicate data correction.&lt;br /&gt;
&lt;br /&gt;
Having data in several languages could be a way to do il8n&lt;br /&gt;
&lt;br /&gt;
Cons&lt;br /&gt;
* might need language specific bundles&lt;br /&gt;
* a character used with one language cannot be seen by someone with a different language set&lt;br /&gt;
* multiple corrections needed when correcting a bug (and if automatic generation of the translation is done, why not do it on the fly)&lt;br /&gt;
&lt;br /&gt;
It probably should be avoided to do it that way.&lt;br /&gt;
&lt;br /&gt;
== Separating data and UI translations ==&lt;br /&gt;
&lt;br /&gt;
* The interface language and the data language should be separate to allow people with book in a different language than their own to use the program more simply.&lt;br /&gt;
To the user that speak only one language, it is no advantage nor a problem.&lt;br /&gt;
For a user which use book that are not in the language he is most comfortable with, he would put the UI and the data to different languages. Same for someone who doesn’t use translation of the data but prefer to have a program in a language he is more comfortable with.&lt;br /&gt;
&lt;br /&gt;
== Custom content and localization ==&lt;br /&gt;
&lt;br /&gt;
* It should be possible to use another language in a data to allow non English speaker to develop custom content in another language. That seem to be a problem when combined with separate language from data. A way to avoid it is to provide easy reference to create custom content.&lt;br /&gt;
&lt;br /&gt;
This might be a hard to make real combined with other points.&lt;br /&gt;
&lt;br /&gt;
(might be wrong on this point [[User:Masaru20100|Masaru20100]]) At the moment, when creating custom content, the English token are used. For a non English-speaker, it is a problem, that’s why, ideally, he should be able to create custom by using his own language.&lt;br /&gt;
&lt;br /&gt;
The problem this cause is that if the user change the language of the program, the custom content either doesn’t work anymore, or all possible translations are checked which would cause massive slowness in the software.&lt;br /&gt;
&lt;br /&gt;
As it seams undoable, the user should be provided with way to easily find the needed English token for his custom content.&lt;br /&gt;
&lt;br /&gt;
== Indicating what is translated ==&lt;br /&gt;
&lt;br /&gt;
It would be good to provide the user with visual information of how much a dataset is translated in his language. It is not really a needed feature but could help him. If he knew that all is not translated, he would be less surprised.&lt;br /&gt;
&lt;br /&gt;
=Technical Aspects=&lt;br /&gt;
&lt;br /&gt;
== Language choice UI ==&lt;br /&gt;
&lt;br /&gt;
There is already options to change the language and the weights and measure system used.&lt;br /&gt;
&lt;br /&gt;
It might be best to have a drop down list rather than radio choices. New translation should appear in the list.&lt;br /&gt;
&lt;br /&gt;
== Formatting Issue ==&lt;br /&gt;
&lt;br /&gt;
Martijn pointed that number should be translatable. In Japanese, the classic number system is almost always used especially in RPG. In fact, translating numbers is not needed, what is needed is formatting numbers.&lt;br /&gt;
&lt;br /&gt;
That means that 10000 gets formatted 10,000 in English, 10 000 in French. In Japanese, it would either be 10,000 or 1万. There is even a locale to obtain 一万 if needed.&lt;br /&gt;
&lt;br /&gt;
In Java, this is usually done by using the NumberFormat class with the appropriate locale.&lt;br /&gt;
&lt;br /&gt;
== Sorting Issue ==&lt;br /&gt;
&lt;br /&gt;
Sorting is usually language dependent, meaning that the list of skills for example is not sorted the same way in different languages, even if the name are the same. The differences are usually minor between roman letter using languages.&lt;br /&gt;
&lt;br /&gt;
Actually, the international guys brought up the sorting thing again - another project would be to look into the GUI/core and replacing all the sorting of items with internationalized methods of sorting (Collators).&lt;br /&gt;
&lt;br /&gt;
Technically, Java already provide ways of sorting based on locale, it’s the Collator classes.&lt;br /&gt;
&lt;br /&gt;
== Unique Identifier ==&lt;br /&gt;
&lt;br /&gt;
Apparently there is already unique identifiers in use for items, so the idea would be to have a file with that id as the key and the translation as the value.&lt;br /&gt;
&lt;br /&gt;
== Output Sheet and Data Language ==&lt;br /&gt;
&lt;br /&gt;
The question is: should output sheets be locale dependent?&lt;br /&gt;
If it is, when a sheet is corrected for one locale, it will need to be edited in all languages. Having languages taken into account in the same sheet make it more complicated.&lt;br /&gt;
&lt;br /&gt;
=== Gender, race and level example ===&lt;br /&gt;
&lt;br /&gt;
There is also other problem as illustrated by the gender, race and level.&lt;br /&gt;
&lt;br /&gt;
In English, the gender propose Male, Female, Neuter, Unknown.&lt;br /&gt;
In a English statblock, it is usually a line like: Gender Race Level N, as “Female drow cleric 3” for a drow noble [http://www.d20pfsrd.com/bestiary/monster-listings/humanoids/drow-common/drow-noble]. As of this writing, the software output “Female Drow Noble Cleric3”, or “Female Drow Noble Cleric 3” instead in most statblock sheets.&lt;br /&gt;
The Unknown gender, and maybe the neuter one too, should probably not output as is in statblock sheets, while not &lt;br /&gt;
On my system, with the preferences to use the system language, the female translation is used instead.&lt;br /&gt;
&lt;br /&gt;
In French, it is Mâle, Femelle, Neuter, Inconnu. The same noble drow is “Drow, prêtre 3” (prêtre is the translation of cleric) [http://www.pathfinder-fr.org/Wiki/Pathfinder-RPG.Drow%20noble.ashx]. I remember reading “Drow (f), prêtre 3”, where the sex is included by using a single letter in parenthesis. It could also have been “Drow, guerrière 3”, where guerrière is the feminine of fighter.&lt;br /&gt;
As you can remark, the order is different.&lt;br /&gt;
&lt;br /&gt;
In Japanese, it looks like “ドラウ（女性）の貴族の3レベル・クレリック” [http://www29.atwiki.jp/prdj/pages/306.html#drow]. ドラウ is drow, 女性 means woman, の is the possessive, 貴族 is noble, レベル is level, クレリック is cleric. That would look like drow(female)’s noble’s 3rd level cleric. When the gender is unknown, it is not mentioned, goblin is such an example [http://www29.atwiki.jp/prdj/pages/244.html#goblin].&lt;br /&gt;
&lt;br /&gt;
In Italian, it seems to be “Drow nobile femmina Chierico 3”, ie Drow noble female Cleric 3. [http://prd.5clone.com/mostri/1982-drow]&lt;br /&gt;
&lt;br /&gt;
I think that in German, Female used as the choice and female as in female something is not written the same.&lt;br /&gt;
&lt;br /&gt;
Note that my examples uses Pathfinder because I do not know of translations of the SRD/RSRD online.&lt;br /&gt;
&lt;br /&gt;
This is only the first element of the stat block, and it seems already complicated. And there was no example of right-to-left languages, like Arabic or Hebrew. One thing seems common is that the gender value used on display, on the one used in stat blocks are different, whatever the language, and it is the same for race. For a standard character sheet, it seems that the UI value can be reused as is. In the case of gender, there is already two (three?) token, GENDER.SHORT and GENDER.LONG (and GENDER?). GENDER.SHORT, which has the same value as GENDER.LONG, could be changed to be the output value. A new value could be introduced, maybe something like GENDER.STATBLOCK.&lt;br /&gt;
That still doesn’t handle the problem of the order of gender/race/class levels.&lt;br /&gt;
&lt;br /&gt;
=== Data translation and output sheet values locale ===&lt;br /&gt;
&lt;br /&gt;
The issue is of what language to use when outputting the gender or other localized fields. At the moment, the data is in English, but there is a mix of English and whatever language the UI is defined to use. My primary example is Gender.&lt;br /&gt;
Once a data language is introduced, it might make sense to use this language in the output sheets rather than the UI one (if they differ).&lt;br /&gt;
&lt;br /&gt;
== Tom’s technical proposal ==&lt;br /&gt;
&lt;br /&gt;
So looking back at the earlier thread, I never actually came back with my suggestion, so here is my perspective on localization and how it should be done. This has been made easier by some changes we have in the 6.x line, and having new UI (with what I believe to be a lot more isolation of code that does display of items) is a huge boost here to making this practical.&lt;br /&gt;
&lt;br /&gt;
First a few base facts as background:&lt;br /&gt;
# For [almost] every item (Class, Skill, etc.) there is a unique identifier (generally referred to as a Key - note that if the &amp;quot;KEY&amp;quot; token is not used, then the Key is the name (first entry on the line in the data) (There is an exception to this we'll call [[#problem1|problem #1]])&lt;br /&gt;
# There are basically 4 types of things that need translation:&lt;br /&gt;
## (2a) item names&lt;br /&gt;
## (2b) constants (like spell schools)&lt;br /&gt;
## (2c) variables (like meters/feet/etc.)&lt;br /&gt;
## (2d) Strings (like descriptions)&lt;br /&gt;
## [if anyone can think of more, let me know]&lt;br /&gt;
# Most (but not all) tokens are &amp;quot;unique&amp;quot; or otherwise &amp;quot;addressable&amp;quot; in that they can only occur once per object. (Anyone notice that the tokens have started to be specific in the test code &amp;amp; docs about whether they overwrite, add, etc. - this is one reason why - and yes, I've been slowly trying to make progress on this even in the 2007-2009 work) [The exception to this is [[#problem2|problem #2]])&lt;br /&gt;
&lt;br /&gt;
A few principles about l10n:&lt;br /&gt;
# We must not make producing a data set materially more complicated than it is today (no requirement to put %L10NNAME% type gunk into data)&lt;br /&gt;
# We should target an ability to tell us if l10n is complete for any given data set&lt;br /&gt;
&lt;br /&gt;
With that:&lt;br /&gt;
* Following from #1, almost everything we have in the data today is &amp;quot;addressable&amp;quot;. By that, I mean that the OUTPUTNAME for a Skill called &amp;quot;FooBar&amp;quot; can be uniquely called out. The name hierarchy is something like: SKILL//Foo//OUTPUTNAME (exceptions are problems #[[#problem1|1]],[[#problem2|2]] to be addressed later)&lt;br /&gt;
&lt;br /&gt;
Given that, we can actually set principle #1 to &amp;quot;The data remains unchanged&amp;quot; (again, except for [[#problem2|problem #2]]). The entire data set is produced (assume US English for a moment). We then have a unique file for l10n that has things like:&lt;br /&gt;
* SKILL:FooBar|Oobarf-ay&lt;br /&gt;
* SKILL:FooBar:OUTPUTNAME|ooBarOutF-ay&lt;br /&gt;
* etc.&lt;br /&gt;
&lt;br /&gt;
This (to the first order) covers 2a, 2d.&lt;br /&gt;
&lt;br /&gt;
For 2b items, we simply have to expand the list of items (SKILL, SPELL) that we are familiar with, so we get things like:&lt;br /&gt;
* SPELLSCHOOL:Divination|Ivinationd-ay&lt;br /&gt;
&lt;br /&gt;
2c is a bit more complicated, but I can't believe it's all that bad given it's a thing many applications already do (and it's a known thing)&lt;br /&gt;
&lt;br /&gt;
Each file could be named in such a way that it identifies it's l10n, e.g.:&lt;br /&gt;
* srd_de_ch.l10n&lt;br /&gt;
* ...and probably placed in a L10N subfolder of the initial dataset.&lt;br /&gt;
* (Note I'd recommend we be clear on where these go, AND ALSO require that NO PCC FILES (I'd recommend we say no PCC or LST, but the formal limit would be no PCC) are recognized if they are in the L10N folder... so that the initial directory parse [which is probably one of the slower parts of our boot process] can immediately ignore the l10n directory and not have to look through the file list looking for .PCC files... alternately, we have a l10n folder that is parallel to the data folder, but that then adds complication in needing new preferences to point at multiple l10n folders and requires more complicated structure within that l10n structure to identify WHICH files in that folder map to which datasets... because we can't simply say a given English word will always translate the same way - English is way too overloaded for that.)&lt;br /&gt;
&lt;br /&gt;
I would recommend we keep things in a small subset of files, and not try to do 1:1 for each data file (that would produce a lot of file sprawl) - but that's not my call.&lt;br /&gt;
&lt;br /&gt;
Addressing principle #2:&lt;br /&gt;
* Since we have a set of items we know would need to be covered (names, certain tokens), we should be able to load those into memory, and load the l10n file into memory and compare. This should be able to produce warnings of 2 kinds:&lt;br /&gt;
* (W1) Errors where the base data set contains things that are not translated&lt;br /&gt;
* (W2) Errors where the translation file attempts to translate things not in the base data set&lt;br /&gt;
* I can't imagine that utility is all that hard to write (just would need to make the list of todos)&lt;br /&gt;
&lt;br /&gt;
This brings us to problems #1 and #2:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;a id=&amp;quot;problem1&amp;quot;&amp;gt;Problem #1&amp;lt;/a&amp;gt;: Non-unique names&lt;br /&gt;
* We glossed over this in 6.x, but the truth is that Spell names are not unique. Some of the *RDs have duplicate names (not all, but I forget which). Same is true for languages.&lt;br /&gt;
* (1a) Spells can theoretically be differentiated by evaluating the &amp;quot;TYPE&amp;quot; token for Divine, Arcane, or Psionic (those are &amp;quot;magical&amp;quot; items in our code.&lt;br /&gt;
* (1b) Languages can theoretically be differentiated between &amp;quot;Spoken&amp;quot; and &amp;quot;Written&amp;quot; as those are &amp;quot;magical&amp;quot; types.&lt;br /&gt;
I believe both of those forms of magic are things on our backlog of FREQs to clean up... and the reason they are on the cleanup list really for L10N (as much as it is to just cleanup the overuse of TYPE)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;a id=&amp;quot;problem2&amp;quot;&amp;gt;Problem #2&amp;lt;/a&amp;gt;: Non-unique tokens&lt;br /&gt;
* There are only a few tokens that are not unique. DESC is one of them, if I recall correctly. The probably solution here is to simply give an identifier to each token. This might require a change to LST Something like:&lt;br /&gt;
* DESC*Overall:x&lt;br /&gt;
* DESC*Second:x&lt;br /&gt;
* (Note: I'm not sure this syntax works or is by any means &amp;quot;good&amp;quot;. DESC:OVERALL|x might be better as it avoids potential issues with using * as a reserved character - take this is a principle of what would have to happen to DESC token, not as a full-blown proposal)&lt;br /&gt;
&lt;br /&gt;
Note that this naming of each DESC item (And other reusable items), while it breaks the &amp;quot;can't change the data&amp;quot; principle actually helps as much as it hurts... it would give us the ability to do things like:&lt;br /&gt;
* DESC:.CLEARID.Overall&lt;br /&gt;
* or things similar to that, which is actually a neat benefit for the small overhead of pain it puts into datasets. (Which, by the way, could be converted to whatever we decide on anyway with our nifty converter, so this doesn't seem all that bad)&lt;br /&gt;
&lt;br /&gt;
So in my mind, the question really is: Is going slightly more than half way good enough? There are areas where we could do translation, and some areas where we need some pretty material core code changes to support it.&lt;br /&gt;
&lt;br /&gt;
== Translation files ==&lt;br /&gt;
&lt;br /&gt;
Hi Tom,&lt;br /&gt;
&lt;br /&gt;
Welcome BACK!!!&lt;br /&gt;
&lt;br /&gt;
I don't mind the solutions put forth. Unique Identifiers for DESC is no more absurd then the Unique&lt;br /&gt;
Identifiers we'll be needing to use more than one CHOOSER on a single line. Plus, the ability to&lt;br /&gt;
clear off a Section of DESC would be awesome.&lt;br /&gt;
&lt;br /&gt;
I'd vote for as complete a job as possible.&lt;br /&gt;
&lt;br /&gt;
Here is where I'm not understanding - where are we going to put the translation stuff?&lt;br /&gt;
&lt;br /&gt;
thpr wrote:&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Here is where I'm not understanding - where are we going to put the translation stuff?&lt;br /&gt;
&lt;br /&gt;
Idea #1 (bad idea IMHO) is to put it in a separate directory:&lt;br /&gt;
data/srd/...&lt;br /&gt;
l10n/srd/...&lt;br /&gt;
&lt;br /&gt;
The problem with that is that you get into synchronization issues... so any time files/directory names change in one place they have to change in another.  That's a contract on the data developer.  (It would also require multiple l10n directories, since we support multiple data directories, so it's a bunch of code)&lt;br /&gt;
&lt;br /&gt;
Idea #2: Implicit Subdirectories:&lt;br /&gt;
data/srd/*.lst&lt;br /&gt;
data/srd/l10n/*.l10n&lt;br /&gt;
&lt;br /&gt;
That ensures that the l10n directory is associated with the dataset.&lt;br /&gt;
&lt;br /&gt;
Idea #3: Explicit designation:&lt;br /&gt;
data/srd/srd.pcc contains LOCALIZATION:l10n/srd.l10n&lt;br /&gt;
then:&lt;br /&gt;
data/l10n/srd.l10n&lt;br /&gt;
&lt;br /&gt;
(would support more than one .l10n file)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--- In pcgen_international@yahoogroups.com, Martijn Verburg &amp;lt;martijnverburg@...&amp;gt; wrote:&lt;br /&gt;
&amp;gt; &amp;gt; (2) We should target an ability to tell us if l10n is complete for any&lt;br /&gt;
&amp;gt; &amp;gt; given data set&lt;br /&gt;
&amp;gt; &amp;gt;&lt;br /&gt;
&amp;gt; Not sure what you mean by this?&lt;br /&gt;
&lt;br /&gt;
If there is an object called &amp;quot;Dagger&amp;quot; we need to ensure the file contains:&lt;br /&gt;
EQUIPMENT:Dagger|Aggerd-ay&lt;br /&gt;
&lt;br /&gt;
If it contains:&lt;br /&gt;
EQUIPMENT:Dgager|Aggerd-ay&lt;br /&gt;
&lt;br /&gt;
That is also an error (just like the &amp;quot;unconstructed reference&amp;quot; items are errors.  By capturing both type 1 and type 2 error (things that aren't translated as well as things that shouldn't have been translated) we are capturing the vast majority of the simple problems.&lt;br /&gt;
&lt;br /&gt;
=== Also need translation ===&lt;br /&gt;
&lt;br /&gt;
Page number: either the original book is referenced, but it doesn’t help people that have the translation where the page is not the same, or the translated book is referenced and that number need to be localized.&lt;br /&gt;
Usually data sets represents individual books, but there is sometimes compilation done of those. That means that several dataset would represent a single one. I know the French editor of Pathfinder does this. No idea what the content is and how it is organized, but it might work by changing the description to include something like chapter X of book Z in the description.&lt;br /&gt;
&lt;br /&gt;
The data sets points to the English books. Should the translation points to the localized one, if it exists?&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Localization]]&lt;/div&gt;</summary>
		<author><name>Masaru20100</name></author>
		
	</entry>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Internationalization&amp;diff=3149</id>
		<title>Internationalization</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Internationalization&amp;diff=3149"/>
		<updated>2012-09-15T11:00:02Z</updated>

		<summary type="html">&lt;p&gt;Masaru20100: /* Tom’s technical proposal */ added link/anchors&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
&lt;br /&gt;
PCGen for 6.0+ releases will be attempting Internationalization (probably not in 6.0). Internalization is the process of changing software to allow it to be usable in any language and any locale. It is often abbreviated i18n. It is needed in PCGen because the software was not thought from the ground up to be usable from a language other than English. Localization is the process of creating the translations for a particular language, to do so the software need to able to handle internationalization. To deal with those, a Yahoo group called [http://groups.yahoo.com/group/pcgen_international pcgen_international] has been created.&lt;br /&gt;
&lt;br /&gt;
Requests for translations, problems with translations, and drafts of translated data sets or other translated content, as well as anything coming up with the Internationalization of PCGen are to be discussed in that group.&lt;br /&gt;
&lt;br /&gt;
Anybody interested to help out with translations to other languages, but also those who are just interested in the discussion of the matter, please join the group. Those interested in joining our efforts on the Internationalization of PCGen, please make yourself known on that list.&lt;br /&gt;
&lt;br /&gt;
This page is an attempt to regroup the information discussed on the list.&lt;br /&gt;
&lt;br /&gt;
There is a JIRA issue to regroup work on i18n: http://jira.pcgen.org/browse/CODE-733&lt;br /&gt;
&lt;br /&gt;
=Goal=&lt;br /&gt;
&lt;br /&gt;
The goal is to allow a user that doesn’t speak English to use the program in his native language with the specifics of his locale. This is an ideal goal, as it is not possible to provide all possible localizations with the low number of volunteers. What is needed is to provide the means for people to create localizations, in order to be able to do that, PCGen must be fully internationalized. Once this is done, the number of localization will slowly grow.&lt;br /&gt;
&lt;br /&gt;
PCGen interface, especially the part that are data set independent, are already internationalized and partially translated. Updating those translations is one of the needed step but not the only one.&lt;br /&gt;
Another element is already internationalized, it’s the use of imperial or metric distance. There is also an option to change it.&lt;br /&gt;
&lt;br /&gt;
Other steps are need to attain internationalization.&lt;br /&gt;
&lt;br /&gt;
* First the '''installation process''' should be detailed in many languages, even if it’s only expanding a compressed file then using a script to launch the program.&lt;br /&gt;
* All program '''UI strings''' should also be translatable, and so are the '''data strings'''. It seems that the non data strings are already translatable.&lt;br /&gt;
* The skills should be '''sorted''' in the UI and in the output sheet according to the natural sorting of the language.&lt;br /&gt;
* The '''output sheets''' should be in the user’s language too.&lt;br /&gt;
* In case the user create it’s own translation, it should be possible to add the language in the option pane without having to compile the program (or worse have to change some code!). From a technical point of view, it also means that the translations should be external to the jar, or that a simple way to add a translation provided.&lt;br /&gt;
&lt;br /&gt;
* Saved characters are usually reusable with a new version of the program, and the il8n should not change that. (technical: the saved elements should stay the same, should probably be keys of some sort — I have no idea what the pcg files are)&lt;br /&gt;
&lt;br /&gt;
* It would be better for the '''measure and weights system''' to be initially set to a logical value rather than a set one, it would depend on the first chosen locale. It is also needed to verify that the imperial and metric system option are actually working.&lt;br /&gt;
&lt;br /&gt;
There is also other elements that would improve usability for the user, mainly that '''help/documentation''' would be available in his language. This is usually big work to be achieve but doesn’t need any change in PCGen.&lt;br /&gt;
Another linked part is to be able to handle '''bug report''' in another language. To do that, the project need some people that would translate the bug reports to English before the development team is able to handle the bug reports. &lt;br /&gt;
&lt;br /&gt;
= Tools for internationalization and localization =&lt;br /&gt;
&lt;br /&gt;
To facilitate the internationalization and localization, some tools would be welcome. This tools are not necessary for the user, but are a great addition to maintainers.&lt;br /&gt;
&lt;br /&gt;
For internationalization:&lt;br /&gt;
* a way to determine which strings are translatable or not. Some IDE and some code quality library provide this kind of tool.&lt;br /&gt;
* a tool to eliminate (or point at) line that are not used any more in the main bundle file (it is quite big and there seems to bit not displayed text)&lt;br /&gt;
&lt;br /&gt;
For localization,&lt;br /&gt;
* If a specific way of storing the data translation is used, a tool to produce and update a more standard file would be needed. In free project, gettext files (POT, PO) are often used. In Java, ResourceBundle are often used. Another standard format is XLIFF. Such a tool would be able to add new needed translation to a file of the standard format, and flag old translations. From the standard format, it would update the translation of the specific format file. This is needed because there is tool to ease and speed up translation, like Virtaal, ResourceBundle editors, or poedit, and they need a standard file format to be usable.  &lt;br /&gt;
* a tool test to see if some entries are not translated (maybe a page that would provide statistics) it might be more useful if UI and data separated&lt;br /&gt;
* keeping glossary for each languages could help (some terms are found at many places)&lt;br /&gt;
* A way to detect incorrect token translation (like using Dager instead of Dagger) is welcome. One way to do this is by generating error or warning when loading the translation file. It would be welcome to generate this list of error without having to launch PCGen, it would also be a nice addition to automatic testing.&lt;br /&gt;
&lt;br /&gt;
=Choices yet to be made=&lt;br /&gt;
&lt;br /&gt;
== Application Packaging ==&lt;br /&gt;
&lt;br /&gt;
As of December 2011, the application and translation of some part of the UI are bundled together.&lt;br /&gt;
&lt;br /&gt;
The question is should the application be bundled this way, or should there be language specific bundles.&lt;br /&gt;
&lt;br /&gt;
Pro of a all-in-one&lt;br /&gt;
* user can change language on the fly&lt;br /&gt;
* no need for explanations on how to install a new language set&lt;br /&gt;
&lt;br /&gt;
Cons&lt;br /&gt;
* file could get quite big&lt;br /&gt;
&lt;br /&gt;
== Genre class names ==&lt;br /&gt;
&lt;br /&gt;
In some languages, the class names can have a genre, like the feminine of priest is priestess in English (even if Cleric is the name of the class, it’s just to illustrate the point). Do we want to use those names in the class names or do we stick to whatever name the class is?&lt;br /&gt;
&lt;br /&gt;
= The goals in more details for PCGen =&lt;br /&gt;
&lt;br /&gt;
== Default language after clean install ==&lt;br /&gt;
&lt;br /&gt;
The language should be the system one. To the user, if doesn’t understand the default language, it will be a pain for him to find the option to change the language.&lt;br /&gt;
It may be even better if the user is prompted with a choice at the start of the program (or at install) in order to simplify this process. It might be displayed only if the system language doesn’t exist in PCGen.&lt;br /&gt;
As noted before, the measure and weight system used need to be chosen by the user at the first install with the default choice depending on the language/locale selected. After first launch or install, the option is changeable in the option preference panel.&lt;br /&gt;
&lt;br /&gt;
After clean install (no preference files):&lt;br /&gt;
# PCGen determine the system language&lt;br /&gt;
# if translation exist (and are believed good enough) switch to that language, if not, display an element to ask the user for the language to use.&lt;br /&gt;
&lt;br /&gt;
== Published language priority ==&lt;br /&gt;
&lt;br /&gt;
* The data that is not translated in a language, for example books not yet translated, should stay in the language it first get out.&lt;br /&gt;
&lt;br /&gt;
Books are almost never instantly translated by companies and some aren’t even translated. PCGen is also short on staff. All that means that the translations will probably be coming far after the original one.&lt;br /&gt;
To an user that only use translated material, it will not be a problem.&lt;br /&gt;
To an user that mix translated material, and not translated one, it shouldn’t become a problem.&lt;br /&gt;
&lt;br /&gt;
== Using different data languages ==&lt;br /&gt;
&lt;br /&gt;
* The data should be the same that the English one to avoid having to duplicate data correction.&lt;br /&gt;
&lt;br /&gt;
Having data in several languages could be a way to do il8n&lt;br /&gt;
&lt;br /&gt;
Cons&lt;br /&gt;
* might need language specific bundles&lt;br /&gt;
* a character used with one language cannot be seen by someone with a different language set&lt;br /&gt;
* multiple corrections needed when correcting a bug (and if automatic generation of the translation is done, why not do it on the fly)&lt;br /&gt;
&lt;br /&gt;
It probably should be avoided to do it that way.&lt;br /&gt;
&lt;br /&gt;
== Separating data and UI translations ==&lt;br /&gt;
&lt;br /&gt;
* The interface language and the data language should be separate to allow people with book in a different language than their own to use the program more simply.&lt;br /&gt;
To the user that speak only one language, it is no advantage nor a problem.&lt;br /&gt;
For a user which use book that are not in the language he is most comfortable with, he would put the UI and the data to different languages. Same for someone who doesn’t use translation of the data but prefer to have a program in a language he is more comfortable with.&lt;br /&gt;
&lt;br /&gt;
== Custom content and localization ==&lt;br /&gt;
&lt;br /&gt;
* It should be possible to use another language in a data to allow non English speaker to develop custom content in another language. That seem to be a problem when combined with separate language from data. A way to avoid it is to provide easy reference to create custom content.&lt;br /&gt;
&lt;br /&gt;
This might be a hard to make real combined with other points.&lt;br /&gt;
&lt;br /&gt;
(might be wrong on this point [[User:Masaru20100|Masaru20100]]) At the moment, when creating custom content, the English token are used. For a non English-speaker, it is a problem, that’s why, ideally, he should be able to create custom by using his own language.&lt;br /&gt;
&lt;br /&gt;
The problem this cause is that if the user change the language of the program, the custom content either doesn’t work anymore, or all possible translations are checked which would cause massive slowness in the software.&lt;br /&gt;
&lt;br /&gt;
As it seams undoable, the user should be provided with way to easily find the needed English token for his custom content.&lt;br /&gt;
&lt;br /&gt;
== Indicating what is translated ==&lt;br /&gt;
&lt;br /&gt;
It would be good to provide the user with visual information of how much a dataset is translated in his language. It is not really a needed feature but could help him. If he knew that all is not translated, he would be less surprised.&lt;br /&gt;
&lt;br /&gt;
=Technical Aspects=&lt;br /&gt;
&lt;br /&gt;
== Language choice UI ==&lt;br /&gt;
&lt;br /&gt;
There is already options to change the language and the weights and measure system used.&lt;br /&gt;
&lt;br /&gt;
It might be best to have a drop down list rather than radio choices. New translation should appear in the list.&lt;br /&gt;
&lt;br /&gt;
== Formatting Issue ==&lt;br /&gt;
&lt;br /&gt;
Martijn pointed that number should be translatable. In Japanese, the classic number system is almost always used especially in RPG. In fact, translating numbers is not needed, what is needed is formatting numbers.&lt;br /&gt;
&lt;br /&gt;
That means that 10000 gets formatted 10,000 in English, 10 000 in French. In Japanese, it would either be 10,000 or 1万. There is even a locale to obtain 一万 if needed.&lt;br /&gt;
&lt;br /&gt;
In Java, this is usually done by using the NumberFormat class with the appropriate locale.&lt;br /&gt;
&lt;br /&gt;
== Sorting Issue ==&lt;br /&gt;
&lt;br /&gt;
Sorting is usually language dependent, meaning that the list of skills for example is not sorted the same way in different languages, even if the name are the same. The differences are usually minor between roman letter using languages.&lt;br /&gt;
&lt;br /&gt;
Actually, the international guys brought up the sorting thing again - another project would be to look into the GUI/core and replacing all the sorting of items with internationalized methods of sorting (Collators).&lt;br /&gt;
&lt;br /&gt;
Technically, Java already provide ways of sorting based on locale, it’s the Collator classes.&lt;br /&gt;
&lt;br /&gt;
== Unique Identifier ==&lt;br /&gt;
&lt;br /&gt;
Apparently there is already unique identifiers in use for items, so the idea would be to have a file with that id as the key and the translation as the value.&lt;br /&gt;
&lt;br /&gt;
== Output Sheet and Data Language ==&lt;br /&gt;
&lt;br /&gt;
The question is: should output sheets be locale dependent?&lt;br /&gt;
If it is, when a sheet is corrected for one locale, it will need to be edited in all languages. Having languages taken into account in the same sheet make it more complicated.&lt;br /&gt;
&lt;br /&gt;
=== Gender, race and level example ===&lt;br /&gt;
&lt;br /&gt;
There is also other problem as illustrated by the gender, race and level.&lt;br /&gt;
&lt;br /&gt;
In English, the gender propose Male, Female, Neuter, Unknown.&lt;br /&gt;
In a English statblock, it is usually a line like: Gender Race Level N, as “Female drow cleric 3” for a drow noble [http://www.d20pfsrd.com/bestiary/monster-listings/humanoids/drow-common/drow-noble]. As of this writing, the software output “Female Drow Noble Cleric3”, or “Female Drow Noble Cleric 3” instead in most statblock sheets.&lt;br /&gt;
The Unknown gender, and maybe the neuter one too, should probably not output as is in statblock sheets, while not &lt;br /&gt;
On my system, with the preferences to use the system language, the female translation is used instead.&lt;br /&gt;
&lt;br /&gt;
In French, it is Mâle, Femelle, Neuter, Inconnu. The same noble drow is “Drow, prêtre 3” (prêtre is the translation of cleric) [http://www.pathfinder-fr.org/Wiki/Pathfinder-RPG.Drow%20noble.ashx]. I remember reading “Drow (f), prêtre 3”, where the sex is included by using a single letter in parenthesis. It could also have been “Drow, guerrière 3”, where guerrière is the feminine of fighter.&lt;br /&gt;
As you can remark, the order is different.&lt;br /&gt;
&lt;br /&gt;
In Japanese, it looks like “ドラウ（女性）の貴族の3レベル・クレリック” [http://www29.atwiki.jp/prdj/pages/306.html#drow]. ドラウ is drow, 女性 means woman, の is the possessive, 貴族 is noble, レベル is level, クレリック is cleric. That would look like drow(female)’s noble’s 3rd level cleric. When the gender is unknown, it is not mentioned, goblin is such an example [http://www29.atwiki.jp/prdj/pages/244.html#goblin].&lt;br /&gt;
&lt;br /&gt;
In Italian, it seems to be “Drow nobile femmina Chierico 3”, ie Drow noble female Cleric 3. [http://prd.5clone.com/mostri/1982-drow]&lt;br /&gt;
&lt;br /&gt;
I think that in German, Female used as the choice and female as in female something is not written the same.&lt;br /&gt;
&lt;br /&gt;
Note that my examples uses Pathfinder because I do not know of translations of the SRD/RSRD online.&lt;br /&gt;
&lt;br /&gt;
This is only the first element of the stat block, and it seems already complicated. And there was no example of right-to-left languages, like Arabic or Hebrew. One thing seems common is that the gender value used on display, on the one used in stat blocks are different, whatever the language, and it is the same for race. For a standard character sheet, it seems that the UI value can be reused as is. In the case of gender, there is already two (three?) token, GENDER.SHORT and GENDER.LONG (and GENDER?). GENDER.SHORT, which has the same value as GENDER.LONG, could be changed to be the output value. A new value could be introduced, maybe something like GENDER.STATBLOCK.&lt;br /&gt;
That still doesn’t handle the problem of the order of gender/race/class levels.&lt;br /&gt;
&lt;br /&gt;
=== Data translation and output sheet values locale ===&lt;br /&gt;
&lt;br /&gt;
The issue is of what language to use when outputting the gender or other localized fields. At the moment, the data is in English, but there is a mix of English and whatever language the UI is defined to use. My primary example is Gender.&lt;br /&gt;
Once a data language is introduced, it might make sense to use this language in the output sheets rather than the UI one (if they differ).&lt;br /&gt;
&lt;br /&gt;
== Tom’s technical proposal ==&lt;br /&gt;
&lt;br /&gt;
So looking back at the earlier thread, I never actually came back with my suggestion, so here is my perspective on localization and how it should be done. This has been made easier by some changes we have in the 6.x line, and having new UI (with what I believe to be a lot more isolation of code that does display of items) is a huge boost here to making this practical.&lt;br /&gt;
&lt;br /&gt;
First a few base facts as background:&lt;br /&gt;
# For [almost] every item (Class, Skill, etc.) there is a unique identifier (generally referred to as a Key - note that if the &amp;quot;KEY&amp;quot; token is not used, then the Key is the name (first entry on the line in the data) (There is an exception to this we'll call [[#problem1|problem #1]])&lt;br /&gt;
# There are basically 4 types of things that need translation:&lt;br /&gt;
## (2a) item names&lt;br /&gt;
## (2b) constants (like spell schools)&lt;br /&gt;
## (2c) variables (like meters/feet/etc.)&lt;br /&gt;
## (2d) Strings (like descriptions)&lt;br /&gt;
## [if anyone can think of more, let me know]&lt;br /&gt;
# Most (but not all) tokens are &amp;quot;unique&amp;quot; or otherwise &amp;quot;addressable&amp;quot; in that they can only occur once per object. (Anyone notice that the tokens have started to be specific in the test code &amp;amp; docs about whether they overwrite, add, etc. - this is one reason why - and yes, I've been slowly trying to make progress on this even in the 2007-2009 work) [The exception to this is [[#problem2|problem #2]])&lt;br /&gt;
&lt;br /&gt;
A few principles about l10n:&lt;br /&gt;
# We must not make producing a data set materially more complicated than it is today (no requirement to put %L10NNAME% type gunk into data)&lt;br /&gt;
# We should target an ability to tell us if l10n is complete for any given data set&lt;br /&gt;
&lt;br /&gt;
With that:&lt;br /&gt;
* Following from #1, almost everything we have in the data today is &amp;quot;addressable&amp;quot;. By that, I mean that the OUTPUTNAME for a Skill called &amp;quot;FooBar&amp;quot; can be uniquely called out. The name hierarchy is something like: SKILL//Foo//OUTPUTNAME (exceptions are problems #[[#problem1|1]],[[#problem2|2]] to be addressed later)&lt;br /&gt;
&lt;br /&gt;
Given that, we can actually set principle #1 to &amp;quot;The data remains unchanged&amp;quot; (again, except for [[#problem2|problem #2]]). The entire data set is produced (assume US English for a moment). We then have a unique file for l10n that has things like:&lt;br /&gt;
* SKILL:FooBar|Oobarf-ay&lt;br /&gt;
* SKILL:FooBar:OUTPUTNAME|ooBarOutF-ay&lt;br /&gt;
* etc.&lt;br /&gt;
&lt;br /&gt;
This (to the first order) covers 2a, 2d.&lt;br /&gt;
&lt;br /&gt;
For 2b items, we simply have to expand the list of items (SKILL, SPELL) that we are familiar with, so we get things like:&lt;br /&gt;
* SPELLSCHOOL:Divination|Ivinationd-ay&lt;br /&gt;
&lt;br /&gt;
2c is a bit more complicated, but I can't believe it's all that bad given it's a thing many applications already do (and it's a known thing)&lt;br /&gt;
&lt;br /&gt;
Each file could be named in such a way that it identifies it's l10n, e.g.:&lt;br /&gt;
* srd_de_ch.l10n&lt;br /&gt;
* ...and probably placed in a L10N subfolder of the initial dataset.&lt;br /&gt;
* (Note I'd recommend we be clear on where these go, AND ALSO require that NO PCC FILES (I'd recommend we say no PCC or LST, but the formal limit would be no PCC) are recognized if they are in the L10N folder... so that the initial directory parse [which is probably one of the slower parts of our boot process] can immediately ignore the l10n directory and not have to look through the file list looking for .PCC files... alternately, we have a l10n folder that is parallel to the data folder, but that then adds complication in needing new preferences to point at multiple l10n folders and requires more complicated structure within that l10n structure to identify WHICH files in that folder map to which datasets... because we can't simply say a given English word will always translate the same way - English is way too overloaded for that.)&lt;br /&gt;
&lt;br /&gt;
I would recommend we keep things in a small subset of files, and not try to do 1:1 for each data file (that would produce a lot of file sprawl) - but that's not my call.&lt;br /&gt;
&lt;br /&gt;
Addressing principle #2:&lt;br /&gt;
* Since we have a set of items we know would need to be covered (names, certain tokens), we should be able to load those into memory, and load the l10n file into memory and compare. This should be able to produce warnings of 2 kinds:&lt;br /&gt;
* (W1) Errors where the base data set contains things that are not translated&lt;br /&gt;
* (W2) Errors where the translation file attempts to translate things not in the base data set&lt;br /&gt;
* I can't imagine that utility is all that hard to write (just would need to make the list of todos)&lt;br /&gt;
&lt;br /&gt;
This brings us to problems #1 and #2:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;a id=&amp;quot;problem1&amp;quot;&amp;gt;Problem #1&amp;lt;/a&amp;gt;: Non-unique names&lt;br /&gt;
* We glossed over this in 6.x, but the truth is that Spell names are not unique. Some of the *RDs have duplicate names (not all, but I forget which). Same is true for languages.&lt;br /&gt;
* (1a) Spells can theoretically be differentiated by evaluating the &amp;quot;TYPE&amp;quot; token for Divine, Arcane, or Psionic (those are &amp;quot;magical&amp;quot; items in our code.&lt;br /&gt;
* (1b) Languages can theoretically be differentiated between &amp;quot;Spoken&amp;quot; and &amp;quot;Written&amp;quot; as those are &amp;quot;magical&amp;quot; types.&lt;br /&gt;
I believe both of those forms of magic are things on our backlog of FREQs to clean up... and the reason they are on the cleanup list really for L10N (as much as it is to just cleanup the overuse of TYPE)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;a id=&amp;quot;problem2&amp;quot;&amp;gt;Problem #2&amp;lt;/a&amp;gt;: Non-unique tokens&lt;br /&gt;
* There are only a few tokens that are not unique. DESC is one of them, if I recall correctly. The probably solution here is to simply give an identifier to each token. This might require a change to LST Something like:&lt;br /&gt;
* DESC*Overall:x&lt;br /&gt;
* DESC*Second:x&lt;br /&gt;
* (Note: I'm not sure this syntax works or is by any means &amp;quot;good&amp;quot;. DESC:OVERALL|x might be better as it avoids potential issues with using * as a reserved character - take this is a principle of what would have to happen to DESC token, not as a full-blown proposal)&lt;br /&gt;
&lt;br /&gt;
Note that this naming of each DESC item (And other reusable items), while it breaks the &amp;quot;can't change the data&amp;quot; principle actually helps as much as it hurts... it would give us the ability to do things like:&lt;br /&gt;
* DESC:.CLEARID.Overall&lt;br /&gt;
* or things similar to that, which is actually a neat benefit for the small overhead of pain it puts into datasets. (Which, by the way, could be converted to whatever we decide on anyway with our nifty converter, so this doesn't seem all that bad)&lt;br /&gt;
&lt;br /&gt;
So in my mind, the question really is: Is going slightly more than half way good enough? There are areas where we could do translation, and some areas where we need some pretty material core code changes to support it.&lt;br /&gt;
&lt;br /&gt;
== Translation files ==&lt;br /&gt;
&lt;br /&gt;
Hi Tom,&lt;br /&gt;
&lt;br /&gt;
Welcome BACK!!!&lt;br /&gt;
&lt;br /&gt;
I don't mind the solutions put forth. Unique Identifiers for DESC is no more absurd then the Unique&lt;br /&gt;
Identifiers we'll be needing to use more than one CHOOSER on a single line. Plus, the ability to&lt;br /&gt;
clear off a Section of DESC would be awesome.&lt;br /&gt;
&lt;br /&gt;
I'd vote for as complete a job as possible.&lt;br /&gt;
&lt;br /&gt;
Here is where I'm not understanding - where are we going to put the translation stuff?&lt;br /&gt;
&lt;br /&gt;
thpr wrote:&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Here is where I'm not understanding - where are we going to put the translation stuff?&lt;br /&gt;
&lt;br /&gt;
Idea #1 (bad idea IMHO) is to put it in a separate directory:&lt;br /&gt;
data/srd/...&lt;br /&gt;
l10n/srd/...&lt;br /&gt;
&lt;br /&gt;
The problem with that is that you get into synchronization issues... so any time files/directory names change in one place they have to change in another.  That's a contract on the data developer.  (It would also require multiple l10n directories, since we support multiple data directories, so it's a bunch of code)&lt;br /&gt;
&lt;br /&gt;
Idea #2: Implicit Subdirectories:&lt;br /&gt;
data/srd/*.lst&lt;br /&gt;
data/srd/l10n/*.l10n&lt;br /&gt;
&lt;br /&gt;
That ensures that the l10n directory is associated with the dataset.&lt;br /&gt;
&lt;br /&gt;
Idea #3: Explicit designation:&lt;br /&gt;
data/srd/srd.pcc contains LOCALIZATION:l10n/srd.l10n&lt;br /&gt;
then:&lt;br /&gt;
data/l10n/srd.l10n&lt;br /&gt;
&lt;br /&gt;
(would support more than one .l10n file)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--- In pcgen_international@yahoogroups.com, Martijn Verburg &amp;lt;martijnverburg@...&amp;gt; wrote:&lt;br /&gt;
&amp;gt; &amp;gt; (2) We should target an ability to tell us if l10n is complete for any&lt;br /&gt;
&amp;gt; &amp;gt; given data set&lt;br /&gt;
&amp;gt; &amp;gt;&lt;br /&gt;
&amp;gt; Not sure what you mean by this?&lt;br /&gt;
&lt;br /&gt;
If there is an object called &amp;quot;Dagger&amp;quot; we need to ensure the file contains:&lt;br /&gt;
EQUIPMENT:Dagger|Aggerd-ay&lt;br /&gt;
&lt;br /&gt;
If it contains:&lt;br /&gt;
EQUIPMENT:Dgager|Aggerd-ay&lt;br /&gt;
&lt;br /&gt;
That is also an error (just like the &amp;quot;unconstructed reference&amp;quot; items are errors.  By capturing both type 1 and type 2 error (things that aren't translated as well as things that shouldn't have been translated) we are capturing the vast majority of the simple problems.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Localization]]&lt;/div&gt;</summary>
		<author><name>Masaru20100</name></author>
		
	</entry>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Internationalization&amp;diff=3148</id>
		<title>Internationalization</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Internationalization&amp;diff=3148"/>
		<updated>2012-09-15T10:45:44Z</updated>

		<summary type="html">&lt;p&gt;Masaru20100: /* Output Sheet and Data Language */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
&lt;br /&gt;
PCGen for 6.0+ releases will be attempting Internationalization (probably not in 6.0). Internalization is the process of changing software to allow it to be usable in any language and any locale. It is often abbreviated i18n. It is needed in PCGen because the software was not thought from the ground up to be usable from a language other than English. Localization is the process of creating the translations for a particular language, to do so the software need to able to handle internationalization. To deal with those, a Yahoo group called [http://groups.yahoo.com/group/pcgen_international pcgen_international] has been created.&lt;br /&gt;
&lt;br /&gt;
Requests for translations, problems with translations, and drafts of translated data sets or other translated content, as well as anything coming up with the Internationalization of PCGen are to be discussed in that group.&lt;br /&gt;
&lt;br /&gt;
Anybody interested to help out with translations to other languages, but also those who are just interested in the discussion of the matter, please join the group. Those interested in joining our efforts on the Internationalization of PCGen, please make yourself known on that list.&lt;br /&gt;
&lt;br /&gt;
This page is an attempt to regroup the information discussed on the list.&lt;br /&gt;
&lt;br /&gt;
There is a JIRA issue to regroup work on i18n: http://jira.pcgen.org/browse/CODE-733&lt;br /&gt;
&lt;br /&gt;
=Goal=&lt;br /&gt;
&lt;br /&gt;
The goal is to allow a user that doesn’t speak English to use the program in his native language with the specifics of his locale. This is an ideal goal, as it is not possible to provide all possible localizations with the low number of volunteers. What is needed is to provide the means for people to create localizations, in order to be able to do that, PCGen must be fully internationalized. Once this is done, the number of localization will slowly grow.&lt;br /&gt;
&lt;br /&gt;
PCGen interface, especially the part that are data set independent, are already internationalized and partially translated. Updating those translations is one of the needed step but not the only one.&lt;br /&gt;
Another element is already internationalized, it’s the use of imperial or metric distance. There is also an option to change it.&lt;br /&gt;
&lt;br /&gt;
Other steps are need to attain internationalization.&lt;br /&gt;
&lt;br /&gt;
* First the '''installation process''' should be detailed in many languages, even if it’s only expanding a compressed file then using a script to launch the program.&lt;br /&gt;
* All program '''UI strings''' should also be translatable, and so are the '''data strings'''. It seems that the non data strings are already translatable.&lt;br /&gt;
* The skills should be '''sorted''' in the UI and in the output sheet according to the natural sorting of the language.&lt;br /&gt;
* The '''output sheets''' should be in the user’s language too.&lt;br /&gt;
* In case the user create it’s own translation, it should be possible to add the language in the option pane without having to compile the program (or worse have to change some code!). From a technical point of view, it also means that the translations should be external to the jar, or that a simple way to add a translation provided.&lt;br /&gt;
&lt;br /&gt;
* Saved characters are usually reusable with a new version of the program, and the il8n should not change that. (technical: the saved elements should stay the same, should probably be keys of some sort — I have no idea what the pcg files are)&lt;br /&gt;
&lt;br /&gt;
* It would be better for the '''measure and weights system''' to be initially set to a logical value rather than a set one, it would depend on the first chosen locale. It is also needed to verify that the imperial and metric system option are actually working.&lt;br /&gt;
&lt;br /&gt;
There is also other elements that would improve usability for the user, mainly that '''help/documentation''' would be available in his language. This is usually big work to be achieve but doesn’t need any change in PCGen.&lt;br /&gt;
Another linked part is to be able to handle '''bug report''' in another language. To do that, the project need some people that would translate the bug reports to English before the development team is able to handle the bug reports. &lt;br /&gt;
&lt;br /&gt;
= Tools for internationalization and localization =&lt;br /&gt;
&lt;br /&gt;
To facilitate the internationalization and localization, some tools would be welcome. This tools are not necessary for the user, but are a great addition to maintainers.&lt;br /&gt;
&lt;br /&gt;
For internationalization:&lt;br /&gt;
* a way to determine which strings are translatable or not. Some IDE and some code quality library provide this kind of tool.&lt;br /&gt;
* a tool to eliminate (or point at) line that are not used any more in the main bundle file (it is quite big and there seems to bit not displayed text)&lt;br /&gt;
&lt;br /&gt;
For localization,&lt;br /&gt;
* If a specific way of storing the data translation is used, a tool to produce and update a more standard file would be needed. In free project, gettext files (POT, PO) are often used. In Java, ResourceBundle are often used. Another standard format is XLIFF. Such a tool would be able to add new needed translation to a file of the standard format, and flag old translations. From the standard format, it would update the translation of the specific format file. This is needed because there is tool to ease and speed up translation, like Virtaal, ResourceBundle editors, or poedit, and they need a standard file format to be usable.  &lt;br /&gt;
* a tool test to see if some entries are not translated (maybe a page that would provide statistics) it might be more useful if UI and data separated&lt;br /&gt;
* keeping glossary for each languages could help (some terms are found at many places)&lt;br /&gt;
* A way to detect incorrect token translation (like using Dager instead of Dagger) is welcome. One way to do this is by generating error or warning when loading the translation file. It would be welcome to generate this list of error without having to launch PCGen, it would also be a nice addition to automatic testing.&lt;br /&gt;
&lt;br /&gt;
=Choices yet to be made=&lt;br /&gt;
&lt;br /&gt;
== Application Packaging ==&lt;br /&gt;
&lt;br /&gt;
As of December 2011, the application and translation of some part of the UI are bundled together.&lt;br /&gt;
&lt;br /&gt;
The question is should the application be bundled this way, or should there be language specific bundles.&lt;br /&gt;
&lt;br /&gt;
Pro of a all-in-one&lt;br /&gt;
* user can change language on the fly&lt;br /&gt;
* no need for explanations on how to install a new language set&lt;br /&gt;
&lt;br /&gt;
Cons&lt;br /&gt;
* file could get quite big&lt;br /&gt;
&lt;br /&gt;
== Genre class names ==&lt;br /&gt;
&lt;br /&gt;
In some languages, the class names can have a genre, like the feminine of priest is priestess in English (even if Cleric is the name of the class, it’s just to illustrate the point). Do we want to use those names in the class names or do we stick to whatever name the class is?&lt;br /&gt;
&lt;br /&gt;
= The goals in more details for PCGen =&lt;br /&gt;
&lt;br /&gt;
== Default language after clean install ==&lt;br /&gt;
&lt;br /&gt;
The language should be the system one. To the user, if doesn’t understand the default language, it will be a pain for him to find the option to change the language.&lt;br /&gt;
It may be even better if the user is prompted with a choice at the start of the program (or at install) in order to simplify this process. It might be displayed only if the system language doesn’t exist in PCGen.&lt;br /&gt;
As noted before, the measure and weight system used need to be chosen by the user at the first install with the default choice depending on the language/locale selected. After first launch or install, the option is changeable in the option preference panel.&lt;br /&gt;
&lt;br /&gt;
After clean install (no preference files):&lt;br /&gt;
# PCGen determine the system language&lt;br /&gt;
# if translation exist (and are believed good enough) switch to that language, if not, display an element to ask the user for the language to use.&lt;br /&gt;
&lt;br /&gt;
== Published language priority ==&lt;br /&gt;
&lt;br /&gt;
* The data that is not translated in a language, for example books not yet translated, should stay in the language it first get out.&lt;br /&gt;
&lt;br /&gt;
Books are almost never instantly translated by companies and some aren’t even translated. PCGen is also short on staff. All that means that the translations will probably be coming far after the original one.&lt;br /&gt;
To an user that only use translated material, it will not be a problem.&lt;br /&gt;
To an user that mix translated material, and not translated one, it shouldn’t become a problem.&lt;br /&gt;
&lt;br /&gt;
== Using different data languages ==&lt;br /&gt;
&lt;br /&gt;
* The data should be the same that the English one to avoid having to duplicate data correction.&lt;br /&gt;
&lt;br /&gt;
Having data in several languages could be a way to do il8n&lt;br /&gt;
&lt;br /&gt;
Cons&lt;br /&gt;
* might need language specific bundles&lt;br /&gt;
* a character used with one language cannot be seen by someone with a different language set&lt;br /&gt;
* multiple corrections needed when correcting a bug (and if automatic generation of the translation is done, why not do it on the fly)&lt;br /&gt;
&lt;br /&gt;
It probably should be avoided to do it that way.&lt;br /&gt;
&lt;br /&gt;
== Separating data and UI translations ==&lt;br /&gt;
&lt;br /&gt;
* The interface language and the data language should be separate to allow people with book in a different language than their own to use the program more simply.&lt;br /&gt;
To the user that speak only one language, it is no advantage nor a problem.&lt;br /&gt;
For a user which use book that are not in the language he is most comfortable with, he would put the UI and the data to different languages. Same for someone who doesn’t use translation of the data but prefer to have a program in a language he is more comfortable with.&lt;br /&gt;
&lt;br /&gt;
== Custom content and localization ==&lt;br /&gt;
&lt;br /&gt;
* It should be possible to use another language in a data to allow non English speaker to develop custom content in another language. That seem to be a problem when combined with separate language from data. A way to avoid it is to provide easy reference to create custom content.&lt;br /&gt;
&lt;br /&gt;
This might be a hard to make real combined with other points.&lt;br /&gt;
&lt;br /&gt;
(might be wrong on this point [[User:Masaru20100|Masaru20100]]) At the moment, when creating custom content, the English token are used. For a non English-speaker, it is a problem, that’s why, ideally, he should be able to create custom by using his own language.&lt;br /&gt;
&lt;br /&gt;
The problem this cause is that if the user change the language of the program, the custom content either doesn’t work anymore, or all possible translations are checked which would cause massive slowness in the software.&lt;br /&gt;
&lt;br /&gt;
As it seams undoable, the user should be provided with way to easily find the needed English token for his custom content.&lt;br /&gt;
&lt;br /&gt;
== Indicating what is translated ==&lt;br /&gt;
&lt;br /&gt;
It would be good to provide the user with visual information of how much a dataset is translated in his language. It is not really a needed feature but could help him. If he knew that all is not translated, he would be less surprised.&lt;br /&gt;
&lt;br /&gt;
=Technical Aspects=&lt;br /&gt;
&lt;br /&gt;
== Language choice UI ==&lt;br /&gt;
&lt;br /&gt;
There is already options to change the language and the weights and measure system used.&lt;br /&gt;
&lt;br /&gt;
It might be best to have a drop down list rather than radio choices. New translation should appear in the list.&lt;br /&gt;
&lt;br /&gt;
== Formatting Issue ==&lt;br /&gt;
&lt;br /&gt;
Martijn pointed that number should be translatable. In Japanese, the classic number system is almost always used especially in RPG. In fact, translating numbers is not needed, what is needed is formatting numbers.&lt;br /&gt;
&lt;br /&gt;
That means that 10000 gets formatted 10,000 in English, 10 000 in French. In Japanese, it would either be 10,000 or 1万. There is even a locale to obtain 一万 if needed.&lt;br /&gt;
&lt;br /&gt;
In Java, this is usually done by using the NumberFormat class with the appropriate locale.&lt;br /&gt;
&lt;br /&gt;
== Sorting Issue ==&lt;br /&gt;
&lt;br /&gt;
Sorting is usually language dependent, meaning that the list of skills for example is not sorted the same way in different languages, even if the name are the same. The differences are usually minor between roman letter using languages.&lt;br /&gt;
&lt;br /&gt;
Actually, the international guys brought up the sorting thing again - another project would be to look into the GUI/core and replacing all the sorting of items with internationalized methods of sorting (Collators).&lt;br /&gt;
&lt;br /&gt;
Technically, Java already provide ways of sorting based on locale, it’s the Collator classes.&lt;br /&gt;
&lt;br /&gt;
== Unique Identifier ==&lt;br /&gt;
&lt;br /&gt;
Apparently there is already unique identifiers in use for items, so the idea would be to have a file with that id as the key and the translation as the value.&lt;br /&gt;
&lt;br /&gt;
== Output Sheet and Data Language ==&lt;br /&gt;
&lt;br /&gt;
The question is: should output sheets be locale dependent?&lt;br /&gt;
If it is, when a sheet is corrected for one locale, it will need to be edited in all languages. Having languages taken into account in the same sheet make it more complicated.&lt;br /&gt;
&lt;br /&gt;
=== Gender, race and level example ===&lt;br /&gt;
&lt;br /&gt;
There is also other problem as illustrated by the gender, race and level.&lt;br /&gt;
&lt;br /&gt;
In English, the gender propose Male, Female, Neuter, Unknown.&lt;br /&gt;
In a English statblock, it is usually a line like: Gender Race Level N, as “Female drow cleric 3” for a drow noble [http://www.d20pfsrd.com/bestiary/monster-listings/humanoids/drow-common/drow-noble]. As of this writing, the software output “Female Drow Noble Cleric3”, or “Female Drow Noble Cleric 3” instead in most statblock sheets.&lt;br /&gt;
The Unknown gender, and maybe the neuter one too, should probably not output as is in statblock sheets, while not &lt;br /&gt;
On my system, with the preferences to use the system language, the female translation is used instead.&lt;br /&gt;
&lt;br /&gt;
In French, it is Mâle, Femelle, Neuter, Inconnu. The same noble drow is “Drow, prêtre 3” (prêtre is the translation of cleric) [http://www.pathfinder-fr.org/Wiki/Pathfinder-RPG.Drow%20noble.ashx]. I remember reading “Drow (f), prêtre 3”, where the sex is included by using a single letter in parenthesis. It could also have been “Drow, guerrière 3”, where guerrière is the feminine of fighter.&lt;br /&gt;
As you can remark, the order is different.&lt;br /&gt;
&lt;br /&gt;
In Japanese, it looks like “ドラウ（女性）の貴族の3レベル・クレリック” [http://www29.atwiki.jp/prdj/pages/306.html#drow]. ドラウ is drow, 女性 means woman, の is the possessive, 貴族 is noble, レベル is level, クレリック is cleric. That would look like drow(female)’s noble’s 3rd level cleric. When the gender is unknown, it is not mentioned, goblin is such an example [http://www29.atwiki.jp/prdj/pages/244.html#goblin].&lt;br /&gt;
&lt;br /&gt;
In Italian, it seems to be “Drow nobile femmina Chierico 3”, ie Drow noble female Cleric 3. [http://prd.5clone.com/mostri/1982-drow]&lt;br /&gt;
&lt;br /&gt;
I think that in German, Female used as the choice and female as in female something is not written the same.&lt;br /&gt;
&lt;br /&gt;
Note that my examples uses Pathfinder because I do not know of translations of the SRD/RSRD online.&lt;br /&gt;
&lt;br /&gt;
This is only the first element of the stat block, and it seems already complicated. And there was no example of right-to-left languages, like Arabic or Hebrew. One thing seems common is that the gender value used on display, on the one used in stat blocks are different, whatever the language, and it is the same for race. For a standard character sheet, it seems that the UI value can be reused as is. In the case of gender, there is already two (three?) token, GENDER.SHORT and GENDER.LONG (and GENDER?). GENDER.SHORT, which has the same value as GENDER.LONG, could be changed to be the output value. A new value could be introduced, maybe something like GENDER.STATBLOCK.&lt;br /&gt;
That still doesn’t handle the problem of the order of gender/race/class levels.&lt;br /&gt;
&lt;br /&gt;
=== Data translation and output sheet values locale ===&lt;br /&gt;
&lt;br /&gt;
The issue is of what language to use when outputting the gender or other localized fields. At the moment, the data is in English, but there is a mix of English and whatever language the UI is defined to use. My primary example is Gender.&lt;br /&gt;
Once a data language is introduced, it might make sense to use this language in the output sheets rather than the UI one (if they differ).&lt;br /&gt;
&lt;br /&gt;
== Tom’s technical proposal ==&lt;br /&gt;
&lt;br /&gt;
So looking back at the earlier thread, I never actually came back with my suggestion, so here is my perspective on localization and how it should be done. This has been made easier by some changes we have in the 6.x line, and having new UI (with what I believe to be a lot more isolation of code that does display of items) is a huge boost here to making this practical.&lt;br /&gt;
&lt;br /&gt;
First a few base facts as background:&lt;br /&gt;
# For [almost] every item (Class, Skill, etc.) there is a unique identifier (generally referred to as a Key - note that if the &amp;quot;KEY&amp;quot; token is not used, then the Key is the name (first entry on the line in the data) (There is an exception to this we'll call problem #1)&lt;br /&gt;
# There are basically 4 types of things that need translation:&lt;br /&gt;
## (2a) item names&lt;br /&gt;
## (2b) constants (like spell schools)&lt;br /&gt;
## (2c) variables (like meters/feet/etc.)&lt;br /&gt;
## (2d) Strings (like descriptions)&lt;br /&gt;
## [if anyone can think of more, let me know]&lt;br /&gt;
# Most (but not all) tokens are &amp;quot;unique&amp;quot; or otherwise &amp;quot;addressable&amp;quot; in that they can only occur once per object. (Anyone notice that the tokens have started to be specific in the test code &amp;amp; docs about whether they overwrite, add, etc. - this is one reason why - and yes, I've been slowly trying to make progress on this even in the 2007-2009 work) [The exception to this is problem #2)&lt;br /&gt;
&lt;br /&gt;
A few principles about l10n:&lt;br /&gt;
# We must not make producing a data set materially more complicated than it is today (no requirement to put %L10NNAME% type gunk into data)&lt;br /&gt;
# We should target an ability to tell us if l10n is complete for any given data set&lt;br /&gt;
&lt;br /&gt;
With that:&lt;br /&gt;
* Following from #1, almost everything we have in the data today is &amp;quot;addressable&amp;quot;. By that, I mean that the OUTPUTNAME for a Skill called &amp;quot;FooBar&amp;quot; can be uniquely called out. The name hierarchy is something like: SKILL//Foo//OUTPUTNAME (exceptions are problems #1,2 to be addressed later)&lt;br /&gt;
&lt;br /&gt;
Given that, we can actually set principle #1 to &amp;quot;The data remains unchanged&amp;quot; (again, except for problem #2). The entire data set is produced (assume US English for a moment). We then have a unique file for l10n that has things like:&lt;br /&gt;
* SKILL:FooBar|Oobarf-ay&lt;br /&gt;
* SKILL:FooBar:OUTPUTNAME|ooBarOutF-ay&lt;br /&gt;
* etc.&lt;br /&gt;
&lt;br /&gt;
This (to the first order) covers 2a, 2d.&lt;br /&gt;
&lt;br /&gt;
For 2b items, we simply have to expand the list of items (SKILL, SPELL) that we are familiar with, so we get things like:&lt;br /&gt;
* SPELLSCHOOL:Divination|Ivinationd-ay&lt;br /&gt;
&lt;br /&gt;
2c is a bit more complicated, but I can't believe it's all that bad given it's a thing many applications already do (and it's a known thing)&lt;br /&gt;
&lt;br /&gt;
Each file could be named in such a way that it identifies it's l10n, e.g.:&lt;br /&gt;
* srd_de_ch.l10n&lt;br /&gt;
* ...and probably placed in a L10N subfolder of the initial dataset.&lt;br /&gt;
* (Note I'd recommend we be clear on where these go, AND ALSO require that NO PCC FILES (I'd recommend we say no PCC or LST, but the formal limit would be no PCC) are recognized if they are in the L10N folder... so that the initial directory parse [which is probably one of the slower parts of our boot process] can immediately ignore the l10n directory and not have to look through the file list looking for .PCC files... alternately, we have a l10n folder that is parallel to the data folder, but that then adds complication in needing new preferences to point at multiple l10n folders and requires more complicated structure within that l10n structure to identify WHICH files in that folder map to which datasets... because we can't simply say a given English word will always translate the same way - English is way too overloaded for that.)&lt;br /&gt;
&lt;br /&gt;
I would recommend we keep things in a small subset of files, and not try to do 1:1 for each data file (that would produce a lot of file sprawl) - but that's not my call.&lt;br /&gt;
&lt;br /&gt;
Addressing principle #2:&lt;br /&gt;
* Since we have a set of items we know would need to be covered (names, certain tokens), we should be able to load those into memory, and load the l10n file into memory and compare. This should be able to produce warnings of 2 kinds:&lt;br /&gt;
* (W1) Errors where the base data set contains things that are not translated&lt;br /&gt;
* (W2) Errors where the translation file attempts to translate things not in the base data set&lt;br /&gt;
* I can't imagine that utility is all that hard to write (just would need to make the list of todos)&lt;br /&gt;
&lt;br /&gt;
This brings us to problems #1 and #2:&lt;br /&gt;
&lt;br /&gt;
Problem #1: Non-unique names&lt;br /&gt;
* We glossed over this in 6.x, but the truth is that Spell names are not unique. Some of the *RDs have duplicate names (not all, but I forget which). Same is true for languages.&lt;br /&gt;
* (1a) Spells can theoretically be differentiated by evaluating the &amp;quot;TYPE&amp;quot; token for Divine, Arcane, or Psionic (those are &amp;quot;magical&amp;quot; items in our code.&lt;br /&gt;
* (1b) Languages can theoretically be differentiated between &amp;quot;Spoken&amp;quot; and &amp;quot;Written&amp;quot; as those are &amp;quot;magical&amp;quot; types.&lt;br /&gt;
I believe both of those forms of magic are things on our backlog of FREQs to clean up... and the reason they are on the cleanup list really for L10N (as much as it is to just cleanup the overuse of TYPE)&lt;br /&gt;
&lt;br /&gt;
Problem #2: Non-unique tokens&lt;br /&gt;
* There are only a few tokens that are not unique. DESC is one of them, if I recall correctly. The probably solution here is to simply give an identifier to each token. This might require a change to LST Something like:&lt;br /&gt;
* DESC*Overall:x&lt;br /&gt;
* DESC*Second:x&lt;br /&gt;
* (Note: I'm not sure this syntax works or is by any means &amp;quot;good&amp;quot;. DESC:OVERALL|x might be better as it avoids potential issues with using * as a reserved character - take this is a principle of what would have to happen to DESC token, not as a full-blown proposal)&lt;br /&gt;
&lt;br /&gt;
Note that this naming of each DESC item (And other reusable items), while it breaks the &amp;quot;can't change the data&amp;quot; principle actually helps as much as it hurts... it would give us the ability to do things like:&lt;br /&gt;
* DESC:.CLEARID.Overall&lt;br /&gt;
* or things similar to that, which is actually a neat benefit for the small overhead of pain it puts into datasets. (Which, by the way, could be converted to whatever we decide on anyway with our nifty converter, so this doesn't seem all that bad)&lt;br /&gt;
&lt;br /&gt;
So in my mind, the question really is: Is going slightly more than half way good enough? There are areas where we could do translation, and some areas where we need some pretty material core code changes to support it.&lt;br /&gt;
&lt;br /&gt;
== Translation files ==&lt;br /&gt;
&lt;br /&gt;
Hi Tom,&lt;br /&gt;
&lt;br /&gt;
Welcome BACK!!!&lt;br /&gt;
&lt;br /&gt;
I don't mind the solutions put forth. Unique Identifiers for DESC is no more absurd then the Unique&lt;br /&gt;
Identifiers we'll be needing to use more than one CHOOSER on a single line. Plus, the ability to&lt;br /&gt;
clear off a Section of DESC would be awesome.&lt;br /&gt;
&lt;br /&gt;
I'd vote for as complete a job as possible.&lt;br /&gt;
&lt;br /&gt;
Here is where I'm not understanding - where are we going to put the translation stuff?&lt;br /&gt;
&lt;br /&gt;
thpr wrote:&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Here is where I'm not understanding - where are we going to put the translation stuff?&lt;br /&gt;
&lt;br /&gt;
Idea #1 (bad idea IMHO) is to put it in a separate directory:&lt;br /&gt;
data/srd/...&lt;br /&gt;
l10n/srd/...&lt;br /&gt;
&lt;br /&gt;
The problem with that is that you get into synchronization issues... so any time files/directory names change in one place they have to change in another.  That's a contract on the data developer.  (It would also require multiple l10n directories, since we support multiple data directories, so it's a bunch of code)&lt;br /&gt;
&lt;br /&gt;
Idea #2: Implicit Subdirectories:&lt;br /&gt;
data/srd/*.lst&lt;br /&gt;
data/srd/l10n/*.l10n&lt;br /&gt;
&lt;br /&gt;
That ensures that the l10n directory is associated with the dataset.&lt;br /&gt;
&lt;br /&gt;
Idea #3: Explicit designation:&lt;br /&gt;
data/srd/srd.pcc contains LOCALIZATION:l10n/srd.l10n&lt;br /&gt;
then:&lt;br /&gt;
data/l10n/srd.l10n&lt;br /&gt;
&lt;br /&gt;
(would support more than one .l10n file)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--- In pcgen_international@yahoogroups.com, Martijn Verburg &amp;lt;martijnverburg@...&amp;gt; wrote:&lt;br /&gt;
&amp;gt; &amp;gt; (2) We should target an ability to tell us if l10n is complete for any&lt;br /&gt;
&amp;gt; &amp;gt; given data set&lt;br /&gt;
&amp;gt; &amp;gt;&lt;br /&gt;
&amp;gt; Not sure what you mean by this?&lt;br /&gt;
&lt;br /&gt;
If there is an object called &amp;quot;Dagger&amp;quot; we need to ensure the file contains:&lt;br /&gt;
EQUIPMENT:Dagger|Aggerd-ay&lt;br /&gt;
&lt;br /&gt;
If it contains:&lt;br /&gt;
EQUIPMENT:Dgager|Aggerd-ay&lt;br /&gt;
&lt;br /&gt;
That is also an error (just like the &amp;quot;unconstructed reference&amp;quot; items are errors.  By capturing both type 1 and type 2 error (things that aren't translated as well as things that shouldn't have been translated) we are capturing the vast majority of the simple problems.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Localization]]&lt;/div&gt;</summary>
		<author><name>Masaru20100</name></author>
		
	</entry>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Internationalization&amp;diff=3147</id>
		<title>Internationalization</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Internationalization&amp;diff=3147"/>
		<updated>2012-09-15T10:23:27Z</updated>

		<summary type="html">&lt;p&gt;Masaru20100: /* Technical Aspects */ added more technical problems&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
&lt;br /&gt;
PCGen for 6.0+ releases will be attempting Internationalization (probably not in 6.0). Internalization is the process of changing software to allow it to be usable in any language and any locale. It is often abbreviated i18n. It is needed in PCGen because the software was not thought from the ground up to be usable from a language other than English. Localization is the process of creating the translations for a particular language, to do so the software need to able to handle internationalization. To deal with those, a Yahoo group called [http://groups.yahoo.com/group/pcgen_international pcgen_international] has been created.&lt;br /&gt;
&lt;br /&gt;
Requests for translations, problems with translations, and drafts of translated data sets or other translated content, as well as anything coming up with the Internationalization of PCGen are to be discussed in that group.&lt;br /&gt;
&lt;br /&gt;
Anybody interested to help out with translations to other languages, but also those who are just interested in the discussion of the matter, please join the group. Those interested in joining our efforts on the Internationalization of PCGen, please make yourself known on that list.&lt;br /&gt;
&lt;br /&gt;
This page is an attempt to regroup the information discussed on the list.&lt;br /&gt;
&lt;br /&gt;
There is a JIRA issue to regroup work on i18n: http://jira.pcgen.org/browse/CODE-733&lt;br /&gt;
&lt;br /&gt;
=Goal=&lt;br /&gt;
&lt;br /&gt;
The goal is to allow a user that doesn’t speak English to use the program in his native language with the specifics of his locale. This is an ideal goal, as it is not possible to provide all possible localizations with the low number of volunteers. What is needed is to provide the means for people to create localizations, in order to be able to do that, PCGen must be fully internationalized. Once this is done, the number of localization will slowly grow.&lt;br /&gt;
&lt;br /&gt;
PCGen interface, especially the part that are data set independent, are already internationalized and partially translated. Updating those translations is one of the needed step but not the only one.&lt;br /&gt;
Another element is already internationalized, it’s the use of imperial or metric distance. There is also an option to change it.&lt;br /&gt;
&lt;br /&gt;
Other steps are need to attain internationalization.&lt;br /&gt;
&lt;br /&gt;
* First the '''installation process''' should be detailed in many languages, even if it’s only expanding a compressed file then using a script to launch the program.&lt;br /&gt;
* All program '''UI strings''' should also be translatable, and so are the '''data strings'''. It seems that the non data strings are already translatable.&lt;br /&gt;
* The skills should be '''sorted''' in the UI and in the output sheet according to the natural sorting of the language.&lt;br /&gt;
* The '''output sheets''' should be in the user’s language too.&lt;br /&gt;
* In case the user create it’s own translation, it should be possible to add the language in the option pane without having to compile the program (or worse have to change some code!). From a technical point of view, it also means that the translations should be external to the jar, or that a simple way to add a translation provided.&lt;br /&gt;
&lt;br /&gt;
* Saved characters are usually reusable with a new version of the program, and the il8n should not change that. (technical: the saved elements should stay the same, should probably be keys of some sort — I have no idea what the pcg files are)&lt;br /&gt;
&lt;br /&gt;
* It would be better for the '''measure and weights system''' to be initially set to a logical value rather than a set one, it would depend on the first chosen locale. It is also needed to verify that the imperial and metric system option are actually working.&lt;br /&gt;
&lt;br /&gt;
There is also other elements that would improve usability for the user, mainly that '''help/documentation''' would be available in his language. This is usually big work to be achieve but doesn’t need any change in PCGen.&lt;br /&gt;
Another linked part is to be able to handle '''bug report''' in another language. To do that, the project need some people that would translate the bug reports to English before the development team is able to handle the bug reports. &lt;br /&gt;
&lt;br /&gt;
= Tools for internationalization and localization =&lt;br /&gt;
&lt;br /&gt;
To facilitate the internationalization and localization, some tools would be welcome. This tools are not necessary for the user, but are a great addition to maintainers.&lt;br /&gt;
&lt;br /&gt;
For internationalization:&lt;br /&gt;
* a way to determine which strings are translatable or not. Some IDE and some code quality library provide this kind of tool.&lt;br /&gt;
* a tool to eliminate (or point at) line that are not used any more in the main bundle file (it is quite big and there seems to bit not displayed text)&lt;br /&gt;
&lt;br /&gt;
For localization,&lt;br /&gt;
* If a specific way of storing the data translation is used, a tool to produce and update a more standard file would be needed. In free project, gettext files (POT, PO) are often used. In Java, ResourceBundle are often used. Another standard format is XLIFF. Such a tool would be able to add new needed translation to a file of the standard format, and flag old translations. From the standard format, it would update the translation of the specific format file. This is needed because there is tool to ease and speed up translation, like Virtaal, ResourceBundle editors, or poedit, and they need a standard file format to be usable.  &lt;br /&gt;
* a tool test to see if some entries are not translated (maybe a page that would provide statistics) it might be more useful if UI and data separated&lt;br /&gt;
* keeping glossary for each languages could help (some terms are found at many places)&lt;br /&gt;
* A way to detect incorrect token translation (like using Dager instead of Dagger) is welcome. One way to do this is by generating error or warning when loading the translation file. It would be welcome to generate this list of error without having to launch PCGen, it would also be a nice addition to automatic testing.&lt;br /&gt;
&lt;br /&gt;
=Choices yet to be made=&lt;br /&gt;
&lt;br /&gt;
== Application Packaging ==&lt;br /&gt;
&lt;br /&gt;
As of December 2011, the application and translation of some part of the UI are bundled together.&lt;br /&gt;
&lt;br /&gt;
The question is should the application be bundled this way, or should there be language specific bundles.&lt;br /&gt;
&lt;br /&gt;
Pro of a all-in-one&lt;br /&gt;
* user can change language on the fly&lt;br /&gt;
* no need for explanations on how to install a new language set&lt;br /&gt;
&lt;br /&gt;
Cons&lt;br /&gt;
* file could get quite big&lt;br /&gt;
&lt;br /&gt;
== Genre class names ==&lt;br /&gt;
&lt;br /&gt;
In some languages, the class names can have a genre, like the feminine of priest is priestess in English (even if Cleric is the name of the class, it’s just to illustrate the point). Do we want to use those names in the class names or do we stick to whatever name the class is?&lt;br /&gt;
&lt;br /&gt;
= The goals in more details for PCGen =&lt;br /&gt;
&lt;br /&gt;
== Default language after clean install ==&lt;br /&gt;
&lt;br /&gt;
The language should be the system one. To the user, if doesn’t understand the default language, it will be a pain for him to find the option to change the language.&lt;br /&gt;
It may be even better if the user is prompted with a choice at the start of the program (or at install) in order to simplify this process. It might be displayed only if the system language doesn’t exist in PCGen.&lt;br /&gt;
As noted before, the measure and weight system used need to be chosen by the user at the first install with the default choice depending on the language/locale selected. After first launch or install, the option is changeable in the option preference panel.&lt;br /&gt;
&lt;br /&gt;
After clean install (no preference files):&lt;br /&gt;
# PCGen determine the system language&lt;br /&gt;
# if translation exist (and are believed good enough) switch to that language, if not, display an element to ask the user for the language to use.&lt;br /&gt;
&lt;br /&gt;
== Published language priority ==&lt;br /&gt;
&lt;br /&gt;
* The data that is not translated in a language, for example books not yet translated, should stay in the language it first get out.&lt;br /&gt;
&lt;br /&gt;
Books are almost never instantly translated by companies and some aren’t even translated. PCGen is also short on staff. All that means that the translations will probably be coming far after the original one.&lt;br /&gt;
To an user that only use translated material, it will not be a problem.&lt;br /&gt;
To an user that mix translated material, and not translated one, it shouldn’t become a problem.&lt;br /&gt;
&lt;br /&gt;
== Using different data languages ==&lt;br /&gt;
&lt;br /&gt;
* The data should be the same that the English one to avoid having to duplicate data correction.&lt;br /&gt;
&lt;br /&gt;
Having data in several languages could be a way to do il8n&lt;br /&gt;
&lt;br /&gt;
Cons&lt;br /&gt;
* might need language specific bundles&lt;br /&gt;
* a character used with one language cannot be seen by someone with a different language set&lt;br /&gt;
* multiple corrections needed when correcting a bug (and if automatic generation of the translation is done, why not do it on the fly)&lt;br /&gt;
&lt;br /&gt;
It probably should be avoided to do it that way.&lt;br /&gt;
&lt;br /&gt;
== Separating data and UI translations ==&lt;br /&gt;
&lt;br /&gt;
* The interface language and the data language should be separate to allow people with book in a different language than their own to use the program more simply.&lt;br /&gt;
To the user that speak only one language, it is no advantage nor a problem.&lt;br /&gt;
For a user which use book that are not in the language he is most comfortable with, he would put the UI and the data to different languages. Same for someone who doesn’t use translation of the data but prefer to have a program in a language he is more comfortable with.&lt;br /&gt;
&lt;br /&gt;
== Custom content and localization ==&lt;br /&gt;
&lt;br /&gt;
* It should be possible to use another language in a data to allow non English speaker to develop custom content in another language. That seem to be a problem when combined with separate language from data. A way to avoid it is to provide easy reference to create custom content.&lt;br /&gt;
&lt;br /&gt;
This might be a hard to make real combined with other points.&lt;br /&gt;
&lt;br /&gt;
(might be wrong on this point [[User:Masaru20100|Masaru20100]]) At the moment, when creating custom content, the English token are used. For a non English-speaker, it is a problem, that’s why, ideally, he should be able to create custom by using his own language.&lt;br /&gt;
&lt;br /&gt;
The problem this cause is that if the user change the language of the program, the custom content either doesn’t work anymore, or all possible translations are checked which would cause massive slowness in the software.&lt;br /&gt;
&lt;br /&gt;
As it seams undoable, the user should be provided with way to easily find the needed English token for his custom content.&lt;br /&gt;
&lt;br /&gt;
== Indicating what is translated ==&lt;br /&gt;
&lt;br /&gt;
It would be good to provide the user with visual information of how much a dataset is translated in his language. It is not really a needed feature but could help him. If he knew that all is not translated, he would be less surprised.&lt;br /&gt;
&lt;br /&gt;
=Technical Aspects=&lt;br /&gt;
&lt;br /&gt;
== Language choice UI ==&lt;br /&gt;
&lt;br /&gt;
There is already options to change the language and the weights and measure system used.&lt;br /&gt;
&lt;br /&gt;
It might be best to have a drop down list rather than radio choices. New translation should appear in the list.&lt;br /&gt;
&lt;br /&gt;
== Formatting Issue ==&lt;br /&gt;
&lt;br /&gt;
Martijn pointed that number should be translatable. In Japanese, the classic number system is almost always used especially in RPG. In fact, translating numbers is not needed, what is needed is formatting numbers.&lt;br /&gt;
&lt;br /&gt;
That means that 10000 gets formatted 10,000 in English, 10 000 in French. In Japanese, it would either be 10,000 or 1万. There is even a locale to obtain 一万 if needed.&lt;br /&gt;
&lt;br /&gt;
In Java, this is usually done by using the NumberFormat class with the appropriate locale.&lt;br /&gt;
&lt;br /&gt;
== Sorting Issue ==&lt;br /&gt;
&lt;br /&gt;
Sorting is usually language dependent, meaning that the list of skills for example is not sorted the same way in different languages, even if the name are the same. The differences are usually minor between roman letter using languages.&lt;br /&gt;
&lt;br /&gt;
Actually, the international guys brought up the sorting thing again - another project would be to look into the GUI/core and replacing all the sorting of items with internationalized methods of sorting (Collators).&lt;br /&gt;
&lt;br /&gt;
Technically, Java already provide ways of sorting based on locale, it’s the Collator classes.&lt;br /&gt;
&lt;br /&gt;
== Unique Identifier ==&lt;br /&gt;
&lt;br /&gt;
Apparently there is already unique identifiers in use for items, so the idea would be to have a file with that id as the key and the translation as the value.&lt;br /&gt;
&lt;br /&gt;
== Output Sheet and Data Language ==&lt;br /&gt;
&lt;br /&gt;
The question is: should output sheets be locale dependent?&lt;br /&gt;
If it is, when a sheet is corrected for one locale, it will need to be edited in all languages. Having languages taken into account in the same sheet make it more complicated.&lt;br /&gt;
&lt;br /&gt;
=== Gender, race and level example ===&lt;br /&gt;
&lt;br /&gt;
There is also other problem as illustrated by the gender, race and level.&lt;br /&gt;
&lt;br /&gt;
In English, the gender propose Male, Female, Neuter, Unknown.&lt;br /&gt;
In a English statblock, it is usually a line like: Gender Race Level N, as “Female drow cleric 3” for a drow noble [http://www.d20pfsrd.com/bestiary/monster-listings/humanoids/drow-common/drow-noble]. As of this writing, the software output “Female Drow Noble Cleric3”, or “Female Drow Noble Cleric 3” instead in most statblock sheets.&lt;br /&gt;
The Unknown gender, and maybe the neuter one too, should probably not output as is in statblock sheets, while not &lt;br /&gt;
On my system, with the preferences to use the system language, the female translation is used instead.&lt;br /&gt;
&lt;br /&gt;
In French, it is Mâle, Femelle, Neuter, Inconnu. The same noble drow is “Drow, prêtre 3” (prêtre is the translation of cleric) [http://www.pathfinder-fr.org/Wiki/Pathfinder-RPG.Drow%20noble.ashx]. I remember reading “Drow (f), prêtre 3”, where the sex is included by using a single letter in parenthesis. It could also have been “Drow, guerrière 3”, where guerrière is the feminine of fighter.&lt;br /&gt;
As you can remark, the order is different.&lt;br /&gt;
&lt;br /&gt;
In Japanese, it looks like “ドラウ（女性）の貴族の3レベル・クレリック” [http://www29.atwiki.jp/prdj/pages/306.html#drow].&lt;br /&gt;
&lt;br /&gt;
=== data translation and output sheet values locale ===&lt;br /&gt;
&lt;br /&gt;
To write&lt;br /&gt;
&lt;br /&gt;
== Tom’s technical proposal ==&lt;br /&gt;
&lt;br /&gt;
So looking back at the earlier thread, I never actually came back with my suggestion, so here is my perspective on localization and how it should be done. This has been made easier by some changes we have in the 6.x line, and having new UI (with what I believe to be a lot more isolation of code that does display of items) is a huge boost here to making this practical.&lt;br /&gt;
&lt;br /&gt;
First a few base facts as background:&lt;br /&gt;
# For [almost] every item (Class, Skill, etc.) there is a unique identifier (generally referred to as a Key - note that if the &amp;quot;KEY&amp;quot; token is not used, then the Key is the name (first entry on the line in the data) (There is an exception to this we'll call problem #1)&lt;br /&gt;
# There are basically 4 types of things that need translation:&lt;br /&gt;
## (2a) item names&lt;br /&gt;
## (2b) constants (like spell schools)&lt;br /&gt;
## (2c) variables (like meters/feet/etc.)&lt;br /&gt;
## (2d) Strings (like descriptions)&lt;br /&gt;
## [if anyone can think of more, let me know]&lt;br /&gt;
# Most (but not all) tokens are &amp;quot;unique&amp;quot; or otherwise &amp;quot;addressable&amp;quot; in that they can only occur once per object. (Anyone notice that the tokens have started to be specific in the test code &amp;amp; docs about whether they overwrite, add, etc. - this is one reason why - and yes, I've been slowly trying to make progress on this even in the 2007-2009 work) [The exception to this is problem #2)&lt;br /&gt;
&lt;br /&gt;
A few principles about l10n:&lt;br /&gt;
# We must not make producing a data set materially more complicated than it is today (no requirement to put %L10NNAME% type gunk into data)&lt;br /&gt;
# We should target an ability to tell us if l10n is complete for any given data set&lt;br /&gt;
&lt;br /&gt;
With that:&lt;br /&gt;
* Following from #1, almost everything we have in the data today is &amp;quot;addressable&amp;quot;. By that, I mean that the OUTPUTNAME for a Skill called &amp;quot;FooBar&amp;quot; can be uniquely called out. The name hierarchy is something like: SKILL//Foo//OUTPUTNAME (exceptions are problems #1,2 to be addressed later)&lt;br /&gt;
&lt;br /&gt;
Given that, we can actually set principle #1 to &amp;quot;The data remains unchanged&amp;quot; (again, except for problem #2). The entire data set is produced (assume US English for a moment). We then have a unique file for l10n that has things like:&lt;br /&gt;
* SKILL:FooBar|Oobarf-ay&lt;br /&gt;
* SKILL:FooBar:OUTPUTNAME|ooBarOutF-ay&lt;br /&gt;
* etc.&lt;br /&gt;
&lt;br /&gt;
This (to the first order) covers 2a, 2d.&lt;br /&gt;
&lt;br /&gt;
For 2b items, we simply have to expand the list of items (SKILL, SPELL) that we are familiar with, so we get things like:&lt;br /&gt;
* SPELLSCHOOL:Divination|Ivinationd-ay&lt;br /&gt;
&lt;br /&gt;
2c is a bit more complicated, but I can't believe it's all that bad given it's a thing many applications already do (and it's a known thing)&lt;br /&gt;
&lt;br /&gt;
Each file could be named in such a way that it identifies it's l10n, e.g.:&lt;br /&gt;
* srd_de_ch.l10n&lt;br /&gt;
* ...and probably placed in a L10N subfolder of the initial dataset.&lt;br /&gt;
* (Note I'd recommend we be clear on where these go, AND ALSO require that NO PCC FILES (I'd recommend we say no PCC or LST, but the formal limit would be no PCC) are recognized if they are in the L10N folder... so that the initial directory parse [which is probably one of the slower parts of our boot process] can immediately ignore the l10n directory and not have to look through the file list looking for .PCC files... alternately, we have a l10n folder that is parallel to the data folder, but that then adds complication in needing new preferences to point at multiple l10n folders and requires more complicated structure within that l10n structure to identify WHICH files in that folder map to which datasets... because we can't simply say a given English word will always translate the same way - English is way too overloaded for that.)&lt;br /&gt;
&lt;br /&gt;
I would recommend we keep things in a small subset of files, and not try to do 1:1 for each data file (that would produce a lot of file sprawl) - but that's not my call.&lt;br /&gt;
&lt;br /&gt;
Addressing principle #2:&lt;br /&gt;
* Since we have a set of items we know would need to be covered (names, certain tokens), we should be able to load those into memory, and load the l10n file into memory and compare. This should be able to produce warnings of 2 kinds:&lt;br /&gt;
* (W1) Errors where the base data set contains things that are not translated&lt;br /&gt;
* (W2) Errors where the translation file attempts to translate things not in the base data set&lt;br /&gt;
* I can't imagine that utility is all that hard to write (just would need to make the list of todos)&lt;br /&gt;
&lt;br /&gt;
This brings us to problems #1 and #2:&lt;br /&gt;
&lt;br /&gt;
Problem #1: Non-unique names&lt;br /&gt;
* We glossed over this in 6.x, but the truth is that Spell names are not unique. Some of the *RDs have duplicate names (not all, but I forget which). Same is true for languages.&lt;br /&gt;
* (1a) Spells can theoretically be differentiated by evaluating the &amp;quot;TYPE&amp;quot; token for Divine, Arcane, or Psionic (those are &amp;quot;magical&amp;quot; items in our code.&lt;br /&gt;
* (1b) Languages can theoretically be differentiated between &amp;quot;Spoken&amp;quot; and &amp;quot;Written&amp;quot; as those are &amp;quot;magical&amp;quot; types.&lt;br /&gt;
I believe both of those forms of magic are things on our backlog of FREQs to clean up... and the reason they are on the cleanup list really for L10N (as much as it is to just cleanup the overuse of TYPE)&lt;br /&gt;
&lt;br /&gt;
Problem #2: Non-unique tokens&lt;br /&gt;
* There are only a few tokens that are not unique. DESC is one of them, if I recall correctly. The probably solution here is to simply give an identifier to each token. This might require a change to LST Something like:&lt;br /&gt;
* DESC*Overall:x&lt;br /&gt;
* DESC*Second:x&lt;br /&gt;
* (Note: I'm not sure this syntax works or is by any means &amp;quot;good&amp;quot;. DESC:OVERALL|x might be better as it avoids potential issues with using * as a reserved character - take this is a principle of what would have to happen to DESC token, not as a full-blown proposal)&lt;br /&gt;
&lt;br /&gt;
Note that this naming of each DESC item (And other reusable items), while it breaks the &amp;quot;can't change the data&amp;quot; principle actually helps as much as it hurts... it would give us the ability to do things like:&lt;br /&gt;
* DESC:.CLEARID.Overall&lt;br /&gt;
* or things similar to that, which is actually a neat benefit for the small overhead of pain it puts into datasets. (Which, by the way, could be converted to whatever we decide on anyway with our nifty converter, so this doesn't seem all that bad)&lt;br /&gt;
&lt;br /&gt;
So in my mind, the question really is: Is going slightly more than half way good enough? There are areas where we could do translation, and some areas where we need some pretty material core code changes to support it.&lt;br /&gt;
&lt;br /&gt;
== Translation files ==&lt;br /&gt;
&lt;br /&gt;
Hi Tom,&lt;br /&gt;
&lt;br /&gt;
Welcome BACK!!!&lt;br /&gt;
&lt;br /&gt;
I don't mind the solutions put forth. Unique Identifiers for DESC is no more absurd then the Unique&lt;br /&gt;
Identifiers we'll be needing to use more than one CHOOSER on a single line. Plus, the ability to&lt;br /&gt;
clear off a Section of DESC would be awesome.&lt;br /&gt;
&lt;br /&gt;
I'd vote for as complete a job as possible.&lt;br /&gt;
&lt;br /&gt;
Here is where I'm not understanding - where are we going to put the translation stuff?&lt;br /&gt;
&lt;br /&gt;
thpr wrote:&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Here is where I'm not understanding - where are we going to put the translation stuff?&lt;br /&gt;
&lt;br /&gt;
Idea #1 (bad idea IMHO) is to put it in a separate directory:&lt;br /&gt;
data/srd/...&lt;br /&gt;
l10n/srd/...&lt;br /&gt;
&lt;br /&gt;
The problem with that is that you get into synchronization issues... so any time files/directory names change in one place they have to change in another.  That's a contract on the data developer.  (It would also require multiple l10n directories, since we support multiple data directories, so it's a bunch of code)&lt;br /&gt;
&lt;br /&gt;
Idea #2: Implicit Subdirectories:&lt;br /&gt;
data/srd/*.lst&lt;br /&gt;
data/srd/l10n/*.l10n&lt;br /&gt;
&lt;br /&gt;
That ensures that the l10n directory is associated with the dataset.&lt;br /&gt;
&lt;br /&gt;
Idea #3: Explicit designation:&lt;br /&gt;
data/srd/srd.pcc contains LOCALIZATION:l10n/srd.l10n&lt;br /&gt;
then:&lt;br /&gt;
data/l10n/srd.l10n&lt;br /&gt;
&lt;br /&gt;
(would support more than one .l10n file)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--- In pcgen_international@yahoogroups.com, Martijn Verburg &amp;lt;martijnverburg@...&amp;gt; wrote:&lt;br /&gt;
&amp;gt; &amp;gt; (2) We should target an ability to tell us if l10n is complete for any&lt;br /&gt;
&amp;gt; &amp;gt; given data set&lt;br /&gt;
&amp;gt; &amp;gt;&lt;br /&gt;
&amp;gt; Not sure what you mean by this?&lt;br /&gt;
&lt;br /&gt;
If there is an object called &amp;quot;Dagger&amp;quot; we need to ensure the file contains:&lt;br /&gt;
EQUIPMENT:Dagger|Aggerd-ay&lt;br /&gt;
&lt;br /&gt;
If it contains:&lt;br /&gt;
EQUIPMENT:Dgager|Aggerd-ay&lt;br /&gt;
&lt;br /&gt;
That is also an error (just like the &amp;quot;unconstructed reference&amp;quot; items are errors.  By capturing both type 1 and type 2 error (things that aren't translated as well as things that shouldn't have been translated) we are capturing the vast majority of the simple problems.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Localization]]&lt;/div&gt;</summary>
		<author><name>Masaru20100</name></author>
		
	</entry>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Explanation_of_the_Code_Base&amp;diff=3140</id>
		<title>Explanation of the Code Base</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Explanation_of_the_Code_Base&amp;diff=3140"/>
		<updated>2012-09-09T08:12:24Z</updated>

		<summary type="html">&lt;p&gt;Masaru20100: /* pcgen.gui */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
  | __TOC__&lt;br /&gt;
  |}&lt;br /&gt;
&lt;br /&gt;
=High level overview of PCGen Code Base=&lt;br /&gt;
&lt;br /&gt;
''src/java/pcgen'' is where the code tree begins. The directories match the package names — so ''pcgen.core'' would be ''src/java/pcgen/core'' (or ''src\java\pcgen\core'' if you are on Windows).&lt;br /&gt;
&lt;br /&gt;
=Packages=&lt;br /&gt;
&lt;br /&gt;
==pcgen.base.*==&lt;br /&gt;
&lt;br /&gt;
These classes are 'base' library elements.  None of these should be objects that are dependent upon pcgen.cdom or pcgen.core classes.  The intent is that pcgen.base elements are usable in any project, not specifically PCGen.  No item which is deeply tied to the concept of a Role-Playing Game or building a Player Character should be present in this package.&lt;br /&gt;
&lt;br /&gt;
==pcgen.cdom.*==&lt;br /&gt;
&lt;br /&gt;
The pcgen.cdom package contains the core contents of the CDOM structure.  There are a number of key subpackages of pcgen.cdom:&lt;br /&gt;
&lt;br /&gt;
# pcgen.cdom.base: This is the &amp;quot;base&amp;quot; package, which has many key components that the entire PCGen code base is dependent upon.  It should be expected that the members of this package have few dependencies outside of pcgen.base* and pcgen.cdom.base*, as this is &amp;quot;low&amp;quot; in the package hierarchy.&lt;br /&gt;
# pcgen.cdom.choiceset: This package contains [[CDOM Primitive Choice Set Concept Document|Primitive Choice Sets]]&lt;br /&gt;
# pcgen.cdom.content: This package contains the non-CDOM Object content objects that would make up a Player Character.  Long term, these objects would be &amp;quot;granted&amp;quot; by CDOM Objects, and thus would appear directly in the CDOM Graph that defines the Player Character (in 5.16, there is very little that distinguishes content from a helper)&lt;br /&gt;
# pcgen.cdom.enumeration: This package contains type safe enumerations (such as enums)&lt;br /&gt;
# pcgen.cdom.formula: This package contains items related to formula calculations performed by PCGen.&lt;br /&gt;
# pcgen.cdom.helper: This package is for &amp;quot;helper&amp;quot; objects of the CDOM Objects found within pcgen.cdom.inst.  Generally a &amp;quot;helper&amp;quot; would be contained within the CDOM Object.&lt;br /&gt;
# pcgen.cdom.inst: This package is for instances of CDOM Objects.  Long term, this will contain many of the objects currently in pcgen.core&lt;br /&gt;
# pcgen.cdom.list: This package contains list objects, such as Class Spell List objects.  These list objects serve as identifiers for collections of CDOM Objects that are used at runtime.&lt;br /&gt;
# pcgen.cdom.reference: This package contains [[CDOM References Concept Document|CDOM References]]&lt;br /&gt;
# pcgen.cdom.modifier: This package contains modifiers, a specialized form of content that is designed to alter the behavior of content that is part of a Player Character (The override from a Hit Die Lock is a good example of a modifier)&lt;br /&gt;
# pcgen.cdom.util: These are utility packages for classes contained within the pcgen.cdom* packages.&lt;br /&gt;
&lt;br /&gt;
==pcgen.rules.*==&lt;br /&gt;
&lt;br /&gt;
This package contains the classes related to the &amp;quot;Rules Data Store&amp;quot;.  The classes here are responsible for loading (and writing) the rules files (PCC, LST), and when combined with the token plugins, this package converts the persistent objects into the instances, lists, content, helpers, references, and other objects of the pcgen.cdom* package.&lt;br /&gt;
&lt;br /&gt;
==pcgen.core==&lt;br /&gt;
&lt;br /&gt;
This is where the business logic goes. This is the main engine that makes things work. The most important class in here is PObject, many classes are subclassed from this (like PCClass, Race, Feat, Spell, etc.). Another important class is PlayerCharacter which is where the player characters are constructed and manipulated. Globals contains the lists of objects loaded when a user loads their desired sources. Constants holds most of the code constants so you do not need to remember their values.&lt;br /&gt;
&lt;br /&gt;
==pcgen.gui==&lt;br /&gt;
&lt;br /&gt;
This is the GUI logic. The main method is in pcGenGUI, and the frame is in PCGen_Frame1. The editors are all defined in the editor package, and all the tab frames are in the tabs package.&lt;br /&gt;
This is deprecated in favor of pcgen.gui2 classes.&lt;br /&gt;
&lt;br /&gt;
==pcgen.gui2==&lt;br /&gt;
&lt;br /&gt;
This is the NewGUI logic.&lt;br /&gt;
&lt;br /&gt;
==pcgen.io==&lt;br /&gt;
&lt;br /&gt;
This is where the disk writing stuff occurs, like creating/parsing pcg files, and exporting character sheets.&lt;br /&gt;
&lt;br /&gt;
==pcgen.persistence==&lt;br /&gt;
&lt;br /&gt;
This is where the lst files are read in. The class that controls the loading is SystemLoader.&lt;br /&gt;
&lt;br /&gt;
==pcgen.util==&lt;br /&gt;
&lt;br /&gt;
This is where generally useful classes that are don't fit any of the other categories go.&lt;br /&gt;
&lt;br /&gt;
==plugin==&lt;br /&gt;
&lt;br /&gt;
This is where the pluggable features go. This includes tools such as Character Sheet, Dicebag, Random Name Generator, Encounter Generator, Network Management, Experience Tracker, Initiative Tracker, GM Notes, Overland Travel and the Character Tracker. It also includes processors for the variety of Lst Tokens and Output Tokens. There is also an [[Arch. Discuss of Plugin System|Architectural Discussion of the PCGen Persistence Plugin System]] to help provide additional explanation of how the Lst Tokens work.&lt;br /&gt;
&lt;br /&gt;
See the Javadocs for further details of the PCGen code base.&lt;/div&gt;</summary>
		<author><name>Masaru20100</name></author>
		
	</entry>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Localization&amp;diff=3132</id>
		<title>Localization</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Localization&amp;diff=3132"/>
		<updated>2012-08-25T03:31:23Z</updated>

		<summary type="html">&lt;p&gt;Masaru20100: /* My Process */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Localization (l8n) is the process of adapting software for its use in a particular location. It can only be done if the software has been [[internationnalized|Internationnalization]] (i10n). It is mainly translation.&lt;br /&gt;
&lt;br /&gt;
In the case of PCGen, as with other free software, localization can only be done with the help of the community.&lt;br /&gt;
&lt;br /&gt;
PCGen both need translation for its user interface (UI) and its data. The data can not be translated for now (as of August 25th 2012), because the internationnalization for the data is not yet done. On top of it, PCGen data is mostly non-free, so providing translation has legal repercutions.&lt;br /&gt;
&lt;br /&gt;
The translation of the UI is simpler. There is a file for each language, and basically you need to translate all the messages. Beware that, as of August 25th 2012, there is many unused strings in the files.&lt;br /&gt;
&lt;br /&gt;
(eventually write more for beginners in l8n, provide links?)&lt;br /&gt;
&lt;br /&gt;
== My Process ==&lt;br /&gt;
&lt;br /&gt;
By [[User:Masaru20100|Masaru20100]] 03:44, 25 August 2012 (MIST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PCGen uses Java’s ResourceBundle, and use cryptic text as the key of strings (unlike PO that indicate to use ASCII text as keys). It means you need to see two text files at the same time to view original files. Do not edit a copy of another language file, because you’d have a file with a mix of the target language and the copied language, which make it difficult to see what is not yet translated (and also harder to merge). I don’t like the ResourceBundle format because it does not allow me to keep the information that my translations on some strings might not be good. That’s why I keep my main translation in po files and not in bundles.&lt;br /&gt;
&lt;br /&gt;
Another reason to keep separated files, is that only ASCII characters can be included in a ResourceBundle, other characters need to be unicode escaped (things like \u0145).&lt;br /&gt;
&lt;br /&gt;
Each time I update my svn copy, I create a new POT file from the default resource bundle. Then I update my latest po file of the language I’m working on, update it with the POT file and save it with a new name (using the svn version number). I then proceed to edit the po file. I save the file, update the resource bundle in the code directory then (I think its needed to see changes) build pcgen.&lt;br /&gt;
&lt;br /&gt;
To update, I just do&lt;br /&gt;
&lt;br /&gt;
 # svn up&lt;br /&gt;
&lt;br /&gt;
To create the new POT, I use prop2po which is part of the package translate-toolkit on Debian. I have a little script that I usually call with the svn number.&lt;br /&gt;
&lt;br /&gt;
 # newpot 17045&lt;br /&gt;
&lt;br /&gt;
''newpot''&lt;br /&gt;
&lt;br /&gt;
 #!/bin/zsh&lt;br /&gt;
 &lt;br /&gt;
 # argument is name of version&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;if [[ -z $1 ]];&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 then&lt;br /&gt;
         echo Argument needed&lt;br /&gt;
         exit 1&lt;br /&gt;
 else&lt;br /&gt;
         name=.$1&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 # Create the new POT from the Language bundle&lt;br /&gt;
 prop2po ../pcgen-svn/code/src/java/pcgen/resources/lang/LanguageBundle.properties LanguageBundle$name.pot&lt;br /&gt;
 #po2xliff -P LanguageBundle$name.pot LanguageBundle$name.xlf&lt;br /&gt;
&lt;br /&gt;
I use virtaal to open the latest po file, update it with the POT then save it with the new version number (poedit would work fine but doesn’t show the comments in the po file). I then edit the file.&lt;br /&gt;
&lt;br /&gt;
Once my change are done, or I want to view them, I use a script to update the resource bundle file. You’ll have to change the name of the language you’d work with there (fr ja en_GB in my case). It uses po2prop also part of the translate-toolkit package.&lt;br /&gt;
&lt;br /&gt;
 # updatebundle 17045&lt;br /&gt;
&lt;br /&gt;
''updatebundle''&lt;br /&gt;
&lt;br /&gt;
 #!/bin/zsh&lt;br /&gt;
 &lt;br /&gt;
 # argument is name of version&lt;br /&gt;
 if &amp;lt;nowiki&amp;gt;[[ -z $1 ]];&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 then&lt;br /&gt;
         echo Argument needed&lt;br /&gt;
         exit 1&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 # Create the new POT from the Language bundle&lt;br /&gt;
 for lang in fr ja en_GB&lt;br /&gt;
 do&lt;br /&gt;
         &amp;lt;nowiki&amp;gt;if [[ -f LanguageBundle.$1.$lang.po ]];&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
         then&lt;br /&gt;
                 po2prop --fuzzy --errorlevel=traceback -t ../pcgen-svn/code/src/java/pcgen/resources/lang/LanguageBundle.properties LanguageBundle.$1.$lang.po ../pcgen-svn/code/src/java/pcgen/resources/lang/LanguageBundle_$lang.properties&lt;br /&gt;
         fi&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
I hope those scripts help some one, you’ll probably need to change them (to fix the path for example).&lt;/div&gt;</summary>
		<author><name>Masaru20100</name></author>
		
	</entry>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Localization&amp;diff=3131</id>
		<title>Localization</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Localization&amp;diff=3131"/>
		<updated>2012-08-25T02:29:56Z</updated>

		<summary type="html">&lt;p&gt;Masaru20100: Added part on encoding of bundles, nowiki tag for scripts.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Localization (l8n) is the process of adapting software for its use in a particular location. It can only be done if the software has been [[internationnalized|Internationnalization]] (i10n). It is mainly translation.&lt;br /&gt;
&lt;br /&gt;
In the case of PCGen, as with other free software, localization can only be done with the help of the community.&lt;br /&gt;
&lt;br /&gt;
PCGen both need translation for its user interface (UI) and its data. The data can not be translated for now (as of August 25th 2012), because the internationnalization for the data is not yet done. On top of it, PCGen data is mostly non-free, so providing translation has legal repercutions.&lt;br /&gt;
&lt;br /&gt;
The translation of the UI is simpler. There is a file for each language, and basically you need to translate all the messages. Beware that, as of August 25th 2012, there is many unused strings in the files.&lt;br /&gt;
&lt;br /&gt;
(eventually write more for beginners in l8n, provide links?)&lt;br /&gt;
&lt;br /&gt;
== My Process ==&lt;br /&gt;
&lt;br /&gt;
By [[User:Masaru20100|Masaru20100]] 03:44, 25 August 2012 (MIST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PCGen uses Java’s ResourceBundle, and use cryptic text as the key of strings (unlike PO that indicate to use ASCII text as keys). It means you need to see two text files at the same time to view original files. Do not edit a copy of another language file, because you’d have a file with a mix of the target language and the copied language, which make it difficult to see what is not yet translated (and also harder to merge). I don’t like the ResourceBundle format because it does not allow me to keep the information that my translations on some strings might not be good. That’s why I keep my main translation in po files and not in bundles.&lt;br /&gt;
&lt;br /&gt;
Another reason to keep separated files, is that only ASCII characters can be included in a ResourceBundle, other characters need to be unicode escaped (things like \u0145).&lt;br /&gt;
&lt;br /&gt;
Each time I update my svn copy, I create a new POT file from the default resource bundle. Then I update my latest po file of the language I’m working on, update it with the POT file and save it with a new name (using the svn version number). I then proceed to edit the po file. I save the file, update the resource bundle in the code directory then (I think its needed to see changes) build pcgen.&lt;br /&gt;
&lt;br /&gt;
To update, I just do&lt;br /&gt;
&lt;br /&gt;
 # svn up&lt;br /&gt;
&lt;br /&gt;
To create the new POT, I use prop2po which is part of the package translate-toolkit on Debian. I have a little script that I usually call with the svn number.&lt;br /&gt;
&lt;br /&gt;
 # newpot 17045&lt;br /&gt;
&lt;br /&gt;
''newpot''&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
 #!/bin/zsh&lt;br /&gt;
 &lt;br /&gt;
 # argument is name of version&lt;br /&gt;
 if [[ -z $1 ]];&lt;br /&gt;
 then&lt;br /&gt;
         echo Argument needed&lt;br /&gt;
         exit 1&lt;br /&gt;
 else&lt;br /&gt;
         name=.$1&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 # Create the new POT from the Language bundle&lt;br /&gt;
 prop2po ../pcgen-svn/code/src/java/pcgen/resources/lang/LanguageBundle.properties LanguageBundle$name.pot&lt;br /&gt;
 #po2xliff -P LanguageBundle$name.pot LanguageBundle$name.xlf&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I use virtaal to open the latest po file, update it with the POT then save it with the new version number (poedit would work fine but doesn’t show the comments in the po file). I then edit the file.&lt;br /&gt;
&lt;br /&gt;
Once my change are done, or I want to view them, I use a script to update the resource bundle file. You’ll have to change the name of the language you’d work with there (fr ja en_GB in my case). It uses po2prop also part of the translate-toolkit package.&lt;br /&gt;
&lt;br /&gt;
 # updatebundle 17045&lt;br /&gt;
&lt;br /&gt;
''updatebundle''&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
 #!/bin/zsh&lt;br /&gt;
 &lt;br /&gt;
 # argument is name of version&lt;br /&gt;
 if [[ -z $1 ]];&lt;br /&gt;
 then&lt;br /&gt;
         echo Argument needed&lt;br /&gt;
         exit 1&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 # Create the new POT from the Language bundle&lt;br /&gt;
 for lang in fr ja en_GB&lt;br /&gt;
 do&lt;br /&gt;
         if [[ -f LanguageBundle.$1.$lang.po ]];&lt;br /&gt;
         then&lt;br /&gt;
                 po2prop --fuzzy --errorlevel=traceback -t ../pcgen-svn/code/src/java/pcgen/resources/lang/LanguageBundle.properties LanguageBundle.$1.$lang.po ../pcgen-svn/code/src/java/pcgen/resources/lang/LanguageBundle_$lang.properties&lt;br /&gt;
         fi&lt;br /&gt;
 done&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I hope those scripts help some one, you’ll probably need to change them (to fix the path for example).&lt;/div&gt;</summary>
		<author><name>Masaru20100</name></author>
		
	</entry>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Internationalization&amp;diff=3130</id>
		<title>Internationalization</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Internationalization&amp;diff=3130"/>
		<updated>2012-08-24T16:46:30Z</updated>

		<summary type="html">&lt;p&gt;Masaru20100: added link to Localization&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
&lt;br /&gt;
PCGen for 6.0+ releases will be attempting Internationalization (probably not in 6.0). Internalization is the process of changing software to allow it to be usable in any language and any locale. It is often abbreviated i18n. It is needed in PCGen because the software was not thought from the ground up to be usable from a language other than English. Localization is the process of creating the translations for a particular language, to do so the software need to able to handle internationalization. To deal with those, a Yahoo group called [http://groups.yahoo.com/group/pcgen_international pcgen_international] has been created.&lt;br /&gt;
&lt;br /&gt;
Requests for translations, problems with translations, and drafts of translated data sets or other translated content, as well as anything coming up with the Internationalization of PCGen are to be discussed in that group.&lt;br /&gt;
&lt;br /&gt;
Anybody interested to help out with translations to other languages, but also those who are just interested in the discussion of the matter, please join the group. Those interested in joining our efforts on the Internationalization of PCGen, please make yourself known on that list.&lt;br /&gt;
&lt;br /&gt;
This page is an attempt to regroup the information discussed on the list.&lt;br /&gt;
&lt;br /&gt;
There is a JIRA issue to regroup work on i18n: http://jira.pcgen.org/browse/CODE-733&lt;br /&gt;
&lt;br /&gt;
=Goal=&lt;br /&gt;
&lt;br /&gt;
The goal is to allow a user that doesn’t speak English to use the program in his native language with the specifics of his locale. This is an ideal goal, as it is not possible to provide all possible localizations with the low number of volunteers. What is needed is to provide the means for people to create localizations, in order to be able to do that, PCGen must be fully internationalized. Once this is done, the number of localization will slowly grow.&lt;br /&gt;
&lt;br /&gt;
PCGen interface, especially the part that are data set independent, are already internationalized and partially translated. Updating those translations is one of the needed step but not the only one.&lt;br /&gt;
Another element is already internationalized, it’s the use of imperial or metric distance. There is also an option to change it.&lt;br /&gt;
&lt;br /&gt;
Other steps are need to attain internationalization.&lt;br /&gt;
&lt;br /&gt;
* First the '''installation process''' should be detailed in many languages, even if it’s only expanding a compressed file then using a script to launch the program.&lt;br /&gt;
* All program '''UI strings''' should also be translatable, and so are the '''data strings'''. It seems that the non data strings are already translatable.&lt;br /&gt;
* The skills should be '''sorted''' in the UI and in the output sheet according to the natural sorting of the language.&lt;br /&gt;
* The '''output sheets''' should be in the user’s language too.&lt;br /&gt;
* In case the user create it’s own translation, it should be possible to add the language in the option pane without having to compile the program (or worse have to change some code!). From a technical point of view, it also means that the translations should be external to the jar, or that a simple way to add a translation provided.&lt;br /&gt;
&lt;br /&gt;
* Saved characters are usually reusable with a new version of the program, and the il8n should not change that. (technical: the saved elements should stay the same, should probably be keys of some sort — I have no idea what the pcg files are)&lt;br /&gt;
&lt;br /&gt;
* It would be better for the '''measure and weights system''' to be initially set to a logical value rather than a set one, it would depend on the first chosen locale. It is also needed to verify that the imperial and metric system option are actually working.&lt;br /&gt;
&lt;br /&gt;
There is also other elements that would improve usability for the user, mainly that '''help/documentation''' would be available in his language. This is usually big work to be achieve but doesn’t need any change in PCGen.&lt;br /&gt;
Another linked part is to be able to handle '''bug report''' in another language. To do that, the project need some people that would translate the bug reports to English before the development team is able to handle the bug reports. &lt;br /&gt;
&lt;br /&gt;
= Tools for internationalization and localization =&lt;br /&gt;
&lt;br /&gt;
To facilitate the internationalization and localization, some tools would be welcome. This tools are not necessary for the user, but are a great addition to maintainers.&lt;br /&gt;
&lt;br /&gt;
For internationalization:&lt;br /&gt;
* a way to determine which strings are translatable or not. Some IDE and some code quality library provide this kind of tool.&lt;br /&gt;
* a tool to eliminate (or point at) line that are not used any more in the main bundle file (it is quite big and there seems to bit not displayed text)&lt;br /&gt;
&lt;br /&gt;
For localization,&lt;br /&gt;
* If a specific way of storing the data translation is used, a tool to produce and update a more standard file would be needed. In free project, gettext files (POT, PO) are often used. In Java, ResourceBundle are often used. Another standard format is XLIFF. Such a tool would be able to add new needed translation to a file of the standard format, and flag old translations. From the standard format, it would update the translation of the specific format file. This is needed because there is tool to ease and speed up translation, like Virtaal, ResourceBundle editors, or poedit, and they need a standard file format to be usable.  &lt;br /&gt;
* a tool test to see if some entries are not translated (maybe a page that would provide statistics) it might be more useful if UI and data separated&lt;br /&gt;
* keeping glossary for each languages could help (some terms are found at many places)&lt;br /&gt;
* A way to detect incorrect token translation (like using Dager instead of Dagger) is welcome. One way to do this is by generating error or warning when loading the translation file. It would be welcome to generate this list of error without having to launch PCGen, it would also be a nice addition to automatic testing.&lt;br /&gt;
&lt;br /&gt;
=Choices yet to be made=&lt;br /&gt;
&lt;br /&gt;
== Application Packaging ==&lt;br /&gt;
&lt;br /&gt;
As of December 2011, the application and translation of some part of the UI are bundled together.&lt;br /&gt;
&lt;br /&gt;
The question is should the application be bundled this way, or should there be language specific bundles.&lt;br /&gt;
&lt;br /&gt;
Pro of a all-in-one&lt;br /&gt;
* user can change language on the fly&lt;br /&gt;
* no need for explanations on how to install a new language set&lt;br /&gt;
&lt;br /&gt;
Cons&lt;br /&gt;
* file could get quite big&lt;br /&gt;
&lt;br /&gt;
== Genre class names ==&lt;br /&gt;
&lt;br /&gt;
In some languages, the class names can have a genre, like the feminine of priest is priestess in English (even if Cleric is the name of the class, it’s just to illustrate the point). Do we want to use those names in the class names or do we stick to whatever name the class is?&lt;br /&gt;
&lt;br /&gt;
= The goals in more details for PCGen =&lt;br /&gt;
&lt;br /&gt;
== Default language after clean install ==&lt;br /&gt;
&lt;br /&gt;
The language should be the system one. To the user, if doesn’t understand the default language, it will be a pain for him to find the option to change the language.&lt;br /&gt;
It may be even better if the user is prompted with a choice at the start of the program (or at install) in order to simplify this process. It might be displayed only if the system language doesn’t exist in PCGen.&lt;br /&gt;
As noted before, the measure and weight system used need to be chosen by the user at the first install with the default choice depending on the language/locale selected. After first launch or install, the option is changeable in the option preference panel.&lt;br /&gt;
&lt;br /&gt;
After clean install (no preference files):&lt;br /&gt;
# PCGen determine the system language&lt;br /&gt;
# if translation exist (and are believed good enough) switch to that language, if not, display an element to ask the user for the language to use.&lt;br /&gt;
&lt;br /&gt;
== Published language priority ==&lt;br /&gt;
&lt;br /&gt;
* The data that is not translated in a language, for example books not yet translated, should stay in the language it first get out.&lt;br /&gt;
&lt;br /&gt;
Books are almost never instantly translated by companies and some aren’t even translated. PCGen is also short on staff. All that means that the translations will probably be coming far after the original one.&lt;br /&gt;
To an user that only use translated material, it will not be a problem.&lt;br /&gt;
To an user that mix translated material, and not translated one, it shouldn’t become a problem.&lt;br /&gt;
&lt;br /&gt;
== Using different data languages ==&lt;br /&gt;
&lt;br /&gt;
* The data should be the same that the English one to avoid having to duplicate data correction.&lt;br /&gt;
&lt;br /&gt;
Having data in several languages could be a way to do il8n&lt;br /&gt;
&lt;br /&gt;
Cons&lt;br /&gt;
* might need language specific bundles&lt;br /&gt;
* a character used with one language cannot be seen by someone with a different language set&lt;br /&gt;
* multiple corrections needed when correcting a bug (and if automatic generation of the translation is done, why not do it on the fly)&lt;br /&gt;
&lt;br /&gt;
It probably should be avoided to do it that way.&lt;br /&gt;
&lt;br /&gt;
== Separating data and UI translations ==&lt;br /&gt;
&lt;br /&gt;
* The interface language and the data language should be separate to allow people with book in a different language than their own to use the program more simply.&lt;br /&gt;
To the user that speak only one language, it is no advantage nor a problem.&lt;br /&gt;
For a user which use book that are not in the language he is most comfortable with, he would put the UI and the data to different languages. Same for someone who doesn’t use translation of the data but prefer to have a program in a language he is more comfortable with.&lt;br /&gt;
&lt;br /&gt;
== Custom content and localization ==&lt;br /&gt;
&lt;br /&gt;
* It should be possible to use another language in a data to allow non English speaker to develop custom content in another language. That seem to be a problem when combined with separate language from data. A way to avoid it is to provide easy reference to create custom content.&lt;br /&gt;
&lt;br /&gt;
This might be a hard to make real combined with other points.&lt;br /&gt;
&lt;br /&gt;
(might be wrong on this point [[User:Masaru20100|Masaru20100]]) At the moment, when creating custom content, the English token are used. For a non English-speaker, it is a problem, that’s why, ideally, he should be able to create custom by using his own language.&lt;br /&gt;
&lt;br /&gt;
The problem this cause is that if the user change the language of the program, the custom content either doesn’t work anymore, or all possible translations are checked which would cause massive slowness in the software.&lt;br /&gt;
&lt;br /&gt;
As it seams undoable, the user should be provided with way to easily find the needed English token for his custom content.&lt;br /&gt;
&lt;br /&gt;
== Indicating what is translated ==&lt;br /&gt;
&lt;br /&gt;
It would be good to provide the user with visual information of how much a dataset is translated in his language. It is not really a needed feature but could help him. If he knew that all is not translated, he would be less surprised.&lt;br /&gt;
&lt;br /&gt;
=Technical Aspects=&lt;br /&gt;
&lt;br /&gt;
== Language choice UI ==&lt;br /&gt;
&lt;br /&gt;
There is already options to change the language and the weights and measure system used.&lt;br /&gt;
&lt;br /&gt;
It might be best to have a drop down list rather than radio choices. New translation should appear in the list.&lt;br /&gt;
&lt;br /&gt;
== Formatting Issue ==&lt;br /&gt;
&lt;br /&gt;
Martijn pointed that number should be translatable. In Japanese, the classic number system is almost always used especially in RPG. In fact, translating numbers is not needed, what is needed is formatting numbers.&lt;br /&gt;
&lt;br /&gt;
That means that 10000 gets formatted 10,000 in English, 10 000 in French. In Japanese, it would either be 10,000 or 1万. There is even a locale to obtain 一万 if needed.&lt;br /&gt;
&lt;br /&gt;
In Java, this is usually done by using the NumberFormat class with the appropriate locale.&lt;br /&gt;
&lt;br /&gt;
== Sorting Issue ==&lt;br /&gt;
&lt;br /&gt;
Sorting is usually language dependent, meaning that the list of skills for example is not sorted the same way in different languages, even if the name are the same. The differences are usually minor between roman letter using languages.&lt;br /&gt;
&lt;br /&gt;
Actually, the international guys brought up the sorting thing again - another project would be to look into the GUI/core and replacing all the sorting of items with internationalized methods of sorting (Collators).&lt;br /&gt;
&lt;br /&gt;
Technically, Java already provide ways of sorting based on locale, it’s the Collator classes.&lt;br /&gt;
&lt;br /&gt;
== Unique Identifier ==&lt;br /&gt;
&lt;br /&gt;
Apparently there is already unique identifiers in use for items, so the idea would be to have a file with that id as the key and the translation as the value.&lt;br /&gt;
&lt;br /&gt;
== Tom’s technical proposal ==&lt;br /&gt;
&lt;br /&gt;
So looking back at the earlier thread, I never actually came back with my suggestion, so here is my perspective on localization and how it should be done. This has been made easier by some changes we have in the 6.x line, and having new UI (with what I believe to be a lot more isolation of code that does display of items) is a huge boost here to making this practical.&lt;br /&gt;
&lt;br /&gt;
First a few base facts as background:&lt;br /&gt;
# For [almost] every item (Class, Skill, etc.) there is a unique identifier (generally referred to as a Key - note that if the &amp;quot;KEY&amp;quot; token is not used, then the Key is the name (first entry on the line in the data) (There is an exception to this we'll call problem #1)&lt;br /&gt;
# There are basically 4 types of things that need translation:&lt;br /&gt;
## (2a) item names&lt;br /&gt;
## (2b) constants (like spell schools)&lt;br /&gt;
## (2c) variables (like meters/feet/etc.)&lt;br /&gt;
## (2d) Strings (like descriptions)&lt;br /&gt;
## [if anyone can think of more, let me know]&lt;br /&gt;
# Most (but not all) tokens are &amp;quot;unique&amp;quot; or otherwise &amp;quot;addressable&amp;quot; in that they can only occur once per object. (Anyone notice that the tokens have started to be specific in the test code &amp;amp; docs about whether they overwrite, add, etc. - this is one reason why - and yes, I've been slowly trying to make progress on this even in the 2007-2009 work) [The exception to this is problem #2)&lt;br /&gt;
&lt;br /&gt;
A few principles about l10n:&lt;br /&gt;
# We must not make producing a data set materially more complicated than it is today (no requirement to put %L10NNAME% type gunk into data)&lt;br /&gt;
# We should target an ability to tell us if l10n is complete for any given data set&lt;br /&gt;
&lt;br /&gt;
With that:&lt;br /&gt;
* Following from #1, almost everything we have in the data today is &amp;quot;addressable&amp;quot;. By that, I mean that the OUTPUTNAME for a Skill called &amp;quot;FooBar&amp;quot; can be uniquely called out. The name hierarchy is something like: SKILL//Foo//OUTPUTNAME (exceptions are problems #1,2 to be addressed later)&lt;br /&gt;
&lt;br /&gt;
Given that, we can actually set principle #1 to &amp;quot;The data remains unchanged&amp;quot; (again, except for problem #2). The entire data set is produced (assume US English for a moment). We then have a unique file for l10n that has things like:&lt;br /&gt;
* SKILL:FooBar|Oobarf-ay&lt;br /&gt;
* SKILL:FooBar:OUTPUTNAME|ooBarOutF-ay&lt;br /&gt;
* etc.&lt;br /&gt;
&lt;br /&gt;
This (to the first order) covers 2a, 2d.&lt;br /&gt;
&lt;br /&gt;
For 2b items, we simply have to expand the list of items (SKILL, SPELL) that we are familiar with, so we get things like:&lt;br /&gt;
* SPELLSCHOOL:Divination|Ivinationd-ay&lt;br /&gt;
&lt;br /&gt;
2c is a bit more complicated, but I can't believe it's all that bad given it's a thing many applications already do (and it's a known thing)&lt;br /&gt;
&lt;br /&gt;
Each file could be named in such a way that it identifies it's l10n, e.g.:&lt;br /&gt;
* srd_de_ch.l10n&lt;br /&gt;
* ...and probably placed in a L10N subfolder of the initial dataset.&lt;br /&gt;
* (Note I'd recommend we be clear on where these go, AND ALSO require that NO PCC FILES (I'd recommend we say no PCC or LST, but the formal limit would be no PCC) are recognized if they are in the L10N folder... so that the initial directory parse [which is probably one of the slower parts of our boot process] can immediately ignore the l10n directory and not have to look through the file list looking for .PCC files... alternately, we have a l10n folder that is parallel to the data folder, but that then adds complication in needing new preferences to point at multiple l10n folders and requires more complicated structure within that l10n structure to identify WHICH files in that folder map to which datasets... because we can't simply say a given English word will always translate the same way - English is way too overloaded for that.)&lt;br /&gt;
&lt;br /&gt;
I would recommend we keep things in a small subset of files, and not try to do 1:1 for each data file (that would produce a lot of file sprawl) - but that's not my call.&lt;br /&gt;
&lt;br /&gt;
Addressing principle #2:&lt;br /&gt;
* Since we have a set of items we know would need to be covered (names, certain tokens), we should be able to load those into memory, and load the l10n file into memory and compare. This should be able to produce warnings of 2 kinds:&lt;br /&gt;
* (W1) Errors where the base data set contains things that are not translated&lt;br /&gt;
* (W2) Errors where the translation file attempts to translate things not in the base data set&lt;br /&gt;
* I can't imagine that utility is all that hard to write (just would need to make the list of todos)&lt;br /&gt;
&lt;br /&gt;
This brings us to problems #1 and #2:&lt;br /&gt;
&lt;br /&gt;
Problem #1: Non-unique names&lt;br /&gt;
* We glossed over this in 6.x, but the truth is that Spell names are not unique. Some of the *RDs have duplicate names (not all, but I forget which). Same is true for languages.&lt;br /&gt;
* (1a) Spells can theoretically be differentiated by evaluating the &amp;quot;TYPE&amp;quot; token for Divine, Arcane, or Psionic (those are &amp;quot;magical&amp;quot; items in our code.&lt;br /&gt;
* (1b) Languages can theoretically be differentiated between &amp;quot;Spoken&amp;quot; and &amp;quot;Written&amp;quot; as those are &amp;quot;magical&amp;quot; types.&lt;br /&gt;
I believe both of those forms of magic are things on our backlog of FREQs to clean up... and the reason they are on the cleanup list really for L10N (as much as it is to just cleanup the overuse of TYPE)&lt;br /&gt;
&lt;br /&gt;
Problem #2: Non-unique tokens&lt;br /&gt;
* There are only a few tokens that are not unique. DESC is one of them, if I recall correctly. The probably solution here is to simply give an identifier to each token. This might require a change to LST Something like:&lt;br /&gt;
* DESC*Overall:x&lt;br /&gt;
* DESC*Second:x&lt;br /&gt;
* (Note: I'm not sure this syntax works or is by any means &amp;quot;good&amp;quot;. DESC:OVERALL|x might be better as it avoids potential issues with using * as a reserved character - take this is a principle of what would have to happen to DESC token, not as a full-blown proposal)&lt;br /&gt;
&lt;br /&gt;
Note that this naming of each DESC item (And other reusable items), while it breaks the &amp;quot;can't change the data&amp;quot; principle actually helps as much as it hurts... it would give us the ability to do things like:&lt;br /&gt;
* DESC:.CLEARID.Overall&lt;br /&gt;
* or things similar to that, which is actually a neat benefit for the small overhead of pain it puts into datasets. (Which, by the way, could be converted to whatever we decide on anyway with our nifty converter, so this doesn't seem all that bad)&lt;br /&gt;
&lt;br /&gt;
So in my mind, the question really is: Is going slightly more than half way good enough? There are areas where we could do translation, and some areas where we need some pretty material core code changes to support it.&lt;br /&gt;
&lt;br /&gt;
== Translation files ==&lt;br /&gt;
&lt;br /&gt;
Hi Tom,&lt;br /&gt;
&lt;br /&gt;
Welcome BACK!!!&lt;br /&gt;
&lt;br /&gt;
I don't mind the solutions put forth. Unique Identifiers for DESC is no more absurd then the Unique&lt;br /&gt;
Identifiers we'll be needing to use more than one CHOOSER on a single line. Plus, the ability to&lt;br /&gt;
clear off a Section of DESC would be awesome.&lt;br /&gt;
&lt;br /&gt;
I'd vote for as complete a job as possible.&lt;br /&gt;
&lt;br /&gt;
Here is where I'm not understanding - where are we going to put the translation stuff?&lt;br /&gt;
&lt;br /&gt;
thpr wrote:&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Here is where I'm not understanding - where are we going to put the translation stuff?&lt;br /&gt;
&lt;br /&gt;
Idea #1 (bad idea IMHO) is to put it in a separate directory:&lt;br /&gt;
data/srd/...&lt;br /&gt;
l10n/srd/...&lt;br /&gt;
&lt;br /&gt;
The problem with that is that you get into synchronization issues... so any time files/directory names change in one place they have to change in another.  That's a contract on the data developer.  (It would also require multiple l10n directories, since we support multiple data directories, so it's a bunch of code)&lt;br /&gt;
&lt;br /&gt;
Idea #2: Implicit Subdirectories:&lt;br /&gt;
data/srd/*.lst&lt;br /&gt;
data/srd/l10n/*.l10n&lt;br /&gt;
&lt;br /&gt;
That ensures that the l10n directory is associated with the dataset.&lt;br /&gt;
&lt;br /&gt;
Idea #3: Explicit designation:&lt;br /&gt;
data/srd/srd.pcc contains LOCALIZATION:l10n/srd.l10n&lt;br /&gt;
then:&lt;br /&gt;
data/l10n/srd.l10n&lt;br /&gt;
&lt;br /&gt;
(would support more than one .l10n file)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--- In pcgen_international@yahoogroups.com, Martijn Verburg &amp;lt;martijnverburg@...&amp;gt; wrote:&lt;br /&gt;
&amp;gt; &amp;gt; (2) We should target an ability to tell us if l10n is complete for any&lt;br /&gt;
&amp;gt; &amp;gt; given data set&lt;br /&gt;
&amp;gt; &amp;gt;&lt;br /&gt;
&amp;gt; Not sure what you mean by this?&lt;br /&gt;
&lt;br /&gt;
If there is an object called &amp;quot;Dagger&amp;quot; we need to ensure the file contains:&lt;br /&gt;
EQUIPMENT:Dagger|Aggerd-ay&lt;br /&gt;
&lt;br /&gt;
If it contains:&lt;br /&gt;
EQUIPMENT:Dgager|Aggerd-ay&lt;br /&gt;
&lt;br /&gt;
That is also an error (just like the &amp;quot;unconstructed reference&amp;quot; items are errors.  By capturing both type 1 and type 2 error (things that aren't translated as well as things that shouldn't have been translated) we are capturing the vast majority of the simple problems.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Localization]]&lt;/div&gt;</summary>
		<author><name>Masaru20100</name></author>
		
	</entry>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Localization&amp;diff=3129</id>
		<title>Localization</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Localization&amp;diff=3129"/>
		<updated>2012-08-24T16:44:45Z</updated>

		<summary type="html">&lt;p&gt;Masaru20100: /* My Process */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Localization (l8n) is the process of adapting software for its use in a particular location. It can only be done if the software has been [[internationnalized|Internationnalisation]] (i10n). It is mainly translation.&lt;br /&gt;
&lt;br /&gt;
In the case of PCGen, as with other free software, localization can only be done with the help of the community.&lt;br /&gt;
&lt;br /&gt;
PCGen both need translation for its user interface (UI) and its data. The data can not be translated for now (as of August 25th 2012), because the internationnalization for the data is not yet done. On top of it, PCGen data is mostly non-free, so providing translation has legal repercutions.&lt;br /&gt;
&lt;br /&gt;
The translation of the UI is simpler. There is a file for each language, and basically you need to translate all the messages. Beware that, as of August 25th 2012, there is many unused strings in the files.&lt;br /&gt;
&lt;br /&gt;
(eventually write more for beginners in l8n, provide links?)&lt;br /&gt;
&lt;br /&gt;
== My Process ==&lt;br /&gt;
&lt;br /&gt;
By [[User:Masaru20100|Masaru20100]] 03:44, 25 August 2012 (MIST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PCGen uses Java’s ResourceBundle, and use cryptic text as the key of strings (unlike PO that indicate to use ASCII text as keys). It means you need to see two text files at the same time to view original files. Do not edit a copy of another language file, because you’d have a file with a mix of the target language and the copied language, which make it difficult to see what is not yet translated (and also harder to merge). I don’t like the ResourceBundle format because it does not allow me to keep the information that my translations on some strings might not be good. That’s why I keep my main translation in po files and not in bundles.&lt;br /&gt;
&lt;br /&gt;
Each time I update my svn copy, I create a new POT file from the default resource bundle. Then I update my latest po file of the language I’m working on, update it with the POT file and save it with a new name (using the svn version number). I then proceed to edit the po file. I save the file, update the resource bundle in the code directory then (I think its needed to see changes) build pcgen.&lt;br /&gt;
&lt;br /&gt;
To update, I just do&lt;br /&gt;
&lt;br /&gt;
 # svn up&lt;br /&gt;
&lt;br /&gt;
To create the new POT, I use prop2po which is part of the package translate-toolkit on Debian. I have a little script that I usually call with the svn number.&lt;br /&gt;
&lt;br /&gt;
 # newpot 17045&lt;br /&gt;
&lt;br /&gt;
''newpot''&lt;br /&gt;
&lt;br /&gt;
 #!/bin/zsh&lt;br /&gt;
 &lt;br /&gt;
 # argument is name of version&lt;br /&gt;
 if [[ -z $1 ]];&lt;br /&gt;
 then&lt;br /&gt;
         echo Argument needed&lt;br /&gt;
         exit 1&lt;br /&gt;
 else&lt;br /&gt;
         name=.$1&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 # Create the new POT from the Language bundle&lt;br /&gt;
 prop2po ../pcgen-svn/code/src/java/pcgen/resources/lang/LanguageBundle.properties LanguageBundle$name.pot&lt;br /&gt;
 #po2xliff -P LanguageBundle$name.pot LanguageBundle$name.xlf&lt;br /&gt;
&lt;br /&gt;
I use virtaal to open the latest po file, update it with the POT then save it with the new version number (poedit would work fine but doesn’t show the comments in the po file). I then edit the file.&lt;br /&gt;
&lt;br /&gt;
Once my change are done, or I want to view them, I use a script to update the resource bundle file. You’ll have to change the name of the language you’d work with there (fr ja en_GB in my case). It uses po2prop also part of the translate-toolkit package.&lt;br /&gt;
&lt;br /&gt;
 # updatebundle 17045&lt;br /&gt;
&lt;br /&gt;
''updatebundle''&lt;br /&gt;
&lt;br /&gt;
 #!/bin/zsh&lt;br /&gt;
 &lt;br /&gt;
 # argument is name of version&lt;br /&gt;
 if [[ -z $1 ]];&lt;br /&gt;
 then&lt;br /&gt;
         echo Argument needed&lt;br /&gt;
         exit 1&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 # Create the new POT from the Language bundle&lt;br /&gt;
 for lang in fr ja en_GB&lt;br /&gt;
 do&lt;br /&gt;
         if [[ -f LanguageBundle.$1.$lang.po ]];&lt;br /&gt;
         then&lt;br /&gt;
                 po2prop --fuzzy --errorlevel=traceback -t ../pcgen-svn/code/src/java/pcgen/resources/lang/LanguageBundle.properties LanguageBundle.$1.$lang.po ../pcgen-svn/code/src/java/pcgen/resources/lang/LanguageBundle_$lang.properties&lt;br /&gt;
         fi&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
I hope those scripts help some one, you’ll probably need to change them (to fix the path for example).&lt;/div&gt;</summary>
		<author><name>Masaru20100</name></author>
		
	</entry>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Localization&amp;diff=3128</id>
		<title>Localization</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Localization&amp;diff=3128"/>
		<updated>2012-08-24T16:44:11Z</updated>

		<summary type="html">&lt;p&gt;Masaru20100: /* My Process */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Localization (l8n) is the process of adapting software for its use in a particular location. It can only be done if the software has been [[internationnalized|Internationnalisation]] (i10n). It is mainly translation.&lt;br /&gt;
&lt;br /&gt;
In the case of PCGen, as with other free software, localization can only be done with the help of the community.&lt;br /&gt;
&lt;br /&gt;
PCGen both need translation for its user interface (UI) and its data. The data can not be translated for now (as of August 25th 2012), because the internationnalization for the data is not yet done. On top of it, PCGen data is mostly non-free, so providing translation has legal repercutions.&lt;br /&gt;
&lt;br /&gt;
The translation of the UI is simpler. There is a file for each language, and basically you need to translate all the messages. Beware that, as of August 25th 2012, there is many unused strings in the files.&lt;br /&gt;
&lt;br /&gt;
(eventually write more for beginners in l8n, provide links?)&lt;br /&gt;
&lt;br /&gt;
== My Process ==&lt;br /&gt;
&lt;br /&gt;
PCGen uses Java’s ResourceBundle, and use cryptic text as the key of strings (unlike PO that indicate to use ASCII text as keys). It means you need to see two text files at the same time to view original files. Do not edit a copy of another language file, because you’d have a file with a mix of the target language and the copied language, which make it difficult to see what is not yet translated (and also harder to merge). I don’t like the ResourceBundle format because it does not allow me to keep the information that my translations on some strings might not be good. That’s why I keep my main translation in po files and not in bundles.&lt;br /&gt;
&lt;br /&gt;
Each time I update my svn copy, I create a new POT file from the default resource bundle. Then I update my latest po file of the language I’m working on, update it with the POT file and save it with a new name (using the svn version number). I then proceed to edit the po file. I save the file, update the resource bundle in the code directory then (I think its needed to see changes) build pcgen.&lt;br /&gt;
&lt;br /&gt;
To update, I just do&lt;br /&gt;
&lt;br /&gt;
 # svn up&lt;br /&gt;
&lt;br /&gt;
To create the new POT, I use prop2po which is part of the package translate-toolkit on Debian. I have a little script that I usually call with the svn number.&lt;br /&gt;
&lt;br /&gt;
 # newpot 17045&lt;br /&gt;
&lt;br /&gt;
''newpot''&lt;br /&gt;
&lt;br /&gt;
 #!/bin/zsh&lt;br /&gt;
 &lt;br /&gt;
 # argument is name of version&lt;br /&gt;
 if [[ -z $1 ]];&lt;br /&gt;
 then&lt;br /&gt;
         echo Argument needed&lt;br /&gt;
         exit 1&lt;br /&gt;
 else&lt;br /&gt;
         name=.$1&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 # Create the new POT from the Language bundle&lt;br /&gt;
 prop2po ../pcgen-svn/code/src/java/pcgen/resources/lang/LanguageBundle.properties LanguageBundle$name.pot&lt;br /&gt;
 #po2xliff -P LanguageBundle$name.pot LanguageBundle$name.xlf&lt;br /&gt;
&lt;br /&gt;
I use virtaal to open the latest po file, update it with the POT then save it with the new version number (poedit would work fine but doesn’t show the comments in the po file). I then edit the file.&lt;br /&gt;
&lt;br /&gt;
Once my change are done, or I want to view them, I use a script to update the resource bundle file. You’ll have to change the name of the language you’d work with there (fr ja en_GB in my case). It uses po2prop also part of the translate-toolkit package.&lt;br /&gt;
&lt;br /&gt;
 # updatebundle 17045&lt;br /&gt;
&lt;br /&gt;
''updatebundle''&lt;br /&gt;
&lt;br /&gt;
 #!/bin/zsh&lt;br /&gt;
 &lt;br /&gt;
 # argument is name of version&lt;br /&gt;
 if [[ -z $1 ]];&lt;br /&gt;
 then&lt;br /&gt;
         echo Argument needed&lt;br /&gt;
         exit 1&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 # Create the new POT from the Language bundle&lt;br /&gt;
 for lang in fr ja en_GB&lt;br /&gt;
 do&lt;br /&gt;
         if [[ -f LanguageBundle.$1.$lang.po ]];&lt;br /&gt;
         then&lt;br /&gt;
                 po2prop --fuzzy --errorlevel=traceback -t ../pcgen-svn/code/src/java/pcgen/resources/lang/LanguageBundle.properties LanguageBundle.$1.$lang.po ../pcgen-svn/code/src/java/pcgen/resources/lang/LanguageBundle_$lang.properties&lt;br /&gt;
         fi&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
I hope those scripts help some one, you’ll probably need to change them (to fix the path for example).&lt;br /&gt;
&lt;br /&gt;
[[User:Masaru20100|Masaru20100]] 03:44, 25 August 2012 (MIST)&lt;/div&gt;</summary>
		<author><name>Masaru20100</name></author>
		
	</entry>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Localization&amp;diff=3127</id>
		<title>Localization</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Localization&amp;diff=3127"/>
		<updated>2012-08-24T16:43:47Z</updated>

		<summary type="html">&lt;p&gt;Masaru20100: New page on l8n&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Localization (l8n) is the process of adapting software for its use in a particular location. It can only be done if the software has been [[internationnalized|Internationnalisation]] (i10n). It is mainly translation.&lt;br /&gt;
&lt;br /&gt;
In the case of PCGen, as with other free software, localization can only be done with the help of the community.&lt;br /&gt;
&lt;br /&gt;
PCGen both need translation for its user interface (UI) and its data. The data can not be translated for now (as of August 25th 2012), because the internationnalization for the data is not yet done. On top of it, PCGen data is mostly non-free, so providing translation has legal repercutions.&lt;br /&gt;
&lt;br /&gt;
The translation of the UI is simpler. There is a file for each language, and basically you need to translate all the messages. Beware that, as of August 25th 2012, there is many unused strings in the files.&lt;br /&gt;
&lt;br /&gt;
(eventually write more for beginners in l8n, provide links?)&lt;br /&gt;
&lt;br /&gt;
== My Process ==&lt;br /&gt;
&lt;br /&gt;
PCGen uses Java’s ResourceBundle, and use cryptic text as the key of strings (unlike PO that indicate to use ASCII text as keys). It means you need to see two text files at the same time to view original files. Do not edit a copy of another language file, because you’d have a file with a mix of the target language and the copied language, which make it difficult to see what is not yet translated (and also harder to merge). I don’t like the ResourceBundle format because it does not allow me to keep the information that my translations on some strings might not be good. That’s why I keep my main translation in po files and not in bundles.&lt;br /&gt;
&lt;br /&gt;
Each time I update my svn copy, I create a new POT file from the default resource bundle. Then I update my latest po file of the language I’m working on, update it with the POT file and save it with a new name (using the svn version number). I then proceed to edit the po file. I save the file, update the resource bundle in the code directory then (I think its needed to see changes) build pcgen.&lt;br /&gt;
&lt;br /&gt;
To update, I just do&lt;br /&gt;
&lt;br /&gt;
 # svn up&lt;br /&gt;
&lt;br /&gt;
To create the new POT, I use prop2po which is part of the package translate-toolkit on Debian. I have a little script that I usually call with the svn number.&lt;br /&gt;
&lt;br /&gt;
 # newpot 17045&lt;br /&gt;
&lt;br /&gt;
''newpot''&lt;br /&gt;
&lt;br /&gt;
 #!/bin/zsh&lt;br /&gt;
 &lt;br /&gt;
 # argument is name of version&lt;br /&gt;
 if [[ -z $1 ]];&lt;br /&gt;
 then&lt;br /&gt;
         echo Argument needed&lt;br /&gt;
         exit 1&lt;br /&gt;
 else&lt;br /&gt;
         name=.$1&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 # Create the new POT from the Language bundle&lt;br /&gt;
 prop2po ../pcgen-svn/code/src/java/pcgen/resources/lang/LanguageBundle.properties LanguageBundle$name.pot&lt;br /&gt;
 #po2xliff -P LanguageBundle$name.pot LanguageBundle$name.xlf&lt;br /&gt;
&lt;br /&gt;
I use virtaal to open the latest po file, update it with the POT then save it with the new version number (poedit would work fine but doesn’t show the comments in the po file). I then edit the file.&lt;br /&gt;
&lt;br /&gt;
Once my change are done, or I want to view them, I use a script to update the resource bundle file. You’ll have to change the name of the language you’d work with there (fr ja en_GB in my case). It uses po2prop also part of the translate-toolkit package.&lt;br /&gt;
&lt;br /&gt;
 # updatebundle 17045&lt;br /&gt;
&lt;br /&gt;
''updatebundle''&lt;br /&gt;
&lt;br /&gt;
 #!/bin/zsh&lt;br /&gt;
 &lt;br /&gt;
 # argument is name of version&lt;br /&gt;
 if [[ -z $1 ]];&lt;br /&gt;
 then&lt;br /&gt;
         echo Argument needed&lt;br /&gt;
         exit 1&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 # Create the new POT from the Language bundle&lt;br /&gt;
 for lang in fr ja en_GB&lt;br /&gt;
 do&lt;br /&gt;
         if [[ -f LanguageBundle.$1.$lang.po ]];&lt;br /&gt;
         then&lt;br /&gt;
                 po2prop --fuzzy --errorlevel=traceback -t ../pcgen-svn/code/src/java/pcgen/resources/lang/LanguageBundle.properties LanguageBundle.$1.$lang.po ../pcgen-svn/code/src/java/pcgen/resources/lang/LanguageBundle_$lang.properties&lt;br /&gt;
         fi&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
I hope those scripts help some one, you’ll probably need to change them (to fix the path for example).&lt;/div&gt;</summary>
		<author><name>Masaru20100</name></author>
		
	</entry>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Joining_the_Code_Team&amp;diff=3026</id>
		<title>Joining the Code Team</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Joining_the_Code_Team&amp;diff=3026"/>
		<updated>2012-02-16T01:53:26Z</updated>

		<summary type="html">&lt;p&gt;Masaru20100: /* Your first change */ Changed external link to internal one&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
  | __TOC__&lt;br /&gt;
  |}&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
&lt;br /&gt;
A list of what to do to join the code team&lt;br /&gt;
&lt;br /&gt;
=General steps=&lt;br /&gt;
&lt;br /&gt;
# Get a [http://groups.yahoo.com Yahoo Groups] id.&lt;br /&gt;
# Be sure to subscribe to the [http://groups.yahoo.com/group/pcgen_developers/ Developer's mailing list]&lt;br /&gt;
# Introduce yourself on the list&lt;br /&gt;
# Find the [http://games.groups.yahoo.com/group/pcgen/ pcgen] project on Yahoo! Groups and join.&lt;br /&gt;
# Get as many IM IDs as possible (most people use Pidgin, Meebo or Gaim) and get online with them.&lt;br /&gt;
# Also join the IRC channel #pcgen on ~DALnet &amp;amp; ~Freenode, we have our meetings and group discussions there in real time.&lt;br /&gt;
# Get the latest official version of PCGen from SF and run it.&lt;br /&gt;
# Get an id at [http://sourceforge.net sourceforge].&lt;br /&gt;
# Find the [http://sourceforge.net/projects/pcgen pcgen] project.&lt;br /&gt;
&lt;br /&gt;
=Your first change=&lt;br /&gt;
# Get your [[Basic Developer Setup|development environment set up]]&lt;br /&gt;
# Select an issue that interests you, either from our issues flagged as bitseize in the [http://jira.pcgen.org/secure/IssueNavigator.jspa?reset=true&amp;amp;mode=hide&amp;amp;jqlQuery=component+%3D+Bitesize+AND+project+%3D+CODE+AND+resolution+%3D+Unresolved+ORDER+BY+updated+DESC Code] and [http://jira.pcgen.org/secure/IssueNavigator.jspa?reset=true&amp;amp;mode=hide&amp;amp;jqlQuery=component+%3D+Bitesize+AND+project+%3D+NEWTAG+AND+resolution+%3D+Unresolved+ORDER+BY+updated+DESC New Tag] projects, or one you have encountered.&lt;br /&gt;
# Build a fix that fixes the bug or implements the new feature&lt;br /&gt;
# Test the fix, preferably by writing a unit test&lt;br /&gt;
# Send the fix as a patch to the developers list asking for a review.&lt;br /&gt;
# Your patch will be reviewed and friendly feedback provided by one of the team.&lt;br /&gt;
&lt;br /&gt;
=Joining the team=&lt;br /&gt;
&lt;br /&gt;
# Once our patch is accepted, the Code Silverback will add you the project on Sourceforge.&lt;br /&gt;
# Your first check-in will be your fix&lt;br /&gt;
# Your second should be adding your name to the team listing!&lt;br /&gt;
# Put your details in this wiki under the [[Code]] team!&lt;br /&gt;
&lt;br /&gt;
Any questions, don't hesitate to ask!&lt;/div&gt;</summary>
		<author><name>Masaru20100</name></author>
		
	</entry>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Internationalization&amp;diff=2964</id>
		<title>Internationalization</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Internationalization&amp;diff=2964"/>
		<updated>2011-12-19T02:37:12Z</updated>

		<summary type="html">&lt;p&gt;Masaru20100: /* Introduction */ added jira link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
&lt;br /&gt;
PCGen for 6.0+ releases will be attempting Internationalization (probably not in 6.0). Internalization is the process of changing software to allow it to be usable in any language and any locale. It is often abbreviated i18n. It is needed in PCGen because the software was not thought from the ground up to be usable from a language other than English. Localization is the process of creating the translations for a particular language, to do so the software need to able to handle internationalization. To deal with those, a Yahoo group called [http://groups.yahoo.com/group/pcgen_international pcgen_international] has been created.&lt;br /&gt;
&lt;br /&gt;
Requests for translations, problems with translations, and drafts of translated data sets or other translated content, as well as anything coming up with the Internationalization of PCGen are to be discussed in that group.&lt;br /&gt;
&lt;br /&gt;
Anybody interested to help out with translations to other languages, but also those who are just interested in the discussion of the matter, please join the group. Those interested in joining our efforts on the Internationalization of PCGen, please make yourself known on that list.&lt;br /&gt;
&lt;br /&gt;
This page is an attempt to regroup the information discussed on the list.&lt;br /&gt;
&lt;br /&gt;
There is a JIRA issue to regroup work on i18n: http://jira.pcgen.org/browse/CODE-733&lt;br /&gt;
&lt;br /&gt;
=Goal=&lt;br /&gt;
&lt;br /&gt;
The goal is to allow a user that doesn’t speak English to use the program in his native language with the specifics of his locale. This is an ideal goal, as it is not possible to provide all possible localizations with the low number of volunteers. What is needed is to provide the means for people to create localizations, in order to be able to do that, PCGen must be fully internationalized. Once this is done, the number of localization will slowly grow.&lt;br /&gt;
&lt;br /&gt;
PCGen interface, especially the part that are data set independent, are already internationalized and partially translated. Updating those translations is one of the needed step but not the only one.&lt;br /&gt;
Another element is already internationalized, it’s the use of imperial or metric distance. There is also an option to change it.&lt;br /&gt;
&lt;br /&gt;
Other steps are need to attain internationalization.&lt;br /&gt;
&lt;br /&gt;
* First the '''installation process''' should be detailed in many languages, even if it’s only expanding a compressed file then using a script to launch the program.&lt;br /&gt;
* All program '''UI strings''' should also be translatable, and so are the '''data strings'''. It seems that the non data strings are already translatable.&lt;br /&gt;
* The skills should be '''sorted''' in the UI and in the output sheet according to the natural sorting of the language.&lt;br /&gt;
* The '''output sheets''' should be in the user’s language too.&lt;br /&gt;
* In case the user create it’s own translation, it should be possible to add the language in the option pane without having to compile the program (or worse have to change some code!). From a technical point of view, it also means that the translations should be external to the jar, or that a simple way to add a translation provided.&lt;br /&gt;
&lt;br /&gt;
* Saved characters are usually reusable with a new version of the program, and the il8n should not change that. (technical: the saved elements should stay the same, should probably be keys of some sort — I have no idea what the pcg files are)&lt;br /&gt;
&lt;br /&gt;
* It would be better for the '''measure and weights system''' to be initially set to a logical value rather than a set one, it would depend on the first chosen locale. It is also needed to verify that the imperial and metric system option are actually working.&lt;br /&gt;
&lt;br /&gt;
There is also other elements that would improve usability for the user, mainly that '''help/documentation''' would be available in his language. This is usually big work to be achieve but doesn’t need any change in PCGen.&lt;br /&gt;
Another linked part is to be able to handle '''bug report''' in another language. To do that, the project need some people that would translate the bug reports to English before the development team is able to handle the bug reports. &lt;br /&gt;
&lt;br /&gt;
= Tools for internationalization and localization =&lt;br /&gt;
&lt;br /&gt;
To facilitate the internationalization and localization, some tools would be welcome. This tools are not necessary for the user, but are a great addition to maintainers.&lt;br /&gt;
&lt;br /&gt;
For internationalization:&lt;br /&gt;
* a way to determine which strings are translatable or not. Some IDE and some code quality library provide this kind of tool.&lt;br /&gt;
* a tool to eliminate (or point at) line that are not used any more in the main bundle file (it is quite big and there seems to bit not displayed text)&lt;br /&gt;
&lt;br /&gt;
For localization,&lt;br /&gt;
* If a specific way of storing the data translation is used, a tool to produce and update a more standard file would be needed. In free project, gettext files (POT, PO) are often used. In Java, ResourceBundle are often used. Another standard format is XLIFF. Such a tool would be able to add new needed translation to a file of the standard format, and flag old translations. From the standard format, it would update the translation of the specific format file. This is needed because there is tool to ease and speed up translation, like Virtaal, ResourceBundle editors, or poedit, and they need a standard file format to be usable.  &lt;br /&gt;
* a tool test to see if some entries are not translated (maybe a page that would provide statistics) it might be more useful if UI and data separated&lt;br /&gt;
* keeping glossary for each languages could help (some terms are found at many places)&lt;br /&gt;
* A way to detect incorrect token translation (like using Dager instead of Dagger) is welcome. One way to do this is by generating error or warning when loading the translation file. It would be welcome to generate this list of error without having to launch PCGen, it would also be a nice addition to automatic testing.&lt;br /&gt;
&lt;br /&gt;
=Choices yet to be made=&lt;br /&gt;
&lt;br /&gt;
== Application Packaging ==&lt;br /&gt;
&lt;br /&gt;
As of December 2011, the application and translation of some part of the UI are bundled together.&lt;br /&gt;
&lt;br /&gt;
The question is should the application be bundled this way, or should there be language specific bundles.&lt;br /&gt;
&lt;br /&gt;
Pro of a all-in-one&lt;br /&gt;
* user can change language on the fly&lt;br /&gt;
* no need for explanations on how to install a new language set&lt;br /&gt;
&lt;br /&gt;
Cons&lt;br /&gt;
* file could get quite big&lt;br /&gt;
&lt;br /&gt;
== Genre class names ==&lt;br /&gt;
&lt;br /&gt;
In some languages, the class names can have a genre, like the feminine of priest is priestess in English (even if Cleric is the name of the class, it’s just to illustrate the point). Do we want to use those names in the class names or do we stick to whatever name the class is?&lt;br /&gt;
&lt;br /&gt;
= The goals in more details for PCGen =&lt;br /&gt;
&lt;br /&gt;
== Default language after clean install ==&lt;br /&gt;
&lt;br /&gt;
The language should be the system one. To the user, if doesn’t understand the default language, it will be a pain for him to find the option to change the language.&lt;br /&gt;
It may be even better if the user is prompted with a choice at the start of the program (or at install) in order to simplify this process. It might be displayed only if the system language doesn’t exist in PCGen.&lt;br /&gt;
As noted before, the measure and weight system used need to be chosen by the user at the first install with the default choice depending on the language/locale selected. After first launch or install, the option is changeable in the option preference panel.&lt;br /&gt;
&lt;br /&gt;
After clean install (no preference files):&lt;br /&gt;
# PCGen determine the system language&lt;br /&gt;
# if translation exist (and are believed good enough) switch to that language, if not, display an element to ask the user for the language to use.&lt;br /&gt;
&lt;br /&gt;
== Published language priority ==&lt;br /&gt;
&lt;br /&gt;
* The data that is not translated in a language, for example books not yet translated, should stay in the language it first get out.&lt;br /&gt;
&lt;br /&gt;
Books are almost never instantly translated by companies and some aren’t even translated. PCGen is also short on staff. All that means that the translations will probably be coming far after the original one.&lt;br /&gt;
To an user that only use translated material, it will not be a problem.&lt;br /&gt;
To an user that mix translated material, and not translated one, it shouldn’t become a problem.&lt;br /&gt;
&lt;br /&gt;
== Using different data languages ==&lt;br /&gt;
&lt;br /&gt;
* The data should be the same that the English one to avoid having to duplicate data correction.&lt;br /&gt;
&lt;br /&gt;
Having data in several languages could be a way to do il8n&lt;br /&gt;
&lt;br /&gt;
Cons&lt;br /&gt;
* might need language specific bundles&lt;br /&gt;
* a character used with one language cannot be seen by someone with a different language set&lt;br /&gt;
* multiple corrections needed when correcting a bug (and if automatic generation of the translation is done, why not do it on the fly)&lt;br /&gt;
&lt;br /&gt;
It probably should be avoided to do it that way.&lt;br /&gt;
&lt;br /&gt;
== Separating data and UI translations ==&lt;br /&gt;
&lt;br /&gt;
* The interface language and the data language should be separate to allow people with book in a different language than their own to use the program more simply.&lt;br /&gt;
To the user that speak only one language, it is no advantage nor a problem.&lt;br /&gt;
For a user which use book that are not in the language he is most comfortable with, he would put the UI and the data to different languages. Same for someone who doesn’t use translation of the data but prefer to have a program in a language he is more comfortable with.&lt;br /&gt;
&lt;br /&gt;
== Custom content and localization ==&lt;br /&gt;
&lt;br /&gt;
* It should be possible to use another language in a data to allow non English speaker to develop custom content in another language. That seem to be a problem when combined with separate language from data. A way to avoid it is to provide easy reference to create custom content.&lt;br /&gt;
&lt;br /&gt;
This might be a hard to make real combined with other points.&lt;br /&gt;
&lt;br /&gt;
(might be wrong on this point [[User:Masaru20100|Masaru20100]]) At the moment, when creating custom content, the English token are used. For a non English-speaker, it is a problem, that’s why, ideally, he should be able to create custom by using his own language.&lt;br /&gt;
&lt;br /&gt;
The problem this cause is that if the user change the language of the program, the custom content either doesn’t work anymore, or all possible translations are checked which would cause massive slowness in the software.&lt;br /&gt;
&lt;br /&gt;
As it seams undoable, the user should be provided with way to easily find the needed English token for his custom content.&lt;br /&gt;
&lt;br /&gt;
== Indicating what is translated ==&lt;br /&gt;
&lt;br /&gt;
It would be good to provide the user with visual information of how much a dataset is translated in his language. It is not really a needed feature but could help him. If he knew that all is not translated, he would be less surprised.&lt;br /&gt;
&lt;br /&gt;
=Technical Aspects=&lt;br /&gt;
&lt;br /&gt;
== Language choice UI ==&lt;br /&gt;
&lt;br /&gt;
There is already options to change the language and the weights and measure system used.&lt;br /&gt;
&lt;br /&gt;
It might be best to have a drop down list rather than radio choices. New translation should appear in the list.&lt;br /&gt;
&lt;br /&gt;
== Formatting Issue ==&lt;br /&gt;
&lt;br /&gt;
Martijn pointed that number should be translatable. In Japanese, the classic number system is almost always used especially in RPG. In fact, translating numbers is not needed, what is needed is formatting numbers.&lt;br /&gt;
&lt;br /&gt;
That means that 10000 gets formatted 10,000 in English, 10 000 in French. In Japanese, it would either be 10,000 or 1万. There is even a locale to obtain 一万 if needed.&lt;br /&gt;
&lt;br /&gt;
In Java, this is usually done by using the NumberFormat class with the appropriate locale.&lt;br /&gt;
&lt;br /&gt;
== Sorting Issue ==&lt;br /&gt;
&lt;br /&gt;
Sorting is usually language dependent, meaning that the list of skills for example is not sorted the same way in different languages, even if the name are the same. The differences are usually minor between roman letter using languages.&lt;br /&gt;
&lt;br /&gt;
Actually, the international guys brought up the sorting thing again - another project would be to look into the GUI/core and replacing all the sorting of items with internationalized methods of sorting (Collators).&lt;br /&gt;
&lt;br /&gt;
Technically, Java already provide ways of sorting based on locale, it’s the Collator classes.&lt;br /&gt;
&lt;br /&gt;
== Unique Identifier ==&lt;br /&gt;
&lt;br /&gt;
Apparently there is already unique identifiers in use for items, so the idea would be to have a file with that id as the key and the translation as the value.&lt;br /&gt;
&lt;br /&gt;
== Tom’s technical proposal ==&lt;br /&gt;
&lt;br /&gt;
So looking back at the earlier thread, I never actually came back with my suggestion, so here is my perspective on localization and how it should be done. This has been made easier by some changes we have in the 6.x line, and having new UI (with what I believe to be a lot more isolation of code that does display of items) is a huge boost here to making this practical.&lt;br /&gt;
&lt;br /&gt;
First a few base facts as background:&lt;br /&gt;
# For [almost] every item (Class, Skill, etc.) there is a unique identifier (generally referred to as a Key - note that if the &amp;quot;KEY&amp;quot; token is not used, then the Key is the name (first entry on the line in the data) (There is an exception to this we'll call problem #1)&lt;br /&gt;
# There are basically 4 types of things that need translation:&lt;br /&gt;
## (2a) item names&lt;br /&gt;
## (2b) constants (like spell schools)&lt;br /&gt;
## (2c) variables (like meters/feet/etc.)&lt;br /&gt;
## (2d) Strings (like descriptions)&lt;br /&gt;
## [if anyone can think of more, let me know]&lt;br /&gt;
# Most (but not all) tokens are &amp;quot;unique&amp;quot; or otherwise &amp;quot;addressable&amp;quot; in that they can only occur once per object. (Anyone notice that the tokens have started to be specific in the test code &amp;amp; docs about whether they overwrite, add, etc. - this is one reason why - and yes, I've been slowly trying to make progress on this even in the 2007-2009 work) [The exception to this is problem #2)&lt;br /&gt;
&lt;br /&gt;
A few principles about l10n:&lt;br /&gt;
# We must not make producing a data set materially more complicated than it is today (no requirement to put %L10NNAME% type gunk into data)&lt;br /&gt;
# We should target an ability to tell us if l10n is complete for any given data set&lt;br /&gt;
&lt;br /&gt;
With that:&lt;br /&gt;
* Following from #1, almost everything we have in the data today is &amp;quot;addressable&amp;quot;. By that, I mean that the OUTPUTNAME for a Skill called &amp;quot;FooBar&amp;quot; can be uniquely called out. The name hierarchy is something like: SKILL//Foo//OUTPUTNAME (exceptions are problems #1,2 to be addressed later)&lt;br /&gt;
&lt;br /&gt;
Given that, we can actually set principle #1 to &amp;quot;The data remains unchanged&amp;quot; (again, except for problem #2). The entire data set is produced (assume US English for a moment). We then have a unique file for l10n that has things like:&lt;br /&gt;
* SKILL:FooBar|Oobarf-ay&lt;br /&gt;
* SKILL:FooBar:OUTPUTNAME|ooBarOutF-ay&lt;br /&gt;
* etc.&lt;br /&gt;
&lt;br /&gt;
This (to the first order) covers 2a, 2d.&lt;br /&gt;
&lt;br /&gt;
For 2b items, we simply have to expand the list of items (SKILL, SPELL) that we are familiar with, so we get things like:&lt;br /&gt;
* SPELLSCHOOL:Divination|Ivinationd-ay&lt;br /&gt;
&lt;br /&gt;
2c is a bit more complicated, but I can't believe it's all that bad given it's a thing many applications already do (and it's a known thing)&lt;br /&gt;
&lt;br /&gt;
Each file could be named in such a way that it identifies it's l10n, e.g.:&lt;br /&gt;
* srd_de_ch.l10n&lt;br /&gt;
* ...and probably placed in a L10N subfolder of the initial dataset.&lt;br /&gt;
* (Note I'd recommend we be clear on where these go, AND ALSO require that NO PCC FILES (I'd recommend we say no PCC or LST, but the formal limit would be no PCC) are recognized if they are in the L10N folder... so that the initial directory parse [which is probably one of the slower parts of our boot process] can immediately ignore the l10n directory and not have to look through the file list looking for .PCC files... alternately, we have a l10n folder that is parallel to the data folder, but that then adds complication in needing new preferences to point at multiple l10n folders and requires more complicated structure within that l10n structure to identify WHICH files in that folder map to which datasets... because we can't simply say a given English word will always translate the same way - English is way too overloaded for that.)&lt;br /&gt;
&lt;br /&gt;
I would recommend we keep things in a small subset of files, and not try to do 1:1 for each data file (that would produce a lot of file sprawl) - but that's not my call.&lt;br /&gt;
&lt;br /&gt;
Addressing principle #2:&lt;br /&gt;
* Since we have a set of items we know would need to be covered (names, certain tokens), we should be able to load those into memory, and load the l10n file into memory and compare. This should be able to produce warnings of 2 kinds:&lt;br /&gt;
* (W1) Errors where the base data set contains things that are not translated&lt;br /&gt;
* (W2) Errors where the translation file attempts to translate things not in the base data set&lt;br /&gt;
* I can't imagine that utility is all that hard to write (just would need to make the list of todos)&lt;br /&gt;
&lt;br /&gt;
This brings us to problems #1 and #2:&lt;br /&gt;
&lt;br /&gt;
Problem #1: Non-unique names&lt;br /&gt;
* We glossed over this in 6.x, but the truth is that Spell names are not unique. Some of the *RDs have duplicate names (not all, but I forget which). Same is true for languages.&lt;br /&gt;
* (1a) Spells can theoretically be differentiated by evaluating the &amp;quot;TYPE&amp;quot; token for Divine, Arcane, or Psionic (those are &amp;quot;magical&amp;quot; items in our code.&lt;br /&gt;
* (1b) Languages can theoretically be differentiated between &amp;quot;Spoken&amp;quot; and &amp;quot;Written&amp;quot; as those are &amp;quot;magical&amp;quot; types.&lt;br /&gt;
I believe both of those forms of magic are things on our backlog of FREQs to clean up... and the reason they are on the cleanup list really for L10N (as much as it is to just cleanup the overuse of TYPE)&lt;br /&gt;
&lt;br /&gt;
Problem #2: Non-unique tokens&lt;br /&gt;
* There are only a few tokens that are not unique. DESC is one of them, if I recall correctly. The probably solution here is to simply give an identifier to each token. This might require a change to LST Something like:&lt;br /&gt;
* DESC*Overall:x&lt;br /&gt;
* DESC*Second:x&lt;br /&gt;
* (Note: I'm not sure this syntax works or is by any means &amp;quot;good&amp;quot;. DESC:OVERALL|x might be better as it avoids potential issues with using * as a reserved character - take this is a principle of what would have to happen to DESC token, not as a full-blown proposal)&lt;br /&gt;
&lt;br /&gt;
Note that this naming of each DESC item (And other reusable items), while it breaks the &amp;quot;can't change the data&amp;quot; principle actually helps as much as it hurts... it would give us the ability to do things like:&lt;br /&gt;
* DESC:.CLEARID.Overall&lt;br /&gt;
* or things similar to that, which is actually a neat benefit for the small overhead of pain it puts into datasets. (Which, by the way, could be converted to whatever we decide on anyway with our nifty converter, so this doesn't seem all that bad)&lt;br /&gt;
&lt;br /&gt;
So in my mind, the question really is: Is going slightly more than half way good enough? There are areas where we could do translation, and some areas where we need some pretty material core code changes to support it.&lt;br /&gt;
&lt;br /&gt;
== Translation files ==&lt;br /&gt;
&lt;br /&gt;
Hi Tom,&lt;br /&gt;
&lt;br /&gt;
Welcome BACK!!!&lt;br /&gt;
&lt;br /&gt;
I don't mind the solutions put forth. Unique Identifiers for DESC is no more absurd then the Unique&lt;br /&gt;
Identifiers we'll be needing to use more than one CHOOSER on a single line. Plus, the ability to&lt;br /&gt;
clear off a Section of DESC would be awesome.&lt;br /&gt;
&lt;br /&gt;
I'd vote for as complete a job as possible.&lt;br /&gt;
&lt;br /&gt;
Here is where I'm not understanding - where are we going to put the translation stuff?&lt;br /&gt;
&lt;br /&gt;
thpr wrote:&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Here is where I'm not understanding - where are we going to put the translation stuff?&lt;br /&gt;
&lt;br /&gt;
Idea #1 (bad idea IMHO) is to put it in a separate directory:&lt;br /&gt;
data/srd/...&lt;br /&gt;
l10n/srd/...&lt;br /&gt;
&lt;br /&gt;
The problem with that is that you get into synchronization issues... so any time files/directory names change in one place they have to change in another.  That's a contract on the data developer.  (It would also require multiple l10n directories, since we support multiple data directories, so it's a bunch of code)&lt;br /&gt;
&lt;br /&gt;
Idea #2: Implicit Subdirectories:&lt;br /&gt;
data/srd/*.lst&lt;br /&gt;
data/srd/l10n/*.l10n&lt;br /&gt;
&lt;br /&gt;
That ensures that the l10n directory is associated with the dataset.&lt;br /&gt;
&lt;br /&gt;
Idea #3: Explicit designation:&lt;br /&gt;
data/srd/srd.pcc contains LOCALIZATION:l10n/srd.l10n&lt;br /&gt;
then:&lt;br /&gt;
data/l10n/srd.l10n&lt;br /&gt;
&lt;br /&gt;
(would support more than one .l10n file)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--- In pcgen_international@yahoogroups.com, Martijn Verburg &amp;lt;martijnverburg@...&amp;gt; wrote:&lt;br /&gt;
&amp;gt; &amp;gt; (2) We should target an ability to tell us if l10n is complete for any&lt;br /&gt;
&amp;gt; &amp;gt; given data set&lt;br /&gt;
&amp;gt; &amp;gt;&lt;br /&gt;
&amp;gt; Not sure what you mean by this?&lt;br /&gt;
&lt;br /&gt;
If there is an object called &amp;quot;Dagger&amp;quot; we need to ensure the file contains:&lt;br /&gt;
EQUIPMENT:Dagger|Aggerd-ay&lt;br /&gt;
&lt;br /&gt;
If it contains:&lt;br /&gt;
EQUIPMENT:Dgager|Aggerd-ay&lt;br /&gt;
&lt;br /&gt;
That is also an error (just like the &amp;quot;unconstructed reference&amp;quot; items are errors.  By capturing both type 1 and type 2 error (things that aren't translated as well as things that shouldn't have been translated) we are capturing the vast majority of the simple problems.&lt;/div&gt;</summary>
		<author><name>Masaru20100</name></author>
		
	</entry>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Talk:Internationalization&amp;diff=2963</id>
		<title>Talk:Internationalization</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Talk:Internationalization&amp;diff=2963"/>
		<updated>2011-12-19T02:30:25Z</updated>

		<summary type="html">&lt;p&gt;Masaru20100: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Masaru20100</name></author>
		
	</entry>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Internationalization&amp;diff=2962</id>
		<title>Internationalization</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Internationalization&amp;diff=2962"/>
		<updated>2011-12-19T02:29:51Z</updated>

		<summary type="html">&lt;p&gt;Masaru20100: Updated from PCGen i18n list&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
&lt;br /&gt;
PCGen for 6.0+ releases will be attempting Internationalization (probably not in 6.0). Internalization is the process of changing software to allow it to be usable in any language and any locale. It is often abbreviated i18n. It is needed in PCGen because the software was not thought from the ground up to be usable from a language other than English. Localization is the process of creating the translations for a particular language, to do so the software need to able to handle internationalization. To deal with those, a Yahoo group called [http://groups.yahoo.com/group/pcgen_international pcgen_international] has been created.&lt;br /&gt;
&lt;br /&gt;
Requests for translations, problems with translations, and drafts of translated data sets or other translated content, as well as anything coming up with the Internationalization of PCGen are to be discussed in that group.&lt;br /&gt;
&lt;br /&gt;
Anybody interested to help out with translations to other languages, but also those who are just interested in the discussion of the matter, please join the group. Those interested in joining our efforts on the Internationalization of PCGen, please make yourself known on that list.&lt;br /&gt;
&lt;br /&gt;
This page is an attempt to regroup the information discussed on the list.&lt;br /&gt;
&lt;br /&gt;
=Goal=&lt;br /&gt;
&lt;br /&gt;
The goal is to allow a user that doesn’t speak English to use the program in his native language with the specifics of his locale. This is an ideal goal, as it is not possible to provide all possible localizations with the low number of volunteers. What is needed is to provide the means for people to create localizations, in order to be able to do that, PCGen must be fully internationalized. Once this is done, the number of localization will slowly grow.&lt;br /&gt;
&lt;br /&gt;
PCGen interface, especially the part that are data set independent, are already internationalized and partially translated. Updating those translations is one of the needed step but not the only one.&lt;br /&gt;
Another element is already internationalized, it’s the use of imperial or metric distance. There is also an option to change it.&lt;br /&gt;
&lt;br /&gt;
Other steps are need to attain internationalization.&lt;br /&gt;
&lt;br /&gt;
* First the '''installation process''' should be detailed in many languages, even if it’s only expanding a compressed file then using a script to launch the program.&lt;br /&gt;
* All program '''UI strings''' should also be translatable, and so are the '''data strings'''. It seems that the non data strings are already translatable.&lt;br /&gt;
* The skills should be '''sorted''' in the UI and in the output sheet according to the natural sorting of the language.&lt;br /&gt;
* The '''output sheets''' should be in the user’s language too.&lt;br /&gt;
* In case the user create it’s own translation, it should be possible to add the language in the option pane without having to compile the program (or worse have to change some code!). From a technical point of view, it also means that the translations should be external to the jar, or that a simple way to add a translation provided.&lt;br /&gt;
&lt;br /&gt;
* Saved characters are usually reusable with a new version of the program, and the il8n should not change that. (technical: the saved elements should stay the same, should probably be keys of some sort — I have no idea what the pcg files are)&lt;br /&gt;
&lt;br /&gt;
* It would be better for the '''measure and weights system''' to be initially set to a logical value rather than a set one, it would depend on the first chosen locale. It is also needed to verify that the imperial and metric system option are actually working.&lt;br /&gt;
&lt;br /&gt;
There is also other elements that would improve usability for the user, mainly that '''help/documentation''' would be available in his language. This is usually big work to be achieve but doesn’t need any change in PCGen.&lt;br /&gt;
Another linked part is to be able to handle '''bug report''' in another language. To do that, the project need some people that would translate the bug reports to English before the development team is able to handle the bug reports. &lt;br /&gt;
&lt;br /&gt;
= Tools for internationalization and localization =&lt;br /&gt;
&lt;br /&gt;
To facilitate the internationalization and localization, some tools would be welcome. This tools are not necessary for the user, but are a great addition to maintainers.&lt;br /&gt;
&lt;br /&gt;
For internationalization:&lt;br /&gt;
* a way to determine which strings are translatable or not. Some IDE and some code quality library provide this kind of tool.&lt;br /&gt;
* a tool to eliminate (or point at) line that are not used any more in the main bundle file (it is quite big and there seems to bit not displayed text)&lt;br /&gt;
&lt;br /&gt;
For localization,&lt;br /&gt;
* If a specific way of storing the data translation is used, a tool to produce and update a more standard file would be needed. In free project, gettext files (POT, PO) are often used. In Java, ResourceBundle are often used. Another standard format is XLIFF. Such a tool would be able to add new needed translation to a file of the standard format, and flag old translations. From the standard format, it would update the translation of the specific format file. This is needed because there is tool to ease and speed up translation, like Virtaal, ResourceBundle editors, or poedit, and they need a standard file format to be usable.  &lt;br /&gt;
* a tool test to see if some entries are not translated (maybe a page that would provide statistics) it might be more useful if UI and data separated&lt;br /&gt;
* keeping glossary for each languages could help (some terms are found at many places)&lt;br /&gt;
* A way to detect incorrect token translation (like using Dager instead of Dagger) is welcome. One way to do this is by generating error or warning when loading the translation file. It would be welcome to generate this list of error without having to launch PCGen, it would also be a nice addition to automatic testing.&lt;br /&gt;
&lt;br /&gt;
=Choices yet to be made=&lt;br /&gt;
&lt;br /&gt;
== Application Packaging ==&lt;br /&gt;
&lt;br /&gt;
As of December 2011, the application and translation of some part of the UI are bundled together.&lt;br /&gt;
&lt;br /&gt;
The question is should the application be bundled this way, or should there be language specific bundles.&lt;br /&gt;
&lt;br /&gt;
Pro of a all-in-one&lt;br /&gt;
* user can change language on the fly&lt;br /&gt;
* no need for explanations on how to install a new language set&lt;br /&gt;
&lt;br /&gt;
Cons&lt;br /&gt;
* file could get quite big&lt;br /&gt;
&lt;br /&gt;
== Genre class names ==&lt;br /&gt;
&lt;br /&gt;
In some languages, the class names can have a genre, like the feminine of priest is priestess in English (even if Cleric is the name of the class, it’s just to illustrate the point). Do we want to use those names in the class names or do we stick to whatever name the class is?&lt;br /&gt;
&lt;br /&gt;
= The goals in more details for PCGen =&lt;br /&gt;
&lt;br /&gt;
== Default language after clean install ==&lt;br /&gt;
&lt;br /&gt;
The language should be the system one. To the user, if doesn’t understand the default language, it will be a pain for him to find the option to change the language.&lt;br /&gt;
It may be even better if the user is prompted with a choice at the start of the program (or at install) in order to simplify this process. It might be displayed only if the system language doesn’t exist in PCGen.&lt;br /&gt;
As noted before, the measure and weight system used need to be chosen by the user at the first install with the default choice depending on the language/locale selected. After first launch or install, the option is changeable in the option preference panel.&lt;br /&gt;
&lt;br /&gt;
After clean install (no preference files):&lt;br /&gt;
# PCGen determine the system language&lt;br /&gt;
# if translation exist (and are believed good enough) switch to that language, if not, display an element to ask the user for the language to use.&lt;br /&gt;
&lt;br /&gt;
== Published language priority ==&lt;br /&gt;
&lt;br /&gt;
* The data that is not translated in a language, for example books not yet translated, should stay in the language it first get out.&lt;br /&gt;
&lt;br /&gt;
Books are almost never instantly translated by companies and some aren’t even translated. PCGen is also short on staff. All that means that the translations will probably be coming far after the original one.&lt;br /&gt;
To an user that only use translated material, it will not be a problem.&lt;br /&gt;
To an user that mix translated material, and not translated one, it shouldn’t become a problem.&lt;br /&gt;
&lt;br /&gt;
== Using different data languages ==&lt;br /&gt;
&lt;br /&gt;
* The data should be the same that the English one to avoid having to duplicate data correction.&lt;br /&gt;
&lt;br /&gt;
Having data in several languages could be a way to do il8n&lt;br /&gt;
&lt;br /&gt;
Cons&lt;br /&gt;
* might need language specific bundles&lt;br /&gt;
* a character used with one language cannot be seen by someone with a different language set&lt;br /&gt;
* multiple corrections needed when correcting a bug (and if automatic generation of the translation is done, why not do it on the fly)&lt;br /&gt;
&lt;br /&gt;
It probably should be avoided to do it that way.&lt;br /&gt;
&lt;br /&gt;
== Separating data and UI translations ==&lt;br /&gt;
&lt;br /&gt;
* The interface language and the data language should be separate to allow people with book in a different language than their own to use the program more simply.&lt;br /&gt;
To the user that speak only one language, it is no advantage nor a problem.&lt;br /&gt;
For a user which use book that are not in the language he is most comfortable with, he would put the UI and the data to different languages. Same for someone who doesn’t use translation of the data but prefer to have a program in a language he is more comfortable with.&lt;br /&gt;
&lt;br /&gt;
== Custom content and localization ==&lt;br /&gt;
&lt;br /&gt;
* It should be possible to use another language in a data to allow non English speaker to develop custom content in another language. That seem to be a problem when combined with separate language from data. A way to avoid it is to provide easy reference to create custom content.&lt;br /&gt;
&lt;br /&gt;
This might be a hard to make real combined with other points.&lt;br /&gt;
&lt;br /&gt;
(might be wrong on this point [[User:Masaru20100|Masaru20100]]) At the moment, when creating custom content, the English token are used. For a non English-speaker, it is a problem, that’s why, ideally, he should be able to create custom by using his own language.&lt;br /&gt;
&lt;br /&gt;
The problem this cause is that if the user change the language of the program, the custom content either doesn’t work anymore, or all possible translations are checked which would cause massive slowness in the software.&lt;br /&gt;
&lt;br /&gt;
As it seams undoable, the user should be provided with way to easily find the needed English token for his custom content.&lt;br /&gt;
&lt;br /&gt;
== Indicating what is translated ==&lt;br /&gt;
&lt;br /&gt;
It would be good to provide the user with visual information of how much a dataset is translated in his language. It is not really a needed feature but could help him. If he knew that all is not translated, he would be less surprised.&lt;br /&gt;
&lt;br /&gt;
=Technical Aspects=&lt;br /&gt;
&lt;br /&gt;
== Language choice UI ==&lt;br /&gt;
&lt;br /&gt;
There is already options to change the language and the weights and measure system used.&lt;br /&gt;
&lt;br /&gt;
It might be best to have a drop down list rather than radio choices. New translation should appear in the list.&lt;br /&gt;
&lt;br /&gt;
== Formatting Issue ==&lt;br /&gt;
&lt;br /&gt;
Martijn pointed that number should be translatable. In Japanese, the classic number system is almost always used especially in RPG. In fact, translating numbers is not needed, what is needed is formatting numbers.&lt;br /&gt;
&lt;br /&gt;
That means that 10000 gets formatted 10,000 in English, 10 000 in French. In Japanese, it would either be 10,000 or 1万. There is even a locale to obtain 一万 if needed.&lt;br /&gt;
&lt;br /&gt;
In Java, this is usually done by using the NumberFormat class with the appropriate locale.&lt;br /&gt;
&lt;br /&gt;
== Sorting Issue ==&lt;br /&gt;
&lt;br /&gt;
Sorting is usually language dependent, meaning that the list of skills for example is not sorted the same way in different languages, even if the name are the same. The differences are usually minor between roman letter using languages.&lt;br /&gt;
&lt;br /&gt;
Actually, the international guys brought up the sorting thing again - another project would be to look into the GUI/core and replacing all the sorting of items with internationalized methods of sorting (Collators).&lt;br /&gt;
&lt;br /&gt;
Technically, Java already provide ways of sorting based on locale, it’s the Collator classes.&lt;br /&gt;
&lt;br /&gt;
== Unique Identifier ==&lt;br /&gt;
&lt;br /&gt;
Apparently there is already unique identifiers in use for items, so the idea would be to have a file with that id as the key and the translation as the value.&lt;br /&gt;
&lt;br /&gt;
== Tom’s technical proposal ==&lt;br /&gt;
&lt;br /&gt;
So looking back at the earlier thread, I never actually came back with my suggestion, so here is my perspective on localization and how it should be done. This has been made easier by some changes we have in the 6.x line, and having new UI (with what I believe to be a lot more isolation of code that does display of items) is a huge boost here to making this practical.&lt;br /&gt;
&lt;br /&gt;
First a few base facts as background:&lt;br /&gt;
# For [almost] every item (Class, Skill, etc.) there is a unique identifier (generally referred to as a Key - note that if the &amp;quot;KEY&amp;quot; token is not used, then the Key is the name (first entry on the line in the data) (There is an exception to this we'll call problem #1)&lt;br /&gt;
# There are basically 4 types of things that need translation:&lt;br /&gt;
## (2a) item names&lt;br /&gt;
## (2b) constants (like spell schools)&lt;br /&gt;
## (2c) variables (like meters/feet/etc.)&lt;br /&gt;
## (2d) Strings (like descriptions)&lt;br /&gt;
## [if anyone can think of more, let me know]&lt;br /&gt;
# Most (but not all) tokens are &amp;quot;unique&amp;quot; or otherwise &amp;quot;addressable&amp;quot; in that they can only occur once per object. (Anyone notice that the tokens have started to be specific in the test code &amp;amp; docs about whether they overwrite, add, etc. - this is one reason why - and yes, I've been slowly trying to make progress on this even in the 2007-2009 work) [The exception to this is problem #2)&lt;br /&gt;
&lt;br /&gt;
A few principles about l10n:&lt;br /&gt;
# We must not make producing a data set materially more complicated than it is today (no requirement to put %L10NNAME% type gunk into data)&lt;br /&gt;
# We should target an ability to tell us if l10n is complete for any given data set&lt;br /&gt;
&lt;br /&gt;
With that:&lt;br /&gt;
* Following from #1, almost everything we have in the data today is &amp;quot;addressable&amp;quot;. By that, I mean that the OUTPUTNAME for a Skill called &amp;quot;FooBar&amp;quot; can be uniquely called out. The name hierarchy is something like: SKILL//Foo//OUTPUTNAME (exceptions are problems #1,2 to be addressed later)&lt;br /&gt;
&lt;br /&gt;
Given that, we can actually set principle #1 to &amp;quot;The data remains unchanged&amp;quot; (again, except for problem #2). The entire data set is produced (assume US English for a moment). We then have a unique file for l10n that has things like:&lt;br /&gt;
* SKILL:FooBar|Oobarf-ay&lt;br /&gt;
* SKILL:FooBar:OUTPUTNAME|ooBarOutF-ay&lt;br /&gt;
* etc.&lt;br /&gt;
&lt;br /&gt;
This (to the first order) covers 2a, 2d.&lt;br /&gt;
&lt;br /&gt;
For 2b items, we simply have to expand the list of items (SKILL, SPELL) that we are familiar with, so we get things like:&lt;br /&gt;
* SPELLSCHOOL:Divination|Ivinationd-ay&lt;br /&gt;
&lt;br /&gt;
2c is a bit more complicated, but I can't believe it's all that bad given it's a thing many applications already do (and it's a known thing)&lt;br /&gt;
&lt;br /&gt;
Each file could be named in such a way that it identifies it's l10n, e.g.:&lt;br /&gt;
* srd_de_ch.l10n&lt;br /&gt;
* ...and probably placed in a L10N subfolder of the initial dataset.&lt;br /&gt;
* (Note I'd recommend we be clear on where these go, AND ALSO require that NO PCC FILES (I'd recommend we say no PCC or LST, but the formal limit would be no PCC) are recognized if they are in the L10N folder... so that the initial directory parse [which is probably one of the slower parts of our boot process] can immediately ignore the l10n directory and not have to look through the file list looking for .PCC files... alternately, we have a l10n folder that is parallel to the data folder, but that then adds complication in needing new preferences to point at multiple l10n folders and requires more complicated structure within that l10n structure to identify WHICH files in that folder map to which datasets... because we can't simply say a given English word will always translate the same way - English is way too overloaded for that.)&lt;br /&gt;
&lt;br /&gt;
I would recommend we keep things in a small subset of files, and not try to do 1:1 for each data file (that would produce a lot of file sprawl) - but that's not my call.&lt;br /&gt;
&lt;br /&gt;
Addressing principle #2:&lt;br /&gt;
* Since we have a set of items we know would need to be covered (names, certain tokens), we should be able to load those into memory, and load the l10n file into memory and compare. This should be able to produce warnings of 2 kinds:&lt;br /&gt;
* (W1) Errors where the base data set contains things that are not translated&lt;br /&gt;
* (W2) Errors where the translation file attempts to translate things not in the base data set&lt;br /&gt;
* I can't imagine that utility is all that hard to write (just would need to make the list of todos)&lt;br /&gt;
&lt;br /&gt;
This brings us to problems #1 and #2:&lt;br /&gt;
&lt;br /&gt;
Problem #1: Non-unique names&lt;br /&gt;
* We glossed over this in 6.x, but the truth is that Spell names are not unique. Some of the *RDs have duplicate names (not all, but I forget which). Same is true for languages.&lt;br /&gt;
* (1a) Spells can theoretically be differentiated by evaluating the &amp;quot;TYPE&amp;quot; token for Divine, Arcane, or Psionic (those are &amp;quot;magical&amp;quot; items in our code.&lt;br /&gt;
* (1b) Languages can theoretically be differentiated between &amp;quot;Spoken&amp;quot; and &amp;quot;Written&amp;quot; as those are &amp;quot;magical&amp;quot; types.&lt;br /&gt;
I believe both of those forms of magic are things on our backlog of FREQs to clean up... and the reason they are on the cleanup list really for L10N (as much as it is to just cleanup the overuse of TYPE)&lt;br /&gt;
&lt;br /&gt;
Problem #2: Non-unique tokens&lt;br /&gt;
* There are only a few tokens that are not unique. DESC is one of them, if I recall correctly. The probably solution here is to simply give an identifier to each token. This might require a change to LST Something like:&lt;br /&gt;
* DESC*Overall:x&lt;br /&gt;
* DESC*Second:x&lt;br /&gt;
* (Note: I'm not sure this syntax works or is by any means &amp;quot;good&amp;quot;. DESC:OVERALL|x might be better as it avoids potential issues with using * as a reserved character - take this is a principle of what would have to happen to DESC token, not as a full-blown proposal)&lt;br /&gt;
&lt;br /&gt;
Note that this naming of each DESC item (And other reusable items), while it breaks the &amp;quot;can't change the data&amp;quot; principle actually helps as much as it hurts... it would give us the ability to do things like:&lt;br /&gt;
* DESC:.CLEARID.Overall&lt;br /&gt;
* or things similar to that, which is actually a neat benefit for the small overhead of pain it puts into datasets. (Which, by the way, could be converted to whatever we decide on anyway with our nifty converter, so this doesn't seem all that bad)&lt;br /&gt;
&lt;br /&gt;
So in my mind, the question really is: Is going slightly more than half way good enough? There are areas where we could do translation, and some areas where we need some pretty material core code changes to support it.&lt;br /&gt;
&lt;br /&gt;
== Translation files ==&lt;br /&gt;
&lt;br /&gt;
Hi Tom,&lt;br /&gt;
&lt;br /&gt;
Welcome BACK!!!&lt;br /&gt;
&lt;br /&gt;
I don't mind the solutions put forth. Unique Identifiers for DESC is no more absurd then the Unique&lt;br /&gt;
Identifiers we'll be needing to use more than one CHOOSER on a single line. Plus, the ability to&lt;br /&gt;
clear off a Section of DESC would be awesome.&lt;br /&gt;
&lt;br /&gt;
I'd vote for as complete a job as possible.&lt;br /&gt;
&lt;br /&gt;
Here is where I'm not understanding - where are we going to put the translation stuff?&lt;br /&gt;
&lt;br /&gt;
thpr wrote:&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Here is where I'm not understanding - where are we going to put the translation stuff?&lt;br /&gt;
&lt;br /&gt;
Idea #1 (bad idea IMHO) is to put it in a separate directory:&lt;br /&gt;
data/srd/...&lt;br /&gt;
l10n/srd/...&lt;br /&gt;
&lt;br /&gt;
The problem with that is that you get into synchronization issues... so any time files/directory names change in one place they have to change in another.  That's a contract on the data developer.  (It would also require multiple l10n directories, since we support multiple data directories, so it's a bunch of code)&lt;br /&gt;
&lt;br /&gt;
Idea #2: Implicit Subdirectories:&lt;br /&gt;
data/srd/*.lst&lt;br /&gt;
data/srd/l10n/*.l10n&lt;br /&gt;
&lt;br /&gt;
That ensures that the l10n directory is associated with the dataset.&lt;br /&gt;
&lt;br /&gt;
Idea #3: Explicit designation:&lt;br /&gt;
data/srd/srd.pcc contains LOCALIZATION:l10n/srd.l10n&lt;br /&gt;
then:&lt;br /&gt;
data/l10n/srd.l10n&lt;br /&gt;
&lt;br /&gt;
(would support more than one .l10n file)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--- In pcgen_international@yahoogroups.com, Martijn Verburg &amp;lt;martijnverburg@...&amp;gt; wrote:&lt;br /&gt;
&amp;gt; &amp;gt; (2) We should target an ability to tell us if l10n is complete for any&lt;br /&gt;
&amp;gt; &amp;gt; given data set&lt;br /&gt;
&amp;gt; &amp;gt;&lt;br /&gt;
&amp;gt; Not sure what you mean by this?&lt;br /&gt;
&lt;br /&gt;
If there is an object called &amp;quot;Dagger&amp;quot; we need to ensure the file contains:&lt;br /&gt;
EQUIPMENT:Dagger|Aggerd-ay&lt;br /&gt;
&lt;br /&gt;
If it contains:&lt;br /&gt;
EQUIPMENT:Dgager|Aggerd-ay&lt;br /&gt;
&lt;br /&gt;
That is also an error (just like the &amp;quot;unconstructed reference&amp;quot; items are errors.  By capturing both type 1 and type 2 error (things that aren't translated as well as things that shouldn't have been translated) we are capturing the vast majority of the simple problems.&lt;/div&gt;</summary>
		<author><name>Masaru20100</name></author>
		
	</entry>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Internationalization&amp;diff=2961</id>
		<title>Internationalization</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Internationalization&amp;diff=2961"/>
		<updated>2011-12-13T10:16:29Z</updated>

		<summary type="html">&lt;p&gt;Masaru20100: First attempt to add content and clear things a bit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
&lt;br /&gt;
PCGen for 6.0+ releases will be attempting Internationalization. (probably not in 6.0) To deal with this we have created a Yahoo group called [http://groups.yahoo.com/group/pcgen_international pcgen_international], that is dedicated to the development of non-English language content for PCGen.&lt;br /&gt;
&lt;br /&gt;
Requests for translations, problems with translations, and drafts of translated data sets or other translated content, as well as anything coming up with the Internationalization of PCGen are to be discussed in that group.&lt;br /&gt;
&lt;br /&gt;
Anybody interested to help out with translations to other languages, but also those who are just interested in the discussion of the matter, please join the group. Those interested in joining our efforts on the Internationalization of PCGen, please make yourself known on that list.&lt;br /&gt;
&lt;br /&gt;
This page is an attempt to regroup the information discussed on the list.&lt;br /&gt;
&lt;br /&gt;
=Goal=&lt;br /&gt;
&lt;br /&gt;
The goal is to allow a user that doesn’t speak English to use the program. There is many things to consider to attain this goal.&lt;br /&gt;
&lt;br /&gt;
First the installation process should be detailed in many languages. The program UI should also be translated, and so is the data. The skills should be sorted in the UI and in the output sheet according to the natural sorting of the language. The output sheets should be in the user’s language too. The documentation need to be also in the user’s language.&lt;br /&gt;
&lt;br /&gt;
(bug report language and translation)&lt;br /&gt;
&lt;br /&gt;
Saved characters are usually reusable with a new version of the program, and the il8n should not change that. (technical: the saved elements should stay the same, should probably be keys of some sort — I have no idea what the pcg files are)&lt;br /&gt;
&lt;br /&gt;
imperial and meter thing (already handled in 12/2011 version, at least there is an item in the options)&lt;br /&gt;
&lt;br /&gt;
= Tools for il8n =&lt;br /&gt;
&lt;br /&gt;
To facilitate the internationalization and localization, some tools would be welcome. This tools are not necessary for the user, but are a great addition to maintainers.&lt;br /&gt;
&lt;br /&gt;
* a tool test to see if some entries are not translated (maybe a page that would provide statistics) it should be ui and data separated I think&lt;br /&gt;
* keeping glossary for each languages could help (some terms are found at many places)&lt;br /&gt;
* a tool to eliminate (or point at) line that are not used any more in the main bundle file (it is quite big and there seems to bit not displayed text)&lt;br /&gt;
&lt;br /&gt;
=Choices yet to be made=&lt;br /&gt;
&lt;br /&gt;
== Application Packaging ==&lt;br /&gt;
&lt;br /&gt;
As of December 2011, the application and translation of some part of the UI are bundled together.&lt;br /&gt;
&lt;br /&gt;
The question is should the application be bundled this way, or should there be language specific bundles.&lt;br /&gt;
&lt;br /&gt;
Pro of a all-in-one&lt;br /&gt;
* user can change language on the fly&lt;br /&gt;
* no need for explanations on how to install a new language set&lt;br /&gt;
&lt;br /&gt;
Cons&lt;br /&gt;
* file could get quite big&lt;br /&gt;
&lt;br /&gt;
== Genre class names ==&lt;br /&gt;
&lt;br /&gt;
In some languages, the class names can have a genre, like the feminine of priest is priestess in English (even if Cleric is the name of the class, it’s just to illustrate the point). Do we want to use those names in the class names or do we stick to whatever name the class is?&lt;br /&gt;
&lt;br /&gt;
= The goals in more details for PCGen =&lt;br /&gt;
&lt;br /&gt;
== Default language after clean install ==&lt;br /&gt;
&lt;br /&gt;
The language should be the system one. To the user, if doesn’t understand the default language, it will be a pain for him to find the option to change the language.&lt;br /&gt;
It may be even better if the user is prompted with a choice at the start of the program (or at install) in order to simplify this process. It might be displayed only if the system language doesn’t exist in PCGen.&lt;br /&gt;
&lt;br /&gt;
After clean install (no preference files):&lt;br /&gt;
# PCGen determine the system language&lt;br /&gt;
# if translation exist (and are believed good enough) switch to that language, if not, display an element to ask the user for the language to use.&lt;br /&gt;
&lt;br /&gt;
== Published language priority ==&lt;br /&gt;
&lt;br /&gt;
* The data that is not translated in a language, for example books not yet translated, should stay in the language it first get out.&lt;br /&gt;
&lt;br /&gt;
Books are almost never instantly translated by companies and some aren’t even translated. PCGen is also short on staff. All that means that the translations will probably be coming far after the original one.&lt;br /&gt;
To an user that only use translated material, it will not be a problem.&lt;br /&gt;
To an user that mix translated material, and not translated one, it shouldn’t become a problem.&lt;br /&gt;
&lt;br /&gt;
== Using different data languages ==&lt;br /&gt;
&lt;br /&gt;
* The data should be the same that the English one to avoid having to duplicate data correction.&lt;br /&gt;
&lt;br /&gt;
Having data in several languages could be a way to do il8n&lt;br /&gt;
&lt;br /&gt;
Cons&lt;br /&gt;
* might need language specific bundles&lt;br /&gt;
* a character used with one language cannot be seen by someone with a different language set&lt;br /&gt;
* multiple corrections needed when correcting a bug (and if automatic generation of the translation is done, why not do it on the fly)&lt;br /&gt;
&lt;br /&gt;
== Separating data and UI translations ==&lt;br /&gt;
&lt;br /&gt;
* The interface language and the data language should be separate to allow people with book in a different language than their own to use the program more simply.&lt;br /&gt;
To the user that speak only one language, it is no advantage. &lt;br /&gt;
For a user which use book that are not in the language he is most comfortable with, he would put the UI and the data to different languages. Same for someone who doesn’t use translation of the data but prefer to have a program in a language he is more comfortable with.&lt;br /&gt;
&lt;br /&gt;
== Custom content and localization ==&lt;br /&gt;
&lt;br /&gt;
* It should be possible to use another language in a data to allow non English speaker to develop custom content in another language. That seem to be a problem when combined with separate language from data. A way to avoid it is to provide easy reference to create custom content.&lt;br /&gt;
&lt;br /&gt;
This might be a hard to make real combined with other points.&lt;br /&gt;
&lt;br /&gt;
=Technical Aspects=&lt;br /&gt;
&lt;br /&gt;
== Language choice UI ==&lt;br /&gt;
&lt;br /&gt;
There is already options to change the language and the distance metric used.&lt;br /&gt;
&lt;br /&gt;
It might be best to have a drop down list rather than radio choices.&lt;br /&gt;
&lt;br /&gt;
== Formatting Issue ==&lt;br /&gt;
&lt;br /&gt;
In Japanese, the classic number system is almost always used especially in RPG. In fact, translating numbers is not needed, what is needed is formatting numbers.&lt;br /&gt;
&lt;br /&gt;
That means that 10000 gets formatted 10,000 in English, 10 000 in French. In Japanese, it would either be 10,000 or 1万.&lt;br /&gt;
&lt;br /&gt;
In Java, this is usually done by using the NumberFormat class.&lt;br /&gt;
&lt;br /&gt;
== Sorting Issue ==&lt;br /&gt;
&lt;br /&gt;
Sorting is usually language dependent, meaning that the list of skills for example is not sorted the same way in different languages, even if the name are the same. The differences are usually minor between roman letter using languages.&lt;br /&gt;
&lt;br /&gt;
Actually, the international guys brought up the sorting thing again - another project would be to look into the GUI/core and replacing all the sorting of items with internationalized methods of sorting (Collators)&lt;br /&gt;
&lt;br /&gt;
* Use of collator to sort lists.&lt;br /&gt;
&lt;br /&gt;
== Unique Identifier ==&lt;br /&gt;
&lt;br /&gt;
Apparently there is already unique identifiers in use for items, so the idea would be to have a file with that id as the key and the translation as the value.&lt;br /&gt;
&lt;br /&gt;
== Tom’s technical proposal ==&lt;br /&gt;
&lt;br /&gt;
So looking back at the earlier thread, I never actually came back with my suggestion, so here is my perspective on localization and how it should be done. This has been made easier by some changes we have in the 6.x line, and having new UI (with what I believe to be a lot more isolation of code that does display of items) is a huge boost here to making this practical.&lt;br /&gt;
&lt;br /&gt;
First a few base facts as background:&lt;br /&gt;
# For [almost] every item (Class, Skill, etc.) there is a unique identifier (generally referred to as a Key - note that if the &amp;quot;KEY&amp;quot; token is not used, then the Key is the name (first entry on the line in the data) (There is an exception to this we'll call problem #1)&lt;br /&gt;
# There are basically 4 types of things that need translation:&lt;br /&gt;
## (2a) item names&lt;br /&gt;
## (2b) constants (like spell schools)&lt;br /&gt;
## (2c) variables (like meters/feet/etc.)&lt;br /&gt;
## (2d) Strings (like descriptions)&lt;br /&gt;
## [if anyone can think of more, let me know]&lt;br /&gt;
# Most (but not all) tokens are &amp;quot;unique&amp;quot; or otherwise &amp;quot;addressable&amp;quot; in that they can only occur once per object. (Anyone notice that the tokens have started to be specific in the test code &amp;amp; docs about whether they overwrite, add, etc. - this is one reason why - and yes, I've been slowly trying to make progress on this even in the 2007-2009 work) [The exception to this is problem #2)&lt;br /&gt;
&lt;br /&gt;
A few principles about l10n:&lt;br /&gt;
# We must not make producing a data set materially more complicated than it is today (no requirement to put %L10NNAME% type gunk into data)&lt;br /&gt;
# We should target an ability to tell us if l10n is complete for any given data set&lt;br /&gt;
&lt;br /&gt;
With that:&lt;br /&gt;
* Following from #1, almost everything we have in the data today is &amp;quot;addressable&amp;quot;. By that, I mean that the OUTPUTNAME for a Skill called &amp;quot;FooBar&amp;quot; can be uniquely called out. The name hierarchy is something like: SKILL//Foo//OUTPUTNAME (exceptions are problems #1,2 to be addressed later)&lt;br /&gt;
&lt;br /&gt;
Given that, we can actually set principle #1 to &amp;quot;The data remains unchanged&amp;quot; (again, except for problem #2). The entire data set is produced (assume US English for a moment). We then have a unique file for l10n that has things like:&lt;br /&gt;
* SKILL:FooBar|Oobarf-ay&lt;br /&gt;
* SKILL:FooBar:OUTPUTNAME|ooBarOutF-ay&lt;br /&gt;
* etc.&lt;br /&gt;
&lt;br /&gt;
This (to the first order) covers 2a, 2d.&lt;br /&gt;
&lt;br /&gt;
For 2b items, we simply have to expand the list of items (SKILL, SPELL) that we are familiar with, so we get things like:&lt;br /&gt;
* SPELLSCHOOL:Divination|Ivinationd-ay&lt;br /&gt;
&lt;br /&gt;
2c is a bit more complicated, but I can't believe it's all that bad given it's a thing many applications already do (and it's a known thing)&lt;br /&gt;
&lt;br /&gt;
Each file could be named in such a way that it identifies it's l10n, e.g.:&lt;br /&gt;
* srd_de_ch.l10n&lt;br /&gt;
* ...and probably placed in a L10N subfolder of the initial dataset.&lt;br /&gt;
* (Note I'd recommend we be clear on where these go, AND ALSO require that NO PCC FILES (I'd recommend we say no PCC or LST, but the formal limit would be no PCC) are recognized if they are in the L10N folder... so that the initial directory parse [which is probably one of the slower parts of our boot process] can immediately ignore the l10n directory and not have to look through the file list looking for .PCC files... alternately, we have a l10n folder that is parallel to the data folder, but that then adds complication in needing new preferences to point at multiple l10n folders and requires more complicated structure within that l10n structure to identify WHICH files in that folder map to which datasets... because we can't simply say a given English word will always translate the same way - English is way too overloaded for that.)&lt;br /&gt;
&lt;br /&gt;
I would recommend we keep things in a small subset of files, and not try to do 1:1 for each data file (that would produce a lot of file sprawl) - but that's not my call.&lt;br /&gt;
&lt;br /&gt;
Addressing principle #2:&lt;br /&gt;
* Since we have a set of items we know would need to be covered (names, certain tokens), we should be able to load those into memory, and load the l10n file into memory and compare. This should be able to produce warnings of 2 kinds:&lt;br /&gt;
* (W1) Errors where the base data set contains things that are not translated&lt;br /&gt;
* (W2) Errors where the translation file attempts to translate things not in the base data set&lt;br /&gt;
* I can't imagine that utility is all that hard to write (just would need to make the list of todos)&lt;br /&gt;
&lt;br /&gt;
This brings us to problems #1 and #2:&lt;br /&gt;
&lt;br /&gt;
Problem #1: Non-unique names&lt;br /&gt;
* We glossed over this in 6.x, but the truth is that Spell names are not unique. Some of the *RDs have duplicate names (not all, but I forget which). Same is true for languages.&lt;br /&gt;
* (1a) Spells can theoretically be differentiated by evaluating the &amp;quot;TYPE&amp;quot; token for Divine, Arcane, or Psionic (those are &amp;quot;magical&amp;quot; items in our code.&lt;br /&gt;
* (1b) Languages can theoretically be differentiated between &amp;quot;Spoken&amp;quot; and &amp;quot;Written&amp;quot; as those are &amp;quot;magical&amp;quot; types.&lt;br /&gt;
I believe both of those forms of magic are things on our backlog of FREQs to clean up... and the reason they are on the cleanup list really for L10N (as much as it is to just cleanup the overuse of TYPE)&lt;br /&gt;
&lt;br /&gt;
Problem #2: Non-unique tokens&lt;br /&gt;
* There are only a few tokens that are not unique. DESC is one of them, if I recall correctly. The probably solution here is to simply give an identifier to each token. This might require a change to LST Something like:&lt;br /&gt;
* DESC*Overall:x&lt;br /&gt;
* DESC*Second:x&lt;br /&gt;
* (Note: I'm not sure this syntax works or is by any means &amp;quot;good&amp;quot;. DESC:OVERALL|x might be better as it avoids potential issues with using * as a reserved character - take this is a principle of what would have to happen to DESC token, not as a full-blown proposal)&lt;br /&gt;
&lt;br /&gt;
Note that this naming of each DESC item (And other reusable items), while it breaks the &amp;quot;can't change the data&amp;quot; principle actually helps as much as it hurts... it would give us the ability to do things like:&lt;br /&gt;
* DESC:.CLEARID.Overall&lt;br /&gt;
* or things similar to that, which is actually a neat benefit for the small overhead of pain it puts into datasets. (Which, by the way, could be converted to whatever we decide on anyway with our nifty converter, so this doesn't seem all that bad)&lt;br /&gt;
&lt;br /&gt;
So in my mind, the question really is: Is going slightly more than half way good enough? There are areas where we could do translation, and some areas where we need some pretty material core code changes to support it.&lt;br /&gt;
&lt;br /&gt;
== Translation files ==&lt;br /&gt;
&lt;br /&gt;
Hi Tom,&lt;br /&gt;
&lt;br /&gt;
Welcome BACK!!!&lt;br /&gt;
&lt;br /&gt;
I don't mind the solutions put forth. Unique Identifiers for DESC is no more absurd then the Unique&lt;br /&gt;
Identifiers we'll be needing to use more than one CHOOSER on a single line. Plus, the ability to&lt;br /&gt;
clear off a Section of DESC would be awesome.&lt;br /&gt;
&lt;br /&gt;
I'd vote for as complete a job as possible.&lt;br /&gt;
&lt;br /&gt;
Here is where I'm not understanding - where are we going to put the translation stuff?&lt;br /&gt;
&lt;br /&gt;
(choices I view&lt;br /&gt;
One translation file (can get really big)&lt;br /&gt;
One translation file per file (apparently Tom advise against this )&lt;br /&gt;
regroup several translation in a file&lt;br /&gt;
)&lt;/div&gt;</summary>
		<author><name>Masaru20100</name></author>
		
	</entry>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Talk:Internationalization&amp;diff=2960</id>
		<title>Talk:Internationalization</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Talk:Internationalization&amp;diff=2960"/>
		<updated>2011-12-13T08:54:32Z</updated>

		<summary type="html">&lt;p&gt;Masaru20100: Created page with &amp;quot;I’m working on getting this page cleared up a bit, it’s still a work in progress. ~~~&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I’m working on getting this page cleared up a bit, it’s still a work in progress. [[User:Masaru20100|Masaru20100]]&lt;/div&gt;</summary>
		<author><name>Masaru20100</name></author>
		
	</entry>
</feed>