add inventory
authorsstamer <s.stamer@metaways.de>
Tue, 6 Sep 2011 14:24:43 +0000 (16:24 +0200)
committerMichael Spahn <m.spahn@metaways.de>
Thu, 4 Oct 2012 13:54:54 +0000 (15:54 +0200)
52 files changed:
tine20/Inventory/Backend/InventoryItem.php [new file with mode: 0644]
tine20/Inventory/Config.php [new file with mode: 0644]
tine20/Inventory/Controller.php [new file with mode: 0644]
tine20/Inventory/Controller/InventoryItem.php [new file with mode: 0644]
tine20/Inventory/Exception.php [new file with mode: 0644]
tine20/Inventory/Frontend/Cli.php [new file with mode: 0644]
tine20/Inventory/Frontend/Http.php [new file with mode: 0644]
tine20/Inventory/Frontend/Json.php [new file with mode: 0644]
tine20/Inventory/Inventory.jsb2 [new file with mode: 0644]
tine20/Inventory/Model/InventoryItem.php [new file with mode: 0644]
tine20/Inventory/Model/InventoryItemFilter.php [new file with mode: 0644]
tine20/Inventory/Model/Status.php [new file with mode: 0644]
tine20/Inventory/Setup/Initialize.php [new file with mode: 0644]
tine20/Inventory/Setup/setup.xml [new file with mode: 0644]
tine20/Inventory/css/Inventory.css [new file with mode: 0644]
tine20/Inventory/js/Inventory.js [new file with mode: 0644]
tine20/Inventory/js/InventoryItemEditDialog.js [new file with mode: 0644]
tine20/Inventory/js/InventoryItemGridPanel.js [new file with mode: 0644]
tine20/Inventory/js/Model.js [new file with mode: 0644]
tine20/Inventory/translations/bg.mo [new file with mode: 0644]
tine20/Inventory/translations/bg.po [new file with mode: 0644]
tine20/Inventory/translations/ca.mo [new file with mode: 0644]
tine20/Inventory/translations/ca.po [new file with mode: 0644]
tine20/Inventory/translations/cs.mo [new file with mode: 0644]
tine20/Inventory/translations/cs.po [new file with mode: 0644]
tine20/Inventory/translations/de.mo [new file with mode: 0644]
tine20/Inventory/translations/de.po [new file with mode: 0644]
tine20/Inventory/translations/en.mo [new file with mode: 0644]
tine20/Inventory/translations/en.po [new file with mode: 0644]
tine20/Inventory/translations/es.mo [new file with mode: 0644]
tine20/Inventory/translations/es.po [new file with mode: 0644]
tine20/Inventory/translations/fr.mo [new file with mode: 0644]
tine20/Inventory/translations/fr.po [new file with mode: 0644]
tine20/Inventory/translations/hu.mo [new file with mode: 0644]
tine20/Inventory/translations/hu.po [new file with mode: 0644]
tine20/Inventory/translations/it.mo [new file with mode: 0644]
tine20/Inventory/translations/it.po [new file with mode: 0644]
tine20/Inventory/translations/ja.mo [new file with mode: 0644]
tine20/Inventory/translations/ja.po [new file with mode: 0644]
tine20/Inventory/translations/nb.mo [new file with mode: 0644]
tine20/Inventory/translations/nb.po [new file with mode: 0644]
tine20/Inventory/translations/pl.mo [new file with mode: 0644]
tine20/Inventory/translations/pl.po [new file with mode: 0644]
tine20/Inventory/translations/ru.mo [new file with mode: 0644]
tine20/Inventory/translations/ru.po [new file with mode: 0644]
tine20/Inventory/translations/sv.mo [new file with mode: 0644]
tine20/Inventory/translations/sv.po [new file with mode: 0644]
tine20/Inventory/translations/template.pot [new file with mode: 0644]
tine20/Inventory/translations/zh_CN.mo [new file with mode: 0644]
tine20/Inventory/translations/zh_CN.po [new file with mode: 0644]
tine20/Inventory/translations/zh_TW.mo [new file with mode: 0644]
tine20/Inventory/translations/zh_TW.po [new file with mode: 0644]

