NEW - bug 210: Babel or Babel-like Community Internationalization
https://foundation.eclipse.org/infrazilla/show_bug.cgi?id=210
diff --git a/html/export/generate1.php b/html/export/generate1.php
new file mode 100755
index 0000000..49b0749
--- /dev/null
+++ b/html/export/generate1.php
@@ -0,0 +1,300 @@
+<?php
+/*******************************************************************************
+ * Copyright (c) 2008 Eclipse Foundation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Eclipse Foundation - Initial API and implementation
+*******************************************************************************/
+
+/*
+ * Documentation: http://wiki.eclipse.org/Babel_/_Server_Tool_Specification#Outputs
+ */
+//TODO handle versions, however that works; files.version is like "3.4" for Eclipse 3.4
+
+/*
+ * Globals
+ */
+$temporary_dir = "tmp_generated/";
+$staging_update_site = "staging/";
+$source_files_for_generate = "source_files_for_generate/";
+
+$leader1 = "";
+$leader1S= "";
+$leader = ". . ";
+$leaderS= ". . ";
+$generated_timestamp = date("Ymdhis");
+
+/*
+ * Clear the staging site
+ */
+if( file_exists( $staging_update_site ) ) {
+ exec( "rm -rf $staging_update_site*" );
+} else {
+ exec( "mkdir $staging_update_site" );
+}
+if( file_exists( "${staging_update_site}plugins/" ) ) {
+ exec( "rm -rf ${staging_update_site}plugins/*" );
+} else {
+ exec( "mkdir ${staging_update_site}plugins/" );
+}
+if( file_exists( "${staging_update_site}features/" ) ) {
+ exec( "rm -rf ${staging_update_site}features/*" );
+} else {
+ exec( "mkdir ${staging_update_site}features/" );
+}
+/*
+ * Get the data (plugins, files, translations) from the live database
+ */
+$dbh = mysql_connect( 'localhost', 'babelstg_rw', '8623xsaas2.' );
+mysql_select_db( 'babelstg', $dbh );
+
+/*
+ * Generate one language pack per language
+ */
+$site_xml = '';
+$language_result = mysql_query( 'SELECT * FROM languages WHERE languages.is_active' );
+while( ($language_row = mysql_fetch_assoc($language_result)) != null ) {
+ $language_name = $language_row['name'];
+ $language_iso = $language_row['iso_code'];
+ echo "${leader1}Generating language pack for $language_name ($language_iso)(" . $language_row['language_id'] . ")\n";
+
+ /*
+ * Determine which plug-ins need to be in this language pack.
+ */
+ $file_result = mysql_query( "SELECT DISTINCT files.file_id, files.name
+ FROM files, strings, translations
+ WHERE files.file_id = strings.file_id
+ AND strings.string_id = translations.string_id
+ AND translations.language_id = ". $language_row['language_id'] . "
+ AND translations.is_active
+ AND files.is_active ");
+ $plugins = array();
+ while( ($file_row = mysql_fetch_assoc($file_result)) != null ) {
+ if( preg_match( "/^([a-zA-Z0-9\.]+)\/(.*)$/", $file_row['name'], $matches ) ) {
+ $file_row['subname'] = $matches[2];
+ $plugins[$matches[1]][] = $file_row;
+ } else {
+ echo " WARNING: no plug-in name found in file " . $file_row['file_id'] . " \"" . $file_row['name'] . "\"\n";
+ }
+ }
+ /*
+ * Generate one plug-in fragment for each plug-in
+ */
+ foreach ($plugins as $plugin_name => $plugin_row ) {
+ echo "${leader1}${leader}Generating plug-in fragment $plugin_name \n";
+ /*
+ * Clean and create the temporary directory
+ */
+ if ( file_exists( $temporary_dir ) ) {
+ exec( "rm -rf $temporary_dir; mkdir $temporary_dir" );
+ } else {
+ exec( "mkdir $temporary_dir" );
+ }
+
+ /*
+ * Generate each *.properties file
+ */
+ foreach ($plugin_row as $properties_file) {
+ /*
+ * Convert the filename to *_lang.properties, e.g., foo_fr.properties
+ */
+ $filename = $properties_file['subname'];
+ if( preg_match( "/^(.*)\.properties$/", $filename, $matches ) ) {
+ $filename = $matches[1] . '_' . $language_iso . '.properties';
+ }
+ echo "${leader1}${leader}${leader}Generating properties file $filename (" . $properties_file['file_id'] . ")\n";
+ /*
+ * Create any needed sub-directories
+ */
+ $fullpath = $temporary_dir . $filename;
+ preg_match( "/^((.*)\/)?(.+?)$/", $fullpath, $matches );
+ $dirs1 = split( "\/", $matches[1] );
+ $dirs2 = array();
+ $d = '';
+ foreach ( $dirs1 as $each ) {
+ if( $each ) {
+ $d .= $each . '/';
+ $dirs2[] = $d;
+ }
+ }
+ foreach( $dirs2 as $each ) {
+ if( !file_exists( $each) ) {
+ exec( "mkdir " . $each );
+ }
+ }
+ /*
+ * Start writing to the file
+ */
+ $outp = fopen( $fullpath, "w" );
+ fwrite( $outp, "# Copyright by many contributors; see http://babel.eclipse.org/\n" );
+ //TODO correct copyrights from all contributors
+ /*
+ * For each string that is translated in this file, write it out
+ * Note that if a string is not translated, then it will not be
+ * included and thus Eclipse will pick up the default string for
+ * that key from the default *.properities file. Thus we only
+ * include the strings that are translated.
+ */
+ $sql = "
+ SELECT
+ strings.name AS `key`,
+ strings.value AS orig,
+ translations.value AS trans
+ FROM strings, translations
+ WHERE strings.string_id = translations.string_id
+ AND translations.language_id = " . $language_row['language_id'] . "
+ AND strings.file_id = " . $properties_file['file_id'] . "
+ AND translations.is_active
+ ";
+ $strings_result = mysql_query( $sql );
+ while( ($strings_row = mysql_fetch_assoc($strings_result)) != null ) {
+ fwrite( $outp, $strings_row['key'] . "=" );
+ echo "${leader1S}${leaderS}${leaderS}${leaderS}" . $strings_row['key'] . "=";
+ if( $strings_row['trans'] ) {
+ fwrite( $outp, $strings_row['trans'] );
+ echo $strings_row['trans'];
+ } else {
+ fwrite( $outp, $strings_row['orig'] );
+ }
+ fwrite( $outp, "\n" );
+ echo "\n";
+ }
+ /*
+ * Finish the properties file
+ */
+ fclose( $outp );
+ echo "${leader1}${leader}${leader}completed properties file $filename\n";
+ }
+ /*
+ * Copy in the various legal files
+ */
+ exec( "cp ${source_files_for_generate}about.html ${temporary_dir}" );
+ exec( "cp ${source_files_for_generate}license.html ${temporary_dir}" );
+ exec( "cp ${source_files_for_generate}epl-v10.html ${temporary_dir}" );
+ exec( "cp ${source_files_for_generate}eclipse_update_120.jpg ${temporary_dir}" );
+ /*
+ * Generate the META-INF/MANIFEST.MF file
+ */
+ $parent_plugin_id = $plugin_name;
+ $fragment_id = "${parent_plugin_id}.nl_$language_iso";
+ $fragment_major_version = "0.2.0"; //TODO what version number should these plugins be?
+ $fragment_version = $fragment_major_version . ".v" . $generated_timestamp;
+ $fragment_filename = $fragment_id . "_" . $fragment_version . ".jar";
+ $parent_min_version = "0.0.0"; //TODO specify a min version (when versions are supported)
+ $parent_max_version = "9.9.9"; //TODO specify a max version (when versions are supported)
+
+ $plugins[$plugin_name]['id'] = $fragment_id;
+ $plugins[$plugin_name]['version'] = $fragment_version;
+
+ exec( "mkdir $temporary_dir/META-INF" );
+ $outp = fopen( "$temporary_dir/META-INF/MANIFEST.MF", "w" );
+ fwrite( $outp, "Manifest-Version: 1.0\n");
+ fwrite( $outp, "Bundle-Name: $parent_plugin_id $language_name NLS Support\n");
+ fwrite( $outp, "Bundle-SymbolicName: $fragment_id ;singleton=true\n");
+ fwrite( $outp, "Bundle-Version: $fragment_version\n");
+ fwrite( $outp, "Bundle-Vendor: Eclipse Foundation Inc.\n");
+ fwrite( $outp, "Fragment-Host: $parent_plugin_id;bundle-version=\"[$parent_min_version,$parent_max_version)\"\n");
+ fclose( $outp );
+ /*
+ * Jar up this directory as the fragment plug-in jar
+ */
+ system( "cd $temporary_dir; /home/bfreeman/jdk1.6.0_04/bin/jar cfM ../${staging_update_site}plugins/$fragment_filename ." );
+ echo "${leader1}${leader}completed plug-in fragment $plugin_name\n";
+ }
+ /*
+ * Clean and create the temporary directory
+ */
+ if ( file_exists( $temporary_dir ) ) {
+ exec( "rm -rf $temporary_dir; mkdir $temporary_dir" );
+ } else {
+ exec( "mkdir $temporary_dir" );
+ }
+ /*
+ * Create the feature.xml
+ *
+ * TODO <url><update label=... url=... and <url><discovery label=... url=... are not implemented
+ *
+ * <url>
+ * <update label="%updateSiteName" url="http://update.eclipse.org/updates/3.2" />
+ * <discovery label="%updateSiteName" url="http://update.eclipse.org/updates/3.2" />
+ * </url>
+ */
+ $feature_id = "org.eclipse.nls.$language_iso";
+ $feature_major_version = "0.2.0"; //TODO what version number should this feature be?
+ $feature_version = $feature_major_version . ".v" . $generated_timestamp;
+ $feature_filename = $feature_id . "_" . $feature_version . ".jar";
+
+ $outp = fopen( "$temporary_dir/feature.xml", "w" );
+ fwrite( $outp, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
+<feature
+ id=\"$feature_id\"
+ label=\"Eclipse Language Pack for $language_name\"
+ image=\"eclipse_update_120.jpg\"
+ provider-name=\"Eclipse Foundation Inc.\"
+ version=\"$feature_version\">
+<license url=\"license.html\">"
+ . htmlspecialchars( file_get_contents( "${source_files_for_generate}license.txt" ) ) . "</license>
+<description>Translations in $language_name for all Eclipse Projects</description>
+" );
+ foreach ($plugins as $plugin_name => $plugin_row ) {
+ fwrite( $outp, '<pluging fragment="true" id="'
+ . $plugin_row['id'] . '" unpack="false" version="'
+ . $plugin_row['version'] . '"/>
+' );
+ }
+ fwrite( $outp, '</feature>
+' );
+ fclose( $outp );
+ /*
+ * Jar up this directory as the feature jar
+ */
+ system( "cd $temporary_dir; /home/bfreeman/jdk1.6.0_04/bin/jar cfM ../${staging_update_site}features/$feature_filename ." );
+ /*
+ * Register this feature with the site.xml
+ */
+ $site_xml .= "<feature url=\"features/$feature_filename\" id=\"$feature_id\" version=\"$feature_version\">
+ <category name=\"Language Packs\"/></feature>
+";
+ echo "${leader1}completed language pack for $language_name ($language_iso)\n";
+}
+/*
+ * TODO <site mirrorsURL=... is not yet implemented
+ */
+$outp = fopen( "${staging_update_site}site.xml", "w" );
+fwrite( $outp, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
+<site>
+ <description url=\"http://babel.eclipse.org/\">This update site contains
+user-contributed translations of the strings in all Eclipse projects. Please
+see the http://babel.eclipse.org/ Babel project web pages for a full how-to-use
+explanation of these translations as well as how you can contribute to
+the translations of this and future versions of Eclipse.</description>
+ <category-def name=\"Language Packs\" label=\"Language Packs\">
+ <description>Language packs for all Eclipse projects</description>
+ </category-def>
+" );
+fwrite( $outp, $site_xml );
+fwrite( $outp, "</site>
+" );
+fclose( $outp );
+
+echo "Completed generating update site\n";
+
+/*
+2. what happens if the translation feature includes plug-in fragments for
+ plug-ins that are not in the current image?
+ does it load correctly and ignore those fragments? if so, good
+ A: warnings appear in the run-time error log
+ does it fail to load? if so, then we need to generate different features, perhaps
+ one feature for each plug or else we need to know more about the project
+ distro structure to know which plug-ins to put in each feature
+ what happens if those plug-ins are later added - does it load the strings now?
+ A: probably not
+3. need to handle different versions of each feature/plugin/platform; generate different
+ language packs for each
+*/
+
+?>