Merge pull request #39 from stevage/fix-tram-route-editor
authorRichard Fairhurst <richard@systemeD.net>
Sun, 25 Mar 2012 17:08:31 +0000 (10:08 -0700)
committerRichard Fairhurst <richard@systemeD.net>
Sun, 25 Mar 2012 17:08:31 +0000 (10:08 -0700)
Fix bug to make tram routes show up on simple editor for tram lines.

147 files changed:
README.txt
TODO.txt
build.xml
embedded/tab_transport.png
halcyon_viewer-config.xml
halcyon_viewer.as
l10n/locale/ast/help_dialog.properties
l10n/locale/br/help_dialog.properties
l10n/locale/ca/p2_main.properties [new file with mode: 0644]
l10n/locale/de_DE/help_dialog.properties
l10n/locale/en_GB/p2_main.properties
l10n/locale/en_US/help_dialog.properties
l10n/locale/en_US/p2_main.properties
l10n/locale/es_ES/help_dialog.properties
l10n/locale/es_ES/p2_main.properties
l10n/locale/fa/p2_main.properties [new file with mode: 0644]
l10n/locale/ga/p2_main.properties [new file with mode: 0644]
l10n/locale/gl/help_dialog.properties [new file with mode: 0644]
l10n/locale/gl/p2_main.properties [new file with mode: 0644]
l10n/locale/he/help_dialog.properties
l10n/locale/hsb/help_dialog.properties
l10n/locale/hsb/p2_main.properties
l10n/locale/hu/help_dialog.properties [new file with mode: 0644]
l10n/locale/hu/p2_main.properties [new file with mode: 0644]
l10n/locale/ia/help_dialog.properties [new file with mode: 0644]
l10n/locale/ia/p2_main.properties [new file with mode: 0644]
l10n/locale/ka/p2_main.properties [new file with mode: 0644]
l10n/locale/lb/p2_main.properties [new file with mode: 0644]
l10n/locale/nl_NL/help_dialog.properties
l10n/locale/nl_NL/p2_main.properties
l10n/locale/ta/p2_main.properties [new file with mode: 0644]
l10n/locale/uk/help_dialog.properties [new file with mode: 0644]
l10n/locale/uk/p2_main.properties [new file with mode: 0644]
l10n/locale/vi/help_dialog.properties [deleted file]
l10n/locale/vi/p2_main.properties [deleted file]
l10n/locale/vi_VN/help_dialog.properties
l10n/locale/vi_VN/p2_main.properties
l10n/locale/zh_CN/help_dialog.properties [new file with mode: 0644]
l10n/map/LocalizationMap.mxml
lib/YahooMap-0.9.4.swc [deleted file]
net/systemeD/controls/Spinner.as [new file with mode: 0644]
net/systemeD/halcyon/DebugURLRequest.as [deleted file]
net/systemeD/halcyon/FileBank.as [new file with mode: 0755]
net/systemeD/halcyon/ImageBank.as [deleted file]
net/systemeD/halcyon/JSController.as
net/systemeD/halcyon/Map.as
net/systemeD/halcyon/MapEvent.as
net/systemeD/halcyon/MarkerUI.as
net/systemeD/halcyon/NestedXMLLoader.as
net/systemeD/halcyon/NodeUI.as
net/systemeD/halcyon/Stylesheet.as [new file with mode: 0644]
net/systemeD/halcyon/WayUI.as
net/systemeD/halcyon/connection/Changeset.as
net/systemeD/halcyon/connection/Connection.as
net/systemeD/halcyon/connection/Entity.as
net/systemeD/halcyon/connection/EntityCollection.as
net/systemeD/halcyon/connection/Marker.as
net/systemeD/halcyon/connection/Node.as
net/systemeD/halcyon/connection/Relation.as
net/systemeD/halcyon/connection/Tag.as
net/systemeD/halcyon/connection/TagEvent.as
net/systemeD/halcyon/connection/Trace.as
net/systemeD/halcyon/connection/Way.as
net/systemeD/halcyon/connection/XMLBaseConnection.as
net/systemeD/halcyon/connection/XMLConnection.as
net/systemeD/halcyon/connection/actions/DeleteWayAction.as
net/systemeD/halcyon/styleparser/NestedCSSLoader.as
net/systemeD/halcyon/styleparser/RuleSet.as
net/systemeD/halcyon/styleparser/ShapeStyle.as
net/systemeD/halcyon/styleparser/Style.as
net/systemeD/halcyon/styleparser/StyleChooser.as
net/systemeD/potlatch2/BackgroundSelector.mxml
net/systemeD/potlatch2/CustomLocaleCommand.as [new file with mode: 0644]
net/systemeD/potlatch2/EditController.as
net/systemeD/potlatch2/Preloader.as
net/systemeD/potlatch2/StyleSelector.mxml
net/systemeD/potlatch2/TagGrid.mxml
net/systemeD/potlatch2/TagViewer.mxml
net/systemeD/potlatch2/Toolbox.mxml
net/systemeD/potlatch2/Yahoo.as [deleted file]
net/systemeD/potlatch2/collections/Imagery.as
net/systemeD/potlatch2/collections/Stylesheets.as
net/systemeD/potlatch2/collections/VectorBackgrounds.as
net/systemeD/potlatch2/controller/ControllerState.as
net/systemeD/potlatch2/controller/DrawWay.as
net/systemeD/potlatch2/controller/SelectedParallelWay.as
net/systemeD/potlatch2/dialogs/BackgroundDialog.mxml [moved from net/systemeD/potlatch2/BackgroundDialog.mxml with 78% similarity]
net/systemeD/potlatch2/dialogs/MyGpxDialog.mxml [moved from net/systemeD/potlatch2/mygpx/MyGpxDialog.mxml with 52% similarity]
net/systemeD/potlatch2/dialogs/OptionsDialog.mxml [moved from net/systemeD/potlatch2/options/OptionsDialog.mxml with 69% similarity]
net/systemeD/potlatch2/dialogs/VectorSourceDialog.mxml [moved from net/systemeD/potlatch2/VectorSourceDialog.mxml with 52% similarity]
net/systemeD/potlatch2/help/VideoPlayer.mxml
net/systemeD/potlatch2/history/HistoryDialog.mxml [new file with mode: 0644]
net/systemeD/potlatch2/mapfeatures/Feature.as
net/systemeD/potlatch2/mapfeatures/MapFeatures.as
net/systemeD/potlatch2/mapfeatures/editors/CheckboxEditor.mxml
net/systemeD/potlatch2/mapfeatures/editors/Choice.as
net/systemeD/potlatch2/mapfeatures/editors/ChoiceEditor.mxml
net/systemeD/potlatch2/mapfeatures/editors/ChoiceEditorFactory.as
net/systemeD/potlatch2/mapfeatures/editors/FreeTextEditor.mxml
net/systemeD/potlatch2/mapfeatures/editors/NumberEditor.mxml
net/systemeD/potlatch2/mapfeatures/editors/RelationMemberEditorFactory.as
net/systemeD/potlatch2/mapfeatures/editors/RestrictionRenderer.mxml
net/systemeD/potlatch2/mapfeatures/editors/RouteEditor.mxml
net/systemeD/potlatch2/mapfeatures/editors/SingleTagEditor.as
net/systemeD/potlatch2/mapfeatures/editors/SingleTagEditorFactory.as
net/systemeD/potlatch2/mapfeatures/editors/SliderEditor.mxml
net/systemeD/potlatch2/mapfeatures/editors/SpeedEditor.mxml
net/systemeD/potlatch2/mapfeatures/editors/TurnRestrictionEditor.mxml
net/systemeD/potlatch2/panels/BackgroundMergePanel.mxml
net/systemeD/potlatch2/panels/BackgroundPanel.mxml
net/systemeD/potlatch2/panels/DragAndDropPanel.mxml [new file with mode: 0644]
net/systemeD/potlatch2/save/OAuthPanel.mxml
net/systemeD/potlatch2/save/SaveManager.as
net/systemeD/potlatch2/skins/CustomFormItemSkin.mxml [new file with mode: 0644]
net/systemeD/potlatch2/skins/CustomFormSkin.mxml [new file with mode: 0644]
net/systemeD/potlatch2/utils/CachedDataLoader.as [deleted file]
net/systemeD/potlatch2/utils/GpxImporter.as
net/systemeD/potlatch2/utils/Importer.as
net/systemeD/potlatch2/utils/KmlImporter.as
net/systemeD/potlatch2/utils/OsmImporter.as
net/systemeD/potlatch2/utils/ShpImporter.as
potlatch2.mxml
resources/features/pois/transport_zebracrossing.n.24.png [new file with mode: 0644]
resources/halcyon.html
resources/imagery.xml
resources/map_features.xml
resources/map_features/buildings.xml
resources/map_features/landuse.xml
resources/map_features/roads.xml
resources/map_features/transport.xml
resources/stylesheets/core_interactive.css
resources/stylesheets/core_landuse.css
resources/stylesheets/core_pois.css
resources/stylesheets/core_ways.css
resources/stylesheets/gpx.css
resources/stylesheets/opencyclemap.css
resources/stylesheets/potlatch.css
resources/stylesheets/snapshot.css
resources/stylesheets/wireframe.css
resources/test.css
resources_src/transport_zebracrossing.svg [new file with mode: 0644]
styles/Application.css
tests/fakeroot/embedded [new symlink]
tests/src/net/systemeD/halcyon/connection/NodeTest.as
tests/src/net/systemeD/halcyon/connection/actions/AddMemberToRelationActionTest.as
tests/src/net/systemeD/halcyon/connection/actions/JoinNodeActionTest.as
tests/src/net/systemeD/halcyon/connection/actions/SetTagActionTest.as

index dabfc42ada5060d4480c384d5ca769390c3e3ea6..563c982cf7354cf25006207fd4949fcd30c9954f 100644 (file)
@@ -12,7 +12,7 @@ Many icons used in halcyon/potlatch2 are based on the awesome CC0-licensed SJJB
 
 * Flex SDK 4.5
 ** Product page: http://www.adobe.com/products/flex/ 
-** Flex 4 Download page: http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+4 (free, OS X/Windows/Linux)
+** Flex 4.5 Download page: http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+4.5 (free, OS X/Windows/Linux)
 * AS3 docs - http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/
 * Flash debug player - http://www.adobe.com/support/flashplayer/downloads.html
 * Basically you might as well just sell your soul to Adobe
@@ -60,7 +60,8 @@ You can create and run the unit tests (not that there are that many) using flexu
 * ant test
 
 If you're using Mac OS X, you may need to tell ant to use more memory, by
-typing export ANT_OPTS=-Xmx500M beforehand (you can put this in your .profile).
+typing export ANT_OPTS="-Xms768m -Xmx1024m -XX:MaxPermSize=512m" 
+beforehand (you can put this in your .profile).
 
 
 Compiling during development:
index 79f1076d7b1e52d21c91606003a9478e7df71eef..fcb303b4af3aa3a7d51c936776b5990291ad22d4 100644 (file)
--- a/TODO.txt
+++ b/TODO.txt
 == l10n ==
 * Fix the en_US / default locale problem
 
+== history ==
+* Think about what happens if a node, which used to be part of a way and isn't any more, changes. Does that put a fake "version" in?
+
 == other ==
 * Simplify.as shouldn't add an action to the global undo stack, since it's called from e.g. importing into other layers
 
+
 Requested enhancements
 ----------------------
 
index 45c5ee655a625dc8cc461823043f33a03a8c6eb6..66c43c3eebf79b21f0f2235f381269de6a4fcf37 100644 (file)
--- a/build.xml
+++ b/build.xml
   <!-- note that there's an asdoc target in Flex 4, if/when we move to that -->
   <target name="docs" depends="manifests,makeLocalesList">
     <exec executable="${ASDOC}" failonerror="true">
-      <arg line="-source-path ."/>
-      <arg line="-doc-sources net/systemeD/"/>
+      <arg line="-source-path=."/>
+      <arg line="-doc-sources=net/systemeD/"/>
       <arg line="-external-library-path=lib/"/>
       <arg line="-external-library-path=${FLEX_HOME}/frameworks/libs/"/>
       <arg line="-external-library-path=${FLEX_HOME}/frameworks/libs/player/10.2/"/>
+      <arg line="-compiler.theme ${flexlib}/themes/Halo/halo.swc"/>
       <arg line="-lenient"/>
-      <arg line="-target-player 10.2.0"/>
-      <arg line="-exclude-classes ${org_classes} ${it_classes} ${hxasm_classes} ${com_classes}"/>
-      <arg line="-output resources/docs/"/>
-      <arg line="-window-title 'Halcyon and Potlatch2 Developer documentation'" />
-      <arg line="-main-title 'Halcyon and Potlatch2 Developer documentation'" />
-      <arg line="-footer 'Found an error? Help us fix it. http://wiki.openstreetmap.org/wiki/Potlatch2'"/>
+      <arg line="-target-player=10.2.0"/>
+      <arg line="-exclude-classes=${org_classes},${it_classes},${hxasm_classes},${com_classes}"/>
+      <arg line="-output=resources/docs/"/>
+      <arg line="-window-title='Halcyon and Potlatch2 Developer documentation'" />
+      <arg line="-main-title='Halcyon and Potlatch2 Developer documentation'" />
+      <arg line="-footer='Found an error? Help us fix it. http://wiki.openstreetmap.org/wiki/Potlatch2'"/>
       <arg line="-package net.systemeD.controls 'Custom-built controls used in Potlatch2'" />
       <arg line="-package net.systemeD.halcyon 'The AS3 rendering library'" />
       <arg line="-package net.systemeD.halcyon.connection 'The connection to the main OSM server, and the entities'" />
@@ -94,9 +95,8 @@
       <arg line="-package net.systemeD.potlatch2.tools 'Data manipulation tools'" />
       <arg line="-package net.systemeD.potlatch2.utils 'Data loading utilities'" />
       
-      <arg line="-left-frameset-width 300" />
-      <arg line="-locale=${locales.list}" />
-      <arg line="-allow-source-path-overlap true" />
+      <arg line="-left-frameset-width=300" />
+      <arg line="-allow-source-path-overlap=true" />
     </exec>
   </target>
 
 
         <fileset id="com_sources" dir="${basedir}/com/" />
         <!-- convert the names of excluded classes to packages with class names -->
-        <pathconvert property="com_classes" pathsep=" " refid="com_sources">
+        <pathconvert property="com_classes" pathsep="," refid="com_sources">
                 <chainedmapper>
                         <globmapper from="${basedir}/*" to="*"/>
                         <mapper type="package" from="*.as" to="*"/>
         <!-- Get the list of all files in the org directory -->
         <fileset id="org_sources" dir="${basedir}/org/" />
         <!-- convert the names of excluded classes to packages with class names -->
-        <pathconvert property="org_classes" pathsep=" " refid="org_sources">
+        <pathconvert property="org_classes" pathsep="," refid="org_sources">
                 <chainedmapper>
                         <globmapper from="${basedir}/*" to="*"/>
                         <mapper type="package" from="*.as" to="*"/>
 
         <fileset id="it_sources" dir="${basedir}/it/" />
         <!-- convert the names of excluded classes to packages with class names -->
-        <pathconvert property="it_classes" pathsep=" " refid="it_sources">
+        <pathconvert property="it_classes" pathsep="," refid="it_sources">
                 <chainedmapper>
                         <globmapper from="${basedir}/*" to="*"/>
                         <mapper type="package" from="*.as" to="*"/>
 
         <fileset id="hxasm_sources" dir="${basedir}/hxasm/" />
         <!-- convert the names of excluded classes to packages with class names -->
-        <pathconvert property="hxasm_classes" pathsep=" " refid="hxasm_sources">
+        <pathconvert property="hxasm_classes" pathsep="," refid="hxasm_sources">
                 <chainedmapper>
                         <globmapper from="${basedir}/*" to="*"/>
                         <mapper type="package" from="*.as" to="*"/>
        
       <!-- Sets java.awt.headless=true so font compilation works in headless environments -->
       <compiler.headless-server>true</compiler.headless-server>
-      <target-player>10.0.0</target-player>
+      <target-player>10.2.0</target-player>
      </mxmlc>
      
      <echo message="The ${test.application.name}.swf test runner has been created in ${test.bin.dir}" />
 
 
         <source-path path-element="${basedir}/l10n/locale/@{locale}"/>
+        <source-path path-element="${basedir}/l10n/locale/en_US"/>
         <include-resource-bundles>help_dialog</include-resource-bundles>
         <include-resource-bundles>p2_main</include-resource-bundles>
 
     <ac:for param="dirname">
       <path>
         <dirset dir="${basedir}/l10n/locale/">
+          <include name="*"/>
           <exclude name="bundles"/>
-          <include name="??_??"/>
         </dirset>
       </path>
       <sequential>
index 5cb7d91cd97172dffc4af6c8ac8c3ea732ebac0e..8c0969071f1b4beb26d8c66cf9667f57b73c1c32 100644 (file)
Binary files a/embedded/tab_transport.png and b/embedded/tab_transport.png differ
index 4b4c2ed6bb084c7670a01d2e657d7ee8816462ed..a4cd4d8a189a09611df6041070ebab5c95aaaeb8 100644 (file)
       <library-path append="true">
           <path-element>lib</path-element>
       </library-path>
+
+       
    </compiler>
+       <static-link-runtime-shared-libraries>true</static-link-runtime-shared-libraries>
 
    <metadata>
       <title>Halcyon</title>