diff --git a/tine20/Inventory/Backend/InventoryItem.php b/tine20/Inventory/Backend/InventoryItem.php
new file mode 100644 (file)
index 0000000..c0f4a22
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Tine 2.0
+ *
+ * @package     Inventory
+ * @subpackage  Backend
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Philipp Schüle <p.schuele@metaways.de>
+ * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
+ */
+
+
+/**
+ * backend for InventoryItems
+ *
+ * @package     Inventory
+ * @subpackage  Backend
+ */
+class Inventory_Backend_InventoryItem extends Tinebase_Backend_Sql_Abstract
+{
+    /**
+     * Table name without prefix
+     *
+     * @var string
+     */
+    protected $_tableName = 'inventory_item';
+    
+    /**
+     * Model name
+     *
+     * @var string
+     */
+    protected $_modelName = 'Inventory_Model_InventoryItem';
+
+    /**
+     * if modlog is active, we add 'is_deleted = 0' to select object in _getSelect()
+     *
+     * @var boolean
+     */
+    protected $_modlogActive = TRUE;
+
+    /************************ overwritten functions *******************/  
+    
+    /************************ helper functions ************************/
+}
diff --git a/tine20/Inventory/Config.php b/tine20/Inventory/Config.php
new file mode 100644 (file)
index 0000000..6f4a823
--- /dev/null
@@ -0,0 +1,91 @@
+<?php
+/**
+ * @package     Inventory
+ * @subpackage  Config
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Philipp Schüle <p.schuele@metaways.de>
+ * @copyright   Copyright (c) 2011 Metaways Infosystems GmbH (http://www.metaways.de)
+ */
+
+/**
+ * Inventory config class
+ * 
+ * @package     Inventory
+ * @subpackage  Config
+ */
+class Inventory_Config extends Tinebase_Config_Abstract
+{
+    /**
+     * Inventory Status
+     * 
+     * @var string
+     */
+    const INVENTORY_STATUS = 'inventoryStatus';
+    
+    /**
+     * (non-PHPdoc)
+     * @see tine20/Tinebase/Config/Definition::$_properties
+     */
+    protected static $_properties = array(
+        self::INVENTORY_STATUS => array(
+                                   //_('Status Available')
+            'label'                 => 'Status Available',
+                                   //_('Possible status. Please note that additional status might impact other Inventory systems on export or syncronisation.')
+            'description'           => 'Possible status. Please note that additional status might impact other Inventory systems on export or syncronisation.',
+            'type'                  => 'keyFieldConfig',
+            'options'               => array('recordModel' => 'Inventory_Model_Status'),
+            'clientRegistryInclude' => TRUE,
+            'default'               => 'IN-PROCESS'
+        ),
+    );
+    
+    /**
+     * (non-PHPdoc)
+     * @see tine20/Tinebase/Config/Abstract::$_appName
+     */
+    protected $_appName = 'Inventory';
+    
+    /**
+     * holds the instance of the singleton
+     *
+     * @var Tinebase_Config
+     */
+    private static $_instance = NULL;
+    
+    /**
+     * the constructor
+     *
+     * don't use the constructor. use the singleton 
+     */    
+    private function __construct() {}
+    
+    /**
+     * the constructor
+     *
+     * don't use the constructor. use the singleton 
+     */    
+    private function __clone() {}
+    
+    /**
+     * Returns instance of Tinebase_Config
+     *
+     * @return Tinebase_Config
+     */
+    public static function getInstance() 
+    {
+        if (self::$_instance === NULL) {
+            self::$_instance = new self();
+        }
+        
+        return self::$_instance;
+    }
+    
+    /**
+     * (non-PHPdoc)
+     * @see tine20/Tinebase/Config/Abstract::getProperties()
+     */
+    public static function getProperties()
+    {
+        return self::$_properties;
+    }
+}
diff --git a/tine20/Inventory/Controller.php b/tine20/Inventory/Controller.php
new file mode 100644 (file)
index 0000000..e6877b0
--- /dev/null
@@ -0,0 +1,106 @@
+<?php
+/**
+ * Tine 2.0
+ * 
+ * @package     Inventory
+ * @subpackage  Controller
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Cornelius Weiss <c.weiss@metaways.de>
+ * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
+ *
+ */
+
+/**
+ * Inventory Controller (composite)
+ * 
+ * The Inventory 2.0 Controller manages access (acl) to the different backends and supports
+ * a common interface to the servers/views
+ * 
+ * @package Inventory
+ * @subpackage  Controller
+ */
+class Inventory_Controller extends Tinebase_Controller_Event implements Tinebase_Container_Interface
+{
+    /**
+     * the constructor
+     *
+     * don't use the constructor. use the singleton 
+     */
+    private function __construct() {
+        $this->_applicationName = 'Inventory';
+        $this->_currentAccount = Tinebase_Core::getUser();
+    }
+    
+    /**
+     * don't clone. Use the singleton.
+     *
+     */
+    private function __clone() 
+    {        
+    }
+    
+    /**
+     * holds self
+     * @var Inventory_Controller
+     */
+    private static $_instance = NULL;
+    
+    /**
+     * singleton
+     *
+     * @return Inventory_Controller
+     */
+    public static function getInstance() 
+    {
+        if (self::$_instance === NULL) {
+            self::$_instance = new Inventory_Controller();
+        }
+        return self::$_instance;
+    }
+    
+    /**
+     * creates the initial folder for new accounts
+     *
+     * @param mixed[int|Tinebase_Model_User] $_account   the accountd object
+     * @return Tinebase_Record_RecordSet                            of subtype Tinebase_Model_Container
+     */
+    public function createPersonalFolder($_accountId)
+    {
+        $translation = Tinebase_Translation::getTranslation('Inventory');
+        
+        $accountId = Tinebase_Model_User::convertUserIdToInt($_accountId);
+        $account = Tinebase_User::getInstance()->getUserById($accountId);
+        $newContainer = new Tinebase_Model_Container(array(
+            'name'              => sprintf($translation->_("%s's personal inventory items"), $account->accountFullName),
+            'type'              => Tinebase_Model_Container::TYPE_PERSONAL,
+            'backend'           => 'Sql',
+            'application_id'    => Tinebase_Application::getInstance()->getApplicationByName('Inventory')->getId() 
+        ));
+        
+        $personalContainer = Tinebase_Container::getInstance()->addContainer($newContainer, NULL, FALSE, $accountId);
+        $container = new Tinebase_Record_RecordSet('Tinebase_Model_Container', array($personalContainer));
+        
+        return $container;
+    }
+
+    /**
+     * event handler function
+     * 
+     * all events get routed through this function
+     *
+     * @param Tinebase_Event_Abstract $_eventObject the eventObject
+     */
+    protected function _handleEvent(Tinebase_Event_Abstract $_eventObject)
+    {
+        if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . ' (' . __LINE__ . ') handle event of type ' . get_class($_eventObject));
+        
+        switch(get_class($_eventObject)) {
+            case 'Admin_Event_AddAccount':
+                $this->createPersonalFolder($_eventObject->account);
+                break;
+            case 'Admin_Event_DeleteAccount':
+                #$this->deletePersonalFolder($_eventObject->account);
+                break;
+        }
+    }
+}
diff --git a/tine20/Inventory/Controller/InventoryItem.php b/tine20/Inventory/Controller/InventoryItem.php
new file mode 100644 (file)
index 0000000..c28c0ca
--- /dev/null
@@ -0,0 +1,59 @@
+<?php
+/**
+ * InventoryItem controller for Inventory application
+ * 
+ * @package     Inventory
+ * @subpackage  Controller
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Philipp Schüle <p.schuele@metaways.de>
+ * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
+ *
+ */
+
+/**
+ * InventoryItem controller class for Inventory application
+ * 
+ * @package     Inventory
+ * @subpackage  Controller
+ */
+class Inventory_Controller_InventoryItem extends Tinebase_Controller_Record_Abstract
+{
+    /**
+     * the constructor
+     *
+     * don't use the constructor. use the singleton 
+     */
+    private function __construct() {        
+        $this->_applicationName = 'Inventory';
+        $this->_backend = new Inventory_Backend_InventoryItem();
+        $this->_modelName = 'Inventory_Model_InventoryItem';
+        $this->_currentAccount = Tinebase_Core::getUser();   
+        $this->_purgeRecords = FALSE;
+        // activate this if you want to use containers
+        $this->_doContainerACLChecks = FALSE;
+    }    
+    
+    /**
+     * holds the instance of the singleton
+     *
+     * @var Inventory_Controller_InventoryItem
+     */
+    private static $_instance = NULL;
+    
+    /**
+     * the singleton pattern
+     *
+     * @return Inventory_Controller_InventoryItem
+     */
+    public static function getInstance() 
+    {
+        if (self::$_instance === NULL) {
+            self::$_instance = new Inventory_Controller_InventoryItem();
+        }
+        
+        return self::$_instance;
+    }        
+
+    /****************************** overwritten functions ************************/    
+    
+}
diff --git a/tine20/Inventory/Exception.php b/tine20/Inventory/Exception.php
new file mode 100644 (file)
index 0000000..7a9cad3
--- /dev/null
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Tine 2.0
+ * 
+ * @package     Inventory
+ * @subpackage  Exception
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
+ * @author      Philipp Schüle <p.schuele@metaways.de>
+ *
+ */
+
+/**
+ * Inventory exception
+ * 
+ * @package     Inventory
+ * @subpackage  Exception
+ */
+class Inventory_Exception extends Exception
+{
+}
diff --git a/tine20/Inventory/Frontend/Cli.php b/tine20/Inventory/Frontend/Cli.php
new file mode 100644 (file)
index 0000000..a09580b
--- /dev/null
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Tine 2.0
+ * @package     Inventory
+ * @subpackage  Frontend
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Cornelius Weiss <c.weiss@metaways.de>
+ * @copyright   Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
+ */
+
+/**
+ * cli server for timetracker
+ *
+ * This class handles cli requests for the timetracker
+ *
+ * @package     Inventory
+ * @subpackage  Frontend
+ */
+class Inventory_Frontend_Cli
+{
+    /**
+     * the internal name of the application
+     *
+     * @var string
+     */
+    protected $_applicationName = 'Inventory';
+    
+    /**
+     * help array with function names and param descriptions
+     */
+    protected $_help = array(
+        /*
+        'functionName' => array(
+            'description'   => 'function description',
+            'params'        => array()
+            )
+        ),
+        */
+    );
+    
+    /**
+     * echos usage information
+     *
+     */
+    public function getHelp()
+    {
+        foreach ($this->_help as $functionHelp) {
+            echo $functionHelp['description']."\n";
+            echo "parameters:\n";
+            foreach ($functionHelp['params'] as $param => $description) {
+                echo "$param \t $description \n";
+            }
+        }
+    }
+}
diff --git a/tine20/Inventory/Frontend/Http.php b/tine20/Inventory/Frontend/Http.php
new file mode 100644 (file)
index 0000000..549aa96
--- /dev/null
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Tine 2.0
+ *
+ * @package     Inventory
+ * @subpackage  Frontend
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Philipp Schüle <p.schuele@metaways.de>
+ * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
+ */
+
+/**
+ * This class handles all Http requests for the Inventory application
+ *
+ * @package     Inventory
+ * @subpackage  Frontend
+ */
+class Inventory_Frontend_Http extends Tinebase_Frontend_Http_Abstract
+{
+    protected $_applicationName = 'Inventory';
+}
diff --git a/tine20/Inventory/Frontend/Json.php b/tine20/Inventory/Frontend/Json.php
new file mode 100644 (file)
index 0000000..5c73e02
--- /dev/null
@@ -0,0 +1,106 @@
+<?php
+/**
+ * Tine 2.0
+ * @package     Inventory
+ * @subpackage  Frontend
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Philipp Schüle <p.schuele@metaways.de>
+ * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
+ * 
+ */
+
+/**
+ *
+ * This class handles all Json requests for the Inventory application
+ *
+ * @package     Inventory
+ * @subpackage  Frontend
+ */
+class Inventory_Frontend_Json extends Tinebase_Frontend_Json_Abstract
+{
+    /**
+     * the controller
+     *
+     * @var Inventory_Controller_InventoryItem
+     */
+    protected $_controller = NULL;
+    
+    /**
+     * user fields (created_by, ...) to resolve in _multipleRecordsToJson and _recordToJson
+     *
+     * @var array
+     */
+    protected $_resolveUserFields = array(
+        'Inventory_Model_InventoryItem' => array('created_by', 'last_modified_by')
+    );
+    
+    /**
+     * the constructor
+     *
+     */
+    public function __construct()
+    {
+        $this->_applicationName = 'Inventory';
+        $this->_controller = Inventory_Controller_InventoryItem::getInstance();
+    }
+    
+    /**
+     * Search for records matching given arguments
+     *
+     * @param  array $filter
+     * @param  array $paging
+     * @return array
+     */
+    public function searchInventoryItems($filter, $paging)
+    {
+        return $this->_search($filter, $paging, $this->_controller, 'Inventory_Model_InventoryItemFilter', TRUE);
+    }     
+    
+    /**
+     * Return a single record
+     *
+     * @param   string $id
+     * @return  array record data
+     */
+    public function getInventoryItem($id)
+    {
+        return $this->_get($id, $this->_controller);
+    }
+
+    /**
+     * creates/updates a record
+     *
+     * @param  array $recordData
+     * @return array created/updated record
+     */
+    public function saveInventoryItem($recordData)
+    {
+        return $this->_save($recordData, $this->_controller, 'InventoryItem');        
+    }
+    
+    /**
+     * deletes existing records
+     *
+     * @param  array  $ids 
+     * @return string
+     */
+    public function deleteInventoryItems($ids)
+    {
+        return $this->_delete($ids, $this->_controller);
+    }    
+
+    /**
+     * Returns registry data
+     * 
+     * @return array
+     */
+    public function getRegistryData()
+    {   
+        $defaultContainerArray = Tinebase_Container::getInstance()->getDefaultContainer(Tinebase_Core::getUser()->getId(), $this->_applicationName)->toArray();
+        $defaultContainerArray['account_grants'] = Tinebase_Container::getInstance()->getGrantsOfAccount(Tinebase_Core::getUser(), $defaultContainerArray['id'])->toArray();
+        
+        return array(
+            'defaultContainer' => $defaultContainerArray
+        );
+    }
+}
diff --git a/tine20/Inventory/Inventory.jsb2 b/tine20/Inventory/Inventory.jsb2
new file mode 100644 (file)
index 0000000..271e0aa
--- /dev/null
@@ -0,0 +1,44 @@
+{
+  "projectName": "Tine 2.0 - Inventory",
+  "deployDir": "Inventory",
+  "licenseText": "Tine 2.0 - Inventory \nCopyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)\nhttp://www.gnu.org/licenses/agpl.html AGPL Version 3",
+  "resources": [
+    
+  ],
+  "pkgs": [
+    {
+      "name": "Inventory FAT Client",
+      "file": "js/Inventory-FAT.js",
+      "isDebug": true,
+      "fileIncludes": [
+        {
+          "text": "Model.js",
+          "path": "js/"
+        },
+        {
+          "text": "Inventory.js",
+          "path": "js/"
+        },
+        {
+          "text": "InventoryItemGridPanel.js",
+          "path": "js/"
+        },
+        {
+          "text": "InventoryItemEditDialog.js",
+          "path": "js/"
+        }
+      ]
+    },
+    {
+      "name": "Inventory FAT Client",
+      "file": "css/Inventory-FAT.css",
+      "isDebug": true,
+      "fileIncludes": [
+        {
+          "text": "Inventory.css",
+          "path": "css/"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/tine20/Inventory/Model/InventoryItem.php b/tine20/Inventory/Model/InventoryItem.php
new file mode 100644 (file)
index 0000000..ba306fd
--- /dev/null
@@ -0,0 +1,101 @@
+<?php
+/**
+ * class to hold InventoryItem data
+ * 
+ * @package     Inventory
+ * @subpackage  Model
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Philipp Schüle <p.schuele@metaways.de>
+ * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
+ * 
+ */
+
+/**
+ * class to hold InventoryItem data
+ * 
+ * @package     Inventory
+ * @subpackage  Model
+ */
+class Inventory_Model_InventoryItem extends Tinebase_Record_Abstract
+{  
+    /**
+     * key in $_validators/$_properties array for the filed which 
+     * represents the identifier
+     * 
+     * @var string
+     */    
+    protected $_identifier = 'id';    
+    
+    /**
+     * application the record belongs to
+     *
+     * @var string
+     */
+    protected $_application = 'Inventory';
+
+    /**
+     * list of zend validator
+     * 
+     * this validators get used when validating user generated content with Zend_Input_Filter
+     *
+     * @var array
+     */
+    protected $_validators = array(
+        'id'                    => array(Zend_Filter_Input::ALLOW_EMPTY => true),
+        'name'                  => array(Zend_Filter_Input::ALLOW_EMPTY => true),
+        'status'                => array(Zend_Filter_Input::ALLOW_EMPTY => true),
+        'container_id'          => array(Zend_Filter_Input::ALLOW_EMPTY => false, 'presence'=>'required'),
+    // @todo add more fields
+    // modlog information
+        'created_by'            => array(Zend_Filter_Input::ALLOW_EMPTY => true),
+        'creation_time'         => array(Zend_Filter_Input::ALLOW_EMPTY => true),
+        'last_modified_by'      => array(Zend_Filter_Input::ALLOW_EMPTY => true),
+        'last_modified_time'    => array(Zend_Filter_Input::ALLOW_EMPTY => true),
+        'is_deleted'            => array(Zend_Filter_Input::ALLOW_EMPTY => true),
+        'deleted_time'          => array(Zend_Filter_Input::ALLOW_EMPTY => true),
+        'deleted_by'            => array(Zend_Filter_Input::ALLOW_EMPTY => true),
+    // relations (linked Inventory_Model_InventoryItem records) and other metadata
+        'relations'             => array(Zend_Filter_Input::ALLOW_EMPTY => true, Zend_Filter_Input::DEFAULT_VALUE => NULL),
+        'tags'                  => array(Zend_Filter_Input::ALLOW_EMPTY => true),    
+        'notes'                 => array(Zend_Filter_Input::ALLOW_EMPTY => true),
+    );
+
+    /**
+     * name of fields containing datetime or an array of datetime information
+     *
+     * @var array list of datetime fields
+     */    
+    protected $_datetimeFields = array(
+        'creation_time',
+        'last_modified_time',
+        'deleted_time'
+    );
+    
+    /**
+     * overwrite constructor to add more filters
+     *
+     * @param mixed $_data
+     * @param bool $_bypassFilters
+     * @param mixed $_convertDates
+     * @return void
+     */
+    public function __construct($_data = NULL, $_bypassFilters = false, $_convertDates = true)
+    {
+        // do something here if you like (add default empty values, ...)
+        
+        return parent::__construct($_data, $_bypassFilters, $_convertDates);
+    }
+
+    /**
+     * fills a record from json data
+     *
+     * @param string $_data json encoded data
+     * @return void
+     */
+    public function setFromJson($_data)
+    {
+        parent::setFromJson($_data);
+        
+        // do something here if you like
+    }
+}
diff --git a/tine20/Inventory/Model/InventoryItemFilter.php b/tine20/Inventory/Model/InventoryItemFilter.php
new file mode 100644 (file)
index 0000000..7f3f4c9
--- /dev/null
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Tine 2.0
+ * 
+ * @package     Inventory
+ * @subpackage  Model
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Philipp Schüle <p.schuele@metaways.de>
+ * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
+ *
+ */
+
+/**
+ * InventoryItem filter Class
+ * 
+ * @package     Inventory
+ * @subpackage  Model
+ */
+class Inventory_Model_InventoryItemFilter extends Tinebase_Model_Filter_FilterGroup 
+{
+    /**
+     * @var string application of this filter group
+     */
+    protected $_applicationName = 'Inventory';
+    
+    /**
+     * @var string name of model this filter group is designed for
+     */
+    protected $_modelName = 'Inventory_Model_InventoryItem';
+    
+    /**
+     * @var array filter model fieldName => definition
+     */
+    protected $_filterModel = array(
+        'query'          => array('filter' => 'Tinebase_Model_Filter_Query', 'options' => array('fields' => array('name', /*'...'*/))),
+        'container_id'   => array('filter' => 'Tinebase_Model_Filter_Container', 'options' => array('applicationName' => 'Inventory')),
+        'id'             => array('filter' => 'Tinebase_Model_Filter_Id'),
+        'status'         => array('filter' => 'Tinebase_Model_Filter_Text'),
+        'tag'            => array('filter' => 'Tinebase_Model_Filter_Tag', 'options' => array('idProperty' => 'inventory_item.id')),
+    
+        // modlog filters
+        'last_modified_time'   => array('filter' => 'Tinebase_Model_Filter_Date'),
+        'deleted_time'         => array('filter' => 'Tinebase_Model_Filter_DateTime'),
+        'creation_time'        => array('filter' => 'Tinebase_Model_Filter_Date'),
+        'last_modified_by'     => array('filter' => 'Tinebase_Model_Filter_User'),
+        'created_by'           => array('filter' => 'Tinebase_Model_Filter_User'),
+    
+        // @todo add filters
+        /*
+        'title'          => array('filter' => 'Tinebase_Model_Filter_Text'),
+        'number'         => array('filter' => 'Tinebase_Model_Filter_Text'),
+        'description'    => array('filter' => 'Tinebase_Model_Filter_Text'),
+        */
+    );
+}
diff --git a/tine20/Inventory/Model/Status.php b/tine20/Inventory/Model/Status.php
new file mode 100644 (file)
index 0000000..fe415ff
--- /dev/null
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Tine 2.0
+ * 
+ * @package     Inventory
+ * @subpackage  Model
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Philipp Schüle <p.schuele@metaways.de>
+ * @copyright   Copyright (c) 2011 Metaways Infosystems GmbH (http://www.metaways.de)
+ *
+ */
+
+/**
+ * Status Record Class
+ * 
+ * @package     Inventory
+ * @subpackage  Model
+ */
+class Inventory_Model_Status extends Tinebase_Config_KeyFieldRecord
+{
+    /**
+     * application the record belongs to
+     *
+     * @var string
+     */
+    protected $_application = 'Inventory';
+    
+    /**
+     * (non-PHPdoc)
+     * @see tine20/Tinebase/Record/Abstract::$_validators
+     */
+    protected $_validators = array(
+        // tine record fields
+        'id'                   => array('allowEmpty' => true,         ),
+        'created_by'           => array('allowEmpty' => true,         ),
+        'creation_time'        => array('allowEmpty' => true          ),
+        'last_modified_by'     => array('allowEmpty' => true          ),
+        'last_modified_time'   => array('allowEmpty' => true          ),
+        'is_deleted'           => array('allowEmpty' => true          ),
+        'deleted_time'         => array('allowEmpty' => true          ),
+        'deleted_by'           => array('allowEmpty' => true          ),
+        'seq'                  => array('allowEmpty' => true,  'Int'  ),
+    
+        // key field record specific
+        'value'                => array('allowEmpty' => false         ),
+        'icon'                 => array('allowEmpty' => true          ),
+        'system'               => array('allowEmpty' => true,  'Int'  ),
+        'is_open'              => array('allowEmpty' => true,  'Int'  ),
+    );
+}
diff --git a/tine20/Inventory/Setup/Initialize.php b/tine20/Inventory/Setup/Initialize.php
new file mode 100644 (file)
index 0000000..95a757e
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Tine 2.0
+ * 
+ * @package     Inventory
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Jonas Fischer <j.fischer@metaways.de>
+ * @copyright   Copyright (c) 2008-2011 Metaways Infosystems GmbH (http://www.metaways.de)
+ *
+ */
+
+/**
+ * class for Inventory initialization
+ * 
+ * @package     Setup
+ */
+class Inventory_Setup_Initialize extends Setup_Initialize
+{
+    /**
+     * init key fields
+     */
+    protected function _initializeKeyFields()
+    {
+        // create status config
+        $cb = new Tinebase_Backend_Sql(array(
+            'modelName' => 'Tinebase_Model_Config', 
+            'tableName' => 'config',
+        ));
+        
+        $statusConfig = array(
+            'name'    => Inventory_Config::INVENTORY_STATUS,
+            'records' => array(
+                array('id' => 'COMPLETED',    'value' => 'Completed',   'is_open' => 0, 'icon' => 'images/oxygen/16x16/actions/ok.png',                   'system' => true), //_('Completed')
+                array('id' => 'CANCELLED',    'value' => 'Cancelled',   'is_open' => 0, 'icon' => 'images/oxygen/16x16/actions/dialog-cancel.png',        'system' => true), //_('Cancelled')
+                array('id' => 'IN-PROCESS',   'value' => 'In process',  'is_open' => 1, 'icon' => 'images/oxygen/16x16/actions/view-refresh.png',         'system' => true), //_('In process')
+            ),
+        );
+        
+        $cb->create(new Tinebase_Model_Config(array(
+            'application_id'    => Tinebase_Application::getInstance()->getApplicationByName('Inventory')->getId(),
+            'name'              => Inventory_Config::INVENTORY_STATUS,
+            'value'             => json_encode($statusConfig),
+        )));
+    }    
+}
diff --git a/tine20/Inventory/Setup/setup.xml b/tine20/Inventory/Setup/setup.xml
new file mode 100644 (file)
index 0000000..9b138ba
--- /dev/null
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<application>
+    <name>Inventory</name>
+    <!-- gettext('Inventory') -->   
+    <version>0.1</version>
+    <order>60</order>
+    <status>disabled</status>
+    <tables>
+        <table>
+            <name>inventory_item</name>
+            <version>1</version>
+            <declaration>
+                <field>
+                    <name>id</name>
+                    <type>text</type>
+                    <length>40</length>
+                    <notnull>true</notnull>
+                </field>
+                <field>
+                    <name>container_id</name>
+                    <type>integer</type>
+                    <notnull>false</notnull>
+                </field>
+                <field>
+                    <name>name</name>
+                    <type>text</type>
+                    <length>255</length>
+                    <notnull>true</notnull>
+                </field>
+                <!-- keyfield 'status' -->
+                <field>
+                    <name>status</name>
+                    <type>text</type>
+                    <length>40</length>
+                    <default>IN-PROCESS</default>
+                    <notnull>true</notnull>
+                </field>
+                <!-- add more fields here -->
+                <!-- defaults for tine system -->
+                <field>
+                    <name>created_by</name>
+                    <type>text</type>
+                    <length>40</length>
+                </field>
+                <field>
+                    <name>creation_time</name>
+                    <type>datetime</type>
+                </field> 
+                <field>
+                    <name>last_modified_by</name>
+                    <type>text</type>
+                    <length>40</length>
+                </field>
+                <field>
+                    <name>last_modified_time</name>
+                    <type>datetime</type>
+                </field>
+                <field>
+                    <name>is_deleted</name>
+                    <type>boolean</type>
+                    <default>false</default>
+                </field>
+                <field>
+                    <name>deleted_by</name>
+                    <type>text</type>
+                    <length>40</length>
+                </field>            
+                <field>
+                    <name>deleted_time</name>
+                    <type>datetime</type>
+                </field>
+                <index>
+                    <name>id</name>
+                    <primary>true</primary>
+                    <field>
+                        <name>id</name>
+                    </field>
+                </index>
+                <index>
+                    <name>container_id</name>
+                    <field>
+                        <name>container_id</name>
+                    </field>
+                </index>
+            </declaration>
+        </table>
+    </tables>
+</application>
diff --git a/tine20/Inventory/css/Inventory.css b/tine20/Inventory/css/Inventory.css
new file mode 100644 (file)
index 0000000..c0fc30b
--- /dev/null
@@ -0,0 +1,19 @@
+/**
+ * Tine 2.0
+ * 
+ * @package     Inventory
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Philipp Schüle <p.schuele@metaways.de>
+ * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
+ *
+ */
+.InventoryIconCls {
+    background-image:url(../../images/oxygen/16x16/actions/document-open-recent.png) !important;
+}
+.x-btn-medium .InventoryIconCls {
+    background-image:url(../../images/oxygen/22x22/actions/document-open-recent.png) !important;
+}
+.x-btn-large .InventoryIconCls {
+    background-image:url(../../images/oxygen/32x32/actions/document-open-recent.png) !important;
+}
\ No newline at end of file
diff --git a/tine20/Inventory/js/Inventory.js b/tine20/Inventory/js/Inventory.js
new file mode 100644 (file)
index 0000000..bbd631b
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Tine 2.0
+ * 
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Philipp Schüle <p.schuele@metaways.de>
+ * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
+ */
+Ext.ns('Tine.Inventory');
+
+/**
+ * @namespace   Tine.Inventory
+ * @class       Tine.Inventory.Application
+ * @extends     Tine.Tinebase.Application
+ * 
+ * @author      Cornelius Weiss <c.weiss@metaways.de>
+ */
+Tine.Inventory.Application = Ext.extend(Tine.Tinebase.Application, {
+    /**
+     * Get translated application title of the calendar application
+     * 
+     * @return {String}
+     */
+    getTitle: function() {
+        return this.i18n.gettext('Inventory');
+    }
+});
+
+/**
+ * @namespace   Tine.Inventory
+ * @class       Tine.Inventory.MainScreen
+ * @extends     Tine.widgets.MainScreen
+ * 
+ * @author      Cornelius Weiss <c.weiss@metaways.de>
+ */
+Tine.Inventory.MainScreen = Ext.extend(Tine.widgets.MainScreen, {
+    activeContentType: 'InventoryItem'
+});
+    
+/**
+ * @namespace   Tine.Inventory
+ * @class       Tine.Inventory.TreePanel
+ * @extends     Tine.widgets.container.TreePanel
+ * 
+ * @author      Cornelius Weiss <c.weiss@metaways.de>
+ */
+Tine.Inventory.TreePanel = Ext.extend(Tine.widgets.container.TreePanel, {
+    id: 'Inventory_Tree',
+    filterMode: 'filterToolbar',
+    recordClass: Tine.Inventory.Model.InventoryItem
+});
+
+/**
+ * favorites panel
+ * 
+ * @class       Tine.Inventory.FilterPanel
+ * @extends     Tine.widgets.persistentfilter.PickerPanel
+ *  
+ * @param {Object} config
+ */
+Tine.Inventory.FilterPanel = function(config) {
+    Ext.apply(this, config);
+    Tine.Inventory.FilterPanel.superclass.constructor.call(this);
+};
+Ext.extend(Tine.Inventory.FilterPanel, Tine.widgets.persistentfilter.PickerPanel, {
+    filter: [{field: 'model', operator: 'equals', value: 'Inventory_Model_InventoryItemFilter'}]
+});
diff --git a/tine20/Inventory/js/InventoryItemEditDialog.js b/tine20/Inventory/js/InventoryItemEditDialog.js
new file mode 100644 (file)
index 0000000..61c038b
--- /dev/null
@@ -0,0 +1,165 @@
+/*
+ * Tine 2.0
+ * 
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Cornelius Weiss <c.weiss@metaways.de>
+ * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
+ */
+Ext.ns('Tine.Inventory');
+
+/**
+ * @namespace   Tine.Inventory
+ * @class       Tine.Inventory.InventoryItemEditDialog
+ * @extends     Tine.widgets.dialog.EditDialog
+ * 
+ * <p>InventoryItem Compose Dialog</p>
+ * <p></p>
+ * 
+ *  @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Cornelius Weiss <c.weiss@metaways.de>
+ * @copyright   Copyright (c) 2007-2008 Metaways Infosystems GmbH (http://www.metaways.de)
+ * 
+ * @param       {Object} config
+ * @constructor
+ * Create a new Tine.Inventory.InventoryItemEditDialog
+ */
+Tine.Inventory.InventoryItemEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog, {
+    
+    /**
+     * @private
+     */
+    windowNamePrefix: 'InventoryItemEditWindow_',
+    appName: 'Inventory',
+    recordClass: Tine.Inventory.Model.InventoryItem,
+    recordProxy: Tine.Inventory.recordBackend,
+    loadRecord: false,
+    tbarItems: [{xtype: 'widget-activitiesaddbutton'}],
+    evalGrants: true,
+    showContainerSelector: true,
+    
+    /**
+     * overwrite update toolbars function (we don't have record grants yet)
+     * @private
+     */
+    updateToolbars: function() {
+
+    },
+    
+    /**
+     * executed after record got updated from proxy
+     * 
+     * @private
+     */
+    onRecordLoad: function() {
+       // you can do something here
+
+       Tine.Inventory.InventoryItemEditDialog.superclass.onRecordLoad.call(this);        
+    },
+    
+    /**
+     * executed when record gets updated from form
+     * - add attachments to record here
+     * 
+     * @private
+     */
+    onRecordUpdate: function() {
+        Tine.Inventory.InventoryItemEditDialog.superclass.onRecordUpdate.call(this);
+        
+        // you can do something here    
+    },
+    
+    /**
+     * returns dialog
+     * 
+     * NOTE: when this method gets called, all initalisation is done.
+     * 
+     * @return {Object}
+     * @private
+     */
+    getFormItems: function() {
+        return {
+            xtype: 'tabpanel',
+            border: false,
+            plain:true,
+            activeTab: 0,
+            border: false,
+            items:[{               
+                title: this.app.i18n._('InventoryItem'),
+                autoScroll: true,
+                border: false,
+                frame: true,
+                layout: 'border',
+                items: [{
+                    region: 'center',
+                    xtype: 'columnform',
+                    labelAlign: 'top',
+                    formDefaults: {
+                        xtype:'textfield',
+                        anchor: '100%',
+                        labelSeparator: '',
+                        columnWidth: .333
+                    },
+                    items: [[{
+                        columnWidth: 1,
+                        fieldLabel: this.app.i18n._('Name'),
+                        name: 'name',
+                        allowBlank: false
+                        }], [new Tine.Tinebase.widgets.keyfield.ComboBox({
+                            app: 'Inventory',
+                            keyFieldName: 'inventoryStatus',
+                            fieldLabel: this.app.i18n._('Status'),
+                            name: 'status',
+                            columnWidth: 0.5
+                        })]
+                    ] 
+                }, {
+                    // activities and tags
+                    layout: 'accordion',
+                    animate: true,
+                    region: 'east',
+                    width: 210,
+                    split: true,
+                    collapsible: true,
+                    collapseMode: 'mini',
+                    header: false,
+                    margins: '0 5 0 5',
+                    border: true,
+                    items: [
+                    new Tine.widgets.activities.ActivitiesPanel({
+                        app: 'Inventory',
+                        showAddNoteForm: false,
+                        border: false,
+                        bodyStyle: 'border:1px solid #B5B8C8;'
+                    }),
+                    new Tine.widgets.tags.TagPanel({
+                        app: 'Inventory',
+                        border: false,
+                        bodyStyle: 'border:1px solid #B5B8C8;'
+                    })]
+                }]
+            }, new Tine.widgets.activities.ActivitiesTabPanel({
+                app: this.appName,
+                record_id: this.record.id,
+                record_model: this.appName + '_Model_' + this.recordClass.getMeta('modelName')
+            })]
+        };
+    }
+});
+
+/**
+ * Inventory Edit Popup
+ * 
+ * @param   {Object} config
+ * @return  {Ext.ux.Window}
+ */
+Tine.Inventory.InventoryItemEditDialog.openWindow = function (config) {
+    var id = (config.record && config.record.id) ? config.record.id : 0;
+    var window = Tine.WindowFactory.getWindow({
+        width: 800,
+        height: 470,
+        name: Tine.Inventory.InventoryItemEditDialog.prototype.windowNamePrefix + id,
+        contentPanelConstructor: 'Tine.Inventory.InventoryItemEditDialog',
+        contentPanelConstructorConfig: config
+    });
+    return window;
+};
diff --git a/tine20/Inventory/js/InventoryItemGridPanel.js b/tine20/Inventory/js/InventoryItemGridPanel.js
new file mode 100644 (file)
index 0000000..cf5eac0
--- /dev/null
@@ -0,0 +1,139 @@
+/*
+ * Tine 2.0
+ * 
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Philipp Schüle <p.schuele@metaways.de>
+ * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
+ */
+Ext.ns('Tine.Inventory');
+
+/**
+ * InventoryItem grid panel
+ * 
+ * @namespace   Tine.Inventory
+ * @class       Tine.Inventory.InventoryItemGridPanel
+ * @extends     Tine.widgets.grid.GridPanel
+ * 
+ * <p>InventoryItem Grid Panel</p>
+ * <p><pre>
+ * </pre></p>
+ * 
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Philipp Schuele <p.schuele@metaways.de>
+ * @copyright   Copyright (c) 2007-2008 Metaways Infosystems GmbH (http://www.metaways.de)
+ * 
+ * @param       {Object} config
+ * @constructor
+ * Create a new Tine.Inventory.InventoryItemGridPanel
+ */
+Tine.Inventory.InventoryItemGridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
+    /**
+     * record class
+     * @cfg {Tine.Inventory.Model.InventoryItem} recordClass
+     */
+    recordClass: Tine.Inventory.Model.InventoryItem,
+   
+    /**
+     * eval grants
+     * @cfg {Boolean} evalGrants
+     */
+    evalGrants: true,
+    
+    /**
+     * grid specific
+     * @private
+     */
+    defaultSortInfo: {field: 'creation_time', direction: 'DESC'},
+    gridConfig: {
+        autoExpandColumn: 'name'
+    },
+     
+    /**
+     * inits this cmp
+     * @private
+     */
+    initComponent: function() {
+        this.recordProxy = Tine.Inventory.recordBackend;
+        
+        this.gridConfig.cm = this.getColumnModel();
+        this.filterToolbar = this.filterToolbar || this.getFilterToolbar();
+        
+        this.plugins = this.plugins || [];
+        this.plugins.push(this.filterToolbar);
+        
+        Tine.Inventory.InventoryItemGridPanel.superclass.initComponent.call(this);
+    },
+    
+    /**
+     * returns cm
+     * 
+     * @return Ext.grid.ColumnModel
+     * @private
+     * 
+     * TODO    add more columns
+     */
+    getColumnModel: function(){
+        return new Ext.grid.ColumnModel({ 
+            defaults: {
+                sortable: true,
+                resizable: true
+            },
+            columns: [{
+                id: 'name',
+                header: this.app.i18n._("Name"),
+                width: 100,
+                sortable: true,
+                dataIndex: 'name'
+            }, {
+                id: 'status',
+                header: this.app.i18n._("Status"),
+                width: 150,
+                sortable: true,
+                dataIndex: 'status',
+                renderer: Tine.Tinebase.widgets.keyfield.Renderer.get('Inventory', 'inventoryStatus')
+            }/*,{
+                id: 'title',
+                header: this.app.i18n._("Title"),
+                width: 350,
+                sortable: true,
+                dataIndex: 'title'
+            },{
+                id: 'budget',
+                header: this.app.i18n._("Budget"),
+                width: 100,
+                sortable: true,
+                dataIndex: 'budget'
+            }*/].concat(this.getModlogColumns())
+        });
+    },
+    
+    /**
+     * status column renderer
+     * @param {string} value
+     * @return {string}
+     */
+    statusRenderer: function(value) {
+        return this.app.i18n._hidden(value);
+    },
+    
+    /**
+     * return additional tb items
+     * @private
+     */
+    getToolbarItems: function(){
+       /*
+        this.action_showClosedToggle = new Tine.widgets.grid.FilterButton({
+            text: this.app.i18n._('Show closed'),
+            iconCls: 'action_showArchived',
+            field: 'showClosed'
+        });
+        */
+        
+        return [
+            /*
+            new Ext.Toolbar.Separator(),
+            this.action_showClosedToggle
+            */
+        ];
+    }    
+});
diff --git a/tine20/Inventory/js/Model.js b/tine20/Inventory/js/Model.js
new file mode 100644 (file)
index 0000000..96e8cea
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * Tine 2.0
+ * 
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Cornelius Weiss <c.weiss@metaways.de>
+ * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
+ */
+Ext.ns('Tine.Inventory.Model');
+
+/**
+ * @namespace   Tine.Inventory.Model
+ * @class       Tine.Inventory.Model.InventoryItem
+ * @extends     Tine.Tinebase.data.Record
+ * inventory record definition
+ * 
+ * @author      Cornelius Weiss <c.weiss@metaways.de>
+ */
+Tine.Inventory.Model.InventoryItem = Tine.Tinebase.data.Record.create(Tine.Tinebase.Model.genericFields.concat([
+    { name: 'id' },
+    { name: 'name' },
+    { name: 'status' },
+    // TODO add more record fields here
+    // tine 2.0 notes + tags
+    { name: 'notes'},
+    { name: 'tags' }
+]), {
+    appName: 'Inventory',
+    modelName: 'InventoryItem',
+    idProperty: 'id',
+    titleProperty: 'title',
+    // ngettext('inventory item', 'inventory records', n);
+    recordName: 'inventory item',
+    recordsName: 'inventory items',
+    containerProperty: 'container_id',
+    // ngettext('inventory record list', 'inventory record lists', n);
+    containerName: 'inventory item list',
+    containersName: 'inventory item lists'
+});
+
+/**
+ * @namespace Tine.Inventory.Model
+ * 
+ * get default data for a new record
+ *  
+ * @return {Object} default data
+ * @static
+ */ 
+Tine.Inventory.Model.InventoryItem.getDefaultData = function() { 
+    var app = Tine.Tinebase.appMgr.get('Inventory');
+    var defaultsContainer = Tine.Inventory.registry.get('defaultContainer');
+    
+    return {
+        container_id: app.getMainScreen().getWestPanel().getContainerTreePanel().getDefaultContainer()
+        // [...] add more defaults
+    };
+};
+
+/**
+ * get filtermodel of record
+ * 
+ * @namespace Tine.Inventory.Model
+ * @static
+ * @return {Object} filterModel definition
+ */ 
+Tine.Inventory.Model.InventoryItem.getFilterModel = function() {
+    var app = Tine.Tinebase.appMgr.get('Inventory');
+    
+    return [
+        {label: _('Quick search'),    field: 'query',       operators: ['contains']},
+        {
+            label: app.i18n._('Status'),
+            field: 'status',
+            filtertype: 'tine.widget.keyfield.filter', 
+            app: app, 
+            keyfieldName: 'inventoryStatus'
+        },
+        {filtertype: 'tinebase.tag', app: app},
+        {filtertype: 'tine.widget.container.filtermodel', app: app, recordClass: Tine.Inventory.Model.InventoryItem},
+        {label: app.i18n._('Last modified'),                                            field: 'last_modified_time', valueType: 'date'},
+        {label: app.i18n._('Last modifier'),                                            field: 'last_modified_by',   valueType: 'user'},
+        {label: app.i18n._('Creation Time'),                                            field: 'creation_time',      valueType: 'date'},
+        {label: app.i18n._('Creator'),                                                  field: 'created_by',         valueType: 'user'}
+    ];
+};
+
+/**
+ * default InventoryItem backend
+ */
+Tine.Inventory.recordBackend = new Tine.Tinebase.data.RecordProxy({
+    appName: 'Inventory',
+    modelName: 'InventoryItem',
+    recordClass: Tine.Inventory.Model.InventoryItem
+});
diff --git a/tine20/Inventory/translations/bg.mo b/tine20/Inventory/translations/bg.mo
new file mode 100644 (file)
index 0000000..896099a
Binary files /dev/null and b/tine20/Inventory/translations/bg.mo differ
diff --git a/tine20/Inventory/translations/bg.po b/tine20/Inventory/translations/bg.po
new file mode 100644 (file)
index 0000000..bcdbb30
--- /dev/null
@@ -0,0 +1,68 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Tine 2.0 - ExampleApplication\n"
+"POT-Creation-Date: 2008-05-17 22:12+0100\n"
+"PO-Revision-Date: 2008-07-29 21:14+0100\n"
+"Last-Translator: Cornelius Weiss <c.weiss@metaways.de>\n"
+"Language-Team: Tine 2.0 Translators\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Bulgarian\n"
+"X-Poedit-Country: \n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: js/ExampleApplication.js:25
+msgid "Example Application"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:74
+msgid "Quick search"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:102 js/ExampleRecordEditDialog.js:104
+msgid "Name"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:108
+msgid "Title"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:114
+msgid "Status"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:121
+msgid "Budget"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:145
+msgid "Show closed"
+msgstr ""
+
+#: js/ExampleRecordEditDialog.js:87
+msgid "ExampleRecord"
+msgstr ""
+
+#: js/Model.js:31
+msgid "example record"
+msgid_plural "example records"
+msgstr[0] ""
+msgstr[1] ""
+
+#: js/Model.js:35
+msgid "example record list"
+msgid_plural "example record lists"
+msgstr[0] ""
+msgstr[1] ""
+
+#: Setup/setup.xml:10
+msgid "ExampleApplication"
+msgstr ""
+
+#: Controller.php:96
+#, python-format
+msgid "%s's personal example records"
+msgstr ""
diff --git a/tine20/Inventory/translations/ca.mo b/tine20/Inventory/translations/ca.mo
new file mode 100644 (file)
index 0000000..097f79c
Binary files /dev/null and b/tine20/Inventory/translations/ca.mo differ
diff --git a/tine20/Inventory/translations/ca.po b/tine20/Inventory/translations/ca.po
new file mode 100644 (file)
index 0000000..6e83595
--- /dev/null
@@ -0,0 +1,68 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Tine 2.0 - ExampleApplication\n"
+"POT-Creation-Date: 2008-05-17 22:12+0100\n"
+"PO-Revision-Date: 2008-07-29 21:14+0100\n"
+"Last-Translator: Cornelius Weiss <c.weiss@metaways.de>\n"
+"Language-Team: Tine 2.0 Translators\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Catalan\n"
+"X-Poedit-Country: NOT SPECIFIED / ANY\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: js/ExampleApplication.js:25
+msgid "Example Application"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:74
+msgid "Quick search"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:102 js/ExampleRecordEditDialog.js:104
+msgid "Name"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:108
+msgid "Title"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:114
+msgid "Status"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:121
+msgid "Budget"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:145
+msgid "Show closed"
+msgstr ""
+
+#: js/ExampleRecordEditDialog.js:87
+msgid "ExampleRecord"
+msgstr ""
+
+#: js/Model.js:31
+msgid "example record"
+msgid_plural "example records"
+msgstr[0] ""
+msgstr[1] ""
+
+#: js/Model.js:35
+msgid "example record list"
+msgid_plural "example record lists"
+msgstr[0] ""
+msgstr[1] ""
+
+#: Setup/setup.xml:10
+msgid "ExampleApplication"
+msgstr ""
+
+#: Controller.php:96
+#, python-format
+msgid "%s's personal example records"
+msgstr ""
diff --git a/tine20/Inventory/translations/cs.mo b/tine20/Inventory/translations/cs.mo
new file mode 100644 (file)
index 0000000..a46ed94
Binary files /dev/null and b/tine20/Inventory/translations/cs.mo differ
diff --git a/tine20/Inventory/translations/cs.po b/tine20/Inventory/translations/cs.po
new file mode 100644 (file)
index 0000000..eda2a02
--- /dev/null
@@ -0,0 +1,105 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Tine 2.0 - ExampleApplication\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2010-07-27 11:08+0100\n"
+"Last-Translator: Michal Sladek <msladek@brotel.cz>\n"
+"Language-Team: Tine 2.0 Translators\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Czech\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+#: js/ExampleApplication.js:25
+msgid "Example Application"
+msgstr "Ukázková aplikace"
+
+#: js/ExampleRecordGridPanel.js:74
+msgid "Quick search"
+msgstr "Rychlé hledání"
+
+#: js/ExampleRecordGridPanel.js:102 js/ExampleRecordEditDialog.js:104
+msgid "Name"
+msgstr "Název"
+
+#: js/ExampleRecordGridPanel.js:108
+msgid "Title"
+msgstr "Název"
+
+#: js/ExampleRecordGridPanel.js:114
+msgid "Status"
+msgstr "Stav"
+
+#: js/ExampleRecordGridPanel.js:121
+msgid "Budget"
+msgstr "Rozpočet"
+
+#: js/ExampleRecordGridPanel.js:145
+msgid "Show closed"
+msgstr "Zobrazit uzavřené"
+
+#: js/ExampleRecordEditDialog.js:87
+msgid "ExampleRecord"
+msgstr "Ukázkový záznam"
+
+#: js/Model.js:31
+msgid "example record"
+msgid_plural "example records"
+msgstr[0] "ukázkový záznam"
+msgstr[1] "ukázkové záznamy"
+msgstr[2] "ukázkových záznamů"
+
+#: js/Model.js:35
+msgid "example record list"
+msgid_plural "example record lists"
+msgstr[0] "seznam ukázkových záznamů"
+msgstr[1] "seznamy ukázkových záznamů"
+msgstr[2] "seznamů ukázkových záznamů"
+
+#: Setup/setup.xml:10
+msgid "ExampleApplication"
+msgstr "Ukázková aplikace"
+
+#: Controller.php:96
+#, python-format
+msgid "%s's personal example records"
+msgstr "Osobní ukázkové záznamy uživatele %s"
+
+#~ msgid "ExampleRecords"
+#~ msgstr "Ukázkové záznamy"
+
+#~ msgid "All ExampleRecords"
+#~ msgstr "Všechny ukázkové záznamy"
+
+#~ msgid "Unit"
+#~ msgstr "Jednotka"
+
+#~ msgid "Unit Price"
+#~ msgstr "Jednotková cena"
+
+#~ msgid "Timesheets are billable"
+#~ msgstr "Pracovní výkazy lze účtovat"
+
+#~ msgid "closed"
+#~ msgstr "uzavřený"
+
+#~ msgid "open"
+#~ msgstr "otevřený"
+
+#~ msgid "Billed"
+#~ msgstr "Účtovaný"
+
+#~ msgid "not yet billed"
+#~ msgstr "zatím neúčtovaný"
+
+#~ msgid "to bill"
+#~ msgstr "k účtování"
+
+#~ msgid "billed"
+#~ msgstr "účtovaný"
+
+#~ msgid "Description"
+#~ msgstr "Popis"
diff --git a/tine20/Inventory/translations/de.mo b/tine20/Inventory/translations/de.mo
new file mode 100644 (file)
index 0000000..03606e2
Binary files /dev/null and b/tine20/Inventory/translations/de.mo differ
diff --git a/tine20/Inventory/translations/de.po b/tine20/Inventory/translations/de.po
new file mode 100644 (file)
index 0000000..c133113
--- /dev/null
@@ -0,0 +1,111 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Tine 2.0 - ExampleApplication\n"
+"POT-Creation-Date: 2008-05-17 22:12+0100\n"
+"PO-Revision-Date: 2010-04-23 12:36+0100\n"
+"Last-Translator: Philipp Schuele <p.schuele@metaways.de>\n"
+"Language-Team: Tine 2.0 Translators\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: German\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: js/ExampleApplication.js:25
+msgid "Example Application"
+msgstr "Beispielanwendung"
+
+#: js/ExampleRecordGridPanel.js:74
+msgid "Quick search"
+msgstr "Schnellsuche"
+
+#: js/ExampleRecordGridPanel.js:102 js/ExampleRecordEditDialog.js:104
+msgid "Name"
+msgstr "Name"
+
+#: js/ExampleRecordGridPanel.js:108
+msgid "Title"
+msgstr "Titel"
+
+#: js/ExampleRecordGridPanel.js:114
+msgid "Status"
+msgstr "Status"
+
+#: js/ExampleRecordGridPanel.js:121
+msgid "Budget"
+msgstr "Budget"
+
+#: js/ExampleRecordGridPanel.js:145
+msgid "Show closed"
+msgstr "Zeige geschlossene"
+
+#: js/ExampleRecordEditDialog.js:87
+msgid "ExampleRecord"
+msgstr "BeispielEintrag"
+
+#: js/Model.js:31
+msgid "example record"
+msgid_plural "example records"
+msgstr[0] "Beispieleintrag"
+msgstr[1] "Beispieleinträge"
+
+#: js/Model.js:35
+msgid "example record list"
+msgid_plural "example record lists"
+msgstr[0] "Liste von Beispieleinträgen"
+msgstr[1] "Listen von Beispieleinträgen"
+
+#: Setup/setup.xml:10
+msgid "ExampleApplication"
+msgstr "BeispielAnwendung"
+
+#: Controller.php:96
+#, python-format
+msgid "%s's personal example records"
+msgstr "%s persönliche Beispieleinträge"
+
+#~ msgid "ExampleRecords"
+#~ msgstr "BeispielEinträge"
+
+#~ msgid "All ExampleRecords"
+#~ msgstr "Alle BeispielEinträge"
+
+#~ msgid "Description"
+#~ msgstr "Beschreibung"
+
+#~ msgid "record list"
+#~ msgid_plural "record lists"
+#~ msgstr[0] "Eintrags Liste"
+#~ msgstr[1] "Eintrags Listen"
+
+#~ msgid "Number"
+#~ msgstr "Zahl"
+
+#~ msgid "Unit"
+#~ msgstr "Einheit"
+
+#~ msgid "Unit Price"
+#~ msgstr "Preis pro Einheit"
+
+#~ msgid "Timesheets are billable"
+#~ msgstr "Stundenzettel sind abrechenbar"
+
+#~ msgid "closed"
+#~ msgstr "geschlossen"
+
+#~ msgid "open"
+#~ msgstr "offen"
+
+#~ msgid "Billed"
+#~ msgstr "Berechnet"
+
+#~ msgid "not yet billed"
+#~ msgstr "noch nicht berechnet"
+
+#~ msgid "to bill"
+#~ msgstr "zu berechnen"
+
+#~ msgid "billed"
+#~ msgstr "berechnet"
diff --git a/tine20/Inventory/translations/en.mo b/tine20/Inventory/translations/en.mo
new file mode 100644 (file)
index 0000000..aef1508
Binary files /dev/null and b/tine20/Inventory/translations/en.mo differ
diff --git a/tine20/Inventory/translations/en.po b/tine20/Inventory/translations/en.po
new file mode 100644 (file)
index 0000000..4b5c94f
--- /dev/null
@@ -0,0 +1,68 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Tine 2.0 - ExampleApplication\n"
+"POT-Creation-Date: 2008-05-17 22:12+0100\n"
+"PO-Revision-Date: 2008-07-29 21:14+0100\n"
+"Last-Translator: Cornelius Weiss <c.weiss@metaways.de>\n"
+"Language-Team: Tine 2.0 Translators\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: en\n"
+"X-Poedit-Country: GB\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: js/ExampleApplication.js:25
+msgid "Example Application"
+msgstr "Example Application"
+
+#: js/ExampleRecordGridPanel.js:74
+msgid "Quick search"
+msgstr "Quick search"
+
+#: js/ExampleRecordGridPanel.js:102 js/ExampleRecordEditDialog.js:104
+msgid "Name"
+msgstr "Name"
+
+#: js/ExampleRecordGridPanel.js:108
+msgid "Title"
+msgstr "Title"
+
+#: js/ExampleRecordGridPanel.js:114
+msgid "Status"
+msgstr "Status"
+
+#: js/ExampleRecordGridPanel.js:121
+msgid "Budget"
+msgstr "Budget"
+
+#: js/ExampleRecordGridPanel.js:145
+msgid "Show closed"
+msgstr "Show closed"
+
+#: js/ExampleRecordEditDialog.js:87
+msgid "ExampleRecord"
+msgstr "ExampleRecord"
+
+#: js/Model.js:31
+msgid "example record"
+msgid_plural "example records"
+msgstr[0] "example record"
+msgstr[1] "example records"
+
+#: js/Model.js:35
+msgid "example record list"
+msgid_plural "example record lists"
+msgstr[0] "example record list"
+msgstr[1] "example record lists"
+
+#: Setup/setup.xml:10
+msgid "ExampleApplication"
+msgstr "ExampleApplication"
+
+#: Controller.php:96
+#, python-format
+msgid "%s's personal example records"
+msgstr "%s's personal example records"
diff --git a/tine20/Inventory/translations/es.mo b/tine20/Inventory/translations/es.mo
new file mode 100644 (file)
index 0000000..4abe5e3
Binary files /dev/null and b/tine20/Inventory/translations/es.mo differ
diff --git a/tine20/Inventory/translations/es.po b/tine20/Inventory/translations/es.po
new file mode 100644 (file)
index 0000000..1127060
--- /dev/null
@@ -0,0 +1,83 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Tine 2.0 - ExampleApplication\n"
+"POT-Creation-Date: 2008-05-17 22:12+0100\n"
+"PO-Revision-Date: 2010-02-10 16:34-0400\n"
+"Last-Translator: \n"
+"Language-Team: Tine 2.0 Translators\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Spanish\n"
+"X-Poedit-Country: NOT SPECIFIED / ANY\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: js/ExampleApplication.js:25
+msgid "Example Application"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:74
+msgid "Quick search"
+msgstr "Búsqueda Rápida"
+
+#: js/ExampleRecordGridPanel.js:102 js/ExampleRecordEditDialog.js:104
+msgid "Name"
+msgstr "Nombre"
+
+#: js/ExampleRecordGridPanel.js:108
+msgid "Title"
+msgstr "Título"
+
+#: js/ExampleRecordGridPanel.js:114
+msgid "Status"
+msgstr "Estado"
+
+#: js/ExampleRecordGridPanel.js:121
+msgid "Budget"
+msgstr "Presupuesto"
+
+#: js/ExampleRecordGridPanel.js:145
+msgid "Show closed"
+msgstr "Función Cerrada"
+
+#: js/ExampleRecordEditDialog.js:87
+#, fuzzy
+msgid "ExampleRecord"
+msgstr "RegistroDeEjemplo"
+
+#: js/Model.js:31
+msgid "example record"
+msgid_plural "example records"
+msgstr[0] ""
+msgstr[1] ""
+
+#: js/Model.js:35
+msgid "example record list"
+msgid_plural "example record lists"
+msgstr[0] ""
+msgstr[1] ""
+
+#: Setup/setup.xml:10
+msgid "ExampleApplication"
+msgstr "AplicaciónDeEjemplo"
+
+#: Controller.php:96
+#, python-format
+msgid "%s's personal example records"
+msgstr ""
+
+#~ msgid "ExampleRecords"
+#~ msgstr "RegistrosDeEjemplo"
+
+#~ msgid "All ExampleRecords"
+#~ msgstr "Todos los RegistrosDeEjemplo"
+
+#~ msgid "Description"
+#~ msgstr "Descripción"
+
+#~ msgid "record list"
+#~ msgid_plural "record lists"
+#~ msgstr[0] "listado de registro"
+#~ msgstr[1] "listado de registros"
diff --git a/tine20/Inventory/translations/fr.mo b/tine20/Inventory/translations/fr.mo
new file mode 100644 (file)
index 0000000..0128dfd
Binary files /dev/null and b/tine20/Inventory/translations/fr.mo differ
diff --git a/tine20/Inventory/translations/fr.po b/tine20/Inventory/translations/fr.po
new file mode 100644 (file)
index 0000000..821264c
--- /dev/null
@@ -0,0 +1,68 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Tine 2.0 - ExampleApplication\n"
+"POT-Creation-Date: 2008-05-17 22:12+0100\n"
+"PO-Revision-Date: 2008-07-29 21:14+0100\n"
+"Last-Translator: Cornelius Weiss <c.weiss@metaways.de>\n"
+"Language-Team: Tine 2.0 Translators\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: French\n"
+"X-Poedit-Country: \n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=2; plural=n>1;\n"
+
+#: js/ExampleApplication.js:25
+msgid "Example Application"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:74
+msgid "Quick search"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:102 js/ExampleRecordEditDialog.js:104
+msgid "Name"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:108
+msgid "Title"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:114
+msgid "Status"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:121
+msgid "Budget"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:145
+msgid "Show closed"
+msgstr ""
+
+#: js/ExampleRecordEditDialog.js:87
+msgid "ExampleRecord"
+msgstr ""
+
+#: js/Model.js:31
+msgid "example record"
+msgid_plural "example records"
+msgstr[0] ""
+msgstr[1] ""
+
+#: js/Model.js:35
+msgid "example record list"
+msgid_plural "example record lists"
+msgstr[0] ""
+msgstr[1] ""
+
+#: Setup/setup.xml:10
+msgid "ExampleApplication"
+msgstr ""
+
+#: Controller.php:96
+#, python-format
+msgid "%s's personal example records"
+msgstr ""
diff --git a/tine20/Inventory/translations/hu.mo b/tine20/Inventory/translations/hu.mo
new file mode 100644 (file)
index 0000000..9d36b55
Binary files /dev/null and b/tine20/Inventory/translations/hu.mo differ
diff --git a/tine20/Inventory/translations/hu.po b/tine20/Inventory/translations/hu.po
new file mode 100644 (file)
index 0000000..4e7e364
--- /dev/null
@@ -0,0 +1,68 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2008-05-17 22:12+0100\n"
+"PO-Revision-Date: \n"
+"Last-Translator: Gump <gump@gump.hu>\n"
+"Language-Team: gump <admin@kemenyfem.hu>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Poedit-Language: Hungarian\n"
+"X-Poedit-Country: HUNGARY\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: js/ExampleApplication.js:25
+msgid "Example Application"
+msgstr "Példa Alkalmazás"
+
+#: js/ExampleRecordGridPanel.js:74
+msgid "Quick search"
+msgstr "Gyors keresés"
+
+#: js/ExampleRecordGridPanel.js:102 js/ExampleRecordEditDialog.js:104
+msgid "Name"
+msgstr "Név"
+
+#: js/ExampleRecordGridPanel.js:108
+msgid "Title"
+msgstr "Beosztás"
+
+#: js/ExampleRecordGridPanel.js:114
+msgid "Status"
+msgstr "Státusz"
+
+#: js/ExampleRecordGridPanel.js:121
+msgid "Budget"
+msgstr "Költség"
+
+#: js/ExampleRecordGridPanel.js:145
+msgid "Show closed"
+msgstr "Mutasd a lezártakat"
+
+#: js/ExampleRecordEditDialog.js:87
+msgid "ExampleRecord"
+msgstr "PéldaRekord"
+
+#: js/Model.js:31
+msgid "example record"
+msgid_plural "example records"
+msgstr[0] "példa rekord"
+msgstr[1] "példa rekordok"
+
+#: js/Model.js:35
+msgid "example record list"
+msgid_plural "example record lists"
+msgstr[0] "példa rekord lista"
+msgstr[1] "példa rekord listák"
+
+#: Setup/setup.xml:10
+msgid "ExampleApplication"
+msgstr "PéldaAlkalmazás"
+
+#: Controller.php:96
+#, python-format
+msgid "%s's personal example records"
+msgstr "%s személyes példa rekordjai"
diff --git a/tine20/Inventory/translations/it.mo b/tine20/Inventory/translations/it.mo
new file mode 100644 (file)
index 0000000..34c53af
Binary files /dev/null and b/tine20/Inventory/translations/it.mo differ
diff --git a/tine20/Inventory/translations/it.po b/tine20/Inventory/translations/it.po
new file mode 100644 (file)
index 0000000..45af897
--- /dev/null
@@ -0,0 +1,68 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Tine 2.0 - ExampleApplication\n"
+"POT-Creation-Date: 2008-05-17 22:12+0100\n"
+"PO-Revision-Date: 2008-07-29 21:14+0100\n"
+"Last-Translator: Cornelius Weiss <c.weiss@metaways.de>\n"
+"Language-Team: Tine 2.0 Translators\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Italian\n"
+"X-Poedit-Country: \n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: js/ExampleApplication.js:25
+msgid "Example Application"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:74
+msgid "Quick search"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:102 js/ExampleRecordEditDialog.js:104
+msgid "Name"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:108
+msgid "Title"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:114
+msgid "Status"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:121
+msgid "Budget"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:145
+msgid "Show closed"
+msgstr ""
+
+#: js/ExampleRecordEditDialog.js:87
+msgid "ExampleRecord"
+msgstr ""
+
+#: js/Model.js:31
+msgid "example record"
+msgid_plural "example records"
+msgstr[0] ""
+msgstr[1] ""
+
+#: js/Model.js:35
+msgid "example record list"
+msgid_plural "example record lists"
+msgstr[0] ""
+msgstr[1] ""
+
+#: Setup/setup.xml:10
+msgid "ExampleApplication"
+msgstr ""
+
+#: Controller.php:96
+#, python-format
+msgid "%s's personal example records"
+msgstr ""
diff --git a/tine20/Inventory/translations/ja.mo b/tine20/Inventory/translations/ja.mo
new file mode 100644 (file)
index 0000000..f337ef3
Binary files /dev/null and b/tine20/Inventory/translations/ja.mo differ
diff --git a/tine20/Inventory/translations/ja.po b/tine20/Inventory/translations/ja.po
new file mode 100644 (file)
index 0000000..6b4c79f
--- /dev/null
@@ -0,0 +1,66 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Tine 2.0 - ExampleApplication\n"
+"POT-Creation-Date: 2008-05-17 22:12+0100\n"
+"PO-Revision-Date: 2008-07-29 21:14+0100\n"
+"Last-Translator: Cornelius Weiss <c.weiss@metaways.de>\n"
+"Language-Team: Tine 2.0 Translators\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Japanese\n"
+"X-Poedit-Country: NOT SPECIFIED / ANY\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: js/ExampleApplication.js:25
+msgid "Example Application"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:74
+msgid "Quick search"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:102 js/ExampleRecordEditDialog.js:104
+msgid "Name"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:108
+msgid "Title"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:114
+msgid "Status"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:121
+msgid "Budget"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:145
+msgid "Show closed"
+msgstr ""
+
+#: js/ExampleRecordEditDialog.js:87
+msgid "ExampleRecord"
+msgstr ""
+
+#: js/Model.js:31
+msgid "example record"
+msgid_plural "example records"
+msgstr[0] ""
+
+#: js/Model.js:35
+msgid "example record list"
+msgid_plural "example record lists"
+msgstr[0] ""
+
+#: Setup/setup.xml:10
+msgid "ExampleApplication"
+msgstr ""
+
+#: Controller.php:96
+#, python-format
+msgid "%s's personal example records"
+msgstr ""
diff --git a/tine20/Inventory/translations/nb.mo b/tine20/Inventory/translations/nb.mo
new file mode 100644 (file)
index 0000000..549f24b
Binary files /dev/null and b/tine20/Inventory/translations/nb.mo differ
diff --git a/tine20/Inventory/translations/nb.po b/tine20/Inventory/translations/nb.po
new file mode 100644 (file)
index 0000000..dd272e7
--- /dev/null
@@ -0,0 +1,113 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Tine 2.0 - ExampleApplication\n"
+"POT-Creation-Date: 2008-05-17 22:12+0100\n"
+"PO-Revision-Date: 2009-12-14 15:21+0100\n"
+"Last-Translator: Ronny Gonzales <gonzito@online.no>\n"
+"Language-Team: Tine 2.0 Translators\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Norwegian Bokmål\n"
+"X-Poedit-Country: NOT SPECIFIED / ANY\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: js/ExampleApplication.js:25
+msgid "Example Application"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:74
+msgid "Quick search"
+msgstr "Hurtig Søk"
+
+#: js/ExampleRecordGridPanel.js:102 js/ExampleRecordEditDialog.js:104
+msgid "Name"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:108
+msgid "Title"
+msgstr "Tittel"
+
+#: js/ExampleRecordGridPanel.js:114
+msgid "Status"
+msgstr "Status"
+
+#: js/ExampleRecordGridPanel.js:121
+msgid "Budget"
+msgstr "Budsjett"
+
+#: js/ExampleRecordGridPanel.js:145
+msgid "Show closed"
+msgstr "Vis lukket"
+
+#: js/ExampleRecordEditDialog.js:87
+#, fuzzy
+msgid "ExampleRecord"
+msgstr "EksempelPost"
+
+#: js/Model.js:31
+msgid "example record"
+msgid_plural "example records"
+msgstr[0] ""
+msgstr[1] ""
+
+#: js/Model.js:35
+msgid "example record list"
+msgid_plural "example record lists"
+msgstr[0] ""
+msgstr[1] ""
+
+#: Setup/setup.xml:10
+msgid "ExampleApplication"
+msgstr "EksempelApplikasjon"
+
+#: Controller.php:96
+#, python-format
+msgid "%s's personal example records"
+msgstr ""
+
+#~ msgid "ExampleRecords"
+#~ msgstr "EksempelPoster"
+
+#~ msgid "All ExampleRecords"
+#~ msgstr "Alle EksempelPoster"
+
+#~ msgid "Description"
+#~ msgstr "Beskrivelse"
+
+#~ msgid "record list"
+#~ msgid_plural "record lists"
+#~ msgstr[0] "lagre liste"
+#~ msgstr[1] "lagre lister"
+
+#~ msgid "Number"
+#~ msgstr "Nummer"
+
+#~ msgid "Unit"
+#~ msgstr "Enhet"
+
+#~ msgid "Unit Price"
+#~ msgstr "Enhets Pris"
+
+#~ msgid "Timesheets are billable"
+#~ msgstr "Tidskjemaer er fakturerbare"
+
+#~ msgid "closed"
+#~ msgstr "lukket"
+
+#~ msgid "open"
+#~ msgstr "åpen"
+
+#~ msgid "Billed"
+#~ msgstr "Fakturert"
+
+#~ msgid "not yet billed"
+#~ msgstr "ikke fakturert enda"
+
+#~ msgid "to bill"
+#~ msgstr "å fakturere"
+
+#~ msgid "billed"
+#~ msgstr "fakturert"
diff --git a/tine20/Inventory/translations/pl.mo b/tine20/Inventory/translations/pl.mo
new file mode 100644 (file)
index 0000000..4fde1b7
Binary files /dev/null and b/tine20/Inventory/translations/pl.mo differ
diff --git a/tine20/Inventory/translations/pl.po b/tine20/Inventory/translations/pl.po
new file mode 100644 (file)
index 0000000..8f69d60
--- /dev/null
@@ -0,0 +1,114 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Tine 2.0 - ExampleApplication\n"
+"POT-Creation-Date: 2008-05-17 22:12+0100\n"
+"PO-Revision-Date: 2011-01-27 17:25+0100\n"
+"Last-Translator: Wojciech Kaczmarek <wojciech_kaczmarek@wp.pl>\n"
+"Language-Team: Tine 2.0 Translators\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Polish\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+
+#: js/ExampleApplication.js:25
+msgid "Example Application"
+msgstr "Przykładowa aplikacja"
+
+#: js/ExampleRecordGridPanel.js:74
+msgid "Quick search"
+msgstr "Szybkie wyszukiwanie"
+
+#: js/ExampleRecordGridPanel.js:102 js/ExampleRecordEditDialog.js:104
+msgid "Name"
+msgstr "Nazwa"
+
+#: js/ExampleRecordGridPanel.js:108
+msgid "Title"
+msgstr "Tytuł"
+
+#: js/ExampleRecordGridPanel.js:114
+msgid "Status"
+msgstr "Status"
+
+#: js/ExampleRecordGridPanel.js:121
+msgid "Budget"
+msgstr "Budżet"
+
+#: js/ExampleRecordGridPanel.js:145
+msgid "Show closed"
+msgstr "Pokaż zakończone"
+
+#: js/ExampleRecordEditDialog.js:87
+msgid "ExampleRecord"
+msgstr "Przykładowy wiersz"
+
+#: js/Model.js:31
+msgid "example record"
+msgid_plural "example records"
+msgstr[0] "Przykładowy wiersz"
+msgstr[1] "przykładowe wiersze"
+msgstr[2] "przykładowe wiersze"
+
+#: js/Model.js:35
+msgid "example record list"
+msgid_plural "example record lists"
+msgstr[0] "Lista przykładowych wierszy"
+msgstr[1] "listy przykładowych wierszy"
+msgstr[2] "listy przykładowych wierszy"
+
+#: Setup/setup.xml:10
+msgid "ExampleApplication"
+msgstr "Przykładowa aplikacja"
+
+#: Controller.php:96
+#, python-format
+msgid "%s's personal example records"
+msgstr "%s przykładowe, osobiste wiersze"
+
+#~ msgid "ExampleRecords"
+#~ msgstr "Przykładowe wiersze"
+
+#~ msgid "All ExampleRecords"
+#~ msgstr "Wszystkie przykładowe wiersze"
+
+#~ msgid "Description"
+#~ msgstr "Opis"
+
+#~ msgid "record list"
+#~ msgid_plural "record lists"
+#~ msgstr[0] "lista aplikacji"
+#~ msgstr[1] "listy aplikacji"
+#~ msgstr[2] "list aplikacji"
+
+#~ msgid "Number"
+#~ msgstr "Ilość"
+
+#~ msgid "Unit"
+#~ msgstr "Jednostka"
+
+#~ msgid "Unit Price"
+#~ msgstr "Cena jednostkowa"
+
+#~ msgid "Timesheets are billable"
+#~ msgstr "Karty godzin gotowe do przeliczenia"
+
+#~ msgid "closed"
+#~ msgstr "zakończone"
+
+#~ msgid "open"
+#~ msgstr "otwarte"
+
+#~ msgid "Billed"
+#~ msgstr "Przeliczone"
+
+#~ msgid "not yet billed"
+#~ msgstr "jeszcze nie przeliczone"
+
+#~ msgid "to bill"
+#~ msgstr "przelicz"
+
+#~ msgid "billed"
+#~ msgstr "przeliczone"
diff --git a/tine20/Inventory/translations/ru.mo b/tine20/Inventory/translations/ru.mo
new file mode 100644 (file)
index 0000000..e384c1b
Binary files /dev/null and b/tine20/Inventory/translations/ru.mo differ
diff --git a/tine20/Inventory/translations/ru.po b/tine20/Inventory/translations/ru.po
new file mode 100644 (file)
index 0000000..efa0af7
--- /dev/null
@@ -0,0 +1,115 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Tine 2.0 - ExampleApplication\n"
+"POT-Creation-Date: 2008-05-17 22:12+0100\n"
+"PO-Revision-Date: 2009-07-21 11:15+0300\n"
+"Last-Translator: Nikolay Parukhin <nik@sevpinro.ru>\n"
+"Language-Team: Tine 2.0 Translators\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Russian\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+
+#: js/ExampleApplication.js:25
+msgid "Example Application"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:74
+msgid "Quick search"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:102 js/ExampleRecordEditDialog.js:104
+msgid "Name"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:108
+msgid "Title"
+msgstr "Заголовок"
+
+#: js/ExampleRecordGridPanel.js:114
+msgid "Status"
+msgstr "Статус"
+
+#: js/ExampleRecordGridPanel.js:121
+msgid "Budget"
+msgstr "Бюджет"
+
+#: js/ExampleRecordGridPanel.js:145
+msgid "Show closed"
+msgstr "Показать закрытые"
+
+#: js/ExampleRecordEditDialog.js:87
+#, fuzzy
+msgid "ExampleRecord"
+msgstr "ЗаписьПример"
+
+#: js/Model.js:31
+msgid "example record"
+msgid_plural "example records"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: js/Model.js:35
+msgid "example record list"
+msgid_plural "example record lists"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: Setup/setup.xml:10
+msgid "ExampleApplication"
+msgstr "ПриложениеПример"
+
+#: Controller.php:96
+#, python-format
+msgid "%s's personal example records"
+msgstr ""
+
+#~ msgid "ExampleRecords"
+#~ msgstr "ЗаписиПримеры"
+
+#~ msgid "All ExampleRecords"
+#~ msgstr "Все ЗаписиПримеры"
+
+#~ msgid "Description"
+#~ msgstr "Описание"
+
+#~ msgid "record list"
+#~ msgid_plural "record lists"
+#~ msgstr[0] "список записей"
+#~ msgstr[1] "списка записей"
+#~ msgstr[2] "списков записей"
+
+#~ msgid "Number"
+#~ msgstr "Номер"
+
+#~ msgid "Unit"
+#~ msgstr "Единица"
+
+#~ msgid "Unit Price"
+#~ msgstr "Цена за единицу"
+
+#~ msgid "Timesheets are billable"
+#~ msgstr "Табели оплачиваемы"
+
+#~ msgid "closed"
+#~ msgstr "закрыт"
+
+#~ msgid "open"
+#~ msgstr "открыт"
+
+#~ msgid "Billed"
+#~ msgstr "Оплачен"
+
+#~ msgid "not yet billed"
+#~ msgstr "ещё не оплачен"
+
+#~ msgid "to bill"
+#~ msgstr "к оплате"
+
+#~ msgid "billed"
+#~ msgstr "оплачен"
diff --git a/tine20/Inventory/translations/sv.mo b/tine20/Inventory/translations/sv.mo
new file mode 100644 (file)
index 0000000..f244d8f
Binary files /dev/null and b/tine20/Inventory/translations/sv.mo differ
diff --git a/tine20/Inventory/translations/sv.po b/tine20/Inventory/translations/sv.po
new file mode 100644 (file)
index 0000000..7a6a3c5
--- /dev/null
@@ -0,0 +1,68 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Tine 2.0 - ExampleApplication\n"
+"POT-Creation-Date: 2008-05-17 22:12+0100\n"
+"PO-Revision-Date: 2008-07-29 21:14+0100\n"
+"Last-Translator: Cornelius Weiss <c.weiss@metaways.de>\n"
+"Language-Team: Tine 2.0 Translators\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Swedish\n"
+"X-Poedit-Country: NOT SPECIFIED / ANY\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: js/ExampleApplication.js:25
+msgid "Example Application"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:74
+msgid "Quick search"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:102 js/ExampleRecordEditDialog.js:104
+msgid "Name"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:108
+msgid "Title"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:114
+msgid "Status"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:121
+msgid "Budget"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:145
+msgid "Show closed"
+msgstr ""
+
+#: js/ExampleRecordEditDialog.js:87
+msgid "ExampleRecord"
+msgstr ""
+
+#: js/Model.js:31
+msgid "example record"
+msgid_plural "example records"
+msgstr[0] ""
+msgstr[1] ""
+
+#: js/Model.js:35
+msgid "example record list"
+msgid_plural "example record lists"
+msgstr[0] ""
+msgstr[1] ""
+
+#: Setup/setup.xml:10
+msgid "ExampleApplication"
+msgstr ""
+
+#: Controller.php:96
+#, python-format
+msgid "%s's personal example records"
+msgstr ""
diff --git a/tine20/Inventory/translations/template.pot b/tine20/Inventory/translations/template.pot
new file mode 100644 (file)
index 0000000..c6e38ed
--- /dev/null
@@ -0,0 +1,52 @@
+#: js/ExampleApplication.js:25
+msgid "Example Application"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:74
+msgid "Quick search"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:102 js/ExampleRecordEditDialog.js:104
+msgid "Name"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:108
+msgid "Title"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:114
+msgid "Status"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:121
+msgid "Budget"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:145
+msgid "Show closed"
+msgstr ""
+
+#: js/ExampleRecordEditDialog.js:87
+msgid "ExampleRecord"
+msgstr ""
+
+#: js/Model.js:31
+msgid "example record"
+msgid_plural "example records"
+msgstr[0] ""
+msgstr[1] ""
+
+#: js/Model.js:35
+msgid "example record list"
+msgid_plural "example record lists"
+msgstr[0] ""
+msgstr[1] ""
+
+#: Setup/setup.xml:10
+msgid "ExampleApplication"
+msgstr ""
+
+#: Controller.php:96
+#, python-format
+msgid "%s's personal example records"
+msgstr ""
diff --git a/tine20/Inventory/translations/zh_CN.mo b/tine20/Inventory/translations/zh_CN.mo
new file mode 100644 (file)
index 0000000..54c8d0e
Binary files /dev/null and b/tine20/Inventory/translations/zh_CN.mo differ
diff --git a/tine20/Inventory/translations/zh_CN.po b/tine20/Inventory/translations/zh_CN.po
new file mode 100644 (file)
index 0000000..5c8a6ba
--- /dev/null
@@ -0,0 +1,66 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Tine 2.0 - ExampleApplication\n"
+"POT-Creation-Date: 2008-05-17 22:12+0100\n"
+"PO-Revision-Date: 2008-07-29 21:14+0100\n"
+"Last-Translator: Cornelius Weiss <c.weiss@metaways.de>\n"
+"Language-Team: Tine 2.0 Translators\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Chinese\n"
+"X-Poedit-Country: CHINA\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: js/ExampleApplication.js:25
+msgid "Example Application"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:74
+msgid "Quick search"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:102 js/ExampleRecordEditDialog.js:104
+msgid "Name"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:108
+msgid "Title"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:114
+msgid "Status"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:121
+msgid "Budget"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:145
+msgid "Show closed"
+msgstr ""
+
+#: js/ExampleRecordEditDialog.js:87
+msgid "ExampleRecord"
+msgstr ""
+
+#: js/Model.js:31
+msgid "example record"
+msgid_plural "example records"
+msgstr[0] ""
+
+#: js/Model.js:35
+msgid "example record list"
+msgid_plural "example record lists"
+msgstr[0] ""
+
+#: Setup/setup.xml:10
+msgid "ExampleApplication"
+msgstr ""
+
+#: Controller.php:96
+#, python-format
+msgid "%s's personal example records"
+msgstr ""
diff --git a/tine20/Inventory/translations/zh_TW.mo b/tine20/Inventory/translations/zh_TW.mo
new file mode 100644 (file)
index 0000000..1712f6f
Binary files /dev/null and b/tine20/Inventory/translations/zh_TW.mo differ
diff --git a/tine20/Inventory/translations/zh_TW.po b/tine20/Inventory/translations/zh_TW.po
new file mode 100644 (file)
index 0000000..914bc8b
--- /dev/null
@@ -0,0 +1,66 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Tine 2.0 - ExampleApplication\n"
+"POT-Creation-Date: 2008-05-17 22:12+0100\n"
+"PO-Revision-Date: 2008-07-29 21:14+0100\n"
+"Last-Translator: Cornelius Weiss <c.weiss@metaways.de>\n"
+"Language-Team: Tine 2.0 Translators\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Chinese\n"
+"X-Poedit-Country: TAIWAN\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: js/ExampleApplication.js:25
+msgid "Example Application"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:74
+msgid "Quick search"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:102 js/ExampleRecordEditDialog.js:104
+msgid "Name"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:108
+msgid "Title"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:114
+msgid "Status"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:121
+msgid "Budget"
+msgstr ""
+
+#: js/ExampleRecordGridPanel.js:145
+msgid "Show closed"
+msgstr ""
+
+#: js/ExampleRecordEditDialog.js:87
+msgid "ExampleRecord"
+msgstr ""
+
+#: js/Model.js:31
+msgid "example record"
+msgid_plural "example records"
+msgstr[0] ""
+
+#: js/Model.js:35
+msgid "example record list"
+msgid_plural "example record lists"
+msgstr[0] ""
+
+#: Setup/setup.xml:10
+msgid "ExampleApplication"
+msgstr ""
+
+#: Controller.php:96
+#, python-format
+msgid "%s's personal example records"
+msgstr ""