index cbf3c914f9ac12dcc29ba1e70233568607b8187e..3e8598cc711253d2eddad955b39c1f2c75932367 100644 (file)
@@ -7,6 +7,7 @@ package {
        import flash.events.*;
        import flash.events.MouseEvent;
        import flash.display.*;
+       import flash.text.Font;
        import flash.text.TextField;
        import flash.external.*;
 //     import bustin.dev.Inspector;
@@ -18,30 +19,45 @@ package {
                function halcyon_viewer():void {
                        stage.align = StageAlign.TOP_LEFT;
                        stage.scaleMode = StageScaleMode.NO_SCALE;
-                       this.loaderInfo.addEventListener(Event.COMPLETE, init);
+                       this.loaderInfo.addEventListener(Event.COMPLETE, startInit);
                }
        
-               private function init(e:Event):void {
+               private function startInit(e:Event):void {
+                       var loader:Loader = new Loader();
+                       loader.contentLoaderInfo.addEventListener(Event.COMPLETE, startApp);
+                       loader.load(new URLRequest("FontLibrary.swf"));
+               }
+
+               private function startApp(event:Event):void {
+                       // Initialise font
+                       var FontLibrary:Class = event.target.applicationDomain.getDefinition("FontLibrary") as Class;
+                       Font.registerFont(FontLibrary.DejaVu);
+
+                       // Get parameters
+                       var params:Object={}; var k:String;
+                       for (k in this.loaderInfo.parameters) params[k]=this.loaderInfo.parameters[k];
+                       Globals.vars.flashvars = loaderInfo.parameters; // ** FIXME - not sure we should use flashvars anywhere in Halcyon/P2
 
-                       theMap = new Map(this.loaderInfo.parameters);
+                       // Initialise map
+                       theMap = new Map();
             theMap.updateSize(stage.stageWidth, stage.stageHeight);
                        addChild(theMap);
-                       Globals.vars.root=theMap;
-                       Globals.vars.nocache = loaderInfo.parameters['nocache'] == 'true';
 
-                       // add debug field
-                       var t:TextField=new TextField();
-                       t.width=400; t.height=100; t.x=400; t.border=true;
-                       t.multiline=true;
-                       addChild(t);
-                       Globals.vars.debug=t;
-            t.visible = loaderInfo.parameters["show_debug"] == 'true';
+                       // Add connection
+                       // ** FIXME - should get the stylesheet from parameters
+                       var conn:Connection = new XMLConnection("Main", params['api'], params['policy'], params);
+                       theMap.addLayer(conn, params['style'], false, true);
+                       theMap.init(params['lat'], params['lon'], params['zoom']);
+
+                       Globals.vars.root=theMap;       // ** FIXME - should no longer be necessary
+                       Globals.vars.nocache = loaderInfo.parameters['nocache'] == 'true';
 
                        stage.addEventListener(MouseEvent.MOUSE_UP, theMap.mouseUpHandler);
                        stage.addEventListener(MouseEvent.MOUSE_MOVE, theMap.mouseMoveHandler);
                        stage.addEventListener(MouseEvent.MOUSE_DOWN, theMap.mouseDownHandler);
 //                     Inspector.getInstance().init(stage);
 
+                       // Zoom buttons
                        var z1:Sprite=new Sprite();
                        z1.graphics.beginFill(0x0000FF); z1.graphics.drawRoundRect(0,0,20,20,5); z1.graphics.endFill();
                        z1.graphics.lineStyle(2,0xFFFFFF);
index 7cfb7bac4baf75a2336265fa8ade55b701289123..6b2fe3e1ab3357cd60af174747e0875946c758cd 100644 (file)
@@ -22,5 +22,10 @@ help.madeMistake=<p>¿T'enquivocasti? Val con calcar desfacer y/o volver a facer
 help.help=Ayuda
 help.guideInfomation=<p>Trai esta guía en casu de necesitar dalguna información cuando principies a editar.</p>
 help.save=Guardar
+help.addingFeatures=Amestar carauterístiques
+help.addingFeaturesText=<p><i>Enantes de que principies, la primera regla que tienes que saber ye no que cinca al usu de datos privativos. ¡Los datos de mapes con drechos d'autor o cualesquier otru datu privativu tan estrictamente torgaos! ¡Nun se permite copiar, calcar o cualesquier otra reproducción de trabayos con drechos d'autor! (Fonte: <a href="http://wiki.openstreetmap.org/wiki/Copyright" target="_blank">Copyright - Wiki d'OpenStreetMap</a>)</i></p>\n  <p></p>\n  <p>Les carauterístiques lliniales como les cais, caminos, ferrocarriles y siluetes d'edificios vamos llamales equí <b>víes</b>.</p>\n  <p>Si de sópitu notes que te falta la barra llateral con tolos iconos, ye porque seleicionasti una carauterística nel mapa. Simplemente deseleicionala calcando nun área balera del mapa pa que vuelvan a apaecer los iconos.</p>\n            <p><b>Pa crear un puntu (o noyu)</b>, arrastra y suelta l'iconu apropiáu de la barra llateral al mapa. Mira Amestar PDIs pa saber más tocante a crear un PDI (Puntu d'interés)</p>\n            <p><b>Pa crear una vía</b>, principia calcando nel mapa nel puntu de comienzu, y llueu calca en cada puntu socesivu. Fai doble-click p'acabar la llinia o calca Intro.</p>\n            <p><b>Pa crear un polígonu</b>, principia calcando nel mapa nel puntu de comienzu, y llueu calca en cada puntu socesivu (asemeyáu a crear una vía), y acaba calcando nel primer puntu pa zarrar el polígonu.</p>\n            <p>Recuerda, si t'enquivoques puedes siempres calcar nel botón Desfacer. Calcando la tecla Esc se desfairán toles ediciones de la carauterística actual.</p>
+help.editBeg=Editar (Princ.)
+help.editingFeatures=Editar carauterístiques (Principiantes)
+help.editingFeaturesText=<p><b>P'amestar un puntu a una vía esistente</b>, seleiciona la vía y mayús+click nel llugar deseáu.</p>\n    <p><b>Pa desaniciar un puntu</b>, seleiciona'l puntu y calca nel botón Desaniciar elementu nel requexu d'abaxo a mandrecha o calca Desaniciar (o Desaniciar atrás) nel tecláu.</p>\n  <p><b>Pa desaniciar una vía</b>, seleiciona esa vía y calca nel botón Desaniciar elementu nel requexu d'abaxo a mandrecha o calca Mayús+Desaniciar (o Mayús+Desaniciar atrás) nel tecláu.</p>\n    <p><b>Pa mover un puntu</b>, calca y arrastra'l puntu.</p>\n   <p><b>Pa mover una vía</b>, calca y arrastra l'elementu completu. Gabitu: Garra un segmentu cuando nun quieras mover un noyu de mou accidental.</p>\n  <p><b>Pa estender una vía</b>, calca nun puntu final de la vía. Darréu, sigui dibuxando como de vezu.</p>\n    <p><b>P'amestar una vía nueva que s'estiende dende una vía esistente</b>, mayús+click nun puntu del final de la vía. Darréu, sigui dibuxando como de vezu.</p>
 help.shortcuts=Atayos
 help.keyboardShortcuts=Atayos de tecláu
index b2e4dc1fccb9422a61ed4ea1a020511a31ebd7ba..ebf062f00e03e11aa4cecaa1cdcde75e553be5c0 100644 (file)
@@ -4,9 +4,19 @@
 
 help.gettingStarted=Kregiñ ganti
 help.welcome=Degemer mat
+help.whyOpenstreetmap=<p><b>Da betra OpenStreetMap ?</b> OSM zo ur servij kartennaouiñ ma vez klokaet ha difaziet dibaouez an holl roadennoù anezhañ gant tud vunut eveldoc'h. Emsav eo rak dieub da implijout ha frank a wirioù eo OSM. Deuet eo OSM da vezañ un oberour eus ar c'hentañ troc'h pa vez da verañ enkadennoù zo (da sk. pa oa bet ret kenurzhiañ strivoù savete mab-den  da-heul krenn-douar Haiti). Pouezus-bras eo resister ar roadennoù ha spi hon eus e vo mat deoc'h gouestlañ un tamm eus hoc'h amzer deomp !</p>
+help.activeMembers=<p><b>+ Evit izili oberiant OpenStreetMap</b>, kevreit da OSM a-raok kemmañ tra pe dra.</p>
+help.newMembers=<p><b>+ Evit an izili nevez</b>, kit da welet <a href="http://www.openstreetmap.org/user/new" target="_blank">http://www.openstreetmap.org</a> evit krouiñ ur gont, kevreañ, ha goude-se distreiñ amañ evit aotren ar moned da Potlatch 2 ha stagañ ganti.</p>
+help.introText=<p><b>Potlatch 2</b> a reer eus aozer OpenStreetMap (OSM). Aotren a ra ac'hanoc'h da gemmañ traoù war-eeun dre lec'hienn {0}.</p>
 help.introduction=Digoradur
+help.controls=Kontrolloù
+help.interfaceControls=Kontrolloù an etrefas
+help.mapBackground=<p>Dibabit foñs ar gartenn e-mesk an elfennoù zo war ar roll pe ouzhpennit ho restr vektor deoc'h-c'hwi.</p>
+help.colourStyle=<p>Dibabit ar stil a fell deoc'h gwelet ar gartenn drezañ. Cheñch a ra al livioù hag ar stil hollek ha dibarzhioù all zo ivez evel ar gweled dre neud-orjal (wireframe).</p>
 help.gps=GPS
+help.createOsmMap=<p>Savit roadennoù kartenn OSM en ur ober gant ar roadennoù GPS pourchaset gant tud all evel treuztres foñs kartenn</p>
 help.myGps=MyGPS
+help.displayGps=<p>Diskwel ar roadennoù GPS bet enporzhiet ganeoc'h a-raok war OpenStreetMap.</p>
 help.undoRedo=Dizober / Adober
 help.help=Skoazell
 help.save=Enrollañ
diff --git a/l10n/locale/ca/p2_main.properties b/l10n/locale/ca/p2_main.properties
new file mode 100644 (file)
index 0000000..aacf566
--- /dev/null
@@ -0,0 +1,37 @@
+# Messages for Catalan (Català)
+# Exported from translatewiki.net
+# Author: Jconstanti
+# Author: Toniher
+
+main.undo=Desfés
+main.redo=Refés
+main.background=Fons
+main.map_style=Estil del mapa
+main.gpsButton=Dades de GPS
+main.gps_data=Dades de GPS
+main.my_tracks=Les meves traces
+main.clear_gps=Neteja
+main.help=Ajuda
+main.options=Opcions
+main.save=Desa
+toolbox.delete_node=Suprimeix el node
+toolbox.delete_area=Suprimeix l'àrea (Maj + Supr)
+toolbox.delete_way=Suprimeix l'àrea (Maj + Supr)
+toolbox.delete_item=Suprimeix l'element
+toolbox.reverse_direction=Canvia la direcció (V)
+toolbox.split_way=Divideix la via
+toolbox.merge_ways=Uneix vies
+toolbox.make_circular=Fer rotonda
+toolbox.create_parrallel_way=Crear via paral·lela (P)
+oauth.gotLinkBox=Feu clic a l'enllaç de sota per obrir una pàgina web on se li demanarà per autoritzar l'accés per a aquesta aplicació.
+oauth.authorized=Una vegada que ha autoritzat l'accés faci clic al botó inferior de 'Provar accés'
+oauth.deniedLabel=<b>S'ha denegat l'accés, si us plau verifiqui i torni a provar</b>
+oauth.rememberMe=Recorda'm
+oauth.permFail=<p>El servidor ha refusat les credencials d'aquesta aplicació - no s'ha pogut obtenir un enllaç d'autorització.</p>\n<p>           <b>OAuth accés impossible.</b>         </p>\n<p>Si us plau, consulteu el proveïdor de l'aplicació per esbrinar el que està passant.</p>
+oauth.tempFail=Hi ha hagut un problema en contactar amb el servidor que dona l'autorització.  Pot ser un error transitori, proveu un altre cop més tard.
+oauth.tryAccessButton=Proveu d'accés
+oauth.cancelButton=Cancel·la
+save.editDescription=Si us plau, introduïu una descripció de les vostres modificacions. Això s'utilitzarà per donar una idea de quins canvis esteu fent a altres dibuixants de mapes.
+styleSelector.editButton=Edita...
+backgroundSelector.editButton=Modifica...
+options.ok=D'acord
index ee70dfc49a23a5d7f8e99068874e0115729387d6..c95c39e77d938cdbee4ce8ae050cbe8fdfd59df4 100644 (file)
@@ -24,12 +24,15 @@ help.help=Hilfe
 help.guideInfomation=<p>Öffnet diese Anleitung für den Fall, dass du am Anfang deiner Bearbeitungen Informationen benötigst.</p>
 help.save=Speichern
 help.addingFeatures=Hinzufügen von Funktionen
+help.addingFeaturesText=<p><i>Bevor du anfängst, musst du den Umgang mit geschützten Daten kennen. Daten aus urheberrechtlich geschützten Karten und andere geschützte Daten sind streng verboten! Das Kopieren, Nachvollziehen und Wiedergeben urheberrechtlich geschützter Werke ist nicht erlaubt! (Quelle: <a href="http://wiki.openstreetmap.org/wiki/Copyright" target="_blank">Urheberrechtshinweise - OpenStreetMap-Wiki</a>)</i></p>\n  <p></p>\n  <p>Zu linearen Funktionen wie bswp. Straßen, Fußwegen, Bahnlinien und Gebäudeumrissen wird im Folgenden als <b>Wege</b> Bezug genommen.</p>\n  <p>Sofern du plötzlich bemerkst, dass die Seitenleiste mitsamt den Symbolen nicht mehr angezeigt wird, liegt das daran, dass du eine Funktion direkt auf der Karte ausgewählt hast. Nimm die Auswahl zurück, indem du einfach einen leeren Bereich der Karte anklickst, um wieder die Symbole angezeigt zu bekommen.</p>\n            <p><b>Um einen Punkt (oder Knotenpunkt) zu erstellen</b>, zieht man das passende, in der Seitenleiste vorhandene, Symbol auf die Karte und legt es dort ab. Siehe auch „Sehenswürdigkeiten hinzufügen“, um mehr zum Erstellen einer Sehenswürdigkeit <i>(POI - Point of Interest)</i> zu erfahren.</p>\n            <p><b>Um einen Weg anzulegen</b>, klickt man zunächst dessen Anfangspunkt auf der Karte an. Danach klickt man die Folgepunkte zur Darstellung des Weges an. Am Endpunkt des Weges macht man einen Doppelklick oder drückt die Entertaste.</p>\n            <p><b>Um ein Polygon zu erstellen</b>, klickt man zunächst den Ausgangspunkt auf der Karte an. Danach klickt man, ähnlich dem Erstellen eines Weges, auf der Karte die Folgepunkt an und beendet die Aktion, indem man am Ende wieder den Ausgangspunkt anklickt, um das Polygon abzuschließen.</p>\n            <p>Sofern du einen Fehler machst, kannst du stets die Schaltfläche „Rückgängig“ anklicken. Das Drücken der Escapetaste macht alle deine Bearbeitungen zur aktuellen Funktion rückgängig.</p>
 help.editBeg=Bearbeiten (Anfänger)
 help.editingFeatures=Funktionen zum Bearbeiten (Anfänger)
+help.editingFeaturesText=<p><b>Um einen Punkt zu einem vorhandenen Weg hinzuzufügen</b>, wählt man den Weg aus, drückt die Umschalttaste und klickt den gewünschten Punkt an.</p>\n    <p><b>Um einen Punkt zu löschen</b>, wählt man den Punkt aus und klickt auf die Schaltfläche „Objekt löschen“ in der unteren rechten Ecke, oder man drückt auf der Tastatur die Taste Entfernen (bzw. die Rücktaste).</p>\n  <p><b>Um einen Weg zu löschen</b>, wählt man den Weg aus  und klickt auf die Schaltfläche „Objekt löschen“ in der unteren rechten Ecke, oder man drückt auf der Tastatur die Umschalttaste und die Taste Entfernen (bzw. die Umschalttaste und die Rücktaste).</p>\n    <p><b>Um einen Punkt zu verschieben</b>, klickt man ihn an und zieht ihn.</p>\n   <p><b>Um einen Weg zu verschieben</b>, klickt man ihn an und zieht ihn. Tipp: Wähle ein Segment an einer Stelle an der man nicht versehentlich auch einen Knotenpunkt verschieben kann.</p>\n  <p><b>Um einen Weg zu verlängern</b>, klickt man auf einen seiner Endpunkte. Danach fährt man mit wie gewohnt mit dem Zeichnen fort.</p>\n    <p><b>Um einen neuen Weg als Anschluss an einen bestehenden Weg hinzuzufügen</b>, drückt man die Umschalttaste und klickt auf einen der Endpunkte des bestehenden Wegs. Danach fährt man mit wie gewohnt mit dem Zeichnen fort.</p>
 help.editAdv=Bearbeiten (Fortgeschrittene)
 help.editingFeaturesAdv=Funktionen zum Bearbeiten (Fortgeschrittene)
+help.editingFeaturesAdvText=<p><b>Um einen Weg zu teilen</b>, wählt man den Punkt aus, an dem man ihn teilen möchte und klickt auf das Scherensymbol oder drückt die Taste X auf der Tastatur. Hinweis: Füge zunächst einen Knotenpunkt hinzu, um den Weg zwischen zwei Knotenpunkten teilen zu können.</p>\n            <p><b>Um eine Kreuzung zweier Wege zu erstellen</b>, zeichnet man wie gewohnt bis zu der Stelle an der die Kreuzung benötigt wird. Sobald man den Weg über einen anderen Weg führt, werden die Punkte eine blaue Farbe annehmen. Nun klickt man auf einen der jetzt blauen Punkte oder auf eine andere Stelle auf dem Weg, um die Kreuzung zu erstellen.</p>\n            <p><b>Um eine Kreuzung zweier Wege zu entfernen</b>, wählt man einen Punkt auf dem Weg, den man ändern möchte, aus. Danach drückt man die Taste „-“ auf der Tastatur, um den Punkt zu entfernen.</p>\n            <p><b>Um die Richtung eines Wegs umzukehren</b>, klickt man auf die Schaltfläche „Richtung umkehren“, die sich in der rechten unteren Ecke befindet. Die Richtung eines Wegs ist nur bei Funktionen bedeutsam, die über eine Richtungskomponente verfügen, wie bspw. Einbahnstraße, Küstenlinie, Insel, usw.</p>\n            <p><b>Um einen parallel zu einem vorhandenen Weg verlaufenden Weg zu erzeugen</b>, wählt man den vorhandenen Weg aus und klickt auf die Schaltfläche „Parallelen Weg erstellen“ in der rechten unteren Ecke oder drückt die Taste P auf der Tastatur.</p>\n     <p><b>Um einen Weg zu erstellen, der Knotenpunkte mit einem vorhandenen Weg gemeinsam haben soll</b>, fängt man zunächst mit dem Zeichnen an, klickt die ersten zwei gemeinsamen Knotenpunkte an und drückt dann die Taste F, um nun automatisch dem bestehenden Weg zu folgen.</p>\n            <p><i>Besuche <a href="http://wiki.openstreetmap.org/wiki/Potlatch_2/Primer" target="_blank">Potlatch 2 Primer</a> auf dem OpenStreetMap-Wiki, um mehr zu komplexeren Bearbeitungsmöglichkeiten sowie zu Bearbeitungskonventionen zu erfahren.</i></p>
 help.tag=Markieren
 help.taggingFeatures=Funktionen zum Markieren
-help.taggingFeaturesText=<p>Dank Potlatch 2 ist das Tagging von Objekten durch die Verwendung von graphischen Menus und Symbolen recht einfach geworden.</p>\n<p><b>Tagging von Objekten</b></p>\n<p>Selektiere den Weg oder Punkt den Du bearbeiten willst, und waehle den entsprechenden Tag aus dem Menu in der linken Seitenleiste aus. Danach werden einige Textfelder erscheinen in die man einige der grundlegenden Eigenschaften, wie z.B. Name eintragen kann. Die genauen Eigenschaften haengen von der Art des Weges oder Punktes ab. Diese sollten so gut wie moeglich ausgefuellt werden.</p><p>Da beliebige Eigenschaften einem Objekt zugewiesen werden koennen, sind natuerlich nicht alle als separate Felder vorhanden. Insofern kann es sein das einige gewueschte Tags oder Werte nicht vorgegeben sind. In diesem Fall koennen durch das klicken der Registerkarte "Advanced" am unteren Rand der Seitenleiste weitere Tags hinzugefuegt werden.</p>\n<p> Das OpenStreetMap wiki verfuegt ueber eine <a href="http://wiki.openstreetmap.org/wiki/Map_features" target="_blank">ausfuehrliche Liste von Tags und Werten</a>. Falls es Unklarheiten bezueglich des taggings, sollte die OSM Dokumentation im Wiki konsultiert werden.</p>
+help.taggingFeaturesText=<p>Dank Potlatch 2 ist das Tagging von Objekten, unter Verwendung graphischer Menüs sowie vordefinierter Felder/Symbole, recht einfach geworden.</p>\n        <p><b>Tagging von Objekten</b></p>\n        <p>Selektiere den Weg oder Punkt den du bearbeiten möchtest, und wähle das passende Tag aus dem Menü in der linken Seitenleiste aus. Danach erscheinen einige Textfelder in die man, abhängig vom zuvor gewählten Tag, die grundlegenden Eigenschaften, wie bspw. Name, Geschwindigkeitsbegrenzung oder Breite eintragen kann. Fülle diese so gut wie möglich aus.</p>\n        <p>Fortgeschrittene Benutzer werden das Fehlen von ein paar Tags und deren zugehöriger Werte feststellen, die sie gelegentlich nutzen. Sofern eines dieser Tags benötigt wird, klicke auf die Registerkarte „Fortgeschritten“, die sich am unteren Ende der Seitenleiste befindet und füge nach Bedarf die dort vorhandenen Tags hinzu, bzw. bearbeite sie.</p>\n        <p> Das OpenStreetMap-Wiki enthält eine <a href="http://wiki.openstreetmap.org/wiki/Map_features" target="_blank">ausführliche Liste von Tags und deren zugehöriger Werte</a>. Sofern Unklarheiten bezüglich des Taggings bestehen, sollte die in diesem Wiki hinterlegte OSM-Dokumentation zu Rate gezogen werden.</p>
 help.shortcuts=Abkürzungen
 help.keyboardShortcuts=Tastaturabkürzungen
index 0124f072f8f456f5b2dd09f289cc43576f39ad62..f4c958d0649eefbe9f0d4179af648d939e7d1b39 100644 (file)
@@ -5,6 +5,7 @@ main.undo=Undo
 main.redo=Redo
 main.background=Background
 main.map_style=Map Style
+main.gpsButton=GPS Data
 main.gps_data=GPS Data
 main.my_tracks=My Tracks
 main.clear_gps=Clear
@@ -23,11 +24,11 @@ toolbox.straighten_way=Straighten way
 toolbox.make_circular=Make circular
 toolbox.make_right_angled=Make right-angled (Q)
 toolbox.create_parrallel_way=Create parallel way (P)
-oauth.gotLinkBox=Click the link below to open a web page where you will be asked to authorise access for this app.
+oauth.gotLinkBox=Click the link below to open a web page where you will be asked to authorise access for this application.
 oauth.authorized=Once you've authorised the access click the 'Try access' button below
 oauth.deniedLabel=<b>Access was denied, please check, and try again</b>
 oauth.rememberMe=Remember me
-oauth.permFail=<p>The server refused this application's credentials -- an authorisation link could not be obtained.          </p><p>         <b>OAuth access will not be possible.</b>  </p><p> Please contact application vendor to find out what's going on.</p>
+oauth.permFail=<p>The server refused this application's credentials -- an authorisation link could not be obtained.          </p>\n<p>       <b>OAuth access will not be possible.</b>       </p>\n<p>       Please contact application vendor to find out what's going on.</p>
 oauth.tempFail=There was a problem contacting the server to get authorisation.    This may be a temporary error, try again later.
 oauth.tryAccessButton=Try access
 oauth.cancelButton=Cancel
@@ -39,4 +40,4 @@ backgroundSelector.editButton=Edit...
 backgroundSelector.vectorButton=Vector file...
 options.tbcheck=Show toolbox
 options.cursorcheck=Use custom cursors
-options.ok=Ok
+options.ok=OK
index 3c795c2c2140d1a4bc4caa0ca39c05637a223cd9..b9efe24dca0cc493f6645aeede2a98c6f9a3a43e 100644 (file)
@@ -1,35 +1,35 @@
 # en_US resources file
 
-help.gettingStarted = Getting Started
-help.welcome = Welcome
-help.whyOpenstreetmap = <p><b>Why OpenStreetMap?</b> OSM is a mapping service in which all data is constantly updated and edited by everyday people like you. The obvious benefit is that it's free to use, but it has also become a major player in crisis mapping (e.g. use of OSM data to coordinate earthquake relief efforts in Haiti). Accuracy of this data is critical, and we hope you are able to volunteer some of your time!</p>
-help.activeMembers = <p><b>+ For active OpenStreetMap members</b>, please sign in to OSM before editing.</p>
-help.newMembers = <p><b>+ For new members</b>, please visit <a href="http://www.openstreetmap.org/user/new" target="_blank">http://www.openstreetmap.org</a> to create an account, log in, then return here to allow access to Potlatch 2 and begin editing.</p>
-help.introText = <p><b>Potlatch 2</b> is an OpenStreetMap (OSM) editor that allows you to make edits directly through {0} website.</p>
-help.introduction = Introduction
-help.controls = Controls
-help.interfaceControls = Interface Controls
-help.mapBackground = <p>Choose your map background from one of the items in the list or add your own vector file.</p>
+help.gettingStarted=Getting Started
+help.welcome=Welcome
+help.whyOpenstreetmap=<p><b>Why OpenStreetMap?</b> OSM is a mapping service in which all data is constantly updated and edited by everyday people like you. The obvious benefit is that it's free to use, but it has also become a major player in crisis mapping (e.g. use of OSM data to coordinate earthquake relief efforts in Haiti). Accuracy of this data is critical, and we hope you are able to volunteer some of your time!</p>
+help.activeMembers=<p><b>+ For active OpenStreetMap members</b>, please sign in to OSM before editing.</p>
+help.newMembers=<p><b>+ For new members</b>, please visit <a href="http://www.openstreetmap.org/user/new" target="_blank">http://www.openstreetmap.org</a> to create an account, log in, then return here to allow access to Potlatch 2 and begin editing.</p>
+help.introText=<p><b>Potlatch 2</b> is an OpenStreetMap (OSM) editor that allows you to make edits directly through {0} website.</p>
+help.introduction=Introduction
+help.controls=Controls
+help.interfaceControls=Interface Controls
+help.mapBackground=<p>Choose your map background from one of the items in the list or add your own vector file.</p>
 help.colourStyle=<p>Choose the style in which you wish to view the map. Colours and overall style vary and also includes other options like wireframe.</p>
-help.gps = GPS
-help.createOsmMap = <p>Create OSM map data using other people's GPS tracks as a background</p>
-help.myGps = MyGPS
-help.displayGps = <p>Display GPS traces that you've previously uploaded to OpenStreetMap.</p>
-help.undoRedo = Undo / Redo
-help.madeMistake = <p>Made a mistake? Just hit undo and/or redo to correct your edits.</p>
-help.help = Help
-help.guideInfomation = <p>Brings up this guide in case you need any information as you begin editing.</p>
-help.save = Save
-help.addingFeatures = Adding Features
-help.addingFeaturesText = <p><i>Before you begin, the first rule you need to know is the use of proprietary data. Data from copyrighted maps or any other proprietary data is strictly prohibited! Copying, tracing or any reproduction of copyrighted work is not allowed! (Source: <a href="http://wiki.openstreetmap.org/wiki/Copyright" target="_blank">Copyright - OpenStreetMap Wiki</a>)</i></p>\n  <p></p>\n  <p>Linear features such as streets, footpaths, railways and building outlines will hereby be referred to as <b>ways</b>.</p>\n  <p>If you suddenly realize your sidebar with all the icons have gone missing, it's because you have a feature selected on the map. Simply deselect by clicking on a blank area of the map to bring up the icons again.</p>\n            <p><b>To create a point (or node)</b>, just drag and drop the appropriate icon from the sidebar onto the map. See Add POIs to learn more about creating a POI (Point of Interest)</p>\n            <p><b>To create a way</b>, begin by clicking on the map at its start point, then click at each successive point. Double-click to finish the line or press Enter.</p>\n            <p><b>To create a polygon</b>, begin by clicking on the map at its start point, then click at each successive point (similar to creating a way), and finish by clicking on the very first point to close the polygon.</p>\n            <p>Remember, if you make a mistake, you can always hit the Undo button. Pressing the Esc key will undo all your edits for the current feature.</p>
-help.editBeg = Edit (Beg.)
-help.editingFeatures = Editing Features (Beginner)
-help.editingFeaturesText = <p><b>To add a point to an existing way</b>, select the way and shift+click at the desired location.</p>\n    <p><b>To delete a point</b>, select the point and click the Delete Item button in the bottom right corner or press Delete (or Backspace) on your keyboard.</p>\n  <p><b>To delete a way</b>, select the way and click the Delete Item button in the bottom right corner or press shift+Delete (or shift+Backspace) on your keyboard.</p>\n    <p><b>To move a point</b>, click and drag the point.</p>\n   <p><b>To move a way</b>, click and drag the entire feature. Hint: Grab a segment where you won't accidentally move a node.</p>\n  <p><b>To extend a way</b>, click on one of the end points of the way. Then continue drawing as usual.</p>\n    <p><b>To add a new way extending from an existing way</b>, shift+click on one of the end points of the way. Then continue drawing as usual.</p>
-help.editAdv = Edit (Adv.)
-help.editingFeaturesAdv = Editing Features (Advanced)
-help.editingFeaturesAdvText =  <p><b>To split a way</b>, select the point at which you want to cut, and click the Scissor tool or press X on your keyboard. Hint: Add a node first in order to cut between nodes.</p>\n            <p><b>To make a junction between two ways</b>, draw as usual until you need to make a junction. Then as you move your mouse over another way, the points will light up blue. Click on one of the blue points or any other desired location on the way to make a junction.</p>\n            <p><b>To disconnect a junction</b>, select the point on the way you wish to alter. The press - on your keyboard to remove the point.</p>\n            <p><b>To reverse the direction of a way</b>, click the Reverse Direction button in the bottom right corner. The direction of a way is only a concern for those features with a "oneway" tag - oneway streets, coastlines, islands, and so on.</p>\n            <p><b>To create a way running parallel</b>, select the way and click the Create Parallel Way button in the bottom right corner or press P on your keyboard.</p>\n     <p><b>To create a way that shares nodes with an existing way</b>, start drawing, click the first two shared nodes, then press F to automatically follow the existing way.</p>\n            <p><i>Visit the <a href="http://wiki.openstreetmap.org/wiki/Potlatch2/Primer" target="_blank">Potlatch 2 Primer</a> on the OpenStreetMap wiki for even more advanced editing methods and conventions.</i></p>
-help.tag = Tag
-help.taggingFeatures = Tagging Features
-help.taggingFeaturesText = <p>With Potlatch 2, tagging features has become relatively easy with its use of graphical menus and dedicated fields/icons.</p>\n          <p><b>Tagging a feature</b></p>\n          <p>Select the point or way that you wish to edit, and choose the appropriate tag from the left sidebar. After tagging the feature, some basic fields should appear such as Name, Speed Limit, and Width, depending on the tag you gave. Fill these out as best you can.</p><p>Advanced users may notice the absence of a few tags and tag values they occasionally use. If this is the case, click on the Advanced tab at the bottom of the sidebar and edit/add as necessary.</p>\n          <p>The OpenStreetMap wiki also provides an <a href="http://wiki.openstreetmap.org/wiki/Map_features" target="_blank">extensive list of tags and tag values</a>. Please refer back to the OSM documentation if you are unsure of which tag to use.</p>
-help.shortcuts = Shortcuts
-help.keyboardShortcuts = Keyboard Shortcuts
+help.gps=GPS
+help.createOsmMap=<p>Create OSM map data using other people's GPS tracks as a background</p>
+help.myGps=MyGPS
+help.displayGps=<p>Display GPS traces that you've previously uploaded to OpenStreetMap.</p>
+help.undoRedo=Undo / Redo
+help.madeMistake=<p>Made a mistake? Just hit undo and/or redo to correct your edits.</p>
+help.help=Help
+help.guideInfomation=<p>Brings up this guide in case you need any information as you begin editing.</p>
+help.save=Save
+help.addingFeatures=Adding Features
+help.addingFeaturesText=<p><i>Before you begin, the first rule you need to know is the use of proprietary data. Data from copyrighted maps or any other proprietary data is strictly prohibited! Copying, tracing or any reproduction of copyrighted work is not allowed! (Source: <a href="http://wiki.openstreetmap.org/wiki/Copyright" target="_blank">Copyright - OpenStreetMap Wiki</a>)</i></p>\n  <p></p>\n  <p>Linear features such as streets, footpaths, railways and building outlines will hereby be referred to as <b>ways</b>.</p>\n  <p>If you suddenly realize your sidebar with all the icons have gone missing, it's because you have a feature selected on the map. Simply deselect by clicking on a blank area of the map to bring up the icons again.</p>\n            <p><b>To create a point (or node)</b>, just drag and drop the appropriate icon from the sidebar onto the map. See Add POIs to learn more about creating a POI (Point of Interest)</p>\n            <p><b>To create a way</b>, begin by clicking on the map at its start point, then click at each successive point. Double-click to finish the line or press Enter.</p>\n            <p><b>To create a polygon</b>, begin by clicking on the map at its start point, then click at each successive point (similar to creating a way), and finish by clicking on the very first point to close the polygon.</p>\n            <p>Remember, if you make a mistake, you can always hit the Undo button. Pressing the Esc key will undo all your edits for the current feature.</p>
+help.editBeg=Edit (Beg.)
+help.editingFeatures=Editing Features (Beginner)
+help.editingFeaturesText=<p><b>To add a point to an existing way</b>, select the way and shift+click at the desired location.</p>\n    <p><b>To delete a point</b>, select the point and click the Delete Item button in the bottom right corner or press Delete (or Backspace) on your keyboard.</p>\n  <p><b>To delete a way</b>, select the way and click the Delete Item button in the bottom right corner or press shift+Delete (or shift+Backspace) on your keyboard.</p>\n    <p><b>To move a point</b>, click and drag the point.</p>\n   <p><b>To move a way</b>, click and drag the entire feature. Hint: Grab a segment where you won't accidentally move a node.</p>\n  <p><b>To extend a way</b>, click on one of the end points of the way. Then continue drawing as usual.</p>\n    <p><b>To add a new way extending from an existing way</b>, shift+click on one of the end points of the way. Then continue drawing as usual.</p>
+help.editAdv=Edit (Adv.)
+help.editingFeaturesAdv=Editing Features (Advanced)
+help.editingFeaturesAdvText=<p><b>To split a way</b>, select the point at which you want to cut, and click the Scissor tool or press X on your keyboard. Hint: Add a node first in order to cut between nodes.</p>\n            <p><b>To make a junction between two ways</b>, draw as usual until you need to make a junction. Then as you move your mouse over another way, the points will light up blue. Click on one of the blue points or any other desired location on the way to make a junction.</p>\n            <p><b>To disconnect a junction</b>, select the point on the way you wish to alter. Then press - on your keyboard to remove the point.</p>\n            <p><b>To reverse the direction of a way</b>, click the Reverse Direction button in the bottom right corner. The direction of a way is only a concern for those features with a "oneway" tag - oneway streets, coastlines, islands, and so on.</p>\n            <p><b>To create a way running parallel</b>, select the way and click the Create Parallel Way button in the bottom right corner or press P on your keyboard.</p>\n     <p><b>To create a way that shares nodes with an existing way</b>, start drawing, click the first two shared nodes, then press F to automatically follow the existing way.</p>\n            <p><i>Visit the <a href="http://wiki.openstreetmap.org/wiki/Potlatch_2/Primer" target="_blank">Potlatch 2 Primer</a> on the OpenStreetMap wiki for even more advanced editing methods and conventions.</i></p>
+help.tag=Tag
+help.taggingFeatures=Tagging Features
+help.taggingFeaturesText=<p>With Potlatch 2, tagging features has become relatively easy with its use of graphical menus and dedicated fields/icons.</p>\n          <p><b>Tagging a feature</b></p>\n          <p>Select the point or way that you wish to edit, and choose the appropriate tag from the left sidebar. After tagging the feature, some basic fields should appear such as Name, Speed Limit, and Width, depending on the tag you gave. Fill these out as best you can.</p><p>Advanced users may notice the absence of a few tags and tag values they occasionally use. If this is the case, click on the Advanced tab at the bottom of the sidebar and edit/add as necessary.</p>\n          <p>The OpenStreetMap wiki also provides an <a href="http://wiki.openstreetmap.org/wiki/Map_features" target="_blank">extensive list of tags and tag values</a>. Please refer back to the OSM documentation if you are unsure of which tag to use.</p>
+help.shortcuts=Shortcuts
+help.keyboardShortcuts=Keyboard Shortcuts
index 80f47c2b052731aefbc4146facff87e82f5c21dd..c1eb227b6c9af84b564b44db878dbb529c24ce27 100644 (file)
@@ -26,7 +26,7 @@ toolbox.make_circular = Make circular
 toolbox.make_right_angled = Make right-angled (Q)
 toolbox.create_parrallel_way = Create parallel way (P)
 
-oauth.gotLinkBox=Click the link below to open a web page where you will be asked to authorise access to this application.
+oauth.gotLinkBox=Click the link below to open a web page where you will be asked to authorise access for this application.
 oauth.authorized=Once you've authorised the access click the 'Try access' button below
 oauth.deniedLabel=<b>Access was denied, please check, and try again</b>
 oauth.rememberMe=Remember me
index 3b34201a4d53e7599e7e6d4af4a60145ce1ebb67..5058308c27b85e2252b1cd9466ac5549ef107bb8 100644 (file)
@@ -1,6 +1,7 @@
 # Messages for Spanish (Español)
 # Exported from translatewiki.net
 # Author: Armando-Martin
+# Author: McDutchie
 
 help.gettingStarted=Primeros pasos
 help.welcome=Bienvenido
@@ -14,3 +15,24 @@ help.interfaceControls=Controles de la interfaz
 help.mapBackground=<p>Elija su fondo de mapa de uno de los elementos de la lista o agregue su propio archivo vectorial.</p>
 help.colourStyle=<p>Elija el estilo con el que desea ver el mapa. Los colores y el estilo general varían y también incluyen otras opciones como modelo de alambres (wireframe).</p>
 help.gps=GPS
+help.createOsmMap=<p>Crear datos de mapa OSM utilizando como fondo las pistas GPS de otras personas.</p>
+help.myGps=MiGPS
+help.displayGps=<p>Mostrar las trazas GPS que ha cargado previamente en OpenStreetMap.</p>
+help.undoRedo=Deshacer / Rehacer
+help.madeMistake=<p>¿Ha cometido un error ? Haga clic simplemente en Deshacer o Rehacer para corregir sus modificaciones.</p>
+help.help=Ayuda
+help.guideInfomation=<p>Suministra esta guía en caso de que necesite informaciones cuando empiece a editar.</p>
+help.save=Guardar
+help.addingFeatures=Añadir objetos al mapa
+help.addingFeaturesText=<p><i>Antes de empezar, la primera regla que usted necesita saber es sobre el uso de datos con derechos de autor. ¡Los datos procedentes de mapas con copyright o cualquier otro dato con derechos de autor está estrictamente prohibido! La copia, seguimiento o cualquier reproducción de obras con derechos de autor no está permitido (Fuente: <a href="http://wiki.openstreetmap.org/wiki/Copyright" target="_blank">Copyright - OpenStreetMap Wiki</a>)</i></p>\n  <p></p>\n  <p>Las características lineales, tales como calles, caminos, vías férreas y perímetros de construcciones se conocen como <b>caminos</b>.</p>\n   <p>Si de repente se da cuenta de que ha desaparecido su barra lateral con todos los iconos, es porque usted ha seleccionado una característica en el mapa. Simplemente desactive la opción haciendo clic en un área en blanco del mapa para mostrar de nuevo los iconos.</p>\n            <b><p>Para crear un punto (o nodo) </b>, sólo tienes que arrastrar y soltar en el mapa el icono correspondiente de la barra lateral. Véase "Añadir PDI" (Add POIs) para aprender más acerca de la creación de un PDI (Punto de Interés)</p>\n            <p><b>Para crear un camino</b>, comience haciendo clic en el mapa en su punto de partida, a continuación, haga clic en cada punto sucesivo. Haga doble clic para terminar la línea o presione Intro.</p>\n            <p><b>Para crear un polígono</b>, comience haciendo clic en el mapa en su punto de partida, a continuación, haga clic en cada punto sucesivo (similar a la creación de un camino), y termine haciendo clic muy próximo al primer punto para cerrar el polígono.</p>\n            <p>Recuerde, si usted comete un error, siempre puede pulsar el botón Deshacer (Undo). Al pulsar la tecla Esc puede deshacer todas las modificaciones para el objeto actualmente seleccionado.</p>
+help.editBeg=Editar (Princip.)
+help.editingFeatures=Editando elementos (Principiante)
+help.editingFeaturesText=<b><p>Para añadir un punto a una forma ya existente</b>, seleccione la forma y presione shift + clic en la ubicación deseada.</p>\n    <b><p>Para eliminar un punto</b>, seleccione el punto y haga clic en el botón Eliminar elemento en la esquina inferior derecha o pulse la tecla Suprimir (o Retroceso) en el teclado.</p>\n   <p><b>Para eliminar un camino</b>, seleccione la forma y haga clic en el botón Eliminar elemento en la esquina inferior derecha, o presione MAYÚS + Supr (o Shift + Supr) en su teclado.</p>\n    <b><p>Para mover un punto</b>, haga clic y arrastre el punto.</p>\n    <b><p>Para mover un camino</b>, haga clic y arrastre el elemento entero. Sugerencia:  Agarre un segmento en el que no se mueva un nodo accidentalmente</p>\n   <b><p>Para extender un camino</b>, haga clic en uno de los puntos extremos del camino. A continuación, siga dibujando como siempre.</p>\n    <b><p> Para añadir un nuevo camino que se extienda desde un camino ya existente</b>, presione shift + clic en uno de los puntos extremos del camino. A continuación, siga dibujando como siempre.</p>
+help.editAdv=Editar (Avanz.)
+help.editingFeaturesAdv=Editando elementos (Avanzado)
+help.editingFeaturesAdvText=<b><p>Para dividir un camino</b>, seleccione el punto en el que desea cortar, y haga clic en la herramienta Tijera o pulse X en el teclado. Sugerencia: Agregue un nodo antes con el fin de cortar entre dos nodos.</p>\n            <b><p>Para realizar una unión entre dos caminos</b>, dibujar, como de costumbre hasta que usted necesite hacer una unión. Luego, a medida que mueva el ratón sobre la otra forma, los puntos se iluminarán de color azul. Haga clic en uno de los puntos azules o en cualquier otra ubicación del camino para hacer la unión.</p>\n            <b><p>Para desconectar una unión</b>, seleccione el punto del camino que desee alterar. Luego presione "-" en el teclado para eliminar el punto.</p>\n            <p><b>Para invertir la dirección de un camino</b>, haga clic en el botón Invertir dirección en la esquina inferior derecha. La dirección de un camino sólo afecta a los elementos con una etiqueta de "sentido único" ("oneway"): calles de sentido único, líneas de costa, islas, etc.</p>\n            <p><b>Para crear un camino paralelo </b>, seleccione el camino y haga clic en el botón Crear camino paralelo en la esquina inferior derecha o pulse P en el teclado.</p>\n      <p><b>Para crear un camino que comparte nodos con una forma ya existente</b>, empiece a dibujar, haga clic en los dos primeros nodos compartidos, a continuación, pulse F para seguir automáticamente el camino existente.</p>\n            <i><p> Visite el <a href="http://wiki.openstreetmap.org/wiki/Potlatch2/Primer" target="_blank">Potlatch 2 Primer</a> en el wiki de OpenStreetMap, para métodos y convenciones de edición incluso más avanzados.</i> </p>
+help.tag=Etiqueta
+help.taggingFeatures=Etiquetando elementos
+help.taggingFeaturesText=<p>Con Potlatch 2, el etiquetado de elementos se ha vuelto relativamente fácil con el uso de menús gráficos y campos dedicados o iconos.</p>\n          <p><b>Etiquetando un elemento</b></p>\n          <p>Seleccione el punto o el camino que desee editar, y seleccione la etiqueta correspondiente de la barra lateral izquierda. Después de etiquetar elelemento, deben aparecer algunos campos básicos, como el nombre, el límite de velocidad, y la anchura, dependiendo de la etiqueta que se le haya puesto. Complételos lo mejor que pueda.</p><p>Los usuarios avanzados pueden notar la ausencia de algunas etiquetas y valores de variables que se utilizan de vez en cuando. Si este es el caso, haga clic en la ficha Opciones avanzadas en la parte inferior de la barra lateral y Editar/Añadir según sea necesario.</p>\n          <p>El wiki de OpenStreetMap también proporciona una <a href="http://wiki.openstreetmap.org/wiki/Map_features" target="_blank">lista extensa de etiquetas y valores de etiquetas</a>. Por favor, consulte la documentación de OSM si no está seguro de qué etiqueta usar.</p>
+help.shortcuts=Atajos
+help.keyboardShortcuts=Atajos clave
index c93299fab765374db665caa9cd6bf772f570ec3d..f2b58d0471289c9b55320d612302d1e32f503de9 100644 (file)
@@ -2,10 +2,41 @@
 # Exported from translatewiki.net
 # Author: Armando-Martin
 
+main.undo=Deshacer
+main.redo=Rehacer
+main.background=Fondo
+main.map_style=Estilo de mapa
+main.gpsButton=Datos GPS
+main.gps_data=Datos GPS
+main.my_tracks=Mis pistas
+main.clear_gps=Borrar
+main.help=Ayuda
+main.options=Opciones
+main.save=Guardar
+tag_viewer.dndprompt=Añadir puntos nuevos arrastrándolos sobre el mapa
+toolbox.delete_node=Borrar nodo (Borrar)
+toolbox.delete_area=Borrar la zona (Mayús+Supr)
+toolbox.delete_way=Borrar laruta (Mayús+Supr)
+toolbox.delete_item=Borrar elemento
+toolbox.reverse_direction=Invertir la ruta (V)
+toolbox.split_way=Dividir camino (X)
+toolbox.merge_ways=Fusionar caminos
+toolbox.straighten_way=Enderezar el camino
+toolbox.make_circular=Hacer circular
+toolbox.make_right_angled=Hacer un ángulo recto (Q)
+toolbox.create_parrallel_way=Crear camino paralelo (P)
+oauth.gotLinkBox=Haga clic en el enlace de abajo para abrir una página web donde se le pedirá acceso autorizado a esta aplicación.
+oauth.authorized=Una vez que haya autorizado el acceso haga clic en el botón inferior 'Probar acceso' ('Try access')
+oauth.deniedLabel=El acceso le ha sido denegado, compruébelo e inténtelo de nuevo.
+oauth.rememberMe=Recordarme
+oauth.permFail=<p>El servidor rechazó las credenciales de esta aplicación -- no se pudo obtener un enlace de autorización.</p>\n<b><p>El acceso OAuth no será posible.</b></p>\n<p>Póngase en contacto con el proveedor de la aplicación para averiguar lo que está pasando.</p>
+oauth.tempFail=Hubo un problema al contactar con el servidor para obtener la autorización. Esto puede ser un error temporal, inténtelo de nuevo más tarde.
 oauth.tryAccessButton=Prueba de acceso
 oauth.cancelButton=Cancelar
 save.editDescription=Introduzca una descripción de sus ediciones. Se utilizará para dar a otros mapeadores una idea de los cambios que está haciendo.
 styleSelector.editButton=Editar...
+backgroundSelector.dim=Atenuar
+backgroundSelector.sharpen=Acentuar contraste
 backgroundSelector.editButton=Editar...
 backgroundSelector.vectorButton=Archivo vectorial...
 options.tbcheck=Mostrar el cuadro de herramientas
diff --git a/l10n/locale/fa/p2_main.properties b/l10n/locale/fa/p2_main.properties
new file mode 100644 (file)
index 0000000..cd473aa
--- /dev/null
@@ -0,0 +1,32 @@
+# Messages for Persian (فارسی)
+# Exported from translatewiki.net
+# Author: ZxxZxxZ
+
+main.undo=خنثی‌سازی
+main.background=پیش‌زمینه
+main.map_style=سبک نقشه
+main.gpsButton=داده‌های جی‌پی‌اس
+main.gps_data=داده‌های جی‌پی‌اس
+main.my_tracks=مسیرهای من
+main.clear_gps=پاک‌کردن
+main.help=راهنما
+main.options=گزینه‌ها
+main.save=ذخیره
+toolbox.delete_node=حذف گره (حذف)
+toolbox.delete_area=حذف منطقه (Shift+Delete)
+toolbox.delete_way=حذف راه (Shift+Delete)
+toolbox.delete_item=حذف مورد
+toolbox.reverse_direction=معکوس‌کردن جهت (V)
+toolbox.split_way=تقسیم راه (X)
+toolbox.merge_ways=ادغام راه‌ها
+toolbox.straighten_way=مستقیم‌سازی راه
+toolbox.make_circular=دایره‌وار کن
+toolbox.create_parrallel_way=ایجاد راه موازی (P)
+oauth.rememberMe=مرا به خاطر بسپار
+oauth.cancelButton=لغو
+styleSelector.editButton=ویرایش...
+backgroundSelector.editButton=ویرایش...
+backgroundSelector.vectorButton=پروندهٔ برداری...
+options.tbcheck=نمایش جعبه‌ابزار
+options.cursorcheck=استفاده از مکان‌نماهای سفارشی
+options.ok=تأیید
diff --git a/l10n/locale/ga/p2_main.properties b/l10n/locale/ga/p2_main.properties
new file mode 100644 (file)
index 0000000..b7f1bcd
--- /dev/null
@@ -0,0 +1,19 @@
+# Messages for Irish (Gaeilge)
+# Exported from translatewiki.net
+# Author: D.de.loinsigh
+
+main.clear_gps=Glan
+main.help=Cuidiú
+main.options=Roghanna
+main.save=Sábháil
+tag_viewer.dndprompt=Chun pointí nua a chur leis, tarraing chun na léarscáile iad
+toolbox.delete_node=Scrios nód
+toolbox.delete_area=Scrios achar
+toolbox.delete_way=Scrios slí
+toolbox.delete_item=Scrios mír
+toolbox.split_way=Scoilt slí
+toolbox.merge_ways=Comhcheangal slite
+toolbox.straighten_way=Dírigh slí
+toolbox.make_circular=Déan ciorclach é
+toolbox.create_parrallel_way=Cruthaigh slí chomhthreomhar
+oauth.cancelButton=Cealaigh
diff --git a/l10n/locale/gl/help_dialog.properties b/l10n/locale/gl/help_dialog.properties
new file mode 100644 (file)
index 0000000..51dc75b
--- /dev/null
@@ -0,0 +1,33 @@
+# Messages for Galician (Galego)
+# Exported from translatewiki.net
+# Author: Toliño
+
+help.gettingStarted=Primeiros pasos
+help.welcome=Benvido
+help.whyOpenstreetmap=<p><b>Por que o OpenStreetMap?</b> O OSM é un servizo cartográfico no que todos os datos están en constante actualización e modificación grazas xente coma vostede. O beneficio máis obvio reside en que é de balde, pero tamén se converteu nun medio importante para a cartografía de crises (por exemplo, a utilizaión de datos do OSM para coordinar os esforzos humanitarios no terremoto de Haití). A precisión dos datos é crítica, e agardamos que poida dedicar algo do seu tempo!</p>
+help.activeMembers=<p><b>+ Para os membros activos do OpenStreetMap</b>, accedede ao sistema do OSM antes de facerdes modificacións.</p>
+help.newMembers=<p><b>+ Para os novos membros</b>, visitade <a href="http://www.openstreetmap.org/user/new" target="_blank">http://www.openstreetmap.org</a> para crear unha conta e acceder ao sistema; logo volvede aquí para permitir o acceso ao Potlatch 2 e comezar a editar.</p>
+help.introText=<p>O <b>Potlatch 2</b> é un editor do OpenStreetMap (OSM) que permite facer edicións directamente mediante o sitio web {0}.</p>
+help.introduction=Introdución
+help.controls=Controis
+help.interfaceControls=Controis da interface
+help.mapBackground=<p>Escolla o seu fondo de mapa dun dos elementos que hai na lista ou engada o seu propio ficheiro vectorial.</p>
+help.colourStyle=<p>Escolla o estilo no que queira ver o mapa. As cores e mais o estilo xeral varían e tamén inclúen outras opcións como a vista en arame.</p>
+help.gps=GPS
+help.createOsmMap=<p>Cree os datos do mapa do OSM usando, como fondo, as pistas GPS doutras persoas</p>
+help.myGps=OMeuGPS
+help.displayGps=<p>Bote unha ollada ás trazas GPS que cargou con anterioridade no OpenStreetMap.</p>
+help.undoRedo=Desfacer / Refacer
+help.madeMistake=<p>Cometeu un erro? Basta con premer en "desfacer" e/ou "refacer" para corrixir as edicións.</p>
+help.help=Axuda
+help.guideInfomation=<p>Presenta esta guía en caso de que necesite algunha información mentres está editando.</p>
+help.save=Gardar
+help.addingFeatures=Características de adición
+help.editBeg=Editar (principiante)
+help.editingFeatures=Características de edición (principiante)
+help.editAdv=Editar (avanzado)
+help.editingFeaturesAdv=Características de edición (avanzado)
+help.tag=Etiqueta
+help.taggingFeatures=Características de etiquetaxe
+help.shortcuts=Atallos
+help.keyboardShortcuts=Atallos do teclado
diff --git a/l10n/locale/gl/p2_main.properties b/l10n/locale/gl/p2_main.properties
new file mode 100644 (file)
index 0000000..454c9e9
--- /dev/null
@@ -0,0 +1,44 @@
+# Messages for Galician (Galego)
+# Exported from translatewiki.net
+# Author: Toliño
+
+main.undo=Desfacer
+main.redo=Refacer
+main.background=Fondo
+main.map_style=Estilo do mapa
+main.gpsButton=Datos do GPS
+main.gps_data=Datos do GPS
+main.my_tracks=As miñas pistas
+main.clear_gps=Limpar
+main.help=Axuda
+main.options=Opcións
+main.save=Gardar
+tag_viewer.dndprompt=Engada novos puntos arrastrándoos sobre o mapa
+toolbox.delete_node=Borrar o nodo (Supr)
+toolbox.delete_area=Borrar a zona (Maiús+Supr)
+toolbox.delete_way=Borrar o camiño (Maiús+Supr)
+toolbox.delete_item=Borrar o elemento
+toolbox.reverse_direction=Inverter a dirección (V)
+toolbox.split_way=Dividir o camiño (X)
+toolbox.merge_ways=Fusionar os camiños
+toolbox.straighten_way=Aliñar os camiños
+toolbox.make_circular=Facer un círculo
+toolbox.make_right_angled=Facer un ángulo recto (Q)
+toolbox.create_parrallel_way=Crear un camiño paralelo (P)
+oauth.gotLinkBox=Prema na ligazón inferior para abrir unha páxina web na que se lle pedirá autorización para acceder a esta aplicación.
+oauth.authorized=Unha vez autorizado o acceso, prema no botón "Intentar o acceso" que hai a continuación
+oauth.deniedLabel=<b>Rexeitouse o acceso; compróbeo e inténteo de novo</b>
+oauth.rememberMe=Lembrádeme
+oauth.permFail=<p>O servidor rexeitou as credenciais de acceso desta aplicación; non se puido obter ligazón de autorización ningunha.             </p>\n<p>       <b>O acceso ao OAuth non será posible.</b>             </p>\n<p>       Póñase en contacto co provedor da aplicación para descubrir o que acontece.</p>
+oauth.tempFail=Houbo un problema ao contactar co servidor para obter a autorización. Este pode ser un erro temporar. Inténteo de novo.
+oauth.tryAccessButton=Intentar o acceso
+oauth.cancelButton=Cancelar
+save.editDescription=Escriba unha descrición das súas edicións. Utilizarase para dar aos outros usuarios unha idea das modificacións que está a realizar.
+styleSelector.editButton=Editar...
+backgroundSelector.dim=atenuar
+backgroundSelector.sharpen=acentuar
+backgroundSelector.editButton=Editar...
+backgroundSelector.vectorButton=Ficheiro vectorial...
+options.tbcheck=Mostrar a caixa de ferramentas
+options.cursorcheck=Usar cursores personalizados
+options.ok=Aceptar
index 448b11d66f5542fc05af7680e9bab106b617450f..56e273f3dc063cda349a8d734fafb64b07757aec 100644 (file)
@@ -6,15 +6,25 @@ help.gettingStarted=תחילת עבודה
 help.welcome=ברוך בואך
 help.whyOpenstreetmap=<p><b>למה OpenStreetMap?&rlm;</b> OSM הוא שירות המיפוי שבו כל הנתונים מתעדכנים ונערכים ללא הרף על־ידי אנשים רגילים כמוך. היתרון הברור הוא שזה חופשי לשימוש, אבל המיזם הזה הפך גם לשחקן בולט במיפוי בעת משבר (למשל, השימוש בנתוני OSM כדי לתאם את מאמצי הסיוע ברעידת האדמה בהאיטי). דיוק הנתונים חיוני, ואנו מקווים שיש לך זמן לנדב לזה!</p>
 help.activeMembers=<p><b>+ לחברי OpenStreetMap פעילים</b>, נא להירשם ל־OSM לפני עריכה</b></p>
+help.newMembers=<p><b>+ לחברים חדשים</b>, אנא בקרו בדך <a href="http://www.openstreetmap.org/user/new" target="_blank">http://www.openstreetmap.org</a> כדי ליצור חשבון משתמש, היכנסו, ואז חזרו הנה כדי לאפשר גישה ל־Potlatch 2 והתחילו לערוך.</p>
+help.introText=<p><b>Potlatch 2</b> הוא עורך OpenStreetMap&rlm (OSM) שמאפשר לך לערוך ישירות דרך אתר {0}.</p>
 help.introduction=מבוא
 help.controls=פקדים
 help.interfaceControls=פקדי ממשק
+help.mapBackground=<p>בחירת רקע המפה שלך מתוך אחד מהפריטים ברשימה או הוספת קובץ וקטורי משלך.</p>
+help.colourStyle=<p>אפשר לבחור את הסגנון להצגת המפה. הצבעים והסגנון הכללי משתנים וכוללים גם קווי־גוף.</p>
 help.gps=GPS
+help.createOsmMap=<p>יצירת נתוני מפות OSM באמצעות שימוש במסלולי GPS של אנשים אחרים בתור רקע</p>
 help.myGps=MyGPS
+help.displayGps=<p>הצגת מסלולי GPS שכבר העלית ל־OpenStreetMap.</p>
 help.undoRedo=ביטול / ביצוע חוזר
+help.madeMistake=<p>עשית טעות? אפשר פשוט ללחוץ על „ביטול” ולתקן את העריכות שלך.</p>
 help.help=עזרה
+help.guideInfomation=<p>העלאת המדריך הזה כשנחוץ לך מידע בעת תחילת העריכה.</p>
 help.save=שמירה
 help.addingFeatures=הוספת תכונות
+# Fuzzy
+help.addingFeaturesText=<p><i>לפני שנתחיל, הכלל הראשון שחשוב לדעת הוא הכלל לגבי שימוש בנתונים קנייניים. נתונים ממפות שמוגבלות בזכויות יוצרים וכל סוג אחר שלנתונים קנייניים אסורים בהחלט! העתקה, העקבה וכל סוג אחר של שכפול של יצירות מוגבלות בזכויות יוצרים אינו מותר! (מקור: <a href="http://wiki.openstreetmap.org/wiki/Copyright" target="_blank">Copyright - OpenStreetMap Wiki</a>)</i></p>\n  <p></p>\n  <p>תכונות קוויות כגול רחובות, נתיבי הליכה, מסילות ברזל ושרטוטי בניינים ייקראו מכאן והלאה בשם <b>דרכים</b>.</p>\n  <p>אם פתאום גילית שסרגל הצד שלך עם כל הסמלים נעלם, אז זה בגלל שבחרת בתכונה , it's because you have a feature selected on the map. Simply deselect by clicking on a blank area of the map to bring up the icons again.</p>\n            <p><b>To create a point (or node)</b>, just drag and drop the appropriate icon from the sidebar onto the map. See Add POIs to learn more about creating a POI (Point of Interest)</p>\n            <p><b>To create a way</b>, begin by clicking on the map at its start point, then click at each successive point. Double-click to finish the line or press Enter.</p>\n            <p><b>To create a polygon</b>, begin by clicking on the map at its start point, then click at each successive point (similar to creating a way), and finish by clicking on the very first point to close the polygon.</p>\n            <p>Remember, if you make a mistake, you can always hit the Undo button. Pressing the Esc key will undo all your edits for the current feature.</p>
 help.editBeg=עריכה (למתחילים)
 help.editingFeatures=עריכת תכונות (למתחילים)
 help.editAdv=עריכה (למתקדמים)
index ee91f080ba02a577f75eea3a6346711e6e46a181..a572776496006658abfe3c41b2e0ea1c3286373d 100644 (file)
@@ -4,6 +4,7 @@
 
 help.gettingStarted=Prěnje kroki
 help.welcome=Witaj
+help.introText=<p><b>Potlatch2</b> je editor OpenStreetMap (OSM), kotryž ći zmóžnja, změny direktnje přez websydło {0} činić.</p>
 help.introduction=Zawod
 help.controls=Wobsłužowanske elementy
 help.interfaceControls=Wobsłužowanske elementy wužiwarskeho powjercha
index 52487cd88e46ffb3f5b20d7d9f44a809bda80540..ab79e0ee6aaf195b9f2ac9ee67ae501e6bd21ea3 100644 (file)
@@ -25,11 +25,17 @@ toolbox.straighten_way=Puć zrunać
 toolbox.make_circular=Kružnje rjadować
 toolbox.make_right_angled=Prawokutnje rjadować
 toolbox.create_parrallel_way=Paralelny puć wutworić (p)
+oauth.gotLinkBox=Klikń na wotkaz horjeka, zo by webstronu wočinił, hdźež će proša, přistup za tutu aplikaciju awtorizować.
+oauth.authorized=Hdyž sy přistup awtorizował, klikń deleka na tłóčatko 'Přistup spytać'
 oauth.deniedLabel=<b>Přistup je so wotpokazał, prošu přepruwuj a spytaj hišće raz</b>
 oauth.rememberMe=Spomjatkować sej
+oauth.permFail=<p>Serwer je přizjewjenske informacije tuteje aplikacije wotpokazał -- awtorizaciski wotkaz njeda so wotwołać.            </p>\n<p>       <b>OAuth-přistup njebudźe móžno.</b>        </p>\n<p>       Prošu staj so ze zhotowjerjom aplikacije do zwiska, zo by wuslědźił, štož so stawa.</p>
+oauth.tempFail=Při zwjazowanju ze serwerom, zo by awtorizaciju dóstał, je problem wustupił. To móhło nachwilny zmylk być, prošu spytaj pozdźišo hišće raz.
 oauth.tryAccessButton=Přistup spytać
 oauth.cancelButton=Přetorhnyć
+save.editDescription=Prošu zapisaj wopisanje twojich změnow. To budźe so wužiwać, zo by druhim kartěrowarjam předstajenje dał, kotre změny činiš.
 styleSelector.editButton=Wobdźěłać...
+backgroundSelector.dim=woćěmnić
 backgroundSelector.sharpen=wótřić
 backgroundSelector.editButton=Wobdźěłać...
 backgroundSelector.vectorButton=Vektorowa dataja...
diff --git a/l10n/locale/hu/help_dialog.properties b/l10n/locale/hu/help_dialog.properties
new file mode 100644 (file)
index 0000000..21e6e54
--- /dev/null
@@ -0,0 +1,34 @@
+# Messages for Hungarian (Magyar)
+# Exported from translatewiki.net
+# Author: BáthoryPéter
+
+help.gettingStarted=Első lépések
+help.welcome=Üdvözlés
+help.whyOpenstreetmap=<p><b>Miért OpenStreetMap?</b> az OSM egy olyan térképszolgáltatás, ahol az adatokat olyan hétköznapi emberek szerkesztik és frissítik, mint te. Ennek a nyilvánvaló előnye, hogy szabadon felhasználható, de jelentős szereplővé teszi például a válságtérképezésben is (pl. OSM adatok használata a Haitii földrengés segélyakcióinak koordinálásában). Az adatok pontossága nagyon fontos, reméljük rá tudsz szánni egy keveset az idődből!</p>
+help.activeMembers=<p><b>- Aktív OpenStreetMap tagok:</b> szerkesztés előtt kérlek jelentkezz be az OSM-be.</p>
+help.newMembers=<p><b>- Új tagok:</b> regisztráláshoz kérlek, látogasd meg az <a href="http://www.openstreetmap.org/user/new" target="_blank">http://www.openstreetmap.org</a> oldalt, jelentkezz be, majd térj vissza ide, hogy megkezdhesd a szerkesztésd a Potlatch 2-vel.</p>
+help.introText=<p>A <b>Potlatch 2</b> egy OpenStreetMap (OSM) szerkesztőprogram, amivel közvetlenül a(z) {0} oldalról tudsz szerkeszteni.</p>
+help.introduction=Bevezetés
+help.controls=Menüsor
+help.interfaceControls=Felület vezérlők
+help.mapBackground=<p>Válassz egy térképhátteret a listából, vagy add hozzá a saját vektoros fájlodat.</p>
+help.colourStyle=<p>Válaszd ki, milyen stílusban szeretnéd megjeleníteni a térképet. Színben és általános megjelenésben különböznek, de van lehetőség vázrajz (wireframe) nézetre is.</p>
+help.gps=GPS
+help.createOsmMap=<p>Térkép készítése mások által készített, háttérként megjelenített GPS nyomvonalak alapján.</p>
+help.myGps=Nyomvonalaim
+help.displayGps=<p>Megjeleníti OpenStreetMapre korábban feltöltött GPS nyomvonalaidat.</p>
+help.undoRedo=Visszavonás / Újra
+help.madeMistake=<p>Valamit elrontottál? A javításhoz csak nyomd meg a Visszavonás vagy Újra gombot.</p>
+help.help=Súgó
+help.guideInfomation=<p>Megjeleníti ezt az útmutatót, ha a szerkesztés megkezdéséhez információra van szükséged.</p>
+help.save=Mentés
+help.addingFeatures=Hozzáadási lehetőségek
+help.addingFeaturesText=<p><i>Mielőtt elkezdenéd, az első szabály, amit tudnod kell, a védett adatok felhasználására vonatkozik. A jogvédett térképek és egyéb védett adatok használata szigorúan tilos! A jogvédett adatok lemásolása, követése és egyéb reprodukciója nem megengedett! (Lásd: <a href="http://wiki.openstreetmap.org/wiki/Copyright" target="_blank">Copyright - OpenStreetMap Wiki</a>)</i></p>\n  <p></p>\n  <p>A lineáris objektumokat – mint utcák, járdák, vasútvonalak és épületkörvonalak – <b>vonalnak</b> nevezzük.</p>\n  <p>Ha azt veszed észre, hogy eltűnt az ikonokat tartalmazó oldalsávod, az azt jelent, hogy kiválasztottál egy objektumot a térképen. Egyszerűn kattints a térképen egy üres helyre és az ikonok újra megjelennek.</p>\n            <p><b>Pont (más néven csomópont) létrehozásához</b> húzz egy ikont az oldalsávról a térképre. POI-k  (Érdekes Pont, Point of Interest) készítéséhez további információkhoz nézd meg az Add POIs részt.</p>\n            <p><b>Vonal készítéséhez</b> kattints a térképen a kezdő helyre, majd minden olyan helyre, ahova a vonalba töréspontot szeretnél tenni. Dupla kattintással, vagy Enterrel tudod befejezni a vonalat.</p>\n            <p><b>Sokszöget készíteni</b> hasonlóan tudsz, mint vonalat, csak a végén a vonal legelső pontjára kell kattintanod, hogy bezárd a sokszöget.</p>\n            <p>Ne feledd, ha valamit elrontasz, csak kattints a Visszavonás gombra. Az Esc visszavonja az összes műveletet, amit az objektumon végeztél.</p>
+help.editBeg=Szerkesztés (1)
+help.editingFeatures=Szerkesztési lehetőségek (kezdő)
+help.editAdv=Szerkesztés (2)
+help.editingFeaturesAdv=Szerkesztési lehetőségek (haladó)
+help.tag=Címkék
+help.taggingFeatures=Címkézési lehetőségek
+help.shortcuts=Billentyűk
+help.keyboardShortcuts=Billentyűparancsok
diff --git a/l10n/locale/hu/p2_main.properties b/l10n/locale/hu/p2_main.properties
new file mode 100644 (file)
index 0000000..abdb321
--- /dev/null
@@ -0,0 +1,44 @@
+# Messages for Hungarian (Magyar)
+# Exported from translatewiki.net
+# Author: BáthoryPéter
+
+main.undo=Visszavonás
+main.redo=Újra
+main.background=Háttér
+main.map_style=Térképstílus
+main.gpsButton=GPS adatok
+main.gps_data=GPS adatok
+main.my_tracks=Nyomvonalaim
+main.clear_gps=Törlés
+main.help=Súgó
+main.options=Beállítások
+main.save=Mentés
+tag_viewer.dndprompt=Új pont hozzáadása térképre húzással
+toolbox.delete_node=Pont törlése (Delete gomb)
+toolbox.delete_area=Terület törlése (Shift+Delete)
+toolbox.delete_way=Vonal törlése (Shift+Delete)
+toolbox.delete_item=Elem törlése
+toolbox.reverse_direction=Irány megfordítása (V)
+toolbox.split_way=Vonal elvágása (X)
+toolbox.merge_ways=Vonalak egyesítése
+toolbox.straighten_way=Vonal kiegyenesítése
+toolbox.make_circular=Kör készítése
+toolbox.make_right_angled=Derékszögesítés (Q)
+toolbox.create_parrallel_way=Párhuzamos vonal létrehozása (P)
+oauth.gotLinkBox=Az alábbi hivatkozásra kattintva egy új lap nyílik, ahol engedélyezheted a hozzáférést ehhez az alkalmazáshoz.
+oauth.authorized=Ha engedélyezted az elérést, kattints az alábbi "Próbáld elérni" gombra
+oauth.deniedLabel=<b>Hozzáférése megtagadva, kérlek ellenőrizd, majd próbáld újra</b>
+oauth.rememberMe=Emlékezz rám
+oauth.permFail=<p>A kiszolgáló megtagadta az alkalmazás hitelesítését -- az engedélyt nem sikerült beszerezni.       </p>\n<p>       <b>OAuth hozzáférés nem lesz lehetséges.</b>        </p>\n<p>       Kérlek vedd fel a kapcsolatot az alkalmazás készítőjével, hogy kiderüljön, mi történt.</p>
+oauth.tempFail=Nem sikerült kapcsolódni az engedélykiállító kiszolgálóhoz. Ez egy átmeneti hiba lehet, kérlek próbáld újra kicsit később.
+oauth.tryAccessButton=Próbáld elérni
+oauth.cancelButton=Mégsem
+save.editDescription=Kérlek adj meg egy szerkesztési összefoglalót. Erre azért van szükség, hogy a többi térképszerkesztő könnyebben megértse a változtatásaidat.
+styleSelector.editButton=Szerkesztés...
+backgroundSelector.dim=halványít
+backgroundSelector.sharpen=élesít
+backgroundSelector.editButton=Szerkesztés...
+backgroundSelector.vectorButton=Vektoros fájl...
+options.tbcheck=Eszköztár megjelenítése
+options.cursorcheck=Egyedi kurzorok használata
+options.ok=OK
diff --git a/l10n/locale/ia/help_dialog.properties b/l10n/locale/ia/help_dialog.properties
new file mode 100644 (file)
index 0000000..8caaa0b
--- /dev/null
@@ -0,0 +1,35 @@
+# Messages for Interlingua (Interlingua)
+# Exported from translatewiki.net
+# Author: McDutchie
+
+help.gettingStarted=Como initiar
+help.welcome=Benvenite
+help.whyOpenstreetmap=<p><b>Proque OpenStreetMap?</b> OSM es un servicio cartographic in le qual tote le datos es constantemente actualisate e modificate per ordinari personas como te. Le obvie beneficio es que le uso es gratuite, ma OSM ha anque devenite un major factor in le cartographia de crises (p.ex. uso de datos de OSM pro coordinar le effortios humanitari post le tremor de terra in Haiti). Le precision de iste datos es de importantia crucial, e nos spera que tu pote dedicar alcun tempore como voluntario!</p>
+help.activeMembers=<p><b>+ Pro membros active de OpenStreetMap</b>, per favor aperi session in OSM ante de modificar.</p>
+help.newMembers=<p><b>+ Pro nove membros</b>, per favor visita <a href="http://www.openstreetmap.org/user/new" target="_blank">http://www.openstreetmap.org</a> pro crear un conto, aperi session, postea retorna hic pro permitter le accesso a Potlatch 2 e comenciar a modificar.</p>
+help.introText=<p><b>Potlatch 2</b> es un editor pro OpenStreetMap (OSM) que permitte facer modificationes directemente via le sito web {0}.</p>
+help.introduction=Introduction
+help.controls=Controlos
+help.interfaceControls=Controlos del interfacie
+help.mapBackground=<p>Selige un fundo de carta del lista o adde un proprie file de graphico vectorial.</p>
+help.colourStyle=<p>Selige le stilo visual del carta. Le colores e le stilo general varia. Il ha etiam altere optiones como "wireframe" (quadro de filos).</p>
+help.gps=GPS
+help.createOsmMap=<p>Crear datos cartographic pro OSM usante le tracias GPS de altere personas como fundo</p>
+help.myGps=MiGPS
+help.displayGps=<p>Monstrar tracias GPS que tu ha previemente incargate a OpenStreetMap.</p>
+help.undoRedo=Disfacer / Refacer
+help.madeMistake=<p>Ha facite un error? Clicca simplemente sur Disfacer o Refacer pro corriger tu modificationes.</p>
+help.help=Adjuta
+help.guideInfomation=<p>Presenta iste guida in caso que tu ha besonio de information quando tu comencia a modificar.</p>
+help.save=Salveguardar
+help.addingFeatures=Addition de objectos
+help.addingFeaturesText=<p><i>Ante de comenciar, le prime regula que tu debe cognoscer concerne le uso de datos proprietari. Le datos de cartas sub copyright o altere datos proprietari es strictemente prohibite! Le copia, le traciamento e omne altere reproduction de un obra sub copyright non es permittite! (Origine: <a href="http://wiki.openstreetmap.org/wiki/Copyright" target="_blank">Copyright - OpenStreetMap Wiki</a>)</i></p>\n  <p></p>\n  <p>Objectos linear como stratas, sentieros pro pedones, ferrovias e profilos de edificios essera hic appellate <b>vias</b>.</p>\n  <p>Si le barra lateral con tote le icones dispare subitemente, isto es perque tu ha seligite un objecto sur le carta. Simplemente disface le selection con un clic sur un area vacue del carta pro facer le icones reapparer.</p>\n           <p><b>Pro crear un puncto (o nodo)</b>, simplemente trahe le icone appropriate ab le barra lateral e depone lo sur le carta. Vider "Adder PDIs" pro saper plus a proposito del creation de un PDI (puncto de interesse).</p>\n           <p><b>Pro crear un via</b>, comencia con un clic sur le carta a su puncto de initio, postea clicca sur cata puncto successive. Face clic duple pro finir le linea o preme le clave Enter.</p>\n           <p><b>Pro crear un polygono</b>, comencia con un clic sur le carta a su puncto de initio, postea clicca sur cata puncto successive (de modo similar al creation de un via), e fini con un clic sur le prime puncto pro clauder le polygono.</p>\n           <p>Non oblida que, si tu face un error, tu pote sempre pulsar le button Disfacer. Preme le clave Esc pro disfacer tote le modificationes del objecto actualmente seligite.</p>
+help.editBeg=Modificar (novicios)
+help.editingFeatures=Modification de objectos (pro comenciantes)
+help.editAdv=Modif. (av.)
+help.editingFeaturesAdv=Modification de objectos (avantiate)
+help.tag=Etiquetta
+help.taggingFeatures=Etiquettage de objectos
+help.taggingFeaturesText=<p>Con Potlatch 2, le etiquettage de objectos ha devenite relativemente facile con le uso de menus graphic e special campos/icones.</p>\n         <p><b>Como etiquettar un objecto</b></p>\n         <p>Selige le puncto o via que tu vole modificar, e selige le etiquetta appropriate ab le barra lateral sinistre. Post etiquettar le objecto, certe campos de base debe apparer como Nomine, Limite de velocitate, e Latitude, dependente del etiquetta que tu specificava. Completa istes tanto como possibile.</p><p>Usatores avantiate pote remarcar le absentia de certe etiquettas e valores que illes occasionalmente usa. Si isto es le caso, clicca sur le scheda "Avantiate" in le parte inferior del barra lateral e modifica/adde como necessari.</p>\n         <p>Le wiki de OpenStreetMap contine etiam un <a href="http://wiki.openstreetmap.org/wiki/Map_features" target="_blank">lista extense de etiquettas e valores de etiquetta</a>. Per favor consulta le documentation de OSM si tu non sape qual etiquetta usar.</p>
+help.shortcuts=Accessos directe
+help.keyboardShortcuts=Claves accelerator
diff --git a/l10n/locale/ia/p2_main.properties b/l10n/locale/ia/p2_main.properties
new file mode 100644 (file)
index 0000000..b019eea
--- /dev/null
@@ -0,0 +1,27 @@
+# Messages for Interlingua (Interlingua)
+# Exported from translatewiki.net
+# Author: McDutchie
+
+main.undo=Disfacer
+main.redo=Refacer
+main.background=Fundo
+main.map_style=Stilo de carta
+main.gpsButton=Datos GPS
+main.gps_data=Datos GPS
+main.my_tracks=Mi pistas
+main.clear_gps=Rader
+main.help=Adjuta
+main.options=Optiones
+main.save=Salveguardar
+tag_viewer.dndprompt=Adde nove punctos per traher e deponer los sur le carta
+toolbox.delete_node=Deler nodo (Del)
+toolbox.delete_area=Deler area (Shift+Del)
+toolbox.delete_way=Deler via (Shift+Del)
+toolbox.delete_item=Deler objecto
+toolbox.reverse_direction=Inverter direction (V)
+toolbox.split_way=Scinder cammino (X)
+toolbox.merge_ways=Fusionar caminos
+toolbox.straighten_way=Render recte
+toolbox.make_circular=Render circular
+toolbox.make_right_angled=Render orthogonal
+toolbox.create_parrallel_way=Crear via parallel (P)
diff --git a/l10n/locale/ka/p2_main.properties b/l10n/locale/ka/p2_main.properties
new file mode 100644 (file)
index 0000000..c636012
--- /dev/null
@@ -0,0 +1,33 @@
+# Messages for Georgian (ქართული)
+# Exported from translatewiki.net
+# Author: David1010
+
+main.undo=გაუქმება
+main.redo=განმეორება
+main.background=ფონი
+main.map_style=რუკის სტილი
+main.gpsButton=GPS-ის მონაცემები
+main.gps_data=GPS-ის მონაცემები
+main.my_tracks=ჩემი გზები
+main.clear_gps=წაშლა
+main.help=დახმარება
+main.options=პარამეტრები
+main.save=შენახვა
+toolbox.delete_node=წერტილის წაშლა (Delete)
+toolbox.delete_area=ტერიტორიის წაშლა (Shift+Delete)
+toolbox.delete_way=გზის წაშლა (Shift+Delete)
+toolbox.delete_item=ელემენტის წაშლა
+toolbox.split_way=გზის გაყოფა (X)
+toolbox.merge_ways=გზების გაერთიანება
+toolbox.straighten_way=გზაბის გასწორება
+toolbox.make_circular=წრიული მოძრაობის შექმნა
+toolbox.make_right_angled=პირდაპირი კუთხის შექმნა (Q)
+toolbox.create_parrallel_way=პარალელური გზის შექმნა (P)
+oauth.rememberMe=დამიმახსოვრე
+oauth.cancelButton=გაუქმება
+styleSelector.editButton=რედაქტირება...
+backgroundSelector.editButton=რედაქტირება...
+backgroundSelector.vectorButton=ვექტორული ფაილი...
+options.tbcheck=ხელსაწყოების ყუთის ჩვენება
+options.cursorcheck=საკუთარი კურსორების გამოყენება
+options.ok=კარგი
diff --git a/l10n/locale/lb/p2_main.properties b/l10n/locale/lb/p2_main.properties
new file mode 100644 (file)
index 0000000..0182f54
--- /dev/null
@@ -0,0 +1,25 @@
+# Messages for Luxembourgish (Lëtzebuergesch)
+# Exported from translatewiki.net
+# Author: Robby
+
+main.undo=Zréck setzen
+main.redo=Widderhuelen
+main.background=Hannergrond
+main.map_style=Styl vun der Kaart
+main.gpsButton=GPS-Donnéeën
+main.gps_data=GPS-Donnéeën
+main.clear_gps=Eidel maachen
+main.help=Hëllef
+main.options=Optiounen
+main.save=Späicheren
+toolbox.delete_node=Knuet läschen (Läschen)
+toolbox.delete_item=Objet läschen
+toolbox.reverse_direction=Richtung ëmdréinen (V)
+oauth.rememberMe=Sech u mech erënneren
+oauth.cancelButton=Ofbriechen
+styleSelector.editButton=Änneren...
+backgroundSelector.editButton=Änneren...
+backgroundSelector.vectorButton=Vektor-Fichier...
+options.tbcheck=Geschirkëscht weisen
+options.cursorcheck=Benotzt déi personaliséiert Curseuren
+options.ok=OK
index 4ac19a4c6946b2458014c3bb06cf7c91e2c3ead4..922edea50333c9525bdcfebb5cb211f5a4e54501 100644 (file)
@@ -1,5 +1,6 @@
 # Messages for Dutch (Nederlands)
 # Exported from translatewiki.net
+# Author: McDutchie
 # Author: SPQRobin
 # Author: Siebrand
 
@@ -12,7 +13,7 @@ help.introText=<p><b>Potlatch2</b> is een editor voor OpenStreetMap (OSM) waarme
 help.introduction=Inleiding
 help.controls=Besturing
 help.interfaceControls=Besturingselementen van de interface
-help.mapBackground=<p>Kies uw kaartachtergrond uit één van de items in de lijst of voeg uw eigen vectorbestand toe.</p>
+help.mapBackground=<p>Kies uw kaartachtergrond uit de lijst of voeg uw eigen vectorbestand toe.</p>
 help.colourStyle=<p>Kies de kaartstijl die u wilt gebruiken. Kleuren en algemene stijl variëren en omvatten ook andere opties zoals draadframe.</p>
 help.gps=GPS
 help.createOsmMap=<p>OSM-kaartgegevens maken met behulp van GPS-tracks van andere mensen als achtergrond</p>
index ce4e7231f9699e99bf0f77ad639821469c073b6e..49e820a44fc5e3aef65b2a0a8858f0468b7a52e8 100644 (file)
@@ -31,7 +31,7 @@ oauth.authorized=Als u toegang hebt, klik dan op de knop "Toegang krijgen" hiero
 oauth.deniedLabel=<b>U hebt geen toegang. Controleer uw gegevens en probeer het opnieuw</b>
 oauth.rememberMe=Aanmeldgegevens onthouden
 oauth.permFail=<p>De server heeft de toegang geweigerd. Het was niet mogelijk om een autorisatieverwijzing te verkrijgen.</p>\n<p><b>OAuth-toegang is niet mogelijk.</b></p>\n<p>Neem contact op met de leverancier van de toepassing om te achterhalen wat er aan de hand is.</p>
-oauth.tempFail=Er was een probleem bij het contacteren van de server om toegang te krijgen.  Dit kan een tijdelijke fout zijn, probeer het later opnieuw.
+oauth.tempFail=Er is een probleem opgetreden tijdens het contact opnemen met de server om toegang te krijgen. Dit kan een tijdelijke fout zijn. Probeer het later opnieuw.
 oauth.tryAccessButton=Toegang proberen te verkrijgen
 oauth.cancelButton=Annuleren
 save.editDescription=Geef een beschrijving van uw bewerking op. Dit is nodig om andere mappers een idee te geven welke wijzigingen u aangebracht hebt.
diff --git a/l10n/locale/ta/p2_main.properties b/l10n/locale/ta/p2_main.properties
new file mode 100644 (file)
index 0000000..314cde9
--- /dev/null
@@ -0,0 +1,21 @@
+# Messages for Tamil (தமிழ்)
+# Exported from translatewiki.net
+# Author: Aswn
+# Author: Karthi.dr
+
+main.undo=செயல்தவிர்
+main.redo=மீண்டும் செய்
+main.background=பின்னணி
+main.gpsButton=ஜி.பி.எஸ் தகவல்
+main.gps_data=புவியிடங்காட்டித் தரவு
+main.clear_gps=வெறுமையாக்கு
+main.help=உதவி
+main.options=விருப்பத் தேர்வுகள்
+main.save=சேமி
+toolbox.delete_item=உருப்படியை நீக்கு
+toolbox.merge_ways=வழிகளை ஒன்றுசேர்
+toolbox.straighten_way=வழியை நேராக்கு
+oauth.cancelButton=ரத்து செய்
+styleSelector.editButton=திருத்து...
+backgroundSelector.editButton=தொகு...
+options.ok=சரி
diff --git a/l10n/locale/uk/help_dialog.properties b/l10n/locale/uk/help_dialog.properties
new file mode 100644 (file)
index 0000000..48fd2e0
--- /dev/null
@@ -0,0 +1,37 @@
+# Messages for Ukrainian (Українська)
+# Exported from translatewiki.net
+# Author: Andygol
+
+help.gettingStarted=Початок роботи
+help.welcome=Ласкаво просимо!
+help.whyOpenstreetmap=<p><b>Чому OpenStreetMap?</b> OSM — це сервіс мап, в якому всі дані постійно оновлюються та виправляються звичайним людьми, такими як ви. Очевидною перевагою є те, що він безкоштовний для використання, він також став основним гравцем у кратографванні кризисних явищ (наприклад використання OSM даних під час надання допомоги під час землетрусу на Гаїті). Точність цих даних має вирішальне значення, і ми сподіваємося, що ви в змозі пожертвувати частину вашого часу!</p>
+help.activeMembers=<p><b>+ Для активних учасників OpenStreetMap</b>, будь ласка, увійдіть до OSM перед редагуванням.</p>
+help.newMembers=<p><b>+ Для нових учасників</b>, будь ласка, відвідайте <a href="http://www.openstreetmap.org/user/new" target="_blank">http://www.openstreetmap.org</a> для створення облікового запису, увійдіть в систему, а потім поверніться сюди, щоб отримати доступ до Потлач 2 і почати редагування.</p>
+help.introText=<p><b>Потлач 2</b> є OpenStreetMap (OSM) редактором, який дозволяє зробити зміни безпосередньо через веб-сайт {0}.</p>
+help.introduction=Вступ
+help.controls=Елементи керування
+help.interfaceControls=Елементи інтерфейсу
+help.mapBackground=<p>Виберіть фонове зображення для мапи з елементів у списку, або додайте власний вектор файл.</p>
+help.colourStyle=<p>Виберіть стиль, в якому ви бажаєте переглядати мапу. Кольори і загальний стиль можна змінити і включають інші варіанти, такі як  каркас.</p>
+help.gps=GPS
+help.createOsmMap=<p>Створюйте  мапу OSM використовуючи GPS-треки інших людей в якості тла</p>
+help.myGps=МійGPS
+help.displayGps=<p>Показ GPS-треків, завантажених  раніше на OpenStreetMap.</p>
+help.undoRedo=Скасувати / Повернути
+help.madeMistake=<p>Зробили помилку? Просто натисніть Скасувати або повторити, щоб виправити ваші зміни.</p>
+help.help=Довідка
+help.guideInfomation=<p>Використовуйте це керівництво, якщо вам потрібна будь-яка інформація під час редагування.</p>
+help.save=Зберегти
+help.addingFeatures=Додавання об’єктів
+help.addingFeaturesText=<p><i>Перше ніж почати, перше правило, яке вам потрібно знати — ЗАБОРОНЕНО використовувати дані з джерел захищених авторським правом, чи даних, на використання яких у вас нема дозволу! Копіювання, обведення чи будь-яке відтворення таких даних недозволене!  (Джерело: <a href="http://wiki.openstreetmap.org/wiki/Copyright" target="_blank">Copyright - OpenStreetMap Wiki</a>)</i></p>\n  <p></p>\n  <p>Лінійні об’єкти, такі як вилиці, стежки, залізничні колії та контури будівель є <b>лініями</b>.</p>\n  <p>Якщо ви помітили, що бокова панель зі значками кудись поділась, не хвилюйтесь, — все через те, що ви виділили об’єкт на мапі. Зніміть виділення, клацнувши у будь-якому порожньому місці на мапі, щоб повернути панель із значками.</p>\n            <p><b>Для створення  точки</b>, просто перетягніть відповідний значок з бокової панелі у відповідне місце на мапі. Дивіться розділ Додавання POI, щоб дізнатись про створення точкових об’єктів — POI (Point of Interest)</p>\n            <p><b>Для створення ліній</b>, клацніть на мапі в місці початку лінії, потім клацайте у кожній потрібній точці, щоб лінія мали відповідну форму. Подвійне клацання, чи натискання на Enter призведе до завершення креслення лінії.</p>\n            <p><b>Для створення полігону</b>, робіть все так само як і для створення лінії, для завершення клацніть на початкову точку , щоб замкнути лінію полігону.</p>\n            <p>Запам’ятайте, якщо ви припустились помилки,завжди можна скористатись кнопкою Відмінити. Натискання Esc призведе до скасування усіх змін для поточного об’єкта.</p>
+help.editBeg=Правити (поч.)
+help.editingFeatures=Редагування об’єктів (початківцям)
+help.editingFeaturesText=<p><b>Щоб додати точку до існуючої лінії</b>, виділіть її натисніть клавішу shift та клацніть у потрібному місці.</p>\n    <p><b>Для вилучення точки</b>, виділіть її та натисніть «Влучити елемент» в правому нижньому куті або натисніть Delete (чи Backspace) на клавіатурі.</p>\n  <p><b>Для вилучення лінії</b>,  виділіть її та натисніть «Влучити елемент» в правому нижньому куті або натисніть shift+Delete (ч shift+Backspace)  на клавіатурі.</p>\n    <p><b>Для переміщення точки</b>, клацніть на еї та потягніть.</p>\n   <p><b>Для переміщення лінії</b>, клацніть та потягніть весь об’єкт. Підказка: Хапайтесь за відрізок, якщо ви не бажаєете випадково пересунути точку.</p>\n  <p><b>Для продовження лінії</b>, клацніть на один з її кінців, потім креслить як завжди.</p>\n    <p><b>Для додавання нової лінії, що з’єднується з інсуючою лінією</b>, клацніть на кінець лінії натиснувши shift, потім кресліть як звичайно.</p>
+help.editAdv=Редагування (Досв.)
+help.editingFeaturesAdv=Редагування об’єктів (Розширене)
+help.editingFeaturesAdvText=<p><b>Щоб розділити лінію</b>, виділіть точку в якій її треба розрізати та скористайтесь «Ножицями» або натисніть X на клавіатурі. Порада: Якщо в потрібному місці точка відсутня — спочатку додайте її, а потім розрізайте.</p>\n            <p><b>Щоб з’єднати дві лінії, що перехрещуються</b>, кресліть як звичайно до тих під доки вам не знадобиться створити перехрестя. Наведіть вказівник миші на іншу лінію, точки на ній підсвітяться синім, клацніть на синю точку або у потрібне місце на лінії для створення перехрестя.</p>\n            <p><b>Для роз’єднання перехрещених ліній</b>, виділіть точку на лінії, яку потрібно змінити. Натисніть «-» на клавіатурі для вилучення точки.</p>\n            <p><b>Для зміни напрямку лінії</b>, натисніть на кнопку «Змінити напрямок» у правому нижньому куті. Напрямок лінії має сенс лише для певних об’єктів таких як дороги з одностороннім рухом, берегова лінія, острови та таке інше.</p>\n            <p><b>Для створення паралельної лінії</b>, виділіть лінію та натисніть на кнопку «Створити паралельну лінію» в правому нижньому куті чи натисніть P на клавіатурі.</p>\n     <p><b>Для створення лінії, що використовує точки вже існуючої лінії</b>, почніть креслити, клацнувши на дві перші спільні точки, а потім натисніть F для автоматичного слідування точкам існуючої лінії.</p>\n            <p><i>Відвідайте <a href="http://wiki.openstreetmap.org/wiki/Potlatch2/Primer" target="_blank">Приклади Potlatch 2</a> на Вікі OpenStreetMap, щоб знайти більше інформації про методи та угоди редагування.</i></p>
+help.tag=Теґ
+help.taggingFeatures=Позначення об’єктів
+help.taggingFeaturesText=<p>В Potlatch 2, позначення об’єктів стало значно простішим з використанням графічних меню та спеціальних полів/значків.</p>\n          <p><b>Позначення об’єктів теґами</b></p>\n          <p>Виділіть точку чи лінію, яку ви бажаєте редагувати, оберіть відповідний теґ із панелі ліворуч. Після позначення об’єкту, з’являться кілька основних полів, такі як назва, обмеження швидкості, ширина, в залежності від обраного теґу. Заповніть їх потрібними значеннями.</p><p>Досвідчені користувачі можуть помітити відсутність деяких теґів та їх значень, які вони використовують. Якщо вам потрібно додати додаткові теґи скористайтесь вкладкою Розширені параметри знизу панелі у разі потреби.</p>\n          <p>Вікі OpenStreetMap також надає <a href="http://wiki.openstreetmap.org/wiki/Uk:Map_features" target="_blank">розширений перелік теґів та їх значнь</a>. Будь ласка, звертайтесь до документації OSM, якщо ви невпевнені, що до застосування теґів.</p>
+help.shortcuts=Комбінації клавіш
+help.keyboardShortcuts=Сполучення клавіш
diff --git a/l10n/locale/uk/p2_main.properties b/l10n/locale/uk/p2_main.properties
new file mode 100644 (file)
index 0000000..92e2765
--- /dev/null
@@ -0,0 +1,44 @@
+# Messages for Ukrainian (Українська)
+# Exported from translatewiki.net
+# Author: Andygol
+
+main.undo=Скасувати
+main.redo=Повернути
+main.background=Фон
+main.map_style=Стиль мапи
+main.gpsButton=GPS-дані
+main.gps_data=GPS-дані
+main.my_tracks=Мої треки
+main.clear_gps=Очистити
+main.help=Довідка
+main.options=Параметри
+main.save=Зберегти
+tag_viewer.dndprompt=Додайте нові точки, перетягнувши їх на мапу
+toolbox.delete_node=Вилучити точку (Delete)
+toolbox.delete_area=Вилучити  ділянку (Shift+Delete)
+toolbox.delete_way=Вилучити лінію (Shift+Delete)
+toolbox.delete_item=Вилучити елемент
+toolbox.reverse_direction=Змінити напрямок (V)
+toolbox.split_way=Розділити лінію (X)
+toolbox.merge_ways=Об’єднати лінії
+toolbox.straighten_way=Випрямити лінію
+toolbox.make_circular=Створити коло
+toolbox.make_right_angled=Зробити кути прямими (Q)
+toolbox.create_parrallel_way=Створити паралельну лінію (P)
+oauth.gotLinkBox=Натисніть на посилання нижче, щоб відкрити веб-сторінку, де вам буде запропоновано дозволити доступ для цього застосунка.
+oauth.authorized=Автентифікований доступ можна перевірити натиснув на кнопки «Випробувати доступ»
+oauth.deniedLabel=<b>Відмовлено в доступі, перевірте і повторіть спробу</b>
+oauth.rememberMe=Запам’ятати мене
+oauth.permFail=<p>Сервер відхилив повноваження цього застосунку — не вдається отримати посилання на авторизації.</p>\n<p>        <b>OAuth доступу не можливий.</b>              </p>\n<p>Зверніться до постачальника застосунку, щоб з’ясувати, що відбувається.</p>
+oauth.tempFail=Сталася помилка підключення до сервера для отримання авторизації.    Це може бути тимчасова помилка, спробуйте ще раз пізніше.
+oauth.tryAccessButton=Випробувати доступ
+oauth.cancelButton=Скасувати
+save.editDescription=Будь ласка, введіть опис для ваших змін. Він дасть можливість іншим маперам мати уявлення про те, які зміни ви зробили.
+styleSelector.editButton=Правити…
+backgroundSelector.dim=приглушити
+backgroundSelector.sharpen=збільшити різкість
+backgroundSelector.editButton=Правити…
+backgroundSelector.vectorButton=Векторний файл…
+options.tbcheck=Показати панель інструментів
+options.cursorcheck=Використовувати власні курсори
+options.ok=Гаразд
diff --git a/l10n/locale/vi/help_dialog.properties b/l10n/locale/vi/help_dialog.properties
deleted file mode 100644 (file)
index 9fd363c..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-# Messages for Vietnamese (Tiếng Việt)
-# Exported from translatewiki.net
-# Author: Minh Nguyen
-
-help.gettingStarted=Bắt đầu
-help.welcome=Hoan nghênh
-help.whyOpenstreetmap=<p><b>Tại sao OpenStreetMap?</b> OSM là một dịch vụ bản đồ có dữ liệu được cập nhật luôn luôn do công sức của những nguời thường như bạn. Dĩ nhiên bạn có thể sử dụng OSM miễn phí, nhưng nó cũng có điểm lợi khác. Nó là một trong những dịch vụ quan trọng nhất cung cấp bản đồ ở nơi thảm họa: dữ liệu OSM được sử dụng để phối hợp các nỗ lực cứu tế tại Haiti sau động đất. Dữ liệu bản đồ cần phải chính xác và đầy đủ. Hy vọng bạn sẽ tình nguyện để dành một tí thì giờ để đóng góp!</p>
-help.activeMembers=<p><b>• Các thành viên đã có tài khoản:</b> Xin vui lòng đăng nhập vào OpenStreetMap truớc khi sửa đổi.</p>
-help.newMembers=<p><b>• Các thành viên mới:</b> Xin vui lòng ghé vào <a href="http://www.openstreetmap.org/user/new" target="_blank">http://www.openstreetmap.org</a> để mở tài khoản mới truớc tiên. Sau đó, đăng nhập và trở về đây để cho phép Potlatch 2 truy cập tài khoản và bắt đầu sửa đổi.</p>
-help.introText=<p><b>Potlatch2</b> là một trình vẽ OpenStreetMap (OSM) cho phép bạn sửa đổi trực tiếp từ trang {0}.</p>
-help.introduction=Giới thiệu
-help.controls=Điều khiển
-help.interfaceControls=Các điều khiển giao diện
-help.mapBackground=<p>Chọn lớp nền bản đồ từ trình đơn hoặc thêm một tập tin vectơ của bạn.</p>
-help.colourStyle=<p>Chọn kiểu để hiển thị bản đồ. Có sẵn nhiều kiểu màu sắc và kiểu vẽ đường, cũng như một số tùy chọn khác như Khung lưới.</p>
-help.gps=GPS
-help.createOsmMap=<p>Vẽ dữ liệu bản đồ OSM bằng cách đồ lên tuyến đường GPS của nguời khác.</p>
-help.myGps=MyGPS
-help.displayGps=<p>Hiện các tuyến đường GPS mà bạn đã tải lên OpenStreetMap.</p>
-help.undoRedo=Hoàn tác / Làm lại
-help.madeMistake=<p>Vừa vẽ nhầm lẫn? Chỉ việc bấm Hoàn tác hoặc Làm lại để chỉnh sửa các đối tượng vẽ.</p>
-help.help=Trợ giúp
-help.guideInfomation=<p>Mở hướng dẫn này để chỉ dẫn cách sửa đổi.</p>
-help.save=Lưu
-help.addingFeatures=Bổ sung Đối tượng
-help.addingFeaturesText=<p><i>Truớc tiên, bạn phải nhớ quy tắc quan trọng nhất về cách sử dụng dữ liệu mang tính thương mại: <b>không cho phép</b> sử dụng dữ liệu từ bất kỳ bản đồ có bản quyền hoặc bất kỳ dữ liệu thương mại khác! <b>Không cho phép</b> sao chép, đồ lên, hoặc tái sản xuất bằng bất cứ phương pháp nào! (Nguồn: <a href="http://wiki.openstreetmap.org/wiki/Copyright?uselang=vi" target="_blank">Quyền tác giả – OpenStreetMap Wiki</a>)</i></p>\n<p></p>\n<p>Hướng dẫn này chỉ đến các đối tượng hình tuyến như đường sá, đường bộ, đường sắt, và hình dạng tòa nhà với tên <b>lối</b>.</p>\n<p>Nếu bạn tình cờ nhận thấy rằng các hình tượng trên thanh bên bị mất, có lẽ một địa điểm hay lối đang được chọn trên bản đồ. Để bỏ chọn nó, nhấn chuột vào một vùng trống trên bản đồ; các hình tượng sẽ hiện ngay.</p>\n<p>Để <b>bổ sung một địa điểm (hoặc nốt)</b>, chỉ việc kéo một hình tượng trưng cho nó từ thanh bên và thả nó vào bản đồ. Xem “Bổ sung địa điểm” để biết thêm về việc tạo địa điểm ưa thích (POI)</p>\n<p>Để <b>vẽ một lối</b>, nhấn chuột vào bản đồ tại vị trí bắt đầu, rồi nhấn chuột vào mọi vị trí dẫn tiếp. Nhấn đúp hoặc bấm “Enter” trên bàn phím để kết thúc đường vẽ.</p>\n<p>Để <b>vẽ một hình đa giác (vùng)</b>, nhấn chuột vào bản đồ tại vị trí bắt đầu, rồi nhấn chuột vào mọi vị trí dẫn tiếp – y chang như việc vẽ lối – và nhấn chuột vào nốt đầu tiên để đóng hình đa giác.</p>\n<p>Nếu bạn vẽ nhầm lẫn, bạn có thể bấm nút Hoàn tác. Bấm “Esc” trên bàn phím để kết thúc sửa đổi điểm hay lối hiện hành.</p>
-help.editBeg=Sửa (Cơ bản)
-help.editingFeatures=Sửa đổi Đối tượng (Cơ bản)
-help.editingFeaturesText=<p>Để <b>thêm một nốt vào giữa một lối đã tồn tại</b>, chọn lối đó, rồi giữ bấm Shift và nhấn chuột vào vị trí của nốt mới.</p>\n<p>Để <b>xóa một nốt</b>, chọn nó và bấm nút “Xóa Nốt” ở phía duới bên phải hoặc bấm Delete (hoặc Backspace) trên bàn phím.</p>\n<p>Để <b>xóa cả một lối</b>, chọn lối đó và bấm nút “Xóa Lối” ở phía dưới bên phải, hoặc bấm Shift+Delete (hoặc Shift+Backspace) trên bàn phím.</p>\n<p>Để <b>di chuyển một điểm hay nốt</b>, chọn và kéo nó.</p>\n<p>Để <b>di chuyển một lối</b>, bấm và kéo cả lối đó. (Gợi ý: Khi kéo lối, tránh các nốt của lối).</p>\n<p>Để <b>kéo dài một lối</b>, nhấn chuột vào nốt tại đầu hay đuôi của lối, rồi tiếp tục vẽ lối bình thường.</p>\n<p>Để <b>vẽ một lối mới liền với đầu hay đuôi của lối đã tồn tại</b>, giữ Shift và nhấn chuột vào nốt tại đầu hay đuôi của lối đó, rồi tiếp tục vẽ lối mới bình thường.</p>
-help.editAdv=Sửa (Nâng cao)
-help.editingFeaturesAdv=Sửa đổi Đối tượng (Nâng cao)
-help.editingFeaturesAdvText=<p>Để <b>cắt đôi một lối</b>, chọn một điểm để cắt và nhấn chuột vào công cụ “Cắt đôi” (đôi kéo) hoặc bấm “X” trên bàn phím. (Gợi ý: Để cắt một lối giữa hai nốt, thêm một nốt mới trước tiên.)</p>\n<p>Để <b>nối liền hai lối</b>, vẽ các lối bình thường đến khi cần nối liền. Khi bạn chuyển con trỏ lên trên một lối khác, các nốt của lối đó sẽ được tô màu xanh. Nhấn chuột vào một trong những nốt xanh hoặc vào nơi khác nào đó trên lối để nối liền.</p>\n<p>Để <b>gỡ một lối khỏi nơi nối liền</b>, chọn nốt trên lối mà bạn muốn gỡ ra. Bấm “-” trên bàn phím để dời nốt khỏi lối.</p>\n<p>Để <b>đảo nguợc một lối</b>, bấm nút “Đảo nguợc” ở phía duới bên phải. Hướng của lối chỉ có ảnh hưởng đến các lối có thẻ “oneway” (một chiều) như các đường một chiều, cũng như các bờ biển, hòn đảo, v.v.</p>\n<p>Để <b>vẽ các lối song song</b>, chọn lối gốc và bấm nút “Vẽ Lối Song song” ở phía duới bên phải, hoặc bấm “P” trên bàn phím.</p>\n<p>Để <b>vẽ lối mới chạy theo lối khác</b>, bắt đầu vẽ lối mới, nhấn chuột vào ít nhất hai nốt trên lối khác, rồi cứ bấm “F” trên bàn phím để tự động chạy theo lối khác.</p>\n<p><i>Đọc <a href="http://wiki.openstreetmap.org/wiki/Potlatch2/Primer?uselang=vi" target="_blank">Hướng dẫn Potlatch2</a> trên OpenStreetMap Wiki để biết những cách sửa đổi nâng cao hơn.</i></p>
-help.tag=Thẻ
-help.taggingFeatures=Gắn thẻ vào Đối tượng
-help.taggingFeaturesText=<p>Trong Potlatch 2, bạn có thể sử dụng các trình đơn, hộp văn bản, và hình tượng để gắn thẻ dễ dàng.</p>\n<p><b>Gắn thẻ vào một địa điểm, nốt, hay lối</b></p>\n<p>Chọn nốt hay điểm để sửa đổi và chọn thẻ phù hợp từ thanh bên ở bên trái. Sau khi gắn thẻ vào đối tượng, bạn có thể tùy biến một số chi tiết cơ bản, thí dụ như “Tên”, “Tốc độ Tối đa”, và “Chiều rộng”, tùy thẻ được chọn. Điền biểu mẫu này càng đầy đủ càng tốt.</p>\n<p>Những người dùng nâng cao có thể cần đặt một số thẻ và chi tiết ít phổ biến hơn. Trong trường hợp này, bấm thẻ “Nâng cao” ở phía duới của thanh bên và sửa đổi và bổ sung các thẻ khác.</p>\n<p>OpenStreetMap Wiki cung cấp một <a href="http://wiki.openstreetmap.org/wiki/Vi:Map_Features?uselang=vi" target="_blank">danh sách thẻ và giá trị thẻ đầy đủ</a>. Xin vui lòng tra cứu tài liệu OSM này khi nào không chắc chắn về các thẻ để sử dụng.</p>
-help.shortcuts=Phím tắt
-help.keyboardShortcuts=Phím tắt
diff --git a/l10n/locale/vi/p2_main.properties b/l10n/locale/vi/p2_main.properties
deleted file mode 100644 (file)
index 8f15315..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-# Messages for Vietnamese (Tiếng Việt)
-# Exported from translatewiki.net
-# Author: Minh Nguyen
-
-main.undo=Hoàn tác
-main.redo=Làm lại
-main.background=Lớp Nền
-main.map_style=Kiểu Bản đồ
-main.gpsButton=Dữ liệu GPS
-main.gps_data=Dữ liệu GPS
-main.my_tracks=Tuyến dường của Tôi
-main.clear_gps=Xóa
-main.help=Trợ giúp
-main.options=Tùy chọn
-main.save=Lưu
-tag_viewer.dndprompt=Để thêm dịa điểm mới, kéo nó vào bản đồ
-toolbox.delete_node=Xóa Nốt (Delete)
-toolbox.delete_area=Xóa Vùng (Shift+Delete)
-toolbox.delete_way=Xóa Lối (Shift+Delete)
-toolbox.delete_item=Xóa Đối tượng
-toolbox.reverse_direction=Đảo nguợc (V)
-toolbox.split_way=Cắt đôi Lối (X)
-toolbox.merge_ways=Hợp nhất các Lối
-toolbox.straighten_way=Làm Thẳng
-toolbox.make_circular=Làm Tròn
-toolbox.make_right_angled=Làm Vuông góc (Q)
-toolbox.create_parrallel_way=Vẽ Lối Song song (P)
-oauth.gotLinkBox=Nhấn chuột vào liên kết ở duới để mở một trang Web xin bạn cho phép ứng dụng này truy cập vào tài khoản của bạn.
-oauth.authorized=Sau khi bạn cho phép ứng dụng này, bấm nút “Thử Truy cập” ở duới.
-oauth.deniedLabel=<b>Ứng dụng không có phép truy cập tài khoản của bạn. Xin vui lòng kiểm tra lại và thử lần nữa.</b>
-oauth.rememberMe=Nhớ thông tin đăng nhập của tôi
-oauth.permFail=<p>Máy chủ không thể xác nhận thông tin đăng nhập của ứng dụng này.</p>\n<p> <b>Không thể truy cập tài khoản của OAuth.</b> </p>\n<p> Xin vui lòng liên lạc với chủ ứng dụng để biết thêm chi tiết.</p>
-oauth.tempFail=Xuất hiện trục trặc khi kết nối với máy chủ để kiểm tra thông tin đăng nhập. Đây có thể là một vấn đề tạm thời; xin thử lại sau.
-oauth.tryAccessButton=Thử Truy cập
-oauth.cancelButton=Hủy bỏ
-save.editDescription=Xin vui lòng miêu tả các sửa đổi của bạn, để cho những nguời dùng khác hiểu biết những thay đổi trên bản đồ.
-styleSelector.editButton=Sửa đổi…
-backgroundSelector.dim=Làm mờ
-backgroundSelector.sharpen=Làm rõ
-backgroundSelector.editButton=Sửa đổi…
-backgroundSelector.vectorButton=Tập tin Vectơ…
-options.tbcheck=Hiện hộp công cụ
-options.cursorcheck=Hiện con trỏ đặc biệt
-options.ok=OK
index b5069509bf38b46a9bd0ac87cd6332b8e3873b3f..9fd363ca3b08365035f96c88af644eed595ca16c 100644 (file)
@@ -1,35 +1,37 @@
-# vi resources file
+# Messages for Vietnamese (Tiếng Việt)
+# Exported from translatewiki.net
+# Author: Minh Nguyen
 
-help.gettingStarted = Bắt đầu
-help.welcome = Hoan nghênh
-help.whyOpenstreetmap = <p><b>Tại sao OpenStreetMap?</b> OSM là một dịch vụ bản đồ có dữ liệu được cập nhật luôn luôn do công sức của những nguời thường như bạn. Dĩ nhiên bạn có thể sử dụng OSM miễn phí, nhưng nó cũng có điểm lợi khác. Nó là một trong những dịch vụ quan trọng nhất cung cấp bản đồ ở nơi thảm họa: dữ liệu OSM được sử dụng để phối hợp các nỗ lực cứu tế tại Haiti sau động đất. Dữ liệu bản đồ cần phải chính xác và đầy đủ. Hy vọng bạn sẽ tình nguyện để dành một tí thì giờ để đóng góp!</p>
-help.activeMembers = <p><b>• Các thành viên đã có tài khoản:</b> Xin vui lòng đăng nhập vào OpenStreetMap truớc khi sửa đổi</b></p>
-help.newMembers = <p><b>• Các thành viên mới:</b> Xin vui lòng ghé vào <a href="http://www.openstreetmap.org/user/new" target="_blank">http://www.openstreetmap.org</a> để mở tài khoản mới truớc tiên. Sau đó, đăng nhập và trở về đây để cho phép Potlatch 2 truy cập tài khoản và bắt đầu sửa đổi.</p>
-help.introText = <p><b>Potlatch2</b> là một trình vẽ OpenStreetMap (OSM) cho phép bạn sửa đổi trực tiếp từ trang {0}.</p>
-help.introduction = Giới thiệu
-help.controls = Điều khiển
-help.interfaceControls = Các điều khiển giao diện
-help.mapBackground = <p>Chọn lớp nền bản đồ từ trình đơn hoặc thêm một tập tin vectơ của bạn.</p>
+help.gettingStarted=Bắt đầu
+help.welcome=Hoan nghênh
+help.whyOpenstreetmap=<p><b>Tại sao OpenStreetMap?</b> OSM là một dịch vụ bản đồ có dữ liệu được cập nhật luôn luôn do công sức của những nguời thường như bạn. Dĩ nhiên bạn có thể sử dụng OSM miễn phí, nhưng nó cũng có điểm lợi khác. Nó là một trong những dịch vụ quan trọng nhất cung cấp bản đồ ở nơi thảm họa: dữ liệu OSM được sử dụng để phối hợp các nỗ lực cứu tế tại Haiti sau động đất. Dữ liệu bản đồ cần phải chính xác và đầy đủ. Hy vọng bạn sẽ tình nguyện để dành một tí thì giờ để đóng góp!</p>
+help.activeMembers=<p><b>• Các thành viên đã có tài khoản:</b> Xin vui lòng đăng nhập vào OpenStreetMap truớc khi sửa đổi.</p>
+help.newMembers=<p><b>• Các thành viên mới:</b> Xin vui lòng ghé vào <a href="http://www.openstreetmap.org/user/new" target="_blank">http://www.openstreetmap.org</a> để mở tài khoản mới truớc tiên. Sau đó, đăng nhập và trở về đây để cho phép Potlatch 2 truy cập tài khoản và bắt đầu sửa đổi.</p>
+help.introText=<p><b>Potlatch2</b> là một trình vẽ OpenStreetMap (OSM) cho phép bạn sửa đổi trực tiếp từ trang {0}.</p>
+help.introduction=Giới thiệu
+help.controls=Điều khiển
+help.interfaceControls=Các điều khiển giao diện
+help.mapBackground=<p>Chọn lớp nền bản đồ từ trình đơn hoặc thêm một tập tin vectơ của bạn.</p>
 help.colourStyle=<p>Chọn kiểu để hiển thị bản đồ. Có sẵn nhiều kiểu màu sắc và kiểu vẽ đường, cũng như một số tùy chọn khác như Khung lưới.</p>
-help.gps = GPS
-help.createOsmMap = <p>Vẽ dữ liệu bản đồ OSM bằng cách đồ lên tuyến đường GPS của nguời khác.</p>
-help.myGps = MyGPX
-help.displayGps = <p>Hiện các tuyến đường GPS mà bạn đã tải lên OpenStreetMap.</p>
-help.undoRedo = Hoàn tác / Làm lại
-help.madeMistake = <p>Vừa vẽ nhầm lẫn? Chỉ việc bấm Hoàn tác hoặc Làm lại để chỉnh sửa các đối tượng vẽ.</p>
-help.help = Trợ giúp
-help.guideInfomation = <p>Mở hướng dẫn này để chỉ dẫn cách sửa đổi.</p>
-help.save = Lưu
-help.addingFeatures = Bổ sung Đối tượng
-help.addingFeaturesText = <p><i>Truớc tiên, bạn phải nhớ quy tắc quan trọng nhất về cách sử dụng dữ liệu mang tính thương mại: <b>không cho phép</b> sử dụng dữ liệu từ bất kỳ bản đồ có bản quyền hoặc bất kỳ dữ liệu thương mại khác! <b>Không cho phép</b> sao chép, đồ lên, hoặc tái sản xuất bằng bất cứ phương pháp nào! (Nguồn: <a href="http://wiki.openstreetmap.org/wiki/Copyright?uselang=vi" target="_blank">Quyền tác giả – OpenStreetMap Wiki</a>)</i></p> <p></p> <p>Hướng dẫn này chỉ đến các đối tượng hình tuyến như đường sá, đường bộ, đường sắt, và hình dạng tòa nhà với tên <b>lối</b>.</p> <p>Nếu bạn tình cờ nhận thấy rằng các hình tượng trên thanh bên bị mất, có lẽ một địa điểm hay lối đang được chọn trên bản đồ. Để bỏ chọn nó, nhấn chuột vào một vùng trống trên bản đồ; các hình tượng sẽ hiện ngay.</p> <p>Để <b>bổ sung một địa điểm (hoặc nốt)</b>, chỉ việc kéo một hình tượng trưng cho nó từ thanh bên và thả nó vào bản đồ. Xem “Bổ sung địa điểm” để biết thêm về việc tạo địa điểm ưa thích (POI)</p> <p>Để <b>vẽ một lối</b>, nhấn chuột vào bản đồ tại vị trí bắt đầu, rồi nhấn chuột vào mọi vị trí dẫn tiếp. Nhấn đúp hoặc bấm “Enter” trên bàn phím để kết thúc đường vẽ.</p> <p>Để <b>vẽ một hình đa giác (vùng)</b>, nhấn chuột vào bản đồ tại vị trí bắt đầu, rồi nhấn chuột vào mọi vị trí dẫn tiếp – y chang như việc vẽ lối – và nhấn chuột vào nốt đầu tiên để đóng hình đa giác.</p> <p>Nếu bạn vẽ nhầm lẫn, bạn có thể bấm nút Hoàn tác. Bấm “Esc” trên bàn phím để kết thúc sửa đổi điểm hay lối hiện hành.</p>
-help.editBeg = Sửa (Cơ bản)
-help.editingFeatures = Sửa đổi Đối tượng (Cơ bản)
-help.editingFeaturesText = <p>Để <b>thêm một nốt vào giữa một lối đã tồn tại</b>, chọn lối đó, rồi giữ bấm Shift và nhấn chuột vào vị trí của nốt mới.</p> <p>Để <b>xóa một nốt</b>, chọn nó và bấm nút “Xóa Nốt” ở phía duới bên phải hoặc bấm Delete (hoặc Backspace) trên bàn phím.</p> <p>Để <b>xóa cả một lối</b>, chọn lối đó và bấm nút “Xóa Lối” ở phía dưới bên phải, hoặc bấm Shift+Delete (hoặc Shift+Backspace) trên bàn phím.</p> <p>Để <b>di chuyển một điểm hay nốt</b>, chọn và kéo nó.</p> <p>Để <b>di chuyển một lối</b>, bấm và kéo cả lối đó. (Gợi ý: Khi kéo lối, tránh các nốt của lối).</p> <p>Để <b>kéo dài một lối</b>, nhấn chuột vào nốt tại đầu hay đuôi của lối, rồi tiếp tục vẽ lối bình thường.</p> <p>Để <b>vẽ một lối mới liền với đầu hay đuôi của lối đã tồn tại</b>, giữ Shift và nhấn chuột vào nốt tại đầu hay đuôi của lối đó, rồi tiếp tục vẽ lối mới bình thường.</p>
-help.editAdv = Sửa (Nâng cao)
-help.editingFeaturesAdv = Sửa đổi Đối tượng (Nâng cao)
-help.editingFeaturesAdvText = <p>Để <b>cắt đôi một lối</b>, chọn một điểm để cắt và nhấn chuột vào công cụ “Cắt đôi” (đôi kéo) hoặc bấm “X” trên bàn phím. (Gợi ý: Để cắt một lối giữa hai nốt, thêm một nốt mới trước tiên.)</p> <p>Để <b>nối liền hai lối</b>, vẽ các lối bình thường đến khi cần nối liền. Khi bạn chuyển con trỏ lên trên một lối khác, các nốt của lối đó sẽ được tô màu xanh. Nhấn chuột vào một trong những nốt xanh hoặc vào nơi khác nào đó trên lối để nối liền.</p> <p>Để <b>gỡ một lối khỏi nơi nối liền</b>, chọn nốt trên lối mà bạn muốn gỡ ra. Bấm “-” trên bàn phím để dời nốt khỏi lối.</p> <p>Để <b>đảo nguợc một lối</b>, bấm nút “Đảo nguợc” ở phía duới bên phải. Hướng của lối chỉ có ảnh hưởng đến các lối có thẻ “oneway” (một chiều) như các đường một chiều, cũng như các bờ biển, hòn đảo, v.v.</p> <p>Để <b>vẽ các lối song song</b>, chọn lối gốc và bấm nút “Vẽ Lối Song song” ở phía duới bên phải, hoặc bấm “P” trên bàn phím.</p> <p>Để <b>vẽ lối mới chạy theo lối khác</b>, bắt đầu vẽ lối mới, nhấn chuột vào ít nhất hai nốt trên lối khác, rồi cứ bấm “F” trên bàn phím để tự động chạy theo lối khác.</p> <p><i>Đọc <a href="http://wiki.openstreetmap.org/wiki/Potlatch2/Primer?uselang=vi" target="_blank">Hướng dẫn Potlatch2</a> trên OpenStreetMap Wiki để biết những cách sửa đổi nâng cao hơn.</i></p>
-help.tag = Thẻ
-help.taggingFeatures = Gắn thẻ vào Đối tượng
-help.taggingFeaturesText = <p>Trong Potlatch 2, bạn có thể sử dụng các trình đơn, hộp văn bản, và hình tượng để gắn thẻ dễ dàng.</p> <p><b>Gắn thẻ vào một địa điểm, nốt, hay lối</b></p> <p>Chọn nốt hay điểm để sửa đổi và chọn thẻ phù hợp từ thanh bên ở bên trái. Sau khi gắn thẻ vào đối tượng, bạn có thể tùy biến một số chi tiết cơ bản, thí dụ như “Tên”, “Tốc độ Tối đa”, và “Chiều rộng”, tùy thẻ được chọn. Điền biểu mẫu này càng đầy đủ càng tốt.</p><p>Những người dùng nâng cao có thể cần đặt một số thẻ và chi tiết ít phổ biến hơn. Trong trường hợp này, bấm thẻ “Nâng cao” ở phía duới của thanh bên và sửa đổi và bổ sung các thẻ khác.</p> <p>OpenStreetMap Wiki cung cấp một <a href="http://wiki.openstreetmap.org/wiki/Vi:Map_Features?uselang=vi" target="_blank">danh sách thẻ và giá trị thẻ đầy đủ</a>. Xin vui lòng tra cứu tài liệu OSM này khi nào không chắc chắn về các thẻ để sử dụng.</p>
-help.shortcuts = Phím tắt
-help.keyboardShortcuts = Phím tắt
+help.gps=GPS
+help.createOsmMap=<p>Vẽ dữ liệu bản đồ OSM bằng cách đồ lên tuyến đường GPS của nguời khác.</p>
+help.myGps=MyGPS
+help.displayGps=<p>Hiện các tuyến đường GPS mà bạn đã tải lên OpenStreetMap.</p>
+help.undoRedo=Hoàn tác / Làm lại
+help.madeMistake=<p>Vừa vẽ nhầm lẫn? Chỉ việc bấm Hoàn tác hoặc Làm lại để chỉnh sửa các đối tượng vẽ.</p>
+help.help=Trợ giúp
+help.guideInfomation=<p>Mở hướng dẫn này để chỉ dẫn cách sửa đổi.</p>
+help.save=Lưu
+help.addingFeatures=Bổ sung Đối tượng
+help.addingFeaturesText=<p><i>Truớc tiên, bạn phải nhớ quy tắc quan trọng nhất về cách sử dụng dữ liệu mang tính thương mại: <b>không cho phép</b> sử dụng dữ liệu từ bất kỳ bản đồ có bản quyền hoặc bất kỳ dữ liệu thương mại khác! <b>Không cho phép</b> sao chép, đồ lên, hoặc tái sản xuất bằng bất cứ phương pháp nào! (Nguồn: <a href="http://wiki.openstreetmap.org/wiki/Copyright?uselang=vi" target="_blank">Quyền tác giả – OpenStreetMap Wiki</a>)</i></p>\n<p></p>\n<p>Hướng dẫn này chỉ đến các đối tượng hình tuyến như đường sá, đường bộ, đường sắt, và hình dạng tòa nhà với tên <b>lối</b>.</p>\n<p>Nếu bạn tình cờ nhận thấy rằng các hình tượng trên thanh bên bị mất, có lẽ một địa điểm hay lối đang được chọn trên bản đồ. Để bỏ chọn nó, nhấn chuột vào một vùng trống trên bản đồ; các hình tượng sẽ hiện ngay.</p>\n<p>Để <b>bổ sung một địa điểm (hoặc nốt)</b>, chỉ việc kéo một hình tượng trưng cho nó từ thanh bên và thả nó vào bản đồ. Xem “Bổ sung địa điểm” để biết thêm về việc tạo địa điểm ưa thích (POI)</p>\n<p>Để <b>vẽ một lối</b>, nhấn chuột vào bản đồ tại vị trí bắt đầu, rồi nhấn chuột vào mọi vị trí dẫn tiếp. Nhấn đúp hoặc bấm “Enter” trên bàn phím để kết thúc đường vẽ.</p>\n<p>Để <b>vẽ một hình đa giác (vùng)</b>, nhấn chuột vào bản đồ tại vị trí bắt đầu, rồi nhấn chuột vào mọi vị trí dẫn tiếp – y chang như việc vẽ lối – và nhấn chuột vào nốt đầu tiên để đóng hình đa giác.</p>\n<p>Nếu bạn vẽ nhầm lẫn, bạn có thể bấm nút Hoàn tác. Bấm “Esc” trên bàn phím để kết thúc sửa đổi điểm hay lối hiện hành.</p>
+help.editBeg=Sửa (Cơ bản)
+help.editingFeatures=Sửa đổi Đối tượng (Cơ bản)
+help.editingFeaturesText=<p>Để <b>thêm một nốt vào giữa một lối đã tồn tại</b>, chọn lối đó, rồi giữ bấm Shift và nhấn chuột vào vị trí của nốt mới.</p>\n<p>Để <b>xóa một nốt</b>, chọn nó và bấm nút “Xóa Nốt” ở phía duới bên phải hoặc bấm Delete (hoặc Backspace) trên bàn phím.</p>\n<p>Để <b>xóa cả một lối</b>, chọn lối đó và bấm nút “Xóa Lối” ở phía dưới bên phải, hoặc bấm Shift+Delete (hoặc Shift+Backspace) trên bàn phím.</p>\n<p>Để <b>di chuyển một điểm hay nốt</b>, chọn và kéo nó.</p>\n<p>Để <b>di chuyển một lối</b>, bấm và kéo cả lối đó. (Gợi ý: Khi kéo lối, tránh các nốt của lối).</p>\n<p>Để <b>kéo dài một lối</b>, nhấn chuột vào nốt tại đầu hay đuôi của lối, rồi tiếp tục vẽ lối bình thường.</p>\n<p>Để <b>vẽ một lối mới liền với đầu hay đuôi của lối đã tồn tại</b>, giữ Shift và nhấn chuột vào nốt tại đầu hay đuôi của lối đó, rồi tiếp tục vẽ lối mới bình thường.</p>
+help.editAdv=Sửa (Nâng cao)
+help.editingFeaturesAdv=Sửa đổi Đối tượng (Nâng cao)
+help.editingFeaturesAdvText=<p>Để <b>cắt đôi một lối</b>, chọn một điểm để cắt và nhấn chuột vào công cụ “Cắt đôi” (đôi kéo) hoặc bấm “X” trên bàn phím. (Gợi ý: Để cắt một lối giữa hai nốt, thêm một nốt mới trước tiên.)</p>\n<p>Để <b>nối liền hai lối</b>, vẽ các lối bình thường đến khi cần nối liền. Khi bạn chuyển con trỏ lên trên một lối khác, các nốt của lối đó sẽ được tô màu xanh. Nhấn chuột vào một trong những nốt xanh hoặc vào nơi khác nào đó trên lối để nối liền.</p>\n<p>Để <b>gỡ một lối khỏi nơi nối liền</b>, chọn nốt trên lối mà bạn muốn gỡ ra. Bấm “-” trên bàn phím để dời nốt khỏi lối.</p>\n<p>Để <b>đảo nguợc một lối</b>, bấm nút “Đảo nguợc” ở phía duới bên phải. Hướng của lối chỉ có ảnh hưởng đến các lối có thẻ “oneway” (một chiều) như các đường một chiều, cũng như các bờ biển, hòn đảo, v.v.</p>\n<p>Để <b>vẽ các lối song song</b>, chọn lối gốc và bấm nút “Vẽ Lối Song song” ở phía duới bên phải, hoặc bấm “P” trên bàn phím.</p>\n<p>Để <b>vẽ lối mới chạy theo lối khác</b>, bắt đầu vẽ lối mới, nhấn chuột vào ít nhất hai nốt trên lối khác, rồi cứ bấm “F” trên bàn phím để tự động chạy theo lối khác.</p>\n<p><i>Đọc <a href="http://wiki.openstreetmap.org/wiki/Potlatch2/Primer?uselang=vi" target="_blank">Hướng dẫn Potlatch2</a> trên OpenStreetMap Wiki để biết những cách sửa đổi nâng cao hơn.</i></p>
+help.tag=Thẻ
+help.taggingFeatures=Gắn thẻ vào Đối tượng
+help.taggingFeaturesText=<p>Trong Potlatch 2, bạn có thể sử dụng các trình đơn, hộp văn bản, và hình tượng để gắn thẻ dễ dàng.</p>\n<p><b>Gắn thẻ vào một địa điểm, nốt, hay lối</b></p>\n<p>Chọn nốt hay điểm để sửa đổi và chọn thẻ phù hợp từ thanh bên ở bên trái. Sau khi gắn thẻ vào đối tượng, bạn có thể tùy biến một số chi tiết cơ bản, thí dụ như “Tên”, “Tốc độ Tối đa”, và “Chiều rộng”, tùy thẻ được chọn. Điền biểu mẫu này càng đầy đủ càng tốt.</p>\n<p>Những người dùng nâng cao có thể cần đặt một số thẻ và chi tiết ít phổ biến hơn. Trong trường hợp này, bấm thẻ “Nâng cao” ở phía duới của thanh bên và sửa đổi và bổ sung các thẻ khác.</p>\n<p>OpenStreetMap Wiki cung cấp một <a href="http://wiki.openstreetmap.org/wiki/Vi:Map_Features?uselang=vi" target="_blank">danh sách thẻ và giá trị thẻ đầy đủ</a>. Xin vui lòng tra cứu tài liệu OSM này khi nào không chắc chắn về các thẻ để sử dụng.</p>
+help.shortcuts=Phím tắt
+help.keyboardShortcuts=Phím tắt
index 0b16027668f505db41ef92b075f2318a2b43fc2e..8f15315e62f6e400ca280bcd45ba706f9699f12b 100644 (file)
@@ -1,48 +1,44 @@
-# vi resources file
-
-main.undo = Hoàn tác
-main.redo = Làm lại
-main.background = Lớp Nền
-main.map_style = Kiểu Bản đồ
-main.gpsButton = Dữ liệu GPS
-main.gps_data = Dữ liệu GPS
-main.my_tracks = Tuyến dường của Tôi
-main.clear_gps = Xóa
-main.help = Trợ giúp
-main.options = Tùy chọn
-main.save = Lưu
-
-tag_viewer.dndprompt = Để thêm dịa điểm mới, kéo nó vào bản đồ
-
-toolbox.delete_node = Xóa Nốt (Delete)
-toolbox.delete_area = Xóa Vùng (Shift+Delete)
-toolbox.delete_way = Xóa Lối (Shift+Delete)
-toolbox.delete_item = Xóa Đối tượng
-toolbox.reverse_direction = Đảo nguợc (V)
-toolbox.split_way = Cắt đôi Lối (X)
-toolbox.merge_ways = Hợp nhất các Lối
-toolbox.straighten_way = Làm Thẳng
-toolbox.make_circular = Làm Tròn
-toolbox.make_right_angled = Làm Vuông góc (Q)
-toolbox.create_parrallel_way = Vẽ Lối Song song (P)
+# Messages for Vietnamese (Tiếng Việt)
+# Exported from translatewiki.net
+# Author: Minh Nguyen
 
+main.undo=Hoàn tác
+main.redo=Làm lại
+main.background=Lớp Nền
+main.map_style=Kiểu Bản đồ
+main.gpsButton=Dữ liệu GPS
+main.gps_data=Dữ liệu GPS
+main.my_tracks=Tuyến dường của Tôi
+main.clear_gps=Xóa
+main.help=Trợ giúp
+main.options=Tùy chọn
+main.save=Lưu
+tag_viewer.dndprompt=Để thêm dịa điểm mới, kéo nó vào bản đồ
+toolbox.delete_node=Xóa Nốt (Delete)
+toolbox.delete_area=Xóa Vùng (Shift+Delete)
+toolbox.delete_way=Xóa Lối (Shift+Delete)
+toolbox.delete_item=Xóa Đối tượng
+toolbox.reverse_direction=Đảo nguợc (V)
+toolbox.split_way=Cắt đôi Lối (X)
+toolbox.merge_ways=Hợp nhất các Lối
+toolbox.straighten_way=Làm Thẳng
+toolbox.make_circular=Làm Tròn
+toolbox.make_right_angled=Làm Vuông góc (Q)
+toolbox.create_parrallel_way=Vẽ Lối Song song (P)
 oauth.gotLinkBox=Nhấn chuột vào liên kết ở duới để mở một trang Web xin bạn cho phép ứng dụng này truy cập vào tài khoản của bạn.
 oauth.authorized=Sau khi bạn cho phép ứng dụng này, bấm nút “Thử Truy cập” ở duới.
 oauth.deniedLabel=<b>Ứng dụng không có phép truy cập tài khoản của bạn. Xin vui lòng kiểm tra lại và thử lần nữa.</b>
 oauth.rememberMe=Nhớ thông tin đăng nhập của tôi
-oauth.permFail=<p>Máy chủ không thể xác nhận thông tin đăng nhập của ứng dụng này.</p><p> <b>Không thể truy cập tài khoản của OAuth.</b> </p><p> Xin vui lòng liên lạc với chủ ứng dụng để biết thêm chi tiết.</p>
+oauth.permFail=<p>Máy chủ không thể xác nhận thông tin đăng nhập của ứng dụng này.</p>\n<p> <b>Không thể truy cập tài khoản của OAuth.</b> </p>\n<p> Xin vui lòng liên lạc với chủ ứng dụng để biết thêm chi tiết.</p>
 oauth.tempFail=Xuất hiện trục trặc khi kết nối với máy chủ để kiểm tra thông tin đăng nhập. Đây có thể là một vấn đề tạm thời; xin thử lại sau.
 oauth.tryAccessButton=Thử Truy cập
 oauth.cancelButton=Hủy bỏ
-
 save.editDescription=Xin vui lòng miêu tả các sửa đổi của bạn, để cho những nguời dùng khác hiểu biết những thay đổi trên bản đồ.
-
 styleSelector.editButton=Sửa đổi…
 backgroundSelector.dim=Làm mờ
 backgroundSelector.sharpen=Làm rõ
 backgroundSelector.editButton=Sửa đổi…
-backgroundSelector.vectorButton=Tập tin Vectơ...
-
+backgroundSelector.vectorButton=Tập tin Vectơ…
 options.tbcheck=Hiện hộp công cụ
 options.cursorcheck=Hiện con trỏ đặc biệt
 options.ok=OK
diff --git a/l10n/locale/zh_CN/help_dialog.properties b/l10n/locale/zh_CN/help_dialog.properties
new file mode 100644 (file)
index 0000000..7fb76a4
--- /dev/null
@@ -0,0 +1,21 @@
+# Messages for Simplified Chinese (‪中文(简体)‬)
+# Exported from translatewiki.net
+# Author: Mmyangfl
+
+help.gettingStarted=入门
+help.welcome=欢迎
+help.activeMembers=<p><b>+ 活跃的 OpenStreetMap 成员</b>,在编辑之前请先登录到 OSM。</p>
+help.controls=控件
+help.interfaceControls=界面控件
+help.gps=GPS
+help.createOsmMap=<p>使用他人的 GPS 轨迹作为背景,以创建 OSM 地图数据</p>
+help.myGps=我的 GPS
+help.undoRedo=撤消/重做
+help.madeMistake=<p>错了吗?只需单击撤消和/或重做,就可更正您的编辑。</p>
+help.help=帮助
+help.save=保存
+help.editBeg=编辑(基础)
+help.editAdv=编辑(高级)
+help.tag=标签
+help.shortcuts=快捷键
+help.keyboardShortcuts=键盘快捷键
index 2a5fa1cebd7d369a6a2f03c44f8b14fa6c9e5c64..c96738c0f9a0e37b31cbc97184ba345c61401bb6 100644 (file)
@@ -7,7 +7,7 @@
   <!-- Support for Locale ResourceBundle changes -->
   <mx:Script>
     <![CDATA[
-      import org.babelfx.commands.ExternalLocaleCommand;
+      import net.systemeD.potlatch2.CustomLocaleCommand;
       import org.babelfx.events.LocaleEvent;
       import mx.resources.ResourceManager;
       import mx.resources.IResourceManager;
@@ -22,7 +22,7 @@
       import net.systemeD.potlatch2.save.OAuthPanel;
       import net.systemeD.potlatch2.save.SaveDialog;
 
-      import net.systemeD.potlatch2.options.OptionsDialog;
+      import net.systemeD.potlatch2.dialogs.OptionsDialog;
 
       private function onLocaleChanged(event:Event):void {
           var rMngr : IResourceManager = ResourceManager.getInstance();
@@ -32,6 +32,9 @@
                                   { label : rMngr.getString('p2_main','main.my_tracks') },
                                   { label : rMngr.getString('p2_main','main.clear_gps') }
                                 ];
+          // ** FIXME: If the locale is en_US, then the above rMngr.getString calls return null.
+          //           Conversely, with any locale, the actual Label of gpsButton is never
+          //           updated and keeps showing 'GPS'.
 
           // Iterate all view instances and inject new dataProvider
           for each (var inst:potlatch2 in sri.targetInstances) {
@@ -43,9 +46,9 @@
   </mx:Script>
 
   <commandFactory>
-    <factory:ClassFactory generator="{ExternalLocaleCommand}">
+    <factory:ClassFactory generator="{CustomLocaleCommand}">
       <factory:properties>
-        <mx:Object externalPath="locales/\{0\}.swf"/>
+        <mx:Object defaultExternalPath="locales/\{0\}.swf"/>
       </factory:properties>
     </factory:ClassFactory>
   </commandFactory>
diff --git a/lib/YahooMap-0.9.4.swc b/lib/YahooMap-0.9.4.swc
deleted file mode 100644 (file)
index ccecc5f..0000000
Binary files a/lib/YahooMap-0.9.4.swc and /dev/null differ
diff --git a/net/systemeD/controls/Spinner.as b/net/systemeD/controls/Spinner.as
new file mode 100644 (file)
index 0000000..038aefa
--- /dev/null
@@ -0,0 +1,68 @@
+package net.systemeD.controls {
+       import flash.events.TimerEvent;
+       import flash.events.Event;
+       import flash.display.Sprite;
+       import flash.display.Shape;
+       import flash.utils.Timer;
+       import flash.filters.GlowFilter;
+       
+       // Adapted from http://www.stevensacks.net/2008/10/01/as3-apple-style-preloader/
+
+       public class Spinner extends Sprite {
+               private var timer:Timer;
+               private var slices:int;
+               private var radius:int;
+
+               public function Spinner(slices:int = 12, radius:int = 6) {
+                       super();
+                       this.slices = slices;
+                       this.radius = radius;
+                       draw();
+
+                       var filter:GlowFilter=new GlowFilter(0xFFFFFF,1,4,4,6);
+                       this.filters = [filter];
+               }
+
+               public function start():void {
+                       visible=true;
+                       if (timer) return;
+                       timer = new Timer(65);
+                       timer.addEventListener(TimerEvent.TIMER, onTimer, false, 0, true);
+                       timer.start();
+               }
+
+               public function stop():void {
+                       visible=false;
+                       if (!timer) return;
+                       timer.reset();
+                       timer.removeEventListener(TimerEvent.TIMER, onTimer);
+                       timer = null;
+               }
+
+               private function onTimer(event:TimerEvent):void {
+                       rotation = (rotation + (360 / slices)) % 360;
+               }
+               
+               private function draw():void {
+                       var i:int = slices;
+                       var degrees:int = 360 / slices;
+                       while (i--) {
+                               var slice:Shape = getSlice();
+                               slice.alpha = Math.max(0.2, 1 - (0.1 * i));
+                               var radianAngle:Number = (degrees * i) * Math.PI / 180;
+                               slice.rotation = -degrees * i;
+                               slice.x = Math.sin(radianAngle) * radius;
+                               slice.y = Math.cos(radianAngle) * radius;
+                               addChild(slice);
+                       }
+               }
+
+               private function getSlice():Shape {
+                       var slice:Shape = new Shape();
+                       slice.graphics.beginFill(0x666666);
+                       slice.graphics.drawRoundRect(-1, 0, 2, 6, 12, 12);
+                       slice.graphics.endFill();
+                       return slice;
+               }
+       }
+}
diff --git a/net/systemeD/halcyon/DebugURLRequest.as b/net/systemeD/halcyon/DebugURLRequest.as
deleted file mode 100644 (file)
index 8aa038b..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-package net.systemeD.halcyon {
-
-       /*
-               === DebugURLRequest ===
-
-               If nocache has been set to 'true' via FlashVars, this will make the URLRequest using 
-               POST rather than GET - thereby preventing FP from caching it
-               (see http://www.ultrashock.com/forums/actionscript/force-reload-files-only-using-as3-123408.html).
-               
-               Sadly we can't just subclass URLRequest, which is defined as final. So you need to create your 
-               new DebugURLRequest, then refer to its .request property.
-               
-               We use an evil Global because we don't know where loaderInfo.parameters will be.
-
-       */
-
-       import flash.net.URLRequest;
-       import flash.net.URLRequestMethod;
-       import flash.system.Capabilities;
-       import net.systemeD.halcyon.Globals;
-
-       public class DebugURLRequest {
-
-               public var request:URLRequest;
-
-               public function DebugURLRequest(url:String=null) {
-                       request=new URLRequest(url);
-                       if (Globals.vars.hasOwnProperty('nocache') && Globals.vars.nocache) {
-                               request.method=URLRequestMethod.POST;
-                               request.data=true;
-                       }
-               }
-
-       }
-
-}
diff --git a/net/systemeD/halcyon/FileBank.as b/net/systemeD/halcyon/FileBank.as
new file mode 100755 (executable)
index 0000000..c79e2ba
--- /dev/null
@@ -0,0 +1,261 @@
+package net.systemeD.halcyon {
+    import flash.events.*;
+       import flash.display.*;
+       import flash.net.*;
+       import flash.utils.ByteArray;
+       import nochump.util.zip.*;
+
+       /*
+               FileBank stores and retrieves bitmap images and other files.
+               Images are internally stored as Loader. Other files are stored as strings.
+
+               See blog.yoz.sk/2009/10/bitmap-bitmapdata-bytearray/ for a really useful conversion guide!
+       */
+
+    public class FileBank extends EventDispatcher{
+               private var files:Object={};
+               private var filesRequested:uint=0;
+               private var filesReceived:uint=0;
+               private var zipsRequested:uint=0;
+               private var zipsReceived:uint=0;
+        private var zipCallbacks:Array=[];
+               
+               public static const FILES_LOADED:String="filesLoaded";
+               
+               private static const GLOBAL_INSTANCE:FileBank = new FileBank();
+               public static function getInstance():FileBank { return GLOBAL_INSTANCE; }
+
+               public function hasFile(name:String):Boolean {
+                       if (files[name]) return true;
+                       return false;
+               }
+
+        public function fileLoaded(name:String, callback:Function):Boolean {
+            var loaded:Boolean = false;
+            if (files[name]) {
+                if (files[name].info.callbacks) {
+                    files[name].info.callbacks.push(callback);
+                } else {
+                    loaded = true;
+                }
+            }
+            return loaded;
+        }
+
+        /* ==========================================================================================
+                  Add an individual file to bank (not from a .zip file)
+                  Used when we want to load a file for use later on (e.g. an image referenced in a stylesheet)
+                  ========================================================================================== */
+
+               public function addFromFile(filename:String, callback:Function = null):void {
+            if (files[filename]) {
+                if (callback != null) {
+                    if (files[filename].info.callbacks) {
+                        files[filename].info.callbacks.push(callback);
+                    } else {
+                        callback(this, filename);
+                    }
+                }
+            } else if (zipsRequested > zipsReceived) {
+                zipCallbacks.push(function ():void {
+                    addFromFile(filename, callback);
+                });
+            } else {
+                var request:URLRequest = new URLRequest(filename);
+                var loader:Object;
+                var loaderInfo:EventDispatcher;
+                
+                if (isImageType(filename)) {
+                    loader = new ExtendedLoader();
+                    loaderInfo = loader.contentLoaderInfo;
+                    loaderInfo.addEventListener(Event.COMPLETE, loadedImage);
+                } else {
+                    loader = loaderInfo = new ExtendedURLLoader();
+                    loaderInfo.addEventListener(Event.COMPLETE, loadedFile);
+                }
+
+                loader.info.filename = filename;
+                loader.info.callbacks = new Array();
+                
+                if (callback != null) {
+                    loader.info.callbacks.push(callback);
+                }
+
+                files[filename] = loader;
+
+                loaderInfo.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
+                loaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
+                loaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
+
+                filesRequested++;
+
+                loader.load(request);
+            }
+               }
+
+        public function onFilesLoaded(callback:Function):void {
+            if (filesRequested > filesReceived) {
+                addEventListener(FileBank.FILES_LOADED, function(e:Event):void {
+                    callback();
+                });
+            } else {
+                callback();
+            }
+        }
+
+        private function loadedImage(event:Event):void {
+                       fileLoadComplete(event.target.loader.info);
+        }
+        private function loadedFile(event:Event):void {
+                       fileLoadComplete(event.target.info);
+        }
+        private function fileLoadComplete(info:Object):void {
+            var callbacks:Array = info.callbacks;
+            info.callbacks = null;
+            while (callbacks.length > 0) {
+                var callback:Function = callbacks.shift();
+                callback(this, info.filename);
+            }
+
+            fileReceived();
+               }
+               private function httpStatusHandler(event:HTTPStatusEvent):void { }
+               private function securityErrorHandler(event:SecurityErrorEvent):void { 
+                       trace("securityErrorEvent: "+event.target.url);
+                       fileReceived();
+               }
+               private function ioErrorHandler(event:IOErrorEvent):void { 
+                       trace("ioErrorEvent: "+event.target.url); 
+                       fileReceived();
+               }
+               private function fileReceived():void {
+                       filesReceived++;
+                       if (filesReceived==filesRequested) { dispatchEvent(new Event(FILES_LOADED)); }
+               }
+
+               /* ==========================================================================================
+                  Add files to bank from .zip file
+                  ========================================================================================== */
+               
+               public function addFromZip(filename:String, prefix:String=""):void {
+                       var loader:URLLoader = new URLLoader();
+                       loader.dataFormat="binary";
+                       loader.addEventListener(Event.COMPLETE, function(e:Event):void { zipReady(e,prefix); } );
+            loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, zipSecurityErrorHandler);
+            loader.addEventListener(IOErrorEvent.IO_ERROR, zipIoErrorHandler);
+            zipsRequested++;
+            loader.load(new URLRequest(filename));
+               }
+               private function zipReady(event:Event, prefix:String):void {
+                       var zip:ZipFile = new ZipFile(event.target.data);
+                       for (var i:uint=0; i<zip.entries.length; i++) {
+                               var fileref:ZipEntry = zip.entries[i];
+                               var data:ByteArray = zip.getInput(fileref);
+                               if (isImageType(fileref.name)) {
+                                       // Store as an image
+                                       var loader:ExtendedLoader=new ExtendedLoader();
+                                       files[prefix+fileref.name]=loader;
+                    loader.info.filename = prefix+fileref.name;
+                                       loader.loadBytes(data);
+                               } else {
+                                       // Store as a document
+                                       var urlloader:ExtendedURLLoader=new ExtendedURLLoader();
+                                       files[prefix+fileref.name]=urlloader;
+                    urlloader.info.filename = prefix+fileref.name;
+                    urlloader.data = data.toString();
+                               }
+                       }
+            zipReceived();
+               }
+               private function zipSecurityErrorHandler(event:SecurityErrorEvent):void { 
+                       trace("securityErrorEvent: "+event.target.url);
+                       zipReceived();
+               }
+               private function zipIoErrorHandler(event:IOErrorEvent):void { 
+                       trace("ioErrorEvent: "+event.target.url); 
+                       zipReceived();
+               }
+               private function zipReceived():void {
+                       zipsReceived++;
+                       if (zipsReceived == zipsRequested) {
+                while (zipCallbacks.length > 0) {
+                    var callback:Function = zipCallbacks.shift();
+                    callback();
+                }
+            }
+               }
+               private function isImageType(filename:String):Boolean {
+                       if (filename.match(/\.jpe?g$/i) ||
+                               filename.match(/\.png$/i) ||
+                               filename.match(/\.gif$/i) ||
+                               filename.match(/\.swf$/i)) { return true; }
+                       return false;
+               }
+
+               /* ==========================================================================================
+                  Get files
+                  get(filename)
+                  getAsDisplayObject(filename)
+                  getAsBitmapData(filename)
+                  getAsByteArray(filename)
+                  ========================================================================================== */
+
+               public function get(name:String):String {
+                       return files[name];
+               }
+
+               public function getAsDisplayObject(name:String):DisplayObject {
+                       /* If the image hasn't loaded yet, then add an EventListener for when it does. */
+                       if (getWidth(name)==0) {
+                               var loader:Loader = new Loader();
+                               files[name].contentLoaderInfo.addEventListener(Event.COMPLETE,
+                                       function(e:Event):void { loaderReady(e, loader) });
+                               return loader;
+                       }
+                       /* Otherwise, create a new Bitmap, because just returning the raw Loader
+                          (i.e. files[name]) would only allow it to be added to one parent. (The other 
+                          way to do this would be by copying the bytes as loaderReady does.). */
+                       return new Bitmap(getAsBitmapData(name));
+               }
+               
+               public function getOriginalDisplayObject(name:String):DisplayObject {
+                       /* But if we're going to clone it later, this'll work fine. */
+                       return files[name];
+               }
+
+               private function loaderReady(event:Event, loader:Loader):void {
+                       /* The file has loaded, so we can copy the data from there into our new Loader */
+                       var info:LoaderInfo = event.target as LoaderInfo;
+                       loader.loadBytes(info.bytes);
+               }
+
+               public function getAsBitmapData(name:String):BitmapData {
+                       var bitmapData:BitmapData=new BitmapData(getWidth(name), getHeight(name), true, 0xFFFFFF);
+                       bitmapData.draw(files[name]);
+                       return bitmapData;
+               }
+               
+               public function getAsByteArray(name:String):ByteArray {
+                       return files[name].contentLoaderInfo.bytes;
+               }
+               
+               public function getAsString(name:String):String {
+                       return files[name].data;
+               }
+        
+               /* ==========================================================================================
+                  Get file information
+                  ========================================================================================== */
+
+               public function getWidth(name:String):int { 
+                       try { return files[name].contentLoaderInfo.width; }
+                       catch (error:Error) { } return 0;
+               }
+
+               public function getHeight(name:String):int { 
+                       try { return files[name].contentLoaderInfo.height; }
+                       catch (error:Error) { } return 0;
+               }
+
+       }
+}
diff --git a/net/systemeD/halcyon/ImageBank.as b/net/systemeD/halcyon/ImageBank.as
deleted file mode 100755 (executable)
index eca8547..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-package net.systemeD.halcyon {
-    import flash.events.*;
-       import flash.display.*;
-       import flash.net.*;
-       import flash.utils.ByteArray;
-       import nochump.util.zip.*;
-
-       /*
-               ImageBank stores and retrieves bitmap images.
-               All images are internally stored as Loader.
-
-               See blog.yoz.sk/2009/10/bitmap-bitmapdata-bytearray/ for a really useful conversion guide!
-       */
-
-    public class ImageBank extends EventDispatcher{
-               private var images:Object={};
-               private var imagesRequested:uint=0;
-               private var imagesReceived:uint=0;
-               
-               public static const IMAGES_LOADED:String="imagesLoaded";
-               public static const ZIP_LOADED:String="zipLoaded";
-               
-               private static const GLOBAL_INSTANCE:ImageBank = new ImageBank();
-               public static function getInstance():ImageBank { return GLOBAL_INSTANCE; }
-
-               public function hasImage(name:String):Boolean {
-                       if (images[name]) return true;
-                       return false;
-               }
-
-               /* ==========================================================================================
-                  Populate with images 
-                  ========================================================================================== */
-
-               public function loadImage(filename:String):void {
-                       if (images[filename]) return;
-                       imagesRequested++;
-
-                       var loader:Loader=new Loader();
-                       images[filename]=loader;
-                       var request:URLRequest=new URLRequest(filename);
-                       loader.contentLoaderInfo.addEventListener(Event.COMPLETE,                                               loadedImage);
-                       loader.contentLoaderInfo.addEventListener(HTTPStatusEvent.HTTP_STATUS,                  httpStatusHandler);
-                       loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR,    securityErrorHandler);
-                       loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,                                ioErrorHandler);
-                       loader.load(request);
-               }
-
-               private function loadedImage(event:Event):void {
-                       imageReceived();
-               }
-               private function httpStatusHandler(event:HTTPStatusEvent):void { }
-               private function securityErrorHandler(event:SecurityErrorEvent):void { 
-                       trace("securityErrorEvent: "+event.target.url);
-                       imageReceived();
-               }
-               private function ioErrorHandler(event:IOErrorEvent):void { 
-                       trace("ioErrorEvent: "+event.target.url); 
-                       imageReceived();
-               }
-               private function imageReceived():void {
-                       imagesReceived++;
-                       if (imagesReceived==imagesRequested) { dispatchEvent(new Event(IMAGES_LOADED)); }
-               }
-
-               /* ==========================================================================================
-                  Load from .zip file
-                  ========================================================================================== */
-               
-               public function loadFromZip(filename:String, prefix:String=""):void {
-                       var loader:URLLoader = new URLLoader();
-                       loader.dataFormat="binary";
-                       loader.addEventListener(Event.COMPLETE, function(e:Event):void { zipReady(e,prefix); } );
-                       loader.load(new URLRequest(filename));
-               }
-               private function zipReady(event:Event, prefix:String):void {
-                       var zip:ZipFile = new ZipFile(event.target.data);
-                       for (var i:uint=0; i<zip.entries.length; i++) {
-                               var fileref:ZipEntry = zip.entries[i];
-                               var data:ByteArray = zip.getInput(fileref);
-                               var loader:Loader=new Loader();
-                               images[prefix+fileref.name]=loader;
-                               loader.loadBytes(data);
-                       }
-                       dispatchEvent(new Event(ZIP_LOADED));
-               }
-
-
-               /* ==========================================================================================
-                  Get images 
-                  getAsDisplayObject(filename)
-                  getAsBitmapData(filename)
-                  getAsByteArray(filename)
-                  ========================================================================================== */
-
-               public function getAsDisplayObject(name:String):DisplayObject {
-                       /* If the image hasn't loaded yet, then add an EventListener for when it does. */
-                       if (getWidth(name)==0) {
-                               var loader:Loader = new Loader();
-                               images[name].contentLoaderInfo.addEventListener(Event.COMPLETE,
-                                       function(e:Event):void { loaderReady(e, loader) });
-                               return loader;
-                       }
-                       /* Otherwise, create a new Bitmap, because just returning the raw Loader
-                          (i.e. images[name]) would only allow it to be added to one parent. (The other 
-                          way to do this would be by copying the bytes as loaderReady does.). */
-                       return new Bitmap(getAsBitmapData(name));
-               }
-               
-               public function getOriginalDisplayObject(name:String):DisplayObject {
-                       /* But if we're going to clone it later, this'll work fine. */
-                       return images[name];
-               }
-
-               private function loaderReady(event:Event, loader:Loader):void {
-                       /* The file has loaded, so we can copy the data from there into our new Loader */
-                       var info:LoaderInfo = event.target as LoaderInfo;
-                       loader.loadBytes(info.bytes);
-               }
-
-               public function getAsBitmapData(name:String):BitmapData {
-                       var bitmapData:BitmapData=new BitmapData(getWidth(name), getHeight(name), true, 0xFFFFFF);
-                       bitmapData.draw(images[name]);
-                       return bitmapData;
-               }
-               
-               public function getAsByteArray(name:String):ByteArray {
-                       return images[name].contentLoaderInfo.bytes;
-               }
-
-               /* ==========================================================================================
-                  Get file information
-                  ========================================================================================== */
-
-               public function getWidth(name:String):int { 
-                       try { return images[name].contentLoaderInfo.width; }
-                       catch (error:Error) { } return 0;
-               }
-
-               public function getHeight(name:String):int { 
-                       try { return images[name].contentLoaderInfo.height; }
-                       catch (error:Error) { } return 0;
-               }
-
-       }
-}
\ No newline at end of file
index 81a2419680ea2a22e67de2b584b030dd67d9e79c..294f9d946d966c159bd1a553bed4fb1f92511444 100644 (file)
@@ -3,14 +3,19 @@ package net.systemeD.halcyon {
        import flash.events.*;
     import flash.external.ExternalInterface;
 
-       /* JSController provides an interface for Halcyon to call the enclosing page, via JavaScript
-         */
+       /**
+       * JSController provides an interface for Halcyon to call the enclosing page, via JavaScript.
+       */
 
     public class JSController implements MapController {
 
         private var map:Map;
-               private var jsresponder:String;                                 // JavaScript function called when user clicks
+               private var jsresponder:String;
 
+        /**
+        * @param map
+        * @param jsresponder JavaScript function called when user clicks
+        */
         public function JSController(map:Map, jsresponder:String) {
             this.map = map;
             this.jsresponder = jsresponder;
index 3d3e9497f5287ac4f474483e2903cd362ebe78b4..833526ea19902a6f106cfb0fe6dcfb1f85cccca9 100644 (file)
@@ -430,6 +430,7 @@ package net.systemeD.halcyon {
 
                private function everyFrame(event:Event):void {
                        if (tileset) { tileset.serviceQueue(); }
+                       if (stage.focus && !stage.contains(stage.focus)) { stage.focus=stage; }
                }
 
                // ------------------------------------------------------------------------------------------
@@ -448,21 +449,5 @@ package net.systemeD.halcyon {
                        }
                }
 
-               // ------------------------------------------------------------------------------------------
-               // Debugging
-               
-               public function clearDebug():void {
-                       if (!Globals.vars.hasOwnProperty('debug')) return;
-                       Globals.vars.debug.text='';
-               }
-                       
-               public function addDebug(text:String):void {
-                       trace(text);
-                       if (!Globals.vars.hasOwnProperty('debug')) return;
-                       if (!Globals.vars.debug.visible) return;
-                       Globals.vars.debug.appendText(text+"\n");
-                       Globals.vars.debug.scrollV=Globals.vars.debug.maxScrollV;
-               }
-
        }
 }
index 3dfeeba14dc60db333110927f5334404a23b8196..907d6cf5a80c26ed1885872a57fba7a4c43f5613 100644 (file)
@@ -17,7 +17,7 @@ package net.systemeD.halcyon {
                public static const NUDGE_BACKGROUND:String = "nudge_background";
         /** Map has been created and is ready, although data is not yet downloaded. */
         public static const INITIALISED:String = "initialized";
-               /** Backrgound imagery has changed to one with attribution that must not be obscured. */
+               /** Background imagery has changed to one with attribution that must not be obscured. */
                public static const BUMP:String = "bump";
                public static const MOUSE_MOVE:String="mouse_move";
                public static const ERROR:String = "error";                             // ** FIXME - this should be a dedicated ErrorEvent class
index 14801bc19265cb9ebe0be83a8ee1cf5fd7d34632..512d3398b36657e5aa4fdf06e31c64949cd467ac 100644 (file)
@@ -10,7 +10,7 @@ package net.systemeD.halcyon {
     import flash.geom.Point;
     import net.systemeD.halcyon.styleparser.*;
     import net.systemeD.halcyon.connection.*;
-    import net.systemeD.halcyon.ImageBank;
+    import net.systemeD.halcyon.FileBank;
 
     public class MarkerUI extends EntityUI {
 
@@ -100,9 +100,9 @@ package net.systemeD.halcyon {
                             icon.graphics.drawCircle(w,w,w);
                             if (s.interactive) { maxwidth=Math.max(w,maxwidth); }
 
-                                               } else if (ImageBank.getInstance().hasImage(s.icon_image)) {
+                                               } else if (FileBank.getInstance().hasFile(s.icon_image)) {
                                                        // load icon from library
-                                                       icon.addChild(ImageBank.getInstance().getAsDisplayObject(s.icon_image));
+                                                       icon.addChild(FileBank.getInstance().getAsDisplayObject(s.icon_image));
 //                                                     addHitSprite(icon.width);                       // ** check this - we're doing it below too
 //                                                     loaded=true; updatePosition();          // ** check this
                                                        if (s.interactive) { maxwidth=Math.max(icon.width,maxwidth); }
index 51e9ec0f0e063df1763263803ca6ba4508c07ce5..94bc9f11d71285278c5ae057b208085ddae71741 100644 (file)
@@ -12,36 +12,29 @@ package net.systemeD.halcyon {
        *       onFeatureLoad can then access the XML via event.target.xml.
        */
 
+    import net.systemeD.halcyon.FileBank;
+
        import flash.events.*;
-    import flash.net.URLLoader;
-    import flash.net.URLRequest;
 
        public class NestedXMLLoader extends EventDispatcher {
                public var xml:XML = null;
-               private var url:String;
                private var count:int;
 
                public function NestedXMLLoader() {
                }
                
                public function load(url:String):void {
-                       this.url=url;
-                       var request:URLRequest=new URLRequest(url+"?d="+Math.random());
-                       var loader:URLLoader = new URLLoader();
-                       loader.addEventListener(Event.COMPLETE, fileLoaded);
-                       loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, fileError);
-                       loader.addEventListener(IOErrorEvent.IO_ERROR, fileError);
-                       loader.load(request);
+            FileBank.getInstance().addFromFile(url, fileLoaded);
                }
                
-               private function fileLoaded(event:Event):void {
-                       count=0;
-                       xml = new XML(URLLoader(event.target).data);
+               private function fileLoaded(fileBank:FileBank, filename:String):void {
+            count=1;
+                       xml = new XML(fileBank.getAsString(filename));
                        for each (var inc:XML in xml.descendants('include')) {
-                               replaceXML(inc);
                                count++;
+                               replaceXML(inc);
                        }
-                       if (count==0) { fireComplete(); }
+            decreaseCount();
                }
 
                private function replaceXML(inc:XML):void {
@@ -51,7 +44,7 @@ package net.systemeD.halcyon {
                                includeElement.parent().replace(findChildIndex(includeElement),event.target.xml);
                                decreaseCount();
                        });
-                       xmlLoader.load(inc.@file+"?d="+Math.random());
+                       xmlLoader.load(inc.@file);
                }
 
                private function findChildIndex(child:XML):int {
@@ -62,11 +55,6 @@ package net.systemeD.halcyon {
                        }
                        return -1;
                }
-
-               private function fileError(event:Event):void {
-                       // just fire a complete event so we don't get an error dialogue
-                       fireComplete();
-               }
                
                private function decreaseCount():void {
                        count--; if (count>0) return;
index 11bcc02fdd8a2daec449d3d49e43220927235333..c25ea3d1984335c16277ed7cfbb9597fe593d58e 100644 (file)
@@ -10,7 +10,7 @@ package net.systemeD.halcyon {
        import flash.geom.Point;
        import net.systemeD.halcyon.styleparser.*;
     import net.systemeD.halcyon.connection.*;
-    import net.systemeD.halcyon.ImageBank;
+    import net.systemeD.halcyon.FileBank;
        
        /** The graphical representation of a Node (including POIs and nodes that are part of Ways). */
        public class NodeUI extends EntityUI {
@@ -119,12 +119,12 @@ package net.systemeD.halcyon {
                                                } else if (s.icon_image=='circle') {
                                                        // draw circle
                                                        w=styleIcon(icon,subpart);
-                                                       icon.graphics.drawCircle(w,w,w);
+                                                       icon.graphics.drawCircle(w/2,w/2,w/2);
                                                        if (s.interactive) { maxwidth=Math.max(w,maxwidth); }
 
-                                               } else if (ImageBank.getInstance().hasImage(s.icon_image)) {
+                                               } else if (FileBank.getInstance().hasFile(s.icon_image)) {
                                                        // load icon from library
-                                                       icon.addChild(ImageBank.getInstance().getAsDisplayObject(s.icon_image));
+                                                       icon.addChild(FileBank.getInstance().getAsDisplayObject(s.icon_image));
 //                                                     addHitSprite(icon.width);                       // ** check this - we're doing it below too
                                                        loaded=true; updatePosition();          // ** check this
                                                        if (s.interactive) { maxwidth=Math.max(icon.width,maxwidth); }
diff --git a/net/systemeD/halcyon/Stylesheet.as b/net/systemeD/halcyon/Stylesheet.as
new file mode 100644 (file)
index 0000000..5a86c3f
--- /dev/null
@@ -0,0 +1,23 @@
+package net.systemeD.halcyon {
+
+    /**
+    * A Stylesheet is a simple object refering to the name and url of the stylesheet.
+    */
+    public class Stylesheet {
+
+        /** The user-visible name of the stylesheet */
+        public var name:String;
+
+        /** The (relative to potlatch2.swf) url of the stylesheet */
+        public var url:String;
+
+        /** Should this stylesheet be considered a "core style"? */
+        public var coreStyle:Boolean;
+
+        public function Stylesheet(name:String, url:String, coreStyle:Boolean = false) {
+            this.name = name;
+            this.url = url;
+            this.coreStyle = coreStyle;
+        }
+    }
+}
\ No newline at end of file
index a7e101dfc2850b4fecbdc7cc91ef85eabd9c9cd1..990f43bbe946681b92ee50e37e46bcd95101cd0a 100644 (file)
@@ -9,7 +9,7 @@ package net.systemeD.halcyon {
        
        import net.systemeD.halcyon.connection.*;
        import net.systemeD.halcyon.styleparser.*;
-    import net.systemeD.halcyon.ImageBank;
+    import net.systemeD.halcyon.FileBank;
 
        /** The graphical representation of a Way. */ 
        public class WayUI extends EntityUI {
@@ -296,7 +296,7 @@ package net.systemeD.halcyon {
                                                fill=new Shape(); addToLayer(fill,FILLSPRITE,s.sublayer);
                                                fill.graphics.moveTo(x0,y0);
                                                if (s.fill_image) {
-                                                       fill.graphics.beginBitmapFill(ImageBank.getInstance().getAsBitmapData(s.fill_image));
+                                                       fill.graphics.beginBitmapFill(FileBank.getInstance().getAsBitmapData(s.fill_image));
                                                } else {
                                                        s.applyFill(fill.graphics);
                                                }
@@ -615,7 +615,7 @@ package net.systemeD.halcyon {
                /* Interaction */
         // TODO: can this be sped up? Hit testing for long ways (that go off the screen) seems to be very slow. */
                public function hitTest(x:Number, y:Number):Way {
-                       if (hitzone.hitTestPoint(x,y,true)) { return entity as Way; }
+                       if (hitzone && hitzone.hitTestPoint(x,y,true)) { return entity as Way; }
                        return null;
                }
        }
index bb1a2bf1ec9d5e786d1ffbe13f0efaa72bb9ca86..de7d97a1b8b61b0a0f4e8c7794a1babd602c720f 100644 (file)
@@ -4,7 +4,7 @@ package net.systemeD.halcyon.connection {
                public static var entity_type:String = 'changeset';
 
         public function Changeset(connection:Connection, id:Number, tags:Object) {
-            super(connection, id, 0, tags, true, NaN, '');
+            super(connection, id, 0, tags, true, NaN, null, null);
         }
 
         public override function toString():String {
index 5c67ba55f0601db1f338595dc4f3577104180ed3..94a9b05cf5f64a142f0c956c53ed9ce49b8857de 100644 (file)
@@ -586,6 +586,7 @@ package net.systemeD.halcyon.connection {
         public function fetchUserTraces(refresh:Boolean=false):void {}
         public function fetchTrace(id:Number, callback:Function):void {}
         public function hasAccessToken():Boolean { return false; }
+        public function fetchHistory(entity:Entity, callback:Function):void {}
 
                public function loadEntity(entity:Entity):void {
                        loadEntityByID(entity.getType(),entity.id);
index e05462e56efd179bad74c4be4313c71738c703e0..c5c6178a2fdf6ed4e28b7476ce08755ee66133dc 100644 (file)
@@ -14,6 +14,7 @@ package net.systemeD.halcyon.connection {
         private var _version:uint;
         private var _uid:Number;
         private var _timestamp:String;
+        private var _user:String;
         private var tags:Object = {};
         private var modified:Boolean = false;
         private var _loaded:Boolean = true;
@@ -25,12 +26,13 @@ package net.systemeD.halcyon.connection {
         /** Have all its parents (ie, relations that contain this object as a member, ways that contain this node) been loaded into memory */
         public var parentsLoaded:Boolean = true;
 
-        public function Entity(connection:Connection, id:Number, version:uint, tags:Object, loaded:Boolean, uid:Number, timestamp:String) {
+        public function Entity(connection:Connection, id:Number, version:uint, tags:Object, loaded:Boolean, uid:Number, timestamp:String, user:String) {
                        this._connection = connection;
             this._id = id;
             this._version = version;
             this._uid = uid;
             this._timestamp = timestamp;
+            this._user = user
             if (connection.cssTransform) tags=connection.cssTransform.run(this,tags);
             this.tags = tags;
                        this._loaded = loaded;
@@ -67,14 +69,19 @@ package net.systemeD.halcyon.connection {
             return _timestamp;
         }
 
+        /** The username who last edited this entity (from OSM API). */
+        public function get user():String {
+            return _user;
+        }
+
                /** Connection to which this entity belongs. */
                public function get connection():Connection {
                        return _connection;
                }
 
         /** Set a bunch of properties in one hit. Implicitly makes entity not deleted. */
-        public function updateEntityProperties(version:uint, tags:Object, loaded:Boolean, parentsLoaded:Boolean, uid:Number, timestamp:String):void {
-            _version=version; this.tags=tags; _loaded=loaded; this.parentsLoaded=parentsLoaded; _uid = uid; _timestamp = timestamp;
+        public function updateEntityProperties(version:uint, tags:Object, loaded:Boolean, parentsLoaded:Boolean, uid:Number, timestamp:String, user:String):void {
+            _version=version; this.tags=tags; _loaded=loaded; this.parentsLoaded=parentsLoaded; _uid = uid; _timestamp = timestamp; _user = user;
             deleted=false;
         }
 
index ad7f6b85df90570867ac6788ba05e49b4fce1643..1d036ab77639eb3181adb7b79c129773c7b82696 100644 (file)
@@ -16,12 +16,13 @@ package net.systemeD.halcyon.connection {
                private var addedToRelationTimer:Timer;
                private var removedFromRelationTimer:Timer;
                private var delayedEvents:Array = [];
+               private static const DIFFERENT:String = "<different>";
 
         public function EntityCollection(entities:Array) {
                        var conn:Connection=entities[0].connection;
                        // ** FIXME: this really is a very nasty way of finding the connection
                        
-                       super(conn, -1, 0, {}, true, -1, "");
+                       super(conn, -1, 0, {}, true, NaN, null, null);
             _entities = entities;
                        
                        //To avoid firing on every contained entity, we wait some short time before firing the events
@@ -35,6 +36,14 @@ package net.systemeD.halcyon.connection {
                        }
         }
                
+               public function releaseListeners():void {
+                       for each(var entity:Entity in _entities) {
+                               entity.removeEventListener(Connection.TAG_CHANGED, onTagChanged);
+                               entity.removeEventListener(Connection.ADDED_TO_RELATION, onAddedToRelation);
+                               entity.removeEventListener(Connection.REMOVED_FROM_RELATION, onRemovedFromRelation);
+                       }
+               }
+               
                public override function get entities():Array {
                        return _entities;
                }
@@ -66,20 +75,19 @@ package net.systemeD.halcyon.connection {
                
                private function getMergedTags():Object {
                        //Builds an object with tags of all entities in this collection. If the value of a tag differs or is not set in all entities, value is marked
-                       var differentMarker:String = "<different>";
                        var mergedTags:Object = _entities[0].getTagsCopy();
                        for each(var entity:Entity in _entities) {
                                var entityTags:Object = entity.getTagsHash();
                                for(var key:String in entityTags) {
                                        var value:String = entityTags[key];
                                        if(mergedTags[key] == null || mergedTags[key] != value) {
-                                               mergedTags[key] = differentMarker;
+                                               mergedTags[key] = DIFFERENT;
                                        }
                                }
                                for(var mergedKey:String in mergedTags) {
                                        var mergedValue:String = mergedTags[mergedKey];
                                        if(entityTags[mergedKey] == null || entityTags[mergedKey] != mergedValue) {
-                                               mergedTags[mergedKey] = differentMarker;
+                                               mergedTags[mergedKey] = DIFFERENT;
                                        }
                                }
                        }
@@ -115,6 +123,7 @@ package net.systemeD.halcyon.connection {
                }
                
                public override function setTag(key:String, value:String, performAction:Function):void {
+            if (value==DIFFERENT) return;
                        var oldValue:String = getMergedTags()[key];     
                        var undoAction:CompositeUndoableAction = new CompositeUndoableAction("set_tag_entity_collection");
                        for each (var entity:Entity in _entities) {
@@ -126,7 +135,9 @@ package net.systemeD.halcyon.connection {
         public override function renameTag(oldKey:String, newKey:String, performAction:Function):void {
                        var undoAction:CompositeUndoableAction = new CompositeUndoableAction("rename_tag_entity_collection");
                        for each (var entity:Entity in _entities) {
-                               undoAction.push(new SetTagKeyAction(entity, oldKey, newKey));
+                               if (entity.getTag(oldKey)) {
+                                       undoAction.push(new SetTagKeyAction(entity, oldKey, newKey));
+                               }
                        }
             performAction(undoAction);
         }
@@ -171,7 +182,7 @@ package net.systemeD.halcyon.connection {
                                                if (!relations[rel.id]) {
                                                        relations[rel.id]= { role: role, relation: rel, distinctCount: 0};
                                                } else if (relations[rel.id].role!=role) {
-                                                       relations[rel.id].role="<different>";
+                                                       relations[rel.id].role=DIFFERENT;
                                                }
                                        }
                                        relations[rel.id].distinctCount++;
index e39c5c9fee1a352bde56f1afb7e26175ecdf04b3..c95d4839b7ccc9e8eea65c827798fb3e82f0d016 100644 (file)
@@ -11,7 +11,7 @@ package net.systemeD.halcyon.connection {
         private var _lon:Number;
 
         public function Marker(connection:Connection, id:Number, version:uint, tags:Object, loaded:Boolean, lat:Number, lon:Number) {
-            super(connection, id, version, tags, loaded, 0, null);
+            super(connection, id, version, tags, loaded, NaN, null, null);
             this._lat = lat;
             this._latproj = lat2latp(lat);
             this._lon = lon;
index eaf5db1febeb151439a2074bc67a6b50011c8d77..16c6a630dd4caca3d740e3c03e740ae9b444e3c1 100644 (file)
@@ -7,15 +7,15 @@ package net.systemeD.halcyon.connection {
         private var _latproj:Number;
         private var _lon:Number;
 
-        public function Node(connection:Connection, id:Number, version:uint, tags:Object, loaded:Boolean, lat:Number, lon:Number, uid:Number = NaN, timestamp:String = null) {
-            super(connection, id, version, tags, loaded, uid, timestamp);
+        public function Node(connection:Connection, id:Number, version:uint, tags:Object, loaded:Boolean, lat:Number, lon:Number, uid:Number = NaN, timestamp:String = null, user:String = null) {
+            super(connection, id, version, tags, loaded, uid, timestamp, user);
             this._lat = lat;
             this._latproj = lat2latp(lat);
             this._lon = lon;
         }
 
-               public function update(version:uint, tags:Object, loaded:Boolean, parentsLoaded:Boolean, lat:Number, lon:Number, uid:Number = NaN, timestamp:String = null):void {
-                       updateEntityProperties(version,tags,loaded,parentsLoaded,uid,timestamp); setLatLonImmediate(lat,lon);
+               public function update(version:uint, tags:Object, loaded:Boolean, parentsLoaded:Boolean, lat:Number, lon:Number, uid:Number = NaN, timestamp:String = null, user:String = null):void {
+                       updateEntityProperties(version,tags,loaded,parentsLoaded,uid,timestamp,user); setLatLonImmediate(lat,lon);
                }
 
         public function get lat():Number {
index a02dbe6bf1a677c54c8648be29ef884b1d910297..db6d435371d5e5b0c63a628ca3563f0275a6f5c2 100644 (file)
@@ -6,19 +6,19 @@ package net.systemeD.halcyon.connection {
         private var members:Array;
                public static var entity_type:String = 'relation';
 
-        public function Relation(connection:Connection, id:Number, version:uint, tags:Object, loaded:Boolean, members:Array, uid:Number = NaN, timestamp:String = null) {
-            super(connection, id, version, tags, loaded, uid, timestamp);
+        public function Relation(connection:Connection, id:Number, version:uint, tags:Object, loaded:Boolean, members:Array, uid:Number = NaN, timestamp:String = null, user:String = null) {
+            super(connection, id, version, tags, loaded, uid, timestamp, user);
             this.members = members;
                        for each (var member:RelationMember in members)
                            member.entity.addParent(this);
         }
 
-        public function update(version:uint, tags:Object, loaded:Boolean, parentsLoaded:Boolean, members:Array, uid:Number = NaN, timestamp:String = null):void {
+        public function update(version:uint, tags:Object, loaded:Boolean, parentsLoaded:Boolean, members:Array, uid:Number = NaN, timestamp:String = null, user:String = null):void {
                        var member:RelationMember;
                        for each (member in this.members)
                            member.entity.removeParent(this);
 
-                       updateEntityProperties(version,tags,loaded,parentsLoaded,uid,timestamp);
+                       updateEntityProperties(version,tags,loaded,parentsLoaded,uid,timestamp,user);
                        this.members=members;
                        for each (member in members)
                            member.entity.addParent(this);
@@ -100,11 +100,19 @@ package net.systemeD.halcyon.connection {
         }
 
                public function removeMember(entity:Entity, performAction:Function):void {
-                       performAction(new RemoveEntityFromRelationAction(this, entity, members));
+                       if (length>1) {
+                               performAction(new RemoveEntityFromRelationAction(this, entity, members));
+                       } else {
+                               performAction(new DeleteRelationAction(this, setDeletedState, members));
+                       }
                }
 
         public function removeMemberByIndex(index:uint, performAction:Function):void {
-            performAction(new RemoveMemberByIndexAction(this, members, index));
+                       if (length>1) {
+                               performAction(new RemoveMemberByIndexAction(this, members, index));
+                       } else {
+                               performAction(new DeleteRelationAction(this, setDeletedState, members));
+                       }
         }
 
                public override function remove(performAction:Function):void {
@@ -143,6 +151,11 @@ package net.systemeD.halcyon.connection {
                        return desc;
                }
                
+               public function getRelationType():String {
+                       var relTags:Object = getTagsHash();
+                       return relTags["type"] ? relTags["type"] : getType();
+               }
+               
                private function getSignificantName(entity:Entity):String {
                        if (!entity.loaded || (entity is Relation)) return '';
 
index 2f9289b5ab3c7b2d999572d112d5c82cdbfd6bed..26911edec7d9de6cc63bec22f7c8425c0cc51439 100644 (file)
@@ -19,7 +19,7 @@ package net.systemeD.halcyon.connection {
             var oldKey:String = _key;
             var realVal:String = entity.getTag(oldKey);
             _key = key;
-            if ( oldKey != null && realVal != null && realVal != "" )
+            if ( oldKey != null && realVal != null && realVal != "" && oldKey!=key )
                 entity.renameTag(oldKey, key, MainUndoStack.getGlobalStack().addAction);
         }
 
index 9cd917eb0076a93342e46866101fb77eb5764274..4e661270622c0fe05e110bc576e3f28eabbe5c6f 100644 (file)
@@ -22,7 +22,7 @@ package net.systemeD.halcyon.connection {
         public function get newValue():String { return _newValue; }
 
         public override function toString():String {
-            return super.toString() + "::'"+_oldKey+"' '"+_key +"' '"+_oldValue+"' '"+_newValue+"'";
+            return super.toString() + "::'"+_oldKey+"' '"+_key +"' '"+_oldValue+"' '"+_newValue+"' ["+item+"]";
         }
     }
 
index d3bc0f2d8cb8f6bd325679d2040a6b70b921973e..bf785de8952f0b559240d281f8841c17d1cd364d 100644 (file)
@@ -46,6 +46,7 @@ package net.systemeD.halcyon.connection {
             _id = Number(xml.@id);
             _filename = xml.@name;
             _description = xml.description;
+            tags = [];
             for each(var tag:XML in xml.tag) {
               tags.push(String(tag));
             }
index fcbd18133bcb30668357dad51c9360aaaed2c63f..11d321458371a7708bbfdcdee521c2c883c7b06d 100644 (file)
@@ -11,17 +11,17 @@ package net.systemeD.halcyon.connection {
                private var edge_b:Number;
                public static var entity_type:String = 'way';
 
-        public function Way(connection:Connection, id:Number, version:uint, tags:Object, loaded:Boolean, nodes:Array, uid:Number = NaN, timestamp:String = null) {
-            super(connection, id, version, tags, loaded, uid, timestamp);
+        public function Way(connection:Connection, id:Number, version:uint, tags:Object, loaded:Boolean, nodes:Array, uid:Number = NaN, timestamp:String = null, user:String = null) {
+            super(connection, id, version, tags, loaded, uid, timestamp, user);
             this.nodes = nodes;
                        for each (var node:Node in nodes) { node.addParent(this); }
                        calculateBbox();
         }
 
-               public function update(version:uint, tags:Object, loaded:Boolean, parentsLoaded:Boolean, nodes:Array, uid:Number = NaN, timestamp:String = null):void {
+               public function update(version:uint, tags:Object, loaded:Boolean, parentsLoaded:Boolean, nodes:Array, uid:Number = NaN, timestamp:String = null, user:String = null):void {
                        var node:Node;
                        for each (node in this.nodes) { node.removeParent(this); }
-                       updateEntityProperties(version,tags,loaded,parentsLoaded,uid,timestamp); this.nodes=nodes;
+                       updateEntityProperties(version,tags,loaded,parentsLoaded,uid,timestamp,user); this.nodes=nodes;
                        for each (node in nodes) { node.addParent(this); }
                        calculateBbox();
                }
index f8c0bfac2d45b4c9537a3126b73406dfd1c47796..5de8112c924efee8456a78d70cb31f21a34fc514 100644 (file)
@@ -30,6 +30,7 @@ package net.systemeD.halcyon.connection {
                                var version:uint;
                                var uid:Number;
                                var timestamp:String;
+                               var user:String;
                                var tags:Object;
                                var node:Node, newNode:Node;
                                var unusedNodes:Object={};
@@ -51,6 +52,7 @@ package net.systemeD.halcyon.connection {
                                        version = uint(relData.@version);
                                        uid = Number(relData.@uid);
                                        timestamp = relData.@timestamp;
+                                       user = relData.@user;
                           
                                        var rel:Relation = getRelation(id);
                                        if ( rel == null || !rel.loaded || singleEntityRequest ) {
@@ -88,11 +90,11 @@ package net.systemeD.halcyon.connection {
                                                }
                                        
                                                if ( rel == null ) {
-                                                       rel=new Relation(this, id, version, tags, true, members, uid, timestamp);
+                                                       rel=new Relation(this, id, version, tags, true, members, uid, timestamp, user);
                                                        setRelation(rel, false);
                                                        createdEntities.push(rel);
                                                } else {
-                                                       rel.update(version, tags, true, false, members, uid, timestamp);
+                                                       rel.update(version, tags, true, false, members, uid, timestamp, user);
                                                        sendEvent(new EntityEvent(NEW_RELATION, rel), false);
                                                }
                                        }
@@ -109,9 +111,11 @@ package net.systemeD.halcyon.connection {
                                                                           Number(nodeData.@lat),
                                                                           Number(nodeData.@lon),
                                                                           Number(nodeData.@uid),
-                                                                          nodeData.@timestamp);
-                if ( inlineStatus ) { newNode.status = nodeData.@status; }
-                               
+                                                                          nodeData.@timestamp,
+                                                                          nodeData.@user);
+
+                    if ( inlineStatus ) { newNode.status = nodeData.@status; }
+
                                        if ( singleEntityRequest ) {
                                                // it's a revert request, so create/update the node
                                                setOrUpdateNode(newNode, true);
@@ -132,6 +136,7 @@ package net.systemeD.halcyon.connection {
                                        version = uint(data.@version);
                                        uid = Number(data.@uid);
                                        timestamp = data.@timestamp;
+                                       user = data.@user;
 
                                        var way:Way = getWay(id);
                                        if ( way == null || !way.loaded || singleEntityRequest) {
@@ -145,14 +150,14 @@ package net.systemeD.halcyon.connection {
                                                }
                                                tags = parseTags(data.tag);
                                                if ( way == null ) {
-                                                       way=new Way(this, id, version, tags, true, nodelist, uid, timestamp)
+                                                       way=new Way(this, id, version, tags, true, nodelist, uid, timestamp, user)
                                                        if ( inlineStatus ) { way.status = data.@status; }
                                                        setWay(way,false);
                                                        createdEntities.push(way);
                                                } else {
                                                        if (!way.loaded) createdEntities.push(way);
                                                        waycount++;
-                                                       way.update(version, tags, true, true, nodelist, uid, timestamp);
+                                                       way.update(version, tags, true, true, nodelist, uid, timestamp, user);
                                                        if ( inlineStatus ) { way.status = data.@status; }
                                                        sendEvent(new EntityEvent(NEW_WAY, way), false);
                                                }
@@ -174,7 +179,7 @@ package net.systemeD.halcyon.connection {
                        }
                }
 
-               private function parseTags(tagElements:XMLList):Object {
+               protected function parseTags(tagElements:XMLList):Object {
                        var tags:Object = {};
                        for each (var tagEl:XML in tagElements)
                                tags[tagEl.@k] = tagEl.@v;
index 8f1172bf4a35c09265c36ebd295ba441f6a36966..6b5d8aeec2fed0af8473c91df9335f208ce4dc1a 100644 (file)
@@ -9,6 +9,7 @@ package net.systemeD.halcyon.connection {
 
        import net.systemeD.halcyon.AttentionEvent;
        import net.systemeD.halcyon.MapEvent;
+       import net.systemeD.halcyon.ExtendedURLLoader;
     import net.systemeD.halcyon.connection.bboxes.*;
 
     /**
@@ -74,18 +75,23 @@ package net.systemeD.halcyon.connection {
 
                private function sendLoadRequest(request:URLRequest):void {
                        var mapLoader:URLLoader = new URLLoader();
+            var errorHandler:Function = function(event:IOErrorEvent):void {
+                errorOnMapLoad(event, request);
+            }
                        mapLoader.addEventListener(Event.COMPLETE, loadedMap);
-                       mapLoader.addEventListener(IOErrorEvent.IO_ERROR, errorOnMapLoad);
+                       mapLoader.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
                        mapLoader.addEventListener(HTTPStatusEvent.HTTP_STATUS, mapLoadStatus);
             request.requestHeaders.push(new URLRequestHeader("X-Error-Format", "XML"));
                        mapLoader.load(request);
                        dispatchEvent(new Event(LOAD_STARTED));
                }
 
-        private function errorOnMapLoad(event:Event):void {
-                       dispatchEvent(new MapEvent(MapEvent.ERROR, { message: "Couldn't load the map" } ));
-                       dispatchEvent(new Event(LOAD_COMPLETED));
+        private function errorOnMapLoad(event:Event, request:URLRequest):void {
+            var url:String = request.url + '?' + URLVariables(request.data).toString(); // for get reqeusts, at least
+            dispatchEvent(new MapEvent(MapEvent.ERROR, { message: "There was a problem loading the map data.\nPlease check your internet connection, or try zooming in.\n\n" + url } ));
+            dispatchEvent(new Event(LOAD_COMPLETED));
         }
+
         private function mapLoadStatus(event:HTTPStatusEvent):void {
         }
 
@@ -157,11 +163,19 @@ package net.systemeD.halcyon.connection {
            }
 
         private function changesetCreateComplete(event:Event):void {
-            // response should be a Number changeset id
-            var id:Number = Number(URLLoader(event.target).data);
+            var result:String = URLLoader(event.target).data;
+
+            if (result.match(/^^\d+$/)) {
+                // response should be a Number changeset id
+                var id:Number = Number(URLLoader(event.target).data);
             
-            // which means we now have a new changeset!
-            setActiveChangeset(new Changeset(this, id, lastUploadedChangesetTags));
+                // which means we now have a new changeset!
+                setActiveChangeset(new Changeset(this, id, lastUploadedChangesetTags));
+            } else {
+                var results:XML = XML(result);
+
+                throwServerError(results.message);
+            }
         }
 
         private function changesetCreateError(event:IOErrorEvent):void {
@@ -476,8 +490,82 @@ package net.systemeD.halcyon.connection {
                                function(e:Event):void { 
                        dispatchEvent(new Event(LOAD_COMPLETED));
                                        callback(e);
-                               }, errorOnMapLoad, mapLoadStatus); // needs error handlers
+                               }, errorOnTraceLoad, mapLoadStatus); // needs error handlers
             dispatchEvent(new Event(LOAD_STARTED)); //specifc to map or reusable?
         }
+
+        private function errorOnTraceLoad(event:Event):void {
+            trace("Trace load error");
+            dispatchEvent(new Event(LOAD_COMPLETED));
+               }
+
+        /** Fetch the history for the given entity. The callback function will be given an array of entities of that type, representing the different versions */
+        override public function fetchHistory(entity:Entity, callback:Function):void {
+            if (entity.id >= 0) {
+              var request:URLRequest = new URLRequest(apiBaseURL + entity.getType() + "/" + entity.id + "/history");
+              var loader:ExtendedURLLoader = new ExtendedURLLoader();
+              loader.addEventListener(Event.COMPLETE, loadedHistory);
+              loader.addEventListener(IOErrorEvent.IO_ERROR, errorOnMapLoad); //needs error handlers
+              loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, mapLoadStatus);
+              loader.info['callback'] = callback; //store the callback so we can use it later
+              loader.load(request);
+              dispatchEvent(new Event(LOAD_STARTED));
+            } else {
+              // objects created locally only have one state, their current one
+              callback([entity]);
+            }
+        }
+
+        private function loadedHistory(event:Event):void {
+            var _xml:XML = new XML(ExtendedURLLoader(event.target).data);
+            var results:Array = [];
+            var dummyConn:Connection = new Connection("dummy", null, null);
+
+            dispatchEvent(new Event(LOAD_COMPLETED));
+
+            // only one type of entity should be returned, but this handles any
+
+            for each(var nodeData:XML in _xml.node) {
+                var newNode:Node = new Node(
+                    dummyConn,
+                    Number(nodeData.@id),
+                    uint(nodeData.@version),
+                    parseTags(nodeData.tag),
+                    true,
+                    Number(nodeData.@lat),
+                    Number(nodeData.@lon),
+                    Number(nodeData.@uid),
+                    nodeData.@timestamp,
+                    nodeData.@user
+                    );
+                results.push(newNode);
+            }
+
+            for each(var wayData:XML in _xml.way) {
+                var nodes:Array = [];
+                for each(var nd:XML in wayData.nd) {
+                  nodes.push(new Node(dummyConn,Number(nd.@ref), NaN, null, false, NaN, NaN));
+                }
+                var newWay:Way = new Way(
+                    dummyConn,
+                    Number(wayData.@id),
+                    uint(wayData.@version),
+                    parseTags(wayData.tag),
+                    true,
+                    nodes,
+                    Number(wayData.@uid),
+                    wayData.@timestamp,
+                    wayData.@user
+                    );
+                results.push(newWay);
+            }
+
+            for each(var relData:XML in _xml.relation) {
+                trace("relation history not implemented");
+            }
+
+            // use the callback we stored earlier, and pass it the results
+            ExtendedURLLoader(event.target).info['callback'](results);
+        }
        }
 }
index f2fd1bc651d3506849721c3b6843afd47e0579ab..59d91a301f4a75d2f966e54c51ea4d078784e75b 100644 (file)
@@ -30,6 +30,8 @@ package net.systemeD.halcyon.connection.actions {
                                way.dispatchEvent(new WayNodeEvent(Connection.WAY_NODE_REMOVED, node, way, 0));
                 if (!node.hasParents && !node.hasInterestingTags()) { //need to trigger redraw of new POIs?
                   node.remove(effects.push);
+                } else {
+                  if (!node.hasParentWays) node.connection.registerPOI(node);
                 }
                        }
                        effects.doAction();
@@ -61,6 +63,7 @@ package net.systemeD.halcyon.connection.actions {
             for each(var node:Node in oldNodeList) {
                 nodeList.push(node);
                node.addParent(way);
+               node.connection.unregisterPOI(node);
                 way.dispatchEvent(new WayNodeEvent(Connection.WAY_NODE_ADDED, node, way, 0));
             }
                        way.resume();
index b03f1b381de5fe3f29082a8e975cc397020986d8..1873d57655b1ebe8327c9c8f377b3e3e0359d781 100644 (file)
@@ -1,9 +1,8 @@
 package net.systemeD.halcyon.styleparser {
 
-       import flash.events.*;
-       import flash.net.URLLoader;
-       import flash.net.URLLoaderDataFormat;
-       import flash.net.URLRequest;
+    import net.systemeD.halcyon.FileBank;
+
+    import flash.events.*;
 
        /** A class permitting you to load CSS files containing 'import' rules, which will be 
                automatically replaced with the contents of the file.                                                                   <p>
@@ -18,9 +17,7 @@ package net.systemeD.halcyon.styleparser {
        */
 
        public class NestedCSSLoader extends EventDispatcher {
-               private var sourceCSS:String;
                public var css:String;
-               private var url:String;
                private var count:int;
 
                private static const IMPORT:RegExp=/@import\s*[^'"]*['"]([^'"]+)['"][^;]*;/g;           // '
@@ -29,28 +26,21 @@ package net.systemeD.halcyon.styleparser {
                }
                
                public function load(url:String):void {
-                       this.url=url;
-                       var request:URLRequest=new URLRequest(url+"?d="+Math.random());
-                       var loader:URLLoader = new URLLoader();
-                       loader.dataFormat = URLLoaderDataFormat.TEXT;
-                       loader.addEventListener(Event.COMPLETE, fileLoaded);
-                       loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, fileError);
-                       loader.addEventListener(IOErrorEvent.IO_ERROR, fileError);
-                       loader.load(request);
+            FileBank.getInstance().addFromFile(url, fileLoaded);
                }
                
-               private function fileLoaded(event:Event):void {
-                       sourceCSS=URLLoader(event.target).data;
-                       css=sourceCSS;
-                       count=0;
+               private function fileLoaded(fileBank:FileBank, filename:String):void {
+                       css = fileBank.getAsString(filename);
+                       count = 1;
 
-                       var result:Object=IMPORT.exec(sourceCSS);
-                       while (result!=null) {
+                       var results:Array = css.match(IMPORT);
+            while (results.length > 0) {
+                IMPORT.lastIndex = 0;
+                var result:Object = IMPORT.exec(results.shift());
                                count++;
                                replaceCSS(result[1],result[0]);
-                               result=IMPORT.exec(sourceCSS);
                        }
-                       if (count==0) { fireComplete(); }
+            decreaseCount();
                }
 
                private function replaceCSS(filename:String, toReplace:String):void {
@@ -60,13 +50,7 @@ package net.systemeD.halcyon.styleparser {
                                css=css.replace(replaceText,event.target.css);
                                decreaseCount();
                        });
-                       cssLoader.load(filename+"?d="+Math.random());
-               }
-
-               private function fileError(event:Event):void {
-                       // just fire a complete event so we don't get an error dialogue
-                       trace("Error while trying to load "+url);
-                       fireComplete();
+                       cssLoader.load(filename);
                }
                
                private function decreaseCount():void {
index 9c0e37e31d8cc976da7f71807777628f29a74332..be59b8d8dd47b7ec4349e7bcf1fb02e01df218af 100644 (file)
@@ -2,20 +2,19 @@ package net.systemeD.halcyon.styleparser {
 
        import flash.events.*;
        import flash.net.*;
-       import net.systemeD.halcyon.ExtendedLoader;
-       import net.systemeD.halcyon.ExtendedURLLoader;
-       import net.systemeD.halcyon.DebugURLRequest;
     import net.systemeD.halcyon.connection.Entity;
-    import net.systemeD.halcyon.ImageBank;
+    import net.systemeD.halcyon.FileBank;
 
     import net.systemeD.halcyon.connection.*;
-       
-       /** A complete stylesheet, as loaded from a MapCSS file. It contains all selectors, declarations, 
-               and embedded images.                                                                                                                                                            </p><p>
-               
-               The RuleSet class has two principal methods: getStyles, which calculates the styles that apply
-               to an entity (returned as a StyleList); and parse, which parses a MapCSS stylesheet into
-               a complete RuleSet. */
+
+    /**
+    * A complete stylesheet, as loaded from a MapCSS file. It contains all selectors, declarations,
+    * and embedded images.
+    *
+    * <p>The RuleSet class has two principal methods: getStyles, which calculates the styles that apply
+    * to an entity (returned as a StyleList); and parse, which parses a MapCSS stylesheet into
+    * a complete RuleSet.</p>
+    */
 
        public class RuleSet {
 
@@ -292,7 +291,6 @@ package net.systemeD.halcyon.styleparser {
                /** Load all images referenced in the RuleSet (for example, icons or bitmap fills). */
                
                private function loadImages():void {
-                       ImageBank.getInstance().addEventListener(ImageBank.IMAGES_LOADED,doIconCallback);
                        var filename:String;
                        for each (var chooser:StyleChooser in choosers) {
                                for each (var style:Style in chooser.styles) {
@@ -302,13 +300,10 @@ package net.systemeD.halcyon.styleparser {
                                        else { continue; }
 
                                        if (filename!='square' && filename!='circle')
-                                               ImageBank.getInstance().loadImage(filename);
+                                               FileBank.getInstance().addFromFile(filename);
                                }
                        }
-               }
-               
-               private function doIconCallback(e:Event):void {
-                       iconCallback();
+            if (iconCallback!=null) { FileBank.getInstance().onFilesLoaded(iconCallback); }
                }
                
                // ------------------------------------------------------------------------------------------------
@@ -531,7 +526,7 @@ package net.systemeD.halcyon.styleparser {
 
         public static function parseCSSColor(colorStr:String):uint {
             colorStr = colorStr.toLowerCase();
-            if (CSSCOLORS[colorStr]) {
+            if (CSSCOLORS[colorStr] != undefined) {
                 return CSSCOLORS[colorStr];
             } else {
                 var match:Object = HEX.exec(colorStr);
index 1ec99967c869c7552aabba1d2cb2b221cbc3d60d..ca180df4e9780fc5993c68a15c5c71e362e98f60 100644 (file)
@@ -4,7 +4,7 @@ package net.systemeD.halcyon.styleparser {
        
        public class ShapeStyle extends Style {
 
-               public var width:Number=0;
+               public var width:Number;
                public var color:Number;
                public var opacity:Number;
                public var dashes:Array=[];
@@ -32,7 +32,7 @@ package net.systemeD.halcyon.styleparser {
                }
                
                override public function get drawn():Boolean {
-                       return (fill_image || !isNaN(fill_color) || width || casing_width);
+                       return (fill_image || !isNaN(fill_color) || !isNaN(width) || casing_width);
                }
 
                public function applyStrokeStyle(g:Graphics):void {
index 32285a8f251c24ad5f199508f5d7810c72819bd3..f84eab711b330a534d424f8ebae069317f5e2cc1 100644 (file)
@@ -56,7 +56,7 @@ package net.systemeD.halcyon.styleparser {
                public function mergeWith(additional:Style):void {
                        for each (var prop:String in properties) {
                                // Note extra check for empty arrays, which we use to mean 'undefined' (see setPropertyFromString below)
-                               if (additional[prop] && !((additional[prop] is Array) && additional[prop].length==0)) {
+                               if (additional[prop]!=undefined && !((additional[prop] is Number) && isNaN(additional[prop])) && !((additional[prop] is Array) && additional[prop].length==0)) {
                                        this[prop]=additional[prop];
                                }
                        }
index 9d9d2f93fc4648a94287b5f8d3582eafedb6ff83..f0e95bc50745152858eabec3721315a1b5927622 100644 (file)
@@ -1,7 +1,7 @@
 package net.systemeD.halcyon.styleparser {
 
        import net.systemeD.halcyon.connection.Entity;
-    import net.systemeD.halcyon.ImageBank;
+    import net.systemeD.halcyon.FileBank;
 
        public class StyleChooser {
 
@@ -68,8 +68,8 @@ package net.systemeD.halcyon.styleparser {
                                                        if (PointStyle(r).icon_width && !PointStyle(r).evals['icon_width']) {
                                                                // ** FIXME: we should check this is the bit being used for 'square', 'circle' etc.
                                                                w=PointStyle(r).icon_width;
-                                                       } else if (PointStyle(r).icon_image && ImageBank.getInstance().hasImage(PointStyle(r).icon_image)) {
-                                                               w=ImageBank.getInstance().getWidth(PointStyle(r).icon_image);
+                                                       } else if (PointStyle(r).icon_image && FileBank.getInstance().hasFile(PointStyle(r).icon_image)) {
+                                                               w=FileBank.getInstance().getWidth(PointStyle(r).icon_image);
                                                        }
                                                        if (w>sl.maxwidth) { sl.maxwidth=w; }
                                                } else if (r is InstructionStyle) {
index 4b339d0e115b70c3519d5eb60ab3ece6ba48397c..26567ceea6b9cc89384feeb538e2092be70f3335 100644 (file)
@@ -1,32 +1,42 @@
 <?xml version="1.0" encoding="utf-8"?>
-<mx:VBox
-       xmlns:fx="http://ns.adobe.com/mxml/2009"
-       xmlns:mx="library://ns.adobe.com/flex/mx"
-       paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom="10"
-       horizontalAlign="left" backgroundColor="white" borderStyle="inset">
-       
-       <mx:List width="100%" height="100%" id="background"
-                       labelField="name"
-                       change="FlexGlobals.topLevelApplication.bgButton.close(); Imagery.instance().setBackground(background.selectedItem);"
-               dataProvider="{Imagery.instance().getAvailableImagery()}"
-               rowCount="{Imagery.instance().getAvailableImagery().length}"/>
-       <mx:HBox>
-       <mx:CheckBox width="100%" label="Dim" selected="{application.theMap.getDimming()}" id="dim"
-           change="setDimming(dim.selected)" />
-       <mx:CheckBox width="100%" label="Sharpen" selected="{application.theMap.getSharpen()}" id="sharpen"
-           change="setSharpen(sharpen.selected)" />
-       </mx:HBox>
-
-       <mx:HBox>
-       <mx:Button id="editLabel" label="Edit..." click="FlexGlobals.topLevelApplication.bgButton.close(); new BackgroundDialog().init('Background imagery',background,Imagery.instance());" />
-       <mx:Button label="Vector file..." click="FlexGlobals.topLevelApplication.bgButton.close(); new VectorSourceDialog().init();" />
-       </mx:HBox>
+<s:BorderContainer
+    xmlns:fx="http://ns.adobe.com/mxml/2009"
+    xmlns:s="library://ns.adobe.com/flex/spark">
+
+    <s:layout>
+      <s:VerticalLayout
+          paddingLeft="5" paddingRight="5"
+          paddingTop="5" paddingBottom="5"/>
+    </s:layout>
+
+    <s:List width="100%" height="100%" id="background"
+            labelField="name"
+            change="FlexGlobals.topLevelApplication.bgButton.close(); Imagery.instance().setBackground(background.selectedItem);"
+            dataProvider="{Imagery.instance().getAvailableImagery()}"
+            selectedItem="{Imagery.instance().selected}">
+      <s:layout>
+        <s:VerticalLayout requestedRowCount="{Imagery.instance().getAvailableImagery().length}" gap="0" horizontalAlign="contentJustify"/>
+      </s:layout>
+    </s:List>
+
+    <s:HGroup width="100%" horizontalAlign="center">
+      <s:CheckBox label="Dim" selected="{application.theMap.getDimming()}" id="dim"
+          change="setDimming(dim.selected)" />
+      <s:CheckBox label="Sharpen" selected="{application.theMap.getSharpen()}" id="sharpen"
+          change="setSharpen(sharpen.selected)" />
+    </s:HGroup>
+
+    <s:HGroup>
+      <s:Button id="editLabel" label="Edit..." click="FlexGlobals.topLevelApplication.bgButton.close(); new BackgroundDialog().init('Background imagery',background,Imagery.instance());" />
+      <s:Button label="Vector file..." click="FlexGlobals.topLevelApplication.bgButton.close(); new VectorSourceDialog().init();" />
+    </s:HGroup>
 
        <fx:Script><![CDATA[
 
                import net.systemeD.halcyon.*;
                import net.systemeD.halcyon.connection.*;
                import net.systemeD.potlatch2.*;
+               import net.systemeD.potlatch2.dialogs.*;
                import net.systemeD.potlatch2.collections.Imagery;
                import mx.core.*;
                import mx.collections.ArrayCollection;
@@ -36,7 +46,6 @@
 
                public function setDimming(v:Boolean):void {
                        FlexGlobals.topLevelApplication.theMap.setDimming(dim.selected);
-                       FlexGlobals.topLevelApplication.yahoo.alpha = dim.selected ? 0.5 : 1;
                        var obj:SharedObject=SharedObject.getLocal("user_state");
                        obj.setProperty('background_dim',v);
                        obj.flush();
@@ -48,5 +57,4 @@
                        obj.flush();
                }
     ]]></fx:Script>
-</mx:VBox>
-
+</s:BorderContainer>
diff --git a/net/systemeD/potlatch2/CustomLocaleCommand.as b/net/systemeD/potlatch2/CustomLocaleCommand.as
new file mode 100644 (file)
index 0000000..b4b8160
--- /dev/null
@@ -0,0 +1,24 @@
+package net.systemeD.potlatch2 {
+    import org.babelfx.commands.ExternalLocaleCommand;
+    import net.systemeD.halcyon.Globals;
+
+    public class CustomLocaleCommand extends ExternalLocaleCommand {
+        public var defaultExternalPath:String;
+
+        override protected function loadLocale(locale:String):void {
+            externalPath = defaultExternalPath;
+
+            if (Globals.vars.locale_paths) {
+                for each (var path:String in Globals.vars.locale_paths.split(";")) {
+                    var args:Array = path.split("=");
+
+                    if (args[0] == locale) {
+                        externalPath = args[1];
+                    }
+                }
+            }
+
+            super.loadLocale(locale);
+        }
+    }
+}
index f70cc2171d35e525879fb3522bff393d3bda4288..5cb00fbd0d1b80d1d02c67ad6a0b94e10504b296 100644 (file)
@@ -15,6 +15,7 @@ package net.systemeD.potlatch2 {
        import flash.ui.Keyboard;
        import flash.ui.Mouse;
        import flash.ui.MouseCursorData;
+       import flash.system.Capabilities;
        import flash.text.TextField;
     import mx.controls.TextArea;
 
@@ -29,7 +30,12 @@ package net.systemeD.potlatch2 {
         /** The current ControllerState */
         public var state:ControllerState;
         
+               /** Hash of when a key was pressed. A user can keyDown within a TextInput, press Enter (leaving
+                   the TextInput), and then keyup - resulting in the keypress being interpreted again. 
+                   We prevent this by tracking keyDowns within the TextInput and ignoring corresponding keyUps. */
                private var keys:Object={};
+
+               public var spaceHeld:Boolean=false;
                public var clipboards:Object={};
                public var cursorsEnabled:Boolean=true;
         private var maximised:Boolean=false;
@@ -68,11 +74,13 @@ package net.systemeD.potlatch2 {
                 map.addEventListener(MapEvent.MOVE, moveHandler);
             }
 
-                       createBitmapCursor("pen"     ,new pen());
-                       createBitmapCursor("pen_x"   ,new pen_x());
-                       createBitmapCursor("pen_o"   ,new pen_o());
-                       createBitmapCursor("pen_so"  ,new pen_so());
-                       createBitmapCursor("pen_plus",new pen_plus());
+                       if (supportsMouseCursors()) {
+                               createBitmapCursor("pen"     ,new pen());
+                               createBitmapCursor("pen_x"   ,new pen_x());
+                               createBitmapCursor("pen_o"   ,new pen_o());
+                               createBitmapCursor("pen_so"  ,new pen_so());
+                               createBitmapCursor("pen_plus",new pen_plus());
+                       }
         }
 
         public function setActive():void {
@@ -100,14 +108,19 @@ package net.systemeD.potlatch2 {
                }
         
         private function keyDownHandler(event:KeyboardEvent):void {
-                       if ((event.target is TextField) || (event.target is TextArea)) return;
-                       keys[event.keyCode]=true;
+                       if ((event.target is TextField) || (event.target is TextArea)) {
+                               keys[event.keyCode]=new Date().getTime();
+                               return;
+                       }
+                       delete keys[event.keyCode];
+                       if (event.keyCode==Keyboard.SPACE) spaceHeld=true;
                }
 
         private function keyUpHandler(event:KeyboardEvent):void {
-            if (!keys[event.keyCode]) return;
-            delete keys[event.keyCode];
-            if ((event.target is TextField) || (event.target is TextArea)) return;                             // not meant for us
+                       if ((event.target is TextField) || (event.target is TextArea)) return;
+                       if (event.keyCode==Keyboard.SPACE) spaceHeld=false;
+                       if (keys[event.keyCode] && new Date().getTime()-keys[event.keyCode]<300) return;
+                       delete keys[event.keyCode];
 
                        if (FunctionKeyManager.instance().handleKeypress(event.keyCode)) { return; }
             
@@ -116,11 +129,6 @@ package net.systemeD.potlatch2 {
             setState(newState);            
                }
 
-               /** Is the given key currently pressed? */
-               public function keyDown(key:Number):Boolean {
-                       return Boolean(keys[key]);
-               }
-
         private function mapMouseEvent(event:MouseEvent):void {
             if (isInteractionEvent(event)) map.stage.focus = map.parent;
             if (event.type==MouseEvent.MOUSE_UP && map.dragstate==map.DRAGGING) { return; }
@@ -188,7 +196,7 @@ package net.systemeD.potlatch2 {
 
                /** Set a mouse pointer. */
                public function setCursor(name:String=""):void {
-                       if (name && cursorsEnabled) { Mouse.cursor=name; }
+                       if (name && cursorsEnabled && supportsMouseCursors()) { Mouse.cursor=name; }
                        else { Mouse.cursor=flash.ui.MouseCursor.AUTO; }
                }
 
@@ -201,6 +209,12 @@ package net.systemeD.potlatch2 {
                        Mouse.registerCursor(name, cursorData);
                }
 
+               private function supportsMouseCursors():Boolean {
+                       var fpArray:Array=Capabilities.version.split(",");
+                       var fpVersion:Number=Number(fpArray[0].split(" ")[1])+Number(fpArray[1])/10;
+                       return (fpVersion>10.1);
+               }
+
         private function toggleSize():void {
             if (maximised) {
                 if (minimiseFunction) {
index 583e610339e1e70a58657efe38c55654738efa2f..ebef62df03e06c52b442ffcc00ce53e7ed923bad 100644 (file)
@@ -6,7 +6,7 @@ package net.systemeD.potlatch2 {
     import flash.geom.Matrix;
     import flash.text.TextField;
     import flash.text.TextFormat;
-    import net.systemeD.halcyon.ImageBank;
+    import net.systemeD.halcyon.FileBank;
 
 
     public class Preloader extends net.systemeD.potlatch2.PreloaderDisplayBase {
@@ -21,9 +21,6 @@ package net.systemeD.potlatch2 {
         private var barFrame:Sprite;
         private var mainColor:uint=0x045966;
 
-               private var assetscount:uint=0;
-               private var queuedEvents:Array=[];
-
         public function Preloader()
         {
             super();
@@ -45,31 +42,16 @@ package net.systemeD.potlatch2 {
 
                        // request .zip files
                        if (loaderInfo.parameters['assets']) {
-                               ImageBank.getInstance().addEventListener(ImageBank.ZIP_LOADED, zipLoaded);
                                for each (var file:String in loaderInfo.parameters['assets'].split(';')) {
                                        var asset:Array=file.split('=');
-                                       assetscount++;
-                                       ImageBank.getInstance().loadFromZip(asset[0],asset[1]);
+                    if (asset.length == 1) {
+                        FileBank.getInstance().addFromZip(asset[0]);
+                    } else {
+                        FileBank.getInstance().addFromZip(asset[0], asset[1]);
+                    }
                                }
                        }
         }
-
-               override protected function initProgressHandler(e:Event):void {
-                       // We don't let anything happen until the .zips are loaded
-                       // see http://stackoverflow.com/questions/2773617/how-to-preload-a-file-in-flex-before-the-application-initializes
-                       if (assetscount>0) {
-                               queuedEvents.push(e);
-                               e.stopImmediatePropagation();
-                       }
-                       draw();
-               }
-               
-               private function zipLoaded(e:Event):void {
-                       assetscount--; if (assetscount>0) return;
-                       for each (var q:Event in queuedEvents) {
-                               dispatchEvent(q);
-                       }
-               }
                
         //this is our "animation" bit
         override protected function draw():void
index 057e6f817730232910f6ef0b85d1e6f134f9dd7c..54e73c9eef98c6e82dcce4befe708bccaaa3d0f7 100644 (file)
@@ -1,24 +1,33 @@
 <?xml version="1.0" encoding="utf-8"?>
-<mx:VBox
+<s:BorderContainer
        xmlns:fx="http://ns.adobe.com/mxml/2009"
-       xmlns:mx="library://ns.adobe.com/flex/mx"
-       paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom="10"
-       horizontalAlign="left" backgroundColor="white" borderStyle="inset">
-       
-       <mx:List width="100%" height="100%" id="mapStyle" 
+    xmlns:s="library://ns.adobe.com/flex/spark" >
+
+    <s:layout>
+      <s:VerticalLayout
+          paddingLeft="5" paddingRight="5"
+          paddingTop="5" paddingBottom="5"/>
+    </s:layout>
+
+       <s:List width="100%" height="100%" id="mapStyle"
                labelField="name"
-               change="FlexGlobals.topLevelApplication.styleButton.close(); Stylesheets.instance().setStylesheet(mapStyle.selectedItem.name, mapStyle.selectedItem.url);"
-               dataProvider="{Stylesheets.instance().getCollection()}"
-               rowCount="{Stylesheets.instance().getCollection().length}" />
+               change="FlexGlobals.topLevelApplication.styleButton.close(); Stylesheets.instance().setStylesheet(mapStyle.selectedItem);"
+            dataProvider="{Stylesheets.instance().getCollection()}"
+            selectedItem="{Stylesheets.instance().selected}">
+      <s:layout>
+        <s:VerticalLayout requestedRowCount="{Stylesheets.instance().getCollection().length}" gap="0" horizontalAlign="contentJustify"/>
+      </s:layout>
+    </s:List>
 
-       <mx:Button id="editButton" label="Edit..." click="FlexGlobals.topLevelApplication.styleButton.close(); new BackgroundDialog().init('Map style',mapStyle,Stylesheets.instance());" />
+       <s:Button id="editButton" label="Edit..." click="FlexGlobals.topLevelApplication.styleButton.close(); new BackgroundDialog().init('Map style',mapStyle,Stylesheets.instance());" />
 
        <fx:Script><![CDATA[
                import net.systemeD.halcyon.*;
                import net.systemeD.halcyon.connection.*;
                import net.systemeD.potlatch2.*;
                import net.systemeD.potlatch2.collections.Stylesheets;
+               import net.systemeD.potlatch2.dialogs.*;
                import mx.core.*;
     ]]></fx:Script>
-</mx:VBox>
+</s:BorderContainer>
 
index c5720efc217ff8ad14e735519dbb2d2c1db49d5e..bed408f0905e606ccbeb9642ae17c8a61586ccad 100644 (file)
@@ -4,7 +4,7 @@
        Advanced tag grid
 -->
 
-<mx:DataGrid editable="true" doubleClickEnabled="true" doubleClick="addNewTag(event)"
+<mx:DataGrid editable="true" doubleClickEnabled="true" doubleClick="addNewTag(event)" sortableColumns="false"
     xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:controls="net.systemeD.controls.*"
        xmlns:mx="library://ns.adobe.com/flex/mx">
@@ -93,6 +93,7 @@
 
                /** Update dataProvider in response to a tag being edited or removed */
                private function tagChanged(event:TagEvent):void {
+                       if (event.key==event.oldKey && event.oldValue==event.newValue) return;
                        var set:Boolean=false;
                        for (var i:uint=0; i<tagDataProvider.length; i++) {
                                if (tagDataProvider[i].key==event.oldKey || tagDataProvider[i].key==event.key) {
index dbdc7f335dff88cc6d2f651d22ea8684449b92de..96f733eb7ee8ebc9aff8870e1e57388f240ebe8a 100644 (file)
@@ -1,4 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>
+<!---
+  The TagViewer is the container for the entire sidebar. It has a number of components, and subpanels, in a ViewStack that change
+  depending on what is selected, i.e. the ControllerState.
+
+  @see net.systemeD.potlatch2.controller.ControllerState
+    -->
 <mx:VBox
     xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:mx="library://ns.adobe.com/flex/mx"
 
 <mx:ViewStack id="sidebar" width="100%" height="100%" creationPolicy="all">
 
-  <!-- Drag & drop icon panel -->
-
-  <mx:VBox id="dndPanel" width="100%" height="100%" horizontalScrollPolicy="off" styleName="dndPanelVbox">
-    <mx:Text id="dndPanelText" text="{dndPrompt}" width="100%" styleName="helpInfo" />
-       <mx:Repeater id="dndRep" dataProvider="{MapFeatures.getInstance().getCategoriesForType('point')}" styleName="dndRepeater">
-               <mx:HBox width="100%" styleName="dndPanelCategory">
-                       <mx:Label text="{dndRep.currentItem.name}:" styleName="dndPanelCategoryLabel"/>
-               </mx:HBox>
-
-               <mx:TileList dataProvider="{dndRep.currentItem.getFeaturesForType('point', true)}" width="100%" height="1"
-                                    rowHeight="32" columnWidth="32" updateComplete="resizePOIGrid(event)" styleName="dndPanelTileList">
-                       <mx:itemRenderer>
-                               <fx:Component>
-                                       <mx:VBox toolTip="{data.name}">
-                                               <fx:Script><![CDATA[
-                                                       import mx.events.DragEvent;
-                                                       import mx.managers.DragManager;
-                                                       import mx.core.DragSource;
-
-                                                       private function dragPOI(event:MouseEvent, tags:Array):void {
-                                                               if (outerDocument.controller.map.dragstate==outerDocument.controller.map.DRAGGING) return;
-
-                                                               // Get the drag initiator component from the event object.
-                                                               var dragInitiator:Image = event.currentTarget as Image;
-                                                               var dragSource:DragSource = new DragSource();
-                                                               dragSource.addData(tags, 'tags');
-                                                               dragSource.addData(event.target.parent.parent.parent.parent, 'container');
-
-                                                               var dragProxy:Image = new Image();
-                                                               dragProxy.source = dragInitiator.source;
-                                                               dragProxy.width = dragInitiator.width;   // must set width and height explicitly
-                                                               dragProxy.height = dragInitiator.height; // for non-embedded images
-                                                               DragManager.doDrag(dragInitiator, dragSource, event, dragProxy);
-                                                       }
-                                               ]]></fx:Script>
-                                               <mx:Image id="foo" source="{data.dndimage}" height="24" width="24" mouseMove="dragPOI(event, data.tags)" toolTip="{data.name}" />
-                                       </mx:VBox>
-                               </fx:Component>
-                       </mx:itemRenderer>
-               </mx:TileList>
-       </mx:Repeater>
-  </mx:VBox>
+  <sidepanel:DragAndDropPanel id="dndPanel" />
 
   <!-- Standard tagging panel -->
 
-  <mx:VBox id="tagsPanel" width="100%" height="100%" creationPolicy="auto">
-    <mx:ViewStack id="stack" width="100%" height="100%">
+  <mx:VBox id="tagsPanel" width="100%" height="100%" creationPolicy="auto" tabChildren="true">
+    <mx:ViewStack id="stack" width="100%" height="100%" change="tagsPanel.tabChildren=(event.newIndex==0)">
       <mx:VBox width="100%" height="100%" label="Simple" id="editorContainer" creationComplete="initEditorStackUIs()" styleName="dndPanelVbox">
         <mx:VBox width="100%" verticalGap="1" styleName="dndTagHeader">
           <mx:HBox width="100%" id="iconContainer" styleName="featureSelector">
@@ -72,7 +37,7 @@
         </mx:VBox>
       </mx:VBox>
       <mx:VBox width="100%" height="100%" label="Advanced" id="advancedContainer" initialize="checkAdvanced()" verticalGap="1">
-        <mx:Label id="advancedID" click="openEntityPage()">
+        <mx:Label id="advancedID" click="new HistoryDialog().init(selectedEntity);">
           <mx:htmlText><![CDATA[<i>No Selection</i>]]></mx:htmlText>
         </mx:Label>
 
       import net.systemeD.halcyon.MapPaint;
       import net.systemeD.potlatch2.EditController;
       import net.systemeD.potlatch2.mapfeatures.*;
+      import net.systemeD.potlatch2.history.HistoryDialog;
       import net.systemeD.potlatch2.mapfeatures.editors.*;
       import net.systemeD.potlatch2.utils.*;
       import net.systemeD.controls.CollapsiblePanel;
 
       import mx.collections.*;
-      import mx.containers.*;
+      import mx.containers.VBox;
+      import mx.containers.HBox;
+      import mx.containers.TabNavigator;
+      import mx.containers.Accordion;
       import mx.events.*;
       import mx.core.*;
       import mx.managers.PopUpManager;
       import mx.managers.DragManager;
       import mx.core.DragSource;
       import mx.controls.TabBar;
+      import spark.components.Form;
+      import spark.layouts.FormLayout;
 //    import flexlib.containers.SuperTabNavigator;
 
       [Bindable] [Embed(source="../../../embedded/tab_basic.png"       )] private var tabIconBasic:Class;
       private var tabIcons:Object= { Basic:tabIconBasic, Details:tabIconDetails, Address:tabIconAddress, Walk:tabIconWalk, Cycle:tabIconCycle, 
                                         Transport:tabIconTransport, Restrictions:tabIconRestrictions};
 
-      [Bindable]
-      public var dndPrompt:String="Add new points by dragging them onto the map";
-
       private var editorStackTabNavigator:TabNavigator;
       private var editorStackAccordion:Accordion;
       [Bindable] private var editorStack:Container;
       private var connection:Connection;
       private var currentCategorySelector:CategorySelector;
       private var categorySelectors:Object = {};       // hash of categorySelectors for each limitType
+      private var categorySelectorEntity:Entity;       // entity used to draw the categorySelector
       private var feature:Feature = null;
 
       private var rowData:Object;              // relation membership reference, needed so it's accessible from relation actions menu
                        selectedEntity.removeEventListener(Connection.TAG_CHANGED, tagChanged);
                        selectedEntity.removeEventListener(Connection.ADDED_TO_RELATION, addedToRelation);
                        selectedEntity.removeEventListener(Connection.REMOVED_FROM_RELATION, removedFromRelation);
+                       if (selectedEntity is EntityCollection) EntityCollection(selectedEntity).releaseListeners();
                }
 
                if (entities.length==0) {
                        // Nothing selected, so show drag-and-drop panel
                        sidebar.selectedChild = dndPanel;
+                       selectedEntity=null;
 
                } else if (entities.length==1) {
                        // Single entity selected, so show tag panel
+                       if (firstSelected!=null && selectedEntity!=firstSelected) { 
+                               firstSelected.addEventListener(Connection.TAG_CHANGED, tagChanged, false, 0, true);
+                       }
                        selectedEntity=firstSelected;
                        connection=firstSelected.connection;
-                       if (selectedEntity!=null) { selectedEntity.addEventListener(Connection.TAG_CHANGED, tagChanged); }
                        if (advancedID!=null) { setupAdvanced(firstSelected); }
                        if (firstSelected is Relation) { stack.addChild(membersVBox); }
             if (selectedEntity is Marker && connection is BugConnection) {
               markerPanelContents.init(selectedEntity, layer);
               sidebar.selectedChild = markerPanel;
             } else if (connection is SnapshotConnection) {
-              backgroundPanelContents.init(selectedEntity, layer);
+              backgroundPanelContents.init(selectedEntity);
               sidebar.selectedChild = backgroundPanel;
             } else {
               refreshFeatureIcon();
                       && xor(!controller.map.getLayerForEntity(entities[0]).isBackground, !controller.map.getLayerForEntity(entities[1]).isBackground) ) {
             backgroundMergePanelContents.init(entities);
             sidebar.selectedChild = backgroundMergePanel;
+                       // ** FIXME: do we need to set selectedEntity here?
 
                } else if(isMultipleEditable(entities)) {
                        selectedEntity = new EntityCollection(entities);
-                       selectedEntity.addEventListener(Connection.TAG_CHANGED, tagChanged);
+                       selectedEntity.addEventListener(Connection.TAG_CHANGED, tagChanged, false, 0, true);
             sidebar.selectedChild = multiplePanel;
                        setupMultiAdvanced(selectedEntity);
                        connection=entities[0].connection;
                } else {
                        //The selection contains elements which can't be edited all together.
                        sidebar.selectedChild = multipleInvalidPanel;
+                       selectedEntity=null;
                }
                UIComponent.resumeBackgroundProcessing();
       }
 
       private function refreshFeatureIcon():void {
           var oldFeature:Feature = feature;
+          var oldEntity:Entity = categorySelectorEntity;
+
           feature = selectedEntity == null ? null : mapFeatures.findMatchingFeature(selectedEntity);
-          if ( feature != oldFeature ) {
-              if ( oldFeature != null )
-                  oldFeature.removeEventListener("imageChanged", featureImageChanged);
-              if ( feature != null )
-                  feature.addEventListener("imageChanged", featureImageChanged);
+          if (oldFeature==feature && categorySelectorEntity==selectedEntity) {
+              updateCategoryImageAndText(selectedEntity,feature);
+              return;
           }
-          setCategorySelector(selectedEntity, feature);
+
+          categorySelectorEntity=selectedEntity;
+          if ( oldFeature != null ) { oldFeature.removeEventListener("imageChanged", featureImageChanged); }
+          if ( feature != null )    { feature.addEventListener("imageChanged", featureImageChanged); }
+                 setCategorySelector(selectedEntity, feature);
       }
 
       private function featureImageChanged(event:Event):void {
           setCategorySelector(selectedEntity, feature);
       }
 
+
       /** Set the icon, categorySelector and help text for the current entity. */
       private function setCategorySelector(entity:Entity, feature:Feature):void {
                        // Remove the "user has selected something" event listener from previous categorySelector,
                        currentCategorySelector=categorySelectors[lt];
                        currentCategorySelector.addEventListener("selectedType", changeFeatureType, false, 0, true);
 
-                       // Update surrounding icon/text display
+                       updateCategoryImageAndText(entity,feature);
+                       currentCategorySelector.setSelectedFeature(feature);
+
+                       // Set it as the popup, and make sure it's visible
+                       popupChange.popUp=currentCategorySelector;
+                       currentCategorySelector.visible=true;
+      }
+
+      private function updateCategoryImageAndText(entity:Entity, feature:Feature):void {
                        if (feature) {
                                iconImage.source = feature.image;
                                iconText.htmlText = feature.htmlDetails(entity);
                                popupChange.label = feature.name;
                                helpLabel.visible = feature.hasHelpURL();
-                               currentCategorySelector.setSelectedFeature(feature);
                        } else {
                                iconImage.source = null;
                                popupChange.label = "unknown";
                                } else {
                                        iconText.htmlText = "<b>No tags set</b><br/><font size='10pt'>Please use the menu below to define what this "+entity.getType()+" is</font>";
                                }
-                               currentCategorySelector.setSelectedFeature(null);
                        }
-
-                       // Set it as the popup, and make sure it's visible
-                       popupChange.popUp=currentCategorySelector;
-                       currentCategorySelector.visible=true;
-      }
+         }
 
          private function isMultipleEditable(entities:Array):Boolean {
                for each(var entity:Entity in entities) {
                        // Add to basic editor box first
                        if ( factory.presence.isEditorPresent(factory, selectedEntity, null) ) {
                                var editor:DisplayObject = factory.createEditorInstance(selectedEntity);
-                               if (editor) basicEditorBox.addChild(editor);
+                               if (editor) Form(basicEditorBox.getChildByName("form")).addElement(UIComponent(editor));
                        }
 
                        // Then prepare to add to category panel
                                        subpanel.styleName="subcategoryPanel";
                                        subpanel.title=subcategory;
                                        subpanels[category][subcategory]=subpanel;
+                                       addConstrainedForm(subpanel);
                                        tabComponents[tab].push(subpanel);
                                }
-                               subpanel.addChild(catEditor);
+                               Form(subpanel.getChildByName("form")).addElement(UIComponent(catEditor));
                        } else {
                                tabComponents[tab].push(catEditor);
                        }
                return 0;
        }
        
-      private function createEditorBox():VBox {
-          var box:VBox = new VBox();
-          box.percentWidth = 100;
-          box.percentHeight = 100;
-          box.styleName = "dndEditorContainer";
-          return box;
-      }
+       private function createEditorBox():VBox {
+               var box:VBox = new VBox();
+               box.percentWidth = 100;
+               box.percentHeight = 100;
+               box.styleName = "dndEditorContainer";
+               addConstrainedForm(box);
+               return box;
+       }
+       
+       private function addConstrainedForm(parentObject:DisplayObjectContainer):void {
+               var form:Form = new Form();
+               form.name = "form";
+               form.percentWidth=100;
+               form.addEventListener(mx.events.ResizeEvent.RESIZE, formResizeHandler, false, 0, true);
+               parentObject.addChild(form);
+               if (parentObject.width>0) form.maxWidth=parentObject.width;
+       }
+       
+       private function formResizeHandler(e:Event):void {
+               var form:Form=Form(e.target);
+               if (form.parent.width>0) form.maxWidth=form.parent.width;
+       }
 
-      private function ensureEditorsPopulated(tab:VBox):void {
-          var components:Array = tabComponents[tab];
-          if ( components == null || tab == null || tab.numChildren >= components.length )
-              return;
-          for each (var component:DisplayObject in components ) {
-              tab.addChild(component);
-          }
-      }
+       private function ensureEditorsPopulated(tab:VBox):void {
+               var components:Array = tabComponents[tab];
+               var form:Form=Form(tab.getChildByName("form"));
+               if ( components == null || tab == null || form.numElements >= components.length ) return;
+               for each (var component:DisplayObject in components ) {
+                       form.addElement(UIComponent(component));
+               }
+       }
 
        private function initEditorStackUIs():void {
                editorStackTabNavigator = new TabNavigator();
                                break;
                        
                        case 3: // Delete relation
-                               Alert.show("Do you really want to delete the relation?","Are you sure?",Alert.YES | Alert.CANCEL,null,
+                               var warning:String="This relation has # members. Deleting it will affect all of them and erase this $. Are you really sure?";
+                               warning=warning.replace("#",rel.length).replace("$",rel.getRelationType());
+                               Alert.show(warning,"Are you sure?",Alert.YES | Alert.CANCEL,null,
                                        function(event:CloseEvent):void { 
                                                if (event.detail==Alert.CANCEL) return;
                                                rel.remove(MainUndoStack.getGlobalStack().addAction);
-                                       } );
+                                       } , null, Alert.CANCEL);
                                break;
                }
        }
               navigateToURL(new URLRequest(feature.helpURL), "potlatch_help");
       }
 
-      /** Open up a new browser page showing OSM's view of the current entity. */
-      public function openEntityPage():void {
-          if (selectedEntity != null && selectedEntity.id >= 0) {
-              // This is slightly hard-coded, but not drastically. The ../s could be changed for string manipulation of the apiBase
-              var urlBase:String = connection.apiBase + '../../browse/'
-              navigateToURL(new URLRequest(urlBase+selectedEntity.getType()+'/'+selectedEntity.id), "potlatch_browse");
-          }
-      }
-
       public function addToRelation():void {
           new RelationSelectPanel().init(selectedEntity,new Object());
       }
           UIComponent.resumeBackgroundProcessing();
       }
 
-       private function resizePOIGrid(event:Event):void {
-               var rows:Number=event.target.dataProvider.length/event.target.columnCount;
-               if (rows!=Math.floor(rows)) { rows=Math.floor(rows+1); }
-               event.target.height=rows*(event.target.rowHeight+1);
-       }
   ]]></fx:Script>
 </mx:VBox>
 
index 5ed66ea30f3117a0e5ae1921347b24f7cc29e5bd..a58c97b0d99dbfd5969416567af579831f8c6f8c 100644 (file)
@@ -14,7 +14,7 @@
                <!-- Top row -->
 
                <s:Button icon="@Embed('../../../embedded/delete.svg')"
-                       click='doDelete();' 
+                       click='doDelete(event.ctrlKey,event.shiftKey);' 
                        enabled="{canDo('delete')}" 
                        alpha="{getAlpha('delete')}" 
                        toolTip="{deleteToolTipText()}" 
                // --------------------------------------------------------------------------------
                // Individual toolbox actions
 
-               public function doDelete():void {
+               public function doDelete(controlKey:Boolean,shiftKey:Boolean):void {
                        var undo:CompositeUndoableAction = new CompositeUndoableAction("Delete objects");
-                       for each (var entity:Entity in controller.state.selection) {
-                               if (entity is Node) { entity.connection.unregisterPOI(Node(entity)); }
-                               entity.remove(undo.push);
-                       }
-                       MainUndoStack.getGlobalStack().addAction(undo);
-
-                       if (controller.state is SelectedWayNode) {
-                               controller.setState(new SelectedWay(SelectedWayNode(controller.state).selectedWay));
-                       } else {
+                       if (controlKey) {
+                               // Temporary function to delete everything with non-accepting status
+                               var conn:Connection=controller.state.selection[0].connection;
+                               var o:Object=conn.getObjectsByBbox(controller.map.edge_l, controller.map.edge_r, controller.map.edge_t, controller.map.edge_b);
+                               for each (var way:Way in o.waysInside) {
+                                       if (way.status=='no' || (shiftKey && way.status=='partial')) { way.remove(undo.push); }
+                               }
+                               for each (var poi:Node in o.poisInside) {
+                                       if (poi.status=='no' || (shiftKey && way.status=='partial')) { poi.connection.unregisterPOI(poi); poi.remove(undo.push); }
+                               }
+                               MainUndoStack.getGlobalStack().addAction(undo);
                                controller.setState(new NoSelection());
+                               
+                       } else {
+                               // Standard delete function
+                               for each (var entity:Entity in controller.state.selection) {
+                                       if (entity is Node) { entity.connection.unregisterPOI(Node(entity)); }
+                                       entity.remove(undo.push);
+                               }
+                               MainUndoStack.getGlobalStack().addAction(undo);
+
+                               if (controller.state is SelectedWayNode) {
+                                       controller.setState(new SelectedWay(SelectedWayNode(controller.state).selectedWay));
+                               } else {
+                                       controller.setState(new NoSelection());
+                               }
                        }
                }
                
diff --git a/net/systemeD/potlatch2/Yahoo.as b/net/systemeD/potlatch2/Yahoo.as
deleted file mode 100644 (file)
index 7530324..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-package net.systemeD.potlatch2 {
-
-       import flash.display.*;
-       import net.systemeD.halcyon.Map;
-       import net.systemeD.halcyon.MapEvent;
-       import com.yahoo.maps.api.YahooMap;
-       import com.yahoo.maps.api.YahooMapEvent;
-       import com.yahoo.maps.api.core.location.LatLon;
-       
-    public class Yahoo extends YahooMap {
-
-               private var map:Map;
-               private static const token:String="f0a.sejV34HnhgIbNSmVHmndXFpijgGeun0fSIMG9428hW_ifF3pYKwbV6r9iaXojl1lU_dakekR";
-               private static const MAXZOOM:int=17;
-
-               private static const UNINITIALISED:uint=0;
-               private static const INITIALISING:uint=1;
-               private static const HIDDEN:uint=2;
-               private static const SHOWING:uint=3;
-               private var currentState:uint=UNINITIALISED;
-
-               private var _lat:Number;
-               private var _lon:Number;
-               private var _scale:Number;
-               private var offset_lat:Number=0;
-               private var offset_lon:Number=0;
-
-               public function Yahoo(map:Map) {
-                       super();
-                       currentState=UNINITIALISED;
-                       this.map=map;
-                       visible=false;
-               }
-               
-               public function show():void {
-                       visible=true;
-                       if (currentState==UNINITIALISED) {
-                               currentState=INITIALISING;
-                               this.addEventListener(YahooMapEvent.MAP_INITIALIZE, initHandler);
-                               this.init(token, map.mapwidth, map.mapheight);
-                               this.mapType="satellite";
-                               this.alpha=0.5;                         // ** FIXME - should take the value the user has chosen
-                               activateListeners();
-                       } else if (currentState==HIDDEN) { 
-                               currentState=SHOWING;
-                               moveto(map.centre_lat, map.centre_lon, map.scale);
-                               this.setSize(map.mapwidth,map.mapheight);
-                               activateListeners();
-                       }
-               }
-
-               public function hide():void {
-                       deactivateListeners();
-                       visible=false;
-                       if (currentState==SHOWING) currentState=HIDDEN;
-               }
-
-               private function activateListeners():void {
-                       map.addEventListener(MapEvent.MOVE, moveHandler);
-                       map.addEventListener(MapEvent.RESIZE, resizeHandler);
-                       map.addEventListener(MapEvent.NUDGE_BACKGROUND, nudgeHandler);
-               }
-               
-               private function deactivateListeners():void {
-                       map.removeEventListener(MapEvent.MOVE, moveHandler);
-                       map.removeEventListener(MapEvent.RESIZE, resizeHandler);
-                       map.removeEventListener(MapEvent.NUDGE_BACKGROUND, nudgeHandler);
-               }
-               
-               private function initHandler(event:YahooMapEvent):void {
-                       currentState=visible ? SHOWING : HIDDEN;
-                       if (map.centre_lat) { moveto(map.centre_lat, map.centre_lon, map.scale); }
-                       this.removeEventListener(YahooMapEvent.MAP_INITIALIZE, initHandler);
-               }
-
-               private function moveHandler(event:MapEvent):void {
-                       if (currentState!=SHOWING) { return; }
-                       moveto(event.params.lat, event.params.lon, event.params.scale);
-               }
-
-               private function moveto(lat:Number,lon:Number,scale:uint):void {
-                       if (scale>MAXZOOM) { visible=false; return; }
-                       _lat=lat; _lon=lon; _scale=scale;
-                       
-                       visible=true;
-                       this.zoomLevel=18-scale;
-                       this.centerLatLon=new LatLon(lat+offset_lat, lon+offset_lon);
-               }
-               
-               private function resizeHandler(event:MapEvent):void {
-                       moveto(map.centre_lat, map.centre_lon, map.scale);
-                       this.setSize(event.params.width, event.params.height);
-               }
-               
-               private function nudgeHandler(event:MapEvent):void {
-                       var cx:Number=map.lon2coord(map.centre_lon);
-                       var cy:Number=map.lat2coord(map.centre_lat);
-                       offset_lon+=map.coord2lon(cx-event.params.x)-map.centre_lon;
-                       offset_lat+=map.coord2lat(cy-event.params.y)-map.centre_lat;
-                       moveto(_lat,_lon,_scale);
-               }
-       }
-}
index f8abb7cff5f8868b57c8ab0db73f3a27885e7f33..ae40fcde39dffcbdf4b61faaf3019cf947ccd67a 100644 (file)
@@ -4,16 +4,14 @@ package net.systemeD.potlatch2.collections {
        import flash.display.*;
        import flash.net.*;
        import flash.text.TextField;
-       import net.systemeD.halcyon.DebugURLRequest;
+       import net.systemeD.halcyon.FileBank;
        import net.systemeD.halcyon.Map;
        import net.systemeD.halcyon.MapEvent;
        import net.systemeD.potlatch2.FunctionKeyManager;
-       import net.systemeD.potlatch2.Yahoo;
        import mx.collections.ArrayCollection;
 
        /*
                There's lots of further tidying we can do:
-               - remove all the horrid Yahoo stuff
                - remove the backreferences to _map and send events instead
                but this will do for now and help remove the clutter from potlatch2.mxml.
        */
@@ -28,28 +26,23 @@ package net.systemeD.potlatch2.collections {
 
                private var _map:Map;
                private var _overlay:Sprite;
-               private var _yahoo:Yahoo;
 
                /* Load catalogue file */
 
-               public function init(map:Map, overlay:Sprite, yahoo:Yahoo):void {
+               public function init(map:Map, overlay:Sprite):void {
                        _map = map;
                        _overlay = overlay;
-                       _yahoo = yahoo;
 
                        // load imagery file
-               var request:DebugURLRequest = new DebugURLRequest("imagery.xml");
-               var loader:URLLoader = new URLLoader();
-               loader.addEventListener(Event.COMPLETE, onImageryLoad);
-               loader.load(request.request);
+            FileBank.getInstance().addFromFile("imagery.xml", onImageryLoad);
 
                        // create map listeners
                        map.addEventListener(MapEvent.MOVE, moveHandler);
                        map.addEventListener(MapEvent.RESIZE, resizeHandler);
                }
 
-        private function onImageryLoad(event:Event):void {
-                       var xml:XML = new XML(URLLoader(event.target).data);
+               private function onImageryLoad(fileBank:FileBank, filename:String):void {
+                       var xml:XML = new XML(fileBank.getAsString(filename));
                        var saved:Object = {};
                        var bg:Object;
                        if (SharedObject.getLocal("user_state").data['background_url']!=undefined) {
@@ -98,11 +91,12 @@ package net.systemeD.potlatch2.collections {
                        collection.forEach(function(bg:Object, index:int, array:Array):void {
                                if (bg.logo) {
                                        // load the logo
-                                       var loader:Loader = new Loader();
-                                       loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(e:Event):void { onLogoLoad(e,bg); });
-                                       loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);
-                                       loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError);
-                                       loader.load(new URLRequest(bg.logo));
+                    FileBank.getInstance().addFromFile(bg.logo, function (fb:FileBank, name:String):void {
+                        bg.logoData = fb.getAsBitmapData(name);
+                        bg.logoWidth = fb.getWidth(name);
+                        bg.logoHeight = fb.getHeight(name);
+                        setLogo();
+                    });
                                }
                                if (bg.attribution_url) {
                                        // load the attribution
@@ -124,13 +118,6 @@ package net.systemeD.potlatch2.collections {
                        // placeholder error routine so exception isn't thrown
                }
                
-               public function onLogoLoad(e:Event, bg:Object):void {
-                       bg.logoData  = Bitmap(LoaderInfo(e.target).content).bitmapData;
-                       bg.logoWidth = e.target.loader.width;
-                       bg.logoHeight= e.target.loader.height;
-                       setLogo();
-               }
-               
                public function onAttributionLoad(e:Event,bg: Object):void {
                        // if we ever need to cope with non-Microsoft attribution, then this should look at bg.scheme
             default xml namespace = Namespace("http://schemas.microsoft.com/search/local/ws/rest/v1");
@@ -156,8 +143,7 @@ package net.systemeD.potlatch2.collections {
                public function setBackground(bg:Object):void {
                        // set background
                        _selected=bg;
-                       if (bg.url=='yahoo') { dispatchEvent(new CollectionEvent(CollectionEvent.SELECT, {url:''})); _yahoo.show(); }
-                                       else { dispatchEvent(new CollectionEvent(CollectionEvent.SELECT, bg      )); _yahoo.hide(); }
+                       dispatchEvent(new CollectionEvent(CollectionEvent.SELECT, bg));
                        // update attribution and logo
                        _overlay.visible=bg.attribution || bg.logo || bg.terms_url;
                        setLogo(); setAttribution(); setTerms();
@@ -249,6 +235,11 @@ package net.systemeD.potlatch2.collections {
                        if (_selected.attribution) positionAttribution();
                }
 
+        [Bindable(event="collection_changed")]
+        public function getCollection():ArrayCollection {
+            return new ArrayCollection(collection);
+        }
+
                [Bindable(event="collection_changed")]
                public function getAvailableImagery():ArrayCollection {
                        var available:Array=[];
index 1ac3f63dd2c799ac284460df2881240f1a4485b0..4cd0989957f755bacf2abb01b1a251bb21d34977 100644 (file)
@@ -3,12 +3,15 @@ package net.systemeD.potlatch2.collections {
        import flash.events.EventDispatcher;
        import flash.events.Event;
        import flash.net.*;
-       import net.systemeD.halcyon.DebugURLRequest;
+       import net.systemeD.halcyon.FileBank;
        import net.systemeD.halcyon.Map;
+       import net.systemeD.halcyon.Stylesheet;
        import net.systemeD.potlatch2.FunctionKeyManager;
-       import net.systemeD.potlatch2.Yahoo;
        import mx.collections.ArrayCollection;
 
+    /**
+    *  A collection of available stylesheets
+    */
        public class Stylesheets extends EventDispatcher {
 
         private static const GLOBAL_INSTANCE:Stylesheets = new Stylesheets();
@@ -16,26 +19,27 @@ package net.systemeD.potlatch2.collections {
 
                private static const DEFAULT:String = 'stylesheets/potlatch.css';
 
-               public var collection:Array=[];
-               private var _selected:String;
+               private var collection:Vector.<Stylesheet> = new Vector.<Stylesheet>;
+               private var _selected:Stylesheet;
 
                /* Load catalogue file */
 
                public function init(request_url:String=null):void {
                        // First, we set _selected in case it's needed before the stylesheet catalogue loads
-                       _selected=request_url;
-                       _selected=_selected ? _selected : SharedObject.getLocal("user_state").data['stylesheet_url'];
-                       _selected=_selected ? _selected : DEFAULT;
+                       var url:String = request_url;
+                       url = url ? url : SharedObject.getLocal("user_state").data['stylesheet_url'];
+                       url = url ? url : DEFAULT;
+
+                       _selected = new Stylesheet("Default", url);
                        
                        // Load the stylesheet catalogue
-                       var request:DebugURLRequest = new DebugURLRequest("stylesheets.xml");
-                       var loader:URLLoader = new URLLoader();
-               loader.addEventListener(Event.COMPLETE, function(e:Event):void { onStylesheetsLoad(e,request_url); });
-               loader.load(request.request);
+            FileBank.getInstance().addFromFile("stylesheets.xml", function (fb:FileBank, name:String):void {
+                onStylesheetsLoad(fb, name, request_url);
+            });
                }
 
-               private function onStylesheetsLoad(event:Event, request_url:String=null):void {
-                       var xml:XML = new XML(URLLoader(event.target).data);
+               private function onStylesheetsLoad(fileBank:FileBank, filename:String, request_url:String=null):void {
+                       var xml:XML = new XML(fileBank.getAsString(filename));
                        var saved_url:String = SharedObject.getLocal("user_state").data['stylesheet_url'];
                        var saved_name:String= SharedObject.getLocal("user_state").data['stylesheet_name'];
                        if (request_url && request_url!=saved_url) { saved_url=request_url; saved_name='Custom'; }
@@ -43,68 +47,86 @@ package net.systemeD.potlatch2.collections {
 
             // first, build the menu from the stylesheet list.
             // Also ensure the saved_url is in the menu (might be either saved from before, or supplied via loaderInfo)
-            collection=new Array();
+            collection = new Vector.<Stylesheet>;
                        for each(var set:XML in xml.stylesheet) {
-                               var obj:Object={};
-                               for (var a:String in set.children()) {
-                                       obj[set.child(a).name()]=set.child(a);
-                               }
-                collection.push(obj);
-                               if (obj.url==saved_url) { isInMenu=true; }
-                               else if (obj.name==saved_name && obj.name!='Custom') { isInMenu=true; saved_url=obj.url; }
+                var corestyle:Boolean = true;
+                if (set.corestyle == "no" || set.corestyle == "false") { corestyle = false }
+
+                var s:Stylesheet = new Stylesheet(set.name, set.url, corestyle);
+                collection.push(s);
+                               if (s.url==saved_url) { isInMenu=true; }
+                               else if (s.name==saved_name && s.name!='Custom') { isInMenu=true; saved_url=s.url; }
                        }
-                       if (saved_url && !isInMenu) { collection.push({ name:saved_name, url:saved_url }); }
+                       if (saved_url && !isInMenu) { collection.push(new Stylesheet(saved_name, saved_url)); }
 
             // pick a stylesheet to be set. It should be the saved one, if it is in the menu
             // or alternatively the first one on the menu,
             // or finally try 'stylesheets/potlatch.css'
-                       for each (var ss:Object in collection) {
+                       for each (var ss:Stylesheet in collection) {
                                if (ss.name==saved_name || ss.url==saved_url) {
-                                       setStylesheet(ss.name, ss.url);
+                                       setStylesheet(ss);
                     isSet = true;
                     break;
                                }
                        }
             if (!isSet) {
               if(collection.length > 0) {
-                var s:Object = collection[0];
-                setStylesheet(s.name, s.url);
+                setStylesheet(collection[0]);
               } else {
                 //hit and hope. FIXME should this be an error state?
-                collection.push({ name:'Potlatch', url:DEFAULT});
-                setStylesheet('Potlatch',DEFAULT);
+                var d:Stylesheet = new Stylesheet('Potlatch', DEFAULT);
+                collection.push(d);
+                setStylesheet(d);
               }
             }
                        FunctionKeyManager.instance().registerListener('Map style',
-                               function(o:String):void { setStylesheet(o,findStylesheetURLWithName(o)); });
+                               function(o:String):void { setStylesheet(findStylesheetWithName(o)); });
                        dispatchEvent(new Event("collection_changed"));
                }
 
-               public function setStylesheet(name:String,url:String):void {
-                       _selected=url;
-                       dispatchEvent(new CollectionEvent(CollectionEvent.SELECT, url));
+               public function setStylesheet(ss:Stylesheet):void {
+                       _selected=ss;
+                       dispatchEvent(new CollectionEvent(CollectionEvent.SELECT, ss.url));
                        var obj:SharedObject = SharedObject.getLocal("user_state");
-                       obj.setProperty("stylesheet_url",url);
-                       obj.setProperty("stylesheet_name",name);
+                       obj.setProperty("stylesheet_url",ss.url);
+                       obj.setProperty("stylesheet_name",ss.name);
                        obj.flush();
                }
-               
-               public function get selected():String { return _selected; }
 
-               private function findStylesheetURLWithName(name:String):String {
-                       for each (var ss:Object in collection) {
-                               if (ss.name==name) { return ss.url; }
+               /** The currently selected stylesheet */
+               public function get selected():Stylesheet { return _selected; }
+
+               private function findStylesheetWithName(name:String):Stylesheet {
+                       for each (var ss:Stylesheet in collection) {
+                               if (ss.name==name) { return ss; }
                        }
-                       return '';
+                       return null;
                }
-               
+
+               /**
+               *  Get the list of core stylesheets
+               */
                [Bindable(event="collection_changed")]
                public function getCollection():ArrayCollection {
                        var available:Array=[];
-                       for each (var ss:Object in collection) {
-                               if (!ss.corestyle || ss.corestyle!='no') available.push(ss);
+                       for each (var ss:Stylesheet in collection) {
+                if (ss.coreStyle == true) {
+                  available.push(ss);
+                }
                        }
                        return new ArrayCollection(available);
                }
+
+               /**
+               *  Get the list of all stylesheets
+               */
+               [Bindable(event="collection_changed")]
+               public function getFullCollection():ArrayCollection {
+            var all:Array=[];
+            for each (var ss:Stylesheet in collection) {
+                all.push(ss);
+            }
+            return new ArrayCollection(all);
+        }
        }
 }
index 8ec7e5fad20aedb92459e4eee421f1920a3c8893..3271048e51b880981bfa634419d052616dd54c60 100644 (file)
@@ -6,7 +6,7 @@ package net.systemeD.potlatch2.collections {
        import net.systemeD.halcyon.Map;
        import net.systemeD.halcyon.MapPaint;
        import net.systemeD.halcyon.connection.Connection;
-       import net.systemeD.halcyon.DebugURLRequest;
+       import net.systemeD.halcyon.FileBank;
        import net.systemeD.potlatch2.utils.*;
                
        public class VectorBackgrounds extends EventDispatcher {
@@ -19,14 +19,11 @@ package net.systemeD.potlatch2.collections {
 
                public function init(map:Map):void {
                        _map = map;
-                       var request:DebugURLRequest = new DebugURLRequest("vectors.xml");
-                       var loader:URLLoader = new URLLoader();
-                       loader.addEventListener(Event.COMPLETE, onConfigLoad);
-                       loader.load(request.request);
+            FileBank.getInstance().addFromFile("vectors.xml", onConfigLoad);
                }
 
-               public function onConfigLoad(e:Event):void {
-                       var xml:XML = XML(e.target.data);
+               private function onConfigLoad(fileBank:FileBank, filename:String):void {
+                       var xml:XML = new XML(fileBank.getAsString(filename));
 
                        // reconstitute results as Array, as we can't run .forEach over an XMLList
                        var sets:Array = [];
@@ -35,98 +32,101 @@ package net.systemeD.potlatch2.collections {
                        // use .forEach to avoid closure problem (http://stackoverflow.com/questions/422784/how-to-fix-closure-problem-in-actionscript-3-as3#3971784)
                        sets.forEach(function(set:XML, index:int, array:Array):void {
 
-                               if (!(set.policyfile == undefined)) {
-                                       Security.loadPolicyFile(String(set.policyfile));
-                               }
+                               // Skip if just an example
+                               if (!(set.@disabled=="true")) {
+
+                                       if (!(set.policyfile == undefined)) {
+                                               Security.loadPolicyFile(String(set.policyfile));
+                                       }
 
-                // Check for any bounds for the vector layer. Obviously won't kick in during subsequent panning
-                var validBbox:Boolean = false;
-                if (set.@minlon && String(set.@minlon) != '') {
-                    if (((_map.edge_l>set.@minlon && _map.edge_l<set.@maxlon) ||
-                         (_map.edge_r>set.@minlon && _map.edge_r<set.@maxlon) ||
-                         (_map.edge_l<set.@minlon && _map.edge_r>set.@maxlon)) &&
-                        ((_map.edge_b>set.@minlat && _map.edge_b<set.@maxlat) ||
-                         (_map.edge_t>set.@minlat && _map.edge_t<set.@maxlat) ||
-                         (_map.edge_b<set.@minlat && _map.edge_t>set.@maxlat))) {
-                        validBbox = true;
-                    } else {
-                        validBbox = false; // out of bounds
-                    }
-                } else {
-                    validBbox = true; // global set
-                }
-
-                               if (set.@disabled == "true") {
-                    // Don't do anything with it. The "disabled" attribute allows examples to appear in the config file
-                               } else if (validBbox) {
-
-                                       var name:String = (set.name == undefined) ? null : String(set.name);
-                                       var loader:String = set.loader;
-                                       switch (loader) {
-                                               case "TrackLoader":
-                                                       break;
-                                               case "KMLImporter":
-                                                       break;
-                                               case "GPXImporter":
-                                                       if (set.url) {
-                                                               if (set.@loaded == "true") {
-                                                                       name ||= 'GPX file';
-                                                                       var gpx_url:String = String(set.url);
-
-                                                                       var connection:Connection = new Connection(name, gpx_url, null, null);
-                                                                       var gpx:GpxImporter=new GpxImporter(connection, _map, [gpx_url],
-                                                                       function(success:Boolean,message:String=null):void {
-                                                                               if (!success) return;
-                                                                               var paint:MapPaint = _map.addLayer(connection, "stylesheets/gpx.css");
-                                                                               paint.updateEntityUIs(false, false);
-                                                                               dispatchEvent(new Event("layers_changed"));
-                                                                       }, false);
+                       // Check for any bounds for the vector layer. Obviously won't kick in during subsequent panning
+                       var validBbox:Boolean = false;
+                       if (set.@minlon && String(set.@minlon) != '') {
+                           if (((_map.edge_l>set.@minlon && _map.edge_l<set.@maxlon) ||
+                                (_map.edge_r>set.@minlon && _map.edge_r<set.@maxlon) ||
+                                (_map.edge_l<set.@minlon && _map.edge_r>set.@maxlon)) &&
+                               ((_map.edge_b>set.@minlat && _map.edge_b<set.@maxlat) ||
+                                (_map.edge_t>set.@minlat && _map.edge_t<set.@maxlat) ||
+                                (_map.edge_b<set.@minlat && _map.edge_t>set.@maxlat))) {
+                               validBbox = true;
+                           } else {
+                               validBbox = false; // out of bounds
+                           }
+                       } else {
+                           validBbox = true; // global set
+                       }
+
+                                       if (validBbox) {
+
+                                               var name:String = (set.name == undefined) ? null : String(set.name);
+                                               var loader:String = set.loader;
+                                               switch (loader) {
+                                                       case "TrackLoader":
+                                                               break;
+                                                       case "KMLImporter":
+                                                               break;
+                                                       case "GPXImporter":
+                                                               if (set.url) {
+                                                                       if (set.@loaded == "true") {
+                                                                               name ||= 'GPX file';
+                                                                               var gpx_url:String = String(set.url);
+
+                                                                               var connection:Connection = new Connection(name, gpx_url, null, null);
+                                                                               var gpx:GpxImporter=new GpxImporter(connection, _map, 
+                                                                               function(connection:Connection,options:Object,success:Boolean,message:String=null):void {
+                                                                                       if (!success) return;
+                                                                                       var paint:MapPaint = _map.addLayer(connection, "stylesheets/gpx.css");
+                                                                                       paint.updateEntityUIs(false, false);
+                                                                                       dispatchEvent(new Event("layers_changed"));
+                                                                               }, false);
+                                                                               gpx.importFromRemoteFiles([gpx_url]);
+                                                                       } else {
+                                                                       trace("VectorBackgrounds: configured but not loaded isn't supported yet");
+                                                                       }
                                                                } else {
-                                                               trace("VectorBackgrounds: configured but not loaded isn't supported yet");
+                                                                       trace("VectorBackgrounds: no url for GPXImporter");
                                                                }
-                                                       } else {
-                                                               trace("VectorBackgrounds: no url for GPXImporter");
-                                                       }
-                                                       break;
-
-                                               case "BugLoader":
-                                                       if (set.url && set.apiKey) {
-                                                               name ||= 'Bugs';
-                                                               var bugLoader:BugLoader = new BugLoader(_map, String(set.url), String(set.apikey), name, String(set.details));
-                                                               if (set.@loaded == "true") {
-                                                                       bugLoader.load();
+                                                               break;
+
+                                                       case "BugLoader":
+                                                               if (set.url && set.apiKey) {
+                                                                       name ||= 'Bugs';
+                                                                       var bugLoader:BugLoader = new BugLoader(_map, String(set.url), String(set.apikey), name, String(set.details));
+                                                                       if (set.@loaded == "true") {
+                                                                               bugLoader.load();
+                                                                       }
+                                                               } else {
+                                                                       trace("VectorBackgrounds: error with BugLoader");
                                                                }
-                                                       } else {
-                                                               trace("VectorBackgrounds: error with BugLoader");
-                                                       }
-                                                       break;
-
-                                               case "BikeShopLoader":
-                                                       if (set.url) {
-                                                               name ||= 'Missing Bike Shops'
-                                                               var bikeShopLoader:BikeShopLoader = new BikeShopLoader(_map, String(set.url), name);
-                                                               if (set.@loaded == "true") {
-                                                                       bikeShopLoader.load();
+                                                               break;
+
+                                                       case "BikeShopLoader":
+                                                               if (set.url) {
+                                                                       name ||= 'Missing Bike Shops'
+                                                                       var bikeShopLoader:BikeShopLoader = new BikeShopLoader(_map, String(set.url), name);
+                                                                       if (set.@loaded == "true") {
+                                                                               bikeShopLoader.load();
+                                                                       }
+                                                               } else {
+                                                                       trace("VectorBackgrounds: no url for BikeShopLoader");
                                                                }
-                                                       } else {
-                                                               trace("VectorBackgrounds: no url for BikeShopLoader");
-                                                       }
-                                                       break;
-
-                                               case "SnapshotLoader":
-                                                       if (set.url) {
-                                                               name ||= 'Snapshot Server'
-                                                               var snapshotLoader:SnapshotLoader = new SnapshotLoader(_map, String(set.url), name, String(set.style));
-                                                               if (set.@loaded == "true") {
-                                                                       snapshotLoader.load();
+                                                               break;
+
+                                                       case "SnapshotLoader":
+                                                               if (set.url) {
+                                                                       name ||= 'Snapshot Server'
+                                                                       var snapshotLoader:SnapshotLoader = new SnapshotLoader(_map, String(set.url), name, String(set.style));
+                                                                       if (set.@loaded == "true") {
+                                                                               snapshotLoader.load();
+                                                                       }
+                                                               } else {
+                                                                       trace("VectorBackgrounds: no url for SnapshotLoader");
                                                                }
-                                                       } else {
-                                                               trace("VectorBackgrounds: no url for SnapshotLoader");
-                                                       }
-                                                       break;
+                                                               break;
 
-                                               default:
-                                                       trace("VectorBackgrounds: unknown loader: " + loader);
+                                                       default:
+                                                               trace("VectorBackgrounds: unknown loader: " + loader);
+                                               }
                                        }
                                }
                        });
index 2ef4fb3384bc8415345b42f754db3b42094e98fc..048f1228bbcb47a82b48e95a722bf10a8f84885b 100644 (file)
@@ -4,8 +4,10 @@ package net.systemeD.potlatch2.controller {
     import net.systemeD.halcyon.Map;
     import net.systemeD.halcyon.MapPaint;
     import net.systemeD.halcyon.connection.*;
+    import net.systemeD.halcyon.AttentionEvent;
     import net.systemeD.potlatch2.collections.Imagery;
     import net.systemeD.potlatch2.EditController;
+    import net.systemeD.potlatch2.history.HistoryDialog;
        import net.systemeD.potlatch2.save.SaveManager;
        import net.systemeD.potlatch2.utils.SnapshotConnection;
        import flash.ui.Keyboard;
@@ -80,6 +82,7 @@ package net.systemeD.potlatch2.controller {
                                case 67:        editableLayer.connection.closeChangeset(); break;                                               // C - close changeset
                                case 68:        editableLayer.alpha=1.3-editableLayer.alpha; return null;                               // D - dim
                                case 71:        FlexGlobals.topLevelApplication.trackLoader.load(); break;                              // G - GPS tracks **FIXME: move from Application to Map
+                case 72:    showHistory(); break;                                                   // H - History
                                case 83:        SaveManager.saveChanges(editableLayer.connection); break;                               // S - save
                                case 84:        controller.tagViewer.togglePanel(); return null;                                                // T - toggle tags panel
                                case 90:        if (!event.shiftKey) { MainUndoStack.getGlobalStack().undo(); return null;}// Z - undo
@@ -140,7 +143,7 @@ package net.systemeD.potlatch2.controller {
                                if ( entity is Node && selectedWay && entity.hasParent(selectedWay) ) {
                                        // select node within this way
                                        return new DragWayNode(selectedWay,  getNodeIndex(selectedWay,entity as Node),  event, false);
-                               } else if ( controller.keyDown(Keyboard.SPACE) ) {
+                               } else if ( controller.spaceHeld ) {
                                        // drag the background imagery to compensate for poor alignment
                                        return new DragBackground(event);
                                } else if (entity && selection.indexOf(entity)>-1) {
@@ -199,8 +202,6 @@ package net.systemeD.potlatch2.controller {
                        MainUndoStack.getGlobalStack().addAction(undo);
                         controller.updateSelectionUI();
                        object.resume();
-
-
                }
                
                /** Remove all tags from current selection. */
@@ -217,6 +218,17 @@ package net.systemeD.potlatch2.controller {
                        for each (item in _selection) item.resume();
                }
 
+        /** Show the history dialog, if only one object is selected. */
+        protected function showHistory():void {
+            if (selectCount == 1) {
+                new HistoryDialog().init(firstSelected);
+            } else if (selectCount == 0) {
+                controller.dispatchEvent(new AttentionEvent(AttentionEvent.ALERT, null, "Can't show history, nothing selected"));
+            } else {
+                controller.dispatchEvent(new AttentionEvent(AttentionEvent.ALERT, null, "Can't show history, multiple objects selected"));
+            }
+        }
+
                /** Create an action to add "source=*" tag to current entity based on background imagery. This is a convenient shorthand for users. */
                protected function setSourceTag():void {
                        if (selectCount!=1) { return; }
@@ -235,7 +247,7 @@ package net.systemeD.potlatch2.controller {
                        for each (var item:Entity in _selection)
                                if (item.id>0) revertable=true;
                        if (revertable)
-                               Alert.show("Revert selected items to the last saved version, discarding your changes?","Are you sure?",Alert.YES | Alert.CANCEL,null,revertHandler);
+                               Alert.show("Revert selected items to the last saved version, discarding your changes?","Are you sure?",Alert.YES | Alert.CANCEL,null,revertHandler,null,Alert.CANCEL);
                }
                protected function revertHandler(event:CloseEvent):void {
                        if (event.detail==Alert.CANCEL) return;