diff --git a/readme/index/development.html b/readme/index/development.html index b5decde4..042fe6e9 100644 --- a/readme/index/development.html +++ b/readme/index/development.html @@ -1,16 +1,16 @@

Development

-

Source code:  trac.oxjs.org/browser

+

Source code:  code.0x2620.org/browser

-

Open issues:  trac.oxjs.org/report

+

Open issues:  code.0x2620.org/0x2620/oxjs/issues

-

Bug reports and feature requests:  trac.oxjs.org/newticket

+

Bug reports and feature requests:  code.0x2620.org/0x2620/oxjs/issues/new

Mailing list:  mailb.org/cgi-bin/mailman/listinfo/oxjs-dev

E-mail:  oxjs@oxjs.org

-

IRC:  irc.freenode.net#oxjs

+

Matrix:  #oxjs:matrix.org

Twitter:  @OxJS

diff --git a/source/Ox.js b/source/Ox.js index 16d1ce97..675fbed3 100644 --- a/source/Ox.js +++ b/source/Ox.js @@ -37,7 +37,7 @@ } function getPath() { - var index, regexp = /Ox\.js(\?\d+|)$/, + var index, regexp = /Ox\.js(\?[\d\.]+|)$/, scripts = document.getElementsByTagName('script'), src; for (index = scripts.length - 1; index >= 0; index--) { src = scripts[index].src; diff --git a/source/Ox/js/Constants.js b/source/Ox/js/Constants.js index 8f88ca13..1fe2d45b 100644 --- a/source/Ox/js/Constants.js +++ b/source/Ox/js/Constants.js @@ -63,7 +63,8 @@ Ox.LOCALE_NAMES = { 'el': 'Ελληνικά', 'en': 'English', 'fr': 'Français', - 'hi': 'हिन्दी' + 'hi': 'हिन्दी', + 'tr': 'Türkçe' }; //@ Ox.LOCALES Locales per module Ox.LOCALES = {}; diff --git a/source/Ox/js/Encoding.js b/source/Ox/js/Encoding.js index 697f45e3..974108ac 100644 --- a/source/Ox/js/Encoding.js +++ b/source/Ox/js/Encoding.js @@ -244,7 +244,7 @@ Ox.decodeDeflate = function(string, callback) { (function() { function replace(string) { - return string.replace(/%(?![0-9A-Fa-f]{2})/g, '%25') + return string.toString().replace(/%(?![0-9A-Fa-f]{2})/g, '%25') .replace(/(%[0-9A-Fa-f]{2})+/g, function(match) { var hex = match.split('%').slice(1), ret; Ox.forEach(Ox.range(1, hex.length + 1), function(length) { diff --git a/source/Ox/json/locale.tr.json b/source/Ox/json/locale.tr.json new file mode 100644 index 00000000..81c526bc --- /dev/null +++ b/source/Ox/json/locale.tr.json @@ -0,0 +1,89 @@ +{ + "%": "%", + ",": ",", + ".": ".", + "%A, %B %e, %Y": "%A, %B %e, %Y", + "%a, %b %e, %Y": "%a, %b %e, %Y", + "AD": "MS", + "AM": "", + "Apr": "", + "April": "Nisan", + "Aug": "", + "August": "Ağustos", + "BC": "MÖ", + "%B %e, %Y": "", + "%b %e, %Y": "", + "d": "g", + "day": "gün", + "days": "gün", + "days{2}": "gün", + "Dec": "", + "December": "Aralık", + "Fall": "Düşmek", + "Feb": "", + "February": "Şubat", + "Fri": "", + "Friday": "Cuma", + "h": "s", + "hour": "saat", + "hours": "saat", + "hours{2}": "saat", + "%I:%M %p": "", + "%I:%M:%S %p": "", + "Jan": "", + "January": "Ocak", + "Jul": "", + "July": "Temmuz", + "Jun": "", + "June": "Haziran", + "m": "d", + "Mar": "", + "March": "Mart", + "May": "Mayıs", + "%m/%d/%Y": "", + "%m/%d/%y": "", + "minute": "dakika", + "minutes": "dakika", + "minutes{2}": "dakika", + "Mon": "", + "Monday": "Pazartesi", + "nd": ".", + "nd{22}": ".", + "no": "hayır", + "Nov": "", + "November": "Kasım", + "Oct": "", + "October": "Ekim", + "PM": "", + "rd": ".", + "rd{23}": ".", + "s": "s", + "Sat": "", + "Saturday": "Cumartesi", + "second": "saniye", + "seconds": "saniye", + "seconds{2}": "saniye", + "Sep": "", + "September": "Eylül", + "Spring": "Bahar", + "st": ".", + "st{21}": ".", + "Summer": "Yaz", + "Sun": "", + "Sunday": "Pazar", + "th": ".", + "th{11}": ".", + "th{12}": ".", + "th{13}": ".", + "Thu": "", + "Thursday": "Perşembe", + "Tue": "", + "Tuesday": "Salı", + "Wed": "", + "Wednesday": "Çarşamba", + "Winter": "kış", + "y": "yy", + "year": "yıl", + "years": "yıl", + "years{2}": "yıl" +} diff --git a/source/UI/css/UI.css b/source/UI/css/UI.css index e6ea4dca..c13be065 100644 --- a/source/UI/css/UI.css +++ b/source/UI/css/UI.css @@ -2458,6 +2458,7 @@ Video font-size: 8px; line-height: 10px; text-align: center; + text-wrap: balance; text-overflow: ellipsis; text-shadow: rgba(0, 0, 0, 1) 1px 1px 1px; color: rgb(255, 255, 255); diff --git a/source/UI/css/theme.css b/source/UI/css/theme.css index 5c62887e..83ac746d 100644 --- a/source/UI/css/theme.css +++ b/source/UI/css/theme.css @@ -1188,8 +1188,10 @@ Scrollbars background: -webkit-linear-gradient(left, $buttonActiveGradient); } -body.$themeClass { - scrollbar-color: $bodyBorder $bodyBackground; +@supports not selector(::-webkit-scrollbar) { + body.$themeClass { + scrollbar-color: $bodyBorder $bodyBackground; + } } /* diff --git a/source/UI/js/Core/Element.js b/source/UI/js/Core/Element.js index 5e1ca456..df17ea0b 100644 --- a/source/UI/js/Core/Element.js +++ b/source/UI/js/Core/Element.js @@ -710,6 +710,7 @@ Ox.Focus.removeElement(this.oxid); this.self(_).unbindKeyboard(); this.$tooltip && this.$tooltip.remove(); + jQuery.cleanData(this.$element); delete Ox.$elements[this.oxid]; // If setElement($element) was used, delete $element too delete Ox.$elements[this.$element.oxid]; @@ -738,6 +739,7 @@ this.findElements().forEach(function($element) { $element.removeElement(false); }); + jQuery.cleanData(this.$element); this.$element.replaceWith($element); if ($element.$element) { // $element is Ox.Element this.$element = $element.$element; diff --git a/source/UI/js/Core/Event.js b/source/UI/js/Core/Event.js index 8df1650a..31c1fee8 100644 --- a/source/UI/js/Core/Event.js +++ b/source/UI/js/Core/Event.js @@ -438,7 +438,7 @@ Ox.forEach( Ox.makeObject(Ox.slice(arguments)), function(data, event) { - target.postMessage(JSON.stringify({ + target && target.postMessage(JSON.stringify({ data: data, event: event, target: isParent ? Ox.oxid : null diff --git a/source/UI/js/Core/UI.js b/source/UI/js/Core/UI.js index 5875480f..00155a51 100644 --- a/source/UI/js/Core/UI.js +++ b/source/UI/js/Core/UI.js @@ -88,6 +88,7 @@ Ox.UI.getImageURL = Ox.cache(function(name, color, theme) { color = color || 'default'; theme = theme || Ox.Theme(); themeData = Ox.Theme.getThemeData(theme); + image = image || Ox.UI.IMAGES['symbolHelp'] if (type == 'symbol') { if (Ox.isString(color)) { colorName = color; diff --git a/source/UI/js/Core/URL.js b/source/UI/js/Core/URL.js index f411d692..14890354 100644 --- a/source/UI/js/Core/URL.js +++ b/source/UI/js/Core/URL.js @@ -683,15 +683,21 @@ Ox.URL = function(options) { condition.operator = condition.operator.replace('=', '^') } } + var key = Ox.getObjectById(self.options.findKeys[state.type], condition.key) if ( - ['date', 'enum', 'float', 'integer', 'time', 'year'].indexOf( - Ox.getObjectById(self.options.findKeys[state.type], condition.key).type - ) > -1 + ['date', 'enum', 'float', 'integer', 'time', 'year'].indexOf(key.type) > -1 && condition.value.indexOf(',') > -1 ) { condition.value = condition.value.split(',').map(function(value) { return parseValue(decodeValue(value), condition.key, state); }); + } else if (Ox.isArray(key.type) && key.type[0] == "integer" && condition.value.indexOf(',') > -1) { + condition.value = condition.value.split(',').map(function(value) { + return parseValue(decodeValue(value), condition.key, state); + }); + if (condition.value.length == 4) { + condition.value = [condition.value.slice(0,2), condition.value.slice(2)] + } } else { condition.value = parseValue(decodeValue(condition.value), condition.key, state); } diff --git a/source/UI/js/Form/ButtonGroup.js b/source/UI/js/Form/ButtonGroup.js index c1c5ff5e..d8eb06ab 100644 --- a/source/UI/js/Form/ButtonGroup.js +++ b/source/UI/js/Form/ButtonGroup.js @@ -31,18 +31,29 @@ Ox.ButtonGroup = function(options, self) { .options(options || {}) .update({ value: function() { - // fixme: this doesn't work in cases where - // multiple buttons can be selected - var position = Ox.getIndexById( - self.options.buttons, self.options.value - ); - if (position > -1) { - self.$buttons[position].trigger('click'); - } else if (self.options.min == 0) { - self.$buttons.forEach(function($button, i) { - $button.options('value') && $button.trigger('click'); - }); + var positions = [], + values = Ox.makeArray(self.options.value); + + Ox.forEach(values, function(value) { + var position = Ox.getIndexById( + self.options.buttons, value + ); + + if (position > -1) { + positions.push(position); + } + }); + + if (positions.length < self.options.min) { + return; } + + Ox.forEach(self.$buttons, function(button, pos) { + var enabled = positions.indexOf(pos) > -1; + if (enabled !== button.value()) { + button.trigger('click'); + } + }); } }) .addClass( diff --git a/source/UI/js/Form/Filter.js b/source/UI/js/Form/Filter.js index 1ad8fa25..f3215ffe 100644 --- a/source/UI/js/Form/Filter.js +++ b/source/UI/js/Form/Filter.js @@ -87,6 +87,16 @@ Ox.Filter = function(options, self) { {id: '=,', title: Ox._('is between')}, {id: '!=,', title: Ox._('is not between')} ], + place: [ + {id: '==', title: Ox._('is')}, + {id: '!==', title: Ox._('is not')}, + {id: '=', title: Ox._('contains')}, + {id: '!=', title: Ox._('does not contain')}, + {id: '^', title: Ox._('starts with')}, + {id: '!^', title: Ox._('does not start with')}, + {id: '$', title: Ox._('ends with')}, + {id: '!$', title: Ox._('does not end with')} + ], string: [ {id: '==', title: Ox._('is')}, {id: '!==', title: Ox._('is not')}, @@ -121,6 +131,7 @@ Ox.Filter = function(options, self) { integer: 0, item: void 0, list: '', + place: '', string: '', text: '', time: '00:00:00', @@ -300,7 +311,7 @@ Ox.Filter = function(options, self) { condition = { key: key.id, operator: condition.operator, - value: self.defaultValue[key.type] + value: self.defaultValue[key.type] || '' }; if (isGroup) { Ox.Log('Form', 'isGroup', self.options.value.operator) @@ -346,7 +357,7 @@ Ox.Filter = function(options, self) { ) { condition.value = newFindKey.type == 'item' ? newFindKey.values[0].id - : self.defaultValue[newFindKey.type]; + : (self.defaultValue[newFindKey.type] || ''); } renderConditions(); } @@ -355,6 +366,13 @@ Ox.Filter = function(options, self) { } } + function isBetweenCondition(condition) { + if (condition.key == "resolution") { + return Ox.isArray(condition.value) && Ox.isArray(condition.value[0]) + } + return Ox.isArray(condition.value) + } + function changeConditionOperator(pos, subpos, operator) { subpos = Ox.isUndefined(subpos) ? -1 : subpos; Ox.Log('FILTER', 'chCoOp', 'query', self.options.value) @@ -362,7 +380,7 @@ Ox.Filter = function(options, self) { ? self.options.value.conditions[pos] : self.options.value.conditions[pos].conditions[subpos], isBetween = operator.indexOf(',') > -1, - wasBetween = Ox.isArray(condition.value), + wasBetween = isBetweenCondition(condition), wasUselessCondition = isUselessCondition(pos, subpos); Ox.Log('FILTER', 'chCoOp', 'iB/wB', isBetween, wasBetween) condition.operator = operator; @@ -569,15 +587,14 @@ Ox.Filter = function(options, self) { } function renderConditionOperator(condition) { - Ox.Log('FILTER', 'rCO', condition, self.conditionOperators[getConditionType( - Ox.getObjectById(self.options.findKeys, condition.key).type - )]) + var key = Ox.getObjectById(self.options.findKeys, condition.key), + conditionType = getConditionType(key.type), + conditionOperators = self.conditionOperators[conditionType] || self.conditionOperators["string"]; + Ox.Log('FILTER', 'rCO', condition, conditionType, conditionOperators) return Ox.Select({ - items: self.conditionOperators[getConditionType( - Ox.getObjectById(self.options.findKeys, condition.key).type - )], + items: conditionOperators, overlap: 'right', - value: condition.operator + (Ox.isArray(condition.value) ? ',' : ''), + value: condition.operator + (isBetweenCondition(condition) ? ',' : ''), width: 128 }) .bindEvent({ @@ -593,7 +610,7 @@ Ox.Filter = function(options, self) { } function renderConditionValue(condition) { - return (!Ox.isArray(condition.value) + return (!isBetweenCondition(condition) ? renderInput(condition) : Ox.InputGroup({ inputs: [ @@ -699,11 +716,11 @@ Ox.Filter = function(options, self) { Ox.Log('Form', 'renderInput', condition) var $input, findKey = Ox.getObjectById(self.options.findKeys, condition.key), - isArray = Ox.isArray(condition.value), + isBetween = isBetweenCondition(condition), isHue, // FIXME: always use 'int' type = findKey.type == 'integer' ? 'int' : findKey.type, - value = !isArray ? condition.value : condition.value[index], + value = !isBetween ? condition.value : condition.value[index], formatArgs, formatType, title; if (type == 'boolean') { $input = Ox.Select({ @@ -720,7 +737,7 @@ Ox.Filter = function(options, self) { return {id: i, title: v} }), value: value, - width: !isArray ? 288 : 128 + width: !isBetween ? 288 : 128 }); } else if (type == 'item') { $input = Ox.Select({ @@ -747,8 +764,8 @@ Ox.Filter = function(options, self) { $input = Ox.Range({ max: isHue ? 360 : 1, min: 0, - size: !isArray ? 288 : 128, // fixme: should be width! - width: !isArray ? 288 : 128, // have to set this too, for formatting when tuple + size: !isBetween ? 288 : 128, // fixme: should be width! + width: !isBetween ? 288 : 128, // have to set this too, for formatting when tuple step: isHue ? 1 : 0.01, thumbSize: 48, thumbValue: true, @@ -761,7 +778,7 @@ Ox.Filter = function(options, self) { value: value }); } else if (formatType == 'date') { - $input = Ox.DateInput(!isArray ? { + $input = Ox.DateInput(!isBetween ? { value: value, width: {day: 66, month: 66, year: 140} } : { @@ -769,7 +786,7 @@ Ox.Filter = function(options, self) { width: {day: 32, month: 32, year: 48} }); } else if (formatType == 'duration') { - $input = Ox.TimeInput(!isArray ? { + $input = Ox.TimeInput(!isBetween ? { seconds: true, value: value, width: {hours: 91, minutes: 91, seconds: 90} @@ -796,16 +813,16 @@ Ox.Filter = function(options, self) { Ox.Input({ id: 'width', type: 'int', - value: value + value: value[0] }), Ox.Input({ id: 'height', type: 'int', - value: value + value: value[1] }) ], separators: [{title: 'x', width: 16}], - width: !isArray ? 288 : 128 + width: !isBetween ? 288 : 128 }) } else if ([ 'currency', 'percent', 'unit', 'value' @@ -816,7 +833,7 @@ Ox.Filter = function(options, self) { Ox.Input({ type: type, value: value, - width: !isArray ? 242 : 80 + width: !isBetween ? 242 : 80 }), formatType == 'value' ? Ox.Select({ overlap: 'left', @@ -840,7 +857,7 @@ Ox.Filter = function(options, self) { split: function(value) { }, - width: !isArray ? 288 : 128 + width: !isBetween ? 288 : 128 }) } } else { @@ -850,7 +867,7 @@ Ox.Filter = function(options, self) { autocomplete: findKey.autocomplete, autocompleteSelect: true, autocompleteSelectSubmit: true, - width: !isArray ? 288 : 128 + width: !isBetween ? 288 : 128 }); } return $input; diff --git a/source/UI/js/Form/FormPanel.js b/source/UI/js/Form/FormPanel.js index b6b3409c..9eb7efe9 100644 --- a/source/UI/js/Form/FormPanel.js +++ b/source/UI/js/Form/FormPanel.js @@ -15,11 +15,18 @@ Ox.FormPanel = function(options, self) { var that = Ox.Element({}, self) .defaults({ form: [], - listSize: 256 + listSize: 256, + section: null }) - .options(options || {}); + .options(options || {}) + .update({ + section: setSection + }); - self.section = 0; + if (self.options.section === null) { + self.options.section = self.options.form[0].id; + } + self.section = Ox.getIndexById(self.options.form, self.options.section); self.sectionTitle = self.options.form[self.section].title; self.$list = Ox.TableList({ columns: [ @@ -62,7 +69,7 @@ Ox.FormPanel = function(options, self) { }), max: 1, min: 1, - selected: [self.options.form[0].id], + selected: [self.options.section], sort: [{key: 'id', operator: '+'}], unique: 'id', width: self.options.listSize @@ -70,7 +77,11 @@ Ox.FormPanel = function(options, self) { select: function(data) { self.$sections[self.section].hide(); self.section = Ox.getIndexById(self.options.form, data.ids[0]); + if (self.section == -1) { + self.section = 0 + } self.$sections[self.section].show(); + self.options.section = self.options.form[self.section].id; that.triggerEvent('select', {section: data.ids[0]}); } }); @@ -130,7 +141,18 @@ Ox.FormPanel = function(options, self) { }); }); - self.$sections[0].show(); + self.$sections[self.section].show(); + + function setSection() { + var id = self.options.section, + section = Ox.getIndexById(self.options.form, id); + if (section > -1 && self.section != section) { + self.$sections[self.section].hide(); + self.section = section; + self.$list.options('selected', [id]); + self.$sections[self.section].show(); + } + }; that.setElement(Ox.SplitPanel({ elements: [ @@ -191,13 +213,24 @@ Ox.FormPanel = function(options, self) { values values @*/ that.values = function() { - var values = {}; - self.options.form.forEach(function(section, i) { - values[section.id] = self.$forms[i].values(); - }); - return values; + if (arguments.length === 0) { + var values = {}; + self.options.form.forEach(function(section, i) { + values[section.id] = self.$forms[i].values(); + }); + return values; + } else { + var sections = arguments[0]; + + self.options.form.forEach(function(form, i) { + if (form.id in sections) { + self.$forms[i].values(sections[form.id]); + } + }); + } }; + return that; }; diff --git a/source/UI/js/Form/Input.js b/source/UI/js/Form/Input.js index bce4e153..488f042b 100644 --- a/source/UI/js/Form/Input.js +++ b/source/UI/js/Form/Input.js @@ -309,6 +309,13 @@ Ox.Input = function(options, self) { click: function() { self.options.disabled && that.gainFocus(); }, + input: event => { + /* + if (!self.options.autocomplete && Ox.contains(['text', 'password'], self.options.type)) { + change(event) + } + */ + }, blur: blur, change: change, focus: focus diff --git a/source/UI/js/List/List.js b/source/UI/js/List/List.js index b5421c02..0c0f9bb1 100644 --- a/source/UI/js/List/List.js +++ b/source/UI/js/List/List.js @@ -624,7 +624,7 @@ Ox.List = function(options, self) { } function getPageByPosition(pos) { - return Math.floor(pos / self.options.pageLength); + return Math.floor(pos / self.pageLength); } function getPageByScrollPosition(pos) { diff --git a/source/UI/js/Map/Map.js b/source/UI/js/Map/Map.js index 70a54676..9f5c4392 100644 --- a/source/UI/js/Map/Map.js +++ b/source/UI/js/Map/Map.js @@ -922,8 +922,12 @@ Ox.Map = function(options, self) { // This is the handler that actually adds the places to the map. // Gets called after panning or zooming, and when the map is idle. if (self.boundsChanged) { - var bounds = self.map.getBounds(), - southWest = bounds.getSouthWest(), + var bounds = self.map.getBounds() + if (!bounds) { + self.boundsChanged = false; + return + } + var southWest = bounds.getSouthWest(), northEast = bounds.getNorthEast(), south = southWest.lat(), west = southWest.lng(), diff --git a/source/UI/js/Map/MapEditor.js b/source/UI/js/Map/MapEditor.js index 1b358d7f..64b36988 100644 --- a/source/UI/js/Map/MapEditor.js +++ b/source/UI/js/Map/MapEditor.js @@ -1041,7 +1041,7 @@ Ox.MapEditor = function(options, self) { var isResult = place && place.id[0] == '_', isUndefined = !!self.options.selected && !self.$list.value(self.options.selected, 'type'); - self.selectedPlace = place.id || ''; + self.selectedPlace = place && place.id ? place.id : ''; if (isResult && isUndefined) { Ox.print('place.id', place.id, 'self.options.selected', self.options.selected, 'type', self.$list.value(self.options.selected)); // define undefined place diff --git a/source/UI/js/Map/MapMarker.js b/source/UI/js/Map/MapMarker.js index b126a30a..10eb69eb 100644 --- a/source/UI/js/Map/MapMarker.js +++ b/source/UI/js/Map/MapMarker.js @@ -212,7 +212,7 @@ Ox.MapMarker = function(options) { size = that.map.options('markerSize'); //Ox.Log('Map', 'setOptions, that.map: ', that.map) if (color == 'auto') { - that.color = typeColor[that.place.type]; + that.color = typeColor[that.place.type] || typeColor['mapPlaceFeatureColor']; } else if (Ox.isArray(color)) { that.color = color; } else { diff --git a/source/UI/js/Menu/Menu.js b/source/UI/js/Menu/Menu.js index d3f5f439..dafa3aab 100644 --- a/source/UI/js/Menu/Menu.js +++ b/source/UI/js/Menu/Menu.js @@ -306,7 +306,7 @@ Ox.Menu = function(options, self) { self.optionGroup = {}; self.optionGroupOffset = {}; items.forEach(function(item, i) { - if (item.group) { + if (item.group && item.items) { items[i] = item.items.map(function(v) { return Ox.extend(v, { group: item.group @@ -463,10 +463,6 @@ Ox.Menu = function(options, self) { item = that.items[self.options.selected]; if (item) { item.removeClass('OxSelected'); - if (item.options('file')) { - item.$button.blurButton(); - that.bindEvent({key_enter: clickSelectedItem}) - } } /* disabled that.triggerEvent('deselect', { @@ -485,10 +481,6 @@ Ox.Menu = function(options, self) { }); item.options('items').length && that.submenus[item.options('id')].showMenu(); item.addClass('OxSelected'); - if (item.options('file')) { - item.$button.focusButton(); - that.unbindEvent('key_enter'); - } that.triggerEvent('select', { id: item.options('id'), title: Ox.isString(item.options('title')[0]) diff --git a/source/UI/js/Menu/MenuItem.js b/source/UI/js/Menu/MenuItem.js index 43db8d45..8d8479e1 100644 --- a/source/UI/js/Menu/MenuItem.js +++ b/source/UI/js/Menu/MenuItem.js @@ -51,9 +51,6 @@ Ox.MenuItem = function(options, self) { that[ self.options.disabled ? 'addClass' : 'removeClass' ]('OxDisabled'); - self.options.file && that.$button.options({ - disabled: self.options.disabled - }); }, keyboard: function() { self.options.keyboard = parseKeyboard(self.options.keyboard); @@ -77,6 +74,27 @@ Ox.MenuItem = function(options, self) { self.options.checked = false; } + if (self.options.file) { + self.$input = $('') + .attr( + Ox.extend({ + type: 'file' + }, self.options.file.multiple ? { + multiple: true + } : {}) + ) + .on({ + change: function(event) { + var filelist = this.files + var files = []; + Ox.loop(filelist.length, function(i) { + files.push(filelist.item(i)); + }); + self.options.menu.clickItem(self.options.position, files); + } + }) + } + that.append( that.$status = Ox.$('') .addClass('OxCell OxStatus') @@ -104,21 +122,17 @@ Ox.MenuItem = function(options, self) { : {} ) .html( - self.options.file - ? that.$button = Ox.FileButton(Ox.extend({ - disabled: self.options.disabled, - title: self.options.title[0] - }, self.options.file)).bindEvent({ - click: function(data) { - self.options.menu.clickItem(self.options.position, data.files); - } - }) - : ( - Ox.isString(self.options.title[0]) - ? self.options.title[0] - : Ox.$('
').html(self.options.title[0]).html() - ) - ) + Ox.isString(self.options.title[0]) + ? self.options.title[0] + : Ox.$('
').html(self.options.title[0]).html() + ).on({ + click: self.options.file ? function(event) { + !self.options.disabled && self.$input.click() + event.preventDefault() + event.stopPropagation() + } : null + + }) ) .append( that.$modifiers = Ox.$('') diff --git a/source/UI/js/Video/AnnotationFolder.js b/source/UI/js/Video/AnnotationFolder.js index f6fb3127..4b04dcd4 100644 --- a/source/UI/js/Video/AnnotationFolder.js +++ b/source/UI/js/Video/AnnotationFolder.js @@ -371,7 +371,8 @@ Ox.AnnotationFolder = function(options, self) { 'equal', 'e', 'f', 'g', 'h', 'i', 'minus', 'n', 'o', 'openbracket', 'p', 'shift_0', 'shift_equal', 'shift_g', 'shift_i', 'shift_minus', 'shift_o', - 'slash', 'space' + 'slash', 'space', + 'control_c', 'control_v', ].forEach(function(key) { key = 'key.' + key; self.$annotations.bindEvent(key, function() { @@ -401,7 +402,8 @@ Ox.AnnotationFolder = function(options, self) { 'equal', 'f', 'g', 'h', 'i', 'minus', 'n', 'o', 'openbracket', 'p', 'shift_0', 'shift_equal', 'shift_g', 'shift_i', 'shift_minus', 'shift_o', - 'slash', 'space' + 'slash', 'space', + 'control_c', 'control_v', ].forEach(function(key) { key = 'key_' + key; self.$annotations.bindEvent(key, function() { diff --git a/source/UI/js/Video/AnnotationPanel.js b/source/UI/js/Video/AnnotationPanel.js index 83036b77..7e03f779 100644 --- a/source/UI/js/Video/AnnotationPanel.js +++ b/source/UI/js/Video/AnnotationPanel.js @@ -325,9 +325,9 @@ Ox.AnnotationPanel = function(options, self) { } else if (data.id == 'export') { that.triggerEvent('exportannotations'); } else if (data.id == 'find') { - that.triggerEvent('find', {value: value}); + that.triggerEvent('find', {value: Ox.decodeHTMLEntities(value)}); } else if (data.id == 'findannotations') { - that.triggerEvent('findannotations', {key: key, value: value}); + that.triggerEvent('findannotations', {key: key, value: Ox.decodeHTMLEntities(value)}); } else if (data.id == 'import') { that.triggerEvent('importannotations'); } else if (data.id == 'insert') { @@ -457,7 +457,8 @@ Ox.AnnotationPanel = function(options, self) { 'equal', 'f', 'g', 'h', 'i', 'minus', 'n', 'o', 'openbracket', 'p', 'shift_0', 'shift_equal', 'shift_g', 'shift_i', 'shift_minus', 'shift_o', - 'slash', 'space' + 'slash', 'space', + 'control_c', 'control_v', ].forEach(function(key) { key = 'key.' + key; self.$folder[index].bindEvent(key, function() { diff --git a/source/UI/js/Video/ClipPanel.js b/source/UI/js/Video/ClipPanel.js index 275da1d9..ea9eb562 100644 --- a/source/UI/js/Video/ClipPanel.js +++ b/source/UI/js/Video/ClipPanel.js @@ -89,7 +89,7 @@ Ox.ClipPanel = function(options, self) { } }); - self.columns = [ + self.columns = [].concat([ { align: 'right', id: 'index', @@ -183,7 +183,9 @@ Ox.ClipPanel = function(options, self) { visible: true, width: 90 }, - { + ], + hasVolume() ? + [{ align: 'right', editable: self.options.editable, format: function(value, data) { @@ -198,6 +200,8 @@ Ox.ClipPanel = function(options, self) { visible: false, width: 45 }, + ] : [], + [ { addable: false, id: 'sort', @@ -205,7 +209,8 @@ Ox.ClipPanel = function(options, self) { // title: Ox._('Sort'), visible: false } - ]; + ] + ); self.$menubar = Ox.Bar({ size: 24 @@ -587,6 +592,12 @@ Ox.ClipPanel = function(options, self) { && self.options.sort[0].operator == '+'; } + function hasVolume() { + return self.options.editable + && self.options.sort && self.options.sort.length + && self.options.sort[0].key == 'index' + } + function joinClips() { var clips = getEditable(self.options.selected).map(function(id) { return Ox.clone(Ox.getObjectById(self.options.clips, id)); diff --git a/source/UI/js/Video/VideoAnnotationPanel.js b/source/UI/js/Video/VideoAnnotationPanel.js index 639fa1fa..5ce19326 100644 --- a/source/UI/js/Video/VideoAnnotationPanel.js +++ b/source/UI/js/Video/VideoAnnotationPanel.js @@ -109,6 +109,11 @@ Ox.VideoAnnotationPanel = function(options, self) { }) .options(options || {}) .update({ + enableSubtitles: function() { + self.$player.forEach(function($player) { + $player.options('enableSubtitles', self.options.enableSubtitles); + }); + }, height: setSizes, 'in': function() { setPoint('in', self.options['in']); @@ -967,7 +972,8 @@ Ox.VideoAnnotationPanel = function(options, self) { 'equal', 'f', 'g', 'h', 'i', 'minus', 'n', 'o', 'openbracket', 'p', 'shift_0', 'shift_equal', 'shift_g', 'shift_i', 'shift_minus', 'shift_o', - 'slash', 'space' + 'slash', 'space', + 'control_c', 'control_v', ].forEach(function(key) { key = 'key.' + key; self.$annotationPanel.bindEvent(key, function() { @@ -1744,6 +1750,9 @@ Ox.VideoAnnotationPanel = function(options, self) { self.$annotationPanel[i].removeItem(id); }; */ + that.playInToOut = function() { + self.$player[0].playInToOut(); + } return that; diff --git a/source/UI/js/Video/VideoEditPanel.js b/source/UI/js/Video/VideoEditPanel.js index 0a4f8627..cc40507e 100644 --- a/source/UI/js/Video/VideoEditPanel.js +++ b/source/UI/js/Video/VideoEditPanel.js @@ -266,9 +266,6 @@ Ox.VideoEditPanel = function(options, self) { .bindEvent({ durationchange: function(data) { self.options.duration = data.duration; - self.$timeline && self.$timeline.replaceWith( - self.$timeline = getTimeline() - ); setPosition(self.$video.options('position'), true); self.$clipPanel.options({duration: self.options.duration}); }, diff --git a/source/UI/js/Video/VideoElement.js b/source/UI/js/Video/VideoElement.js index 0e4e33a9..72bdfac6 100644 --- a/source/UI/js/Video/VideoElement.js +++ b/source/UI/js/Video/VideoElement.js @@ -31,8 +31,10 @@ Ox.VideoElement = function(options, self) { .defaults({ autoplay: false, loop: false, + muted: false, playbackRate: 1, - items: [] + items: [], + volume: 1 }) .options(options || {}) .update({ @@ -101,7 +103,8 @@ Ox.VideoElement = function(options, self) { self.$videos = [getVideo(), getVideo()]; self.$video = self.$videos[self.currentVideo]; self.video = self.$video[0]; - self.volume = 1; + self.volume = self.options.volume; + self.muted = self.options.muted; self.$brightness = $('
').css({ width: '100%', height: '100%', @@ -162,15 +165,33 @@ Ox.VideoElement = function(options, self) { }, progress: function() { // stop buffering if buffered to end point - if (self.video == this && self.buffering) { - var item = self.items[self.currentItem]; - Ox.range(self.video.buffered.length).forEach(function(i) { - if (self.video.buffered.start(i) <= item['in'] + var video = this, + item = self.items[self.currentItem], + nextItem = Ox.mod(self.currentItem + 1, self.numberOfItems), + next = self.items[nextItem], + nextVideo = self.$videos[Ox.mod(self.currentVideo + 1, self.$videos.length)][0]; + if (self.video == video && (video.preload != 'none' || self.buffering)) { + if (clipCached(video, item)) { + self.video.preload = 'none'; + self.buffering = false; + if (nextVideo != self.video) { + nextVideo.preload = 'auto'; + } + } + } else if (!self.buffering && nextVideo == video && video.preload != 'none') { + if (clipCached(video, next)) { + video.preload = 'none'; + } + } + function clipCached(video, item) { + var cached = false + Ox.range(video.buffered.length).forEach(function(i) { + if (video.buffered.start(i) <= item['in'] && self.video.buffered.end(i) >= item.out) { - self.video.preload = 'none'; - self.buffering = false; + cached = true } }); + return cached } }, seeking: function() { @@ -202,6 +223,10 @@ Ox.VideoElement = function(options, self) { } else { video = document.createElement('video'); } + video.playsinline = true + video.setAttribute('playsinline', 'playsinline') + video.setAttribute('webkit-playsinline', 'webkit-playsinline') + video.WebKitPlaysInline = true return $(video); }; @@ -331,7 +356,7 @@ Ox.VideoElement = function(options, self) { function setCurrentVideo(callback) { var css = {}, - muted = false, + muted = self.muted, item = self.items[self.currentItem], next; Ox.Log('Video', 'sCV', item); @@ -343,7 +368,6 @@ Ox.VideoElement = function(options, self) { if (self.video) { self.$videos[self.currentVideo].hide(); self.video.pause(); - muted = self.video.muted; } self.currentVideo = Ox.mod(self.currentVideo + 1, self.$videos.length); self.$video = self.$videos[self.currentVideo]; @@ -352,8 +376,8 @@ Ox.VideoElement = function(options, self) { if (self.$video.attr('src') != item.src) { self.loadedMetadata && Ox.Log('Video', 'caching next item failed, reset src'); self.video.src = item.src; - self.video.preload = 'auto'; } + self.video.preload = 'auto'; self.video.volume = getVolume(); self.video.playbackRate = self.options.playbackRate; self.$video.css(css); @@ -530,8 +554,11 @@ Ox.VideoElement = function(options, self) { /*@ muted get/set muted @*/ - that.muted = function() { - return getset('muted', arguments[0]); + that.muted = function(value) { + if (!Ox.isUndefined(value)) { + self.muted = value; + } + return getset('muted', value); }; /*@ diff --git a/source/UI/js/Video/VideoPlayer.js b/source/UI/js/Video/VideoPlayer.js index 36c2822b..9a15bcf4 100644 --- a/source/UI/js/Video/VideoPlayer.js +++ b/source/UI/js/Video/VideoPlayer.js @@ -444,7 +444,9 @@ Ox.VideoPlayer = function(options, self) { self.$video = Ox.VideoElement({ items: self.video, loop: self.options.loop, - playbackRate: self.options.playbackRate + muted: self.options.muted, + playbackRate: self.options.playbackRate, + volume: self.options.volume }) .bindEvent(Ox.extend({ durationchange: durationchange, @@ -1792,20 +1794,22 @@ Ox.VideoPlayer = function(options, self) { function goToNext(type, direction) { // type can be 'chapter' or 'result' var position, positions; - if (type == 'chapter') { + if (type == 'chapter' && self.options.chapters) { positions = self.options.chapters.map(function(chapter) { return chapter.position; }); - } else if (type == 'result') { + } else if (type == 'result' && self.results) { positions = Ox.unique(self.results.map(function(result) { return result['in']; })); } - position = Ox.nextValue(positions, self.options.position, direction); - setPosition(position); - that.triggerEvent('position', { - position: self.options.position - }); + if (positions) { + position = Ox.nextValue(positions, self.options.position, direction); + setPosition(position); + that.triggerEvent('position', { + position: self.options.position + }); + } } function goToPoint() { diff --git a/source/UI/js/Video/VideoPlayerPanel.js b/source/UI/js/Video/VideoPlayerPanel.js index 1b376d81..336277e4 100644 --- a/source/UI/js/Video/VideoPlayerPanel.js +++ b/source/UI/js/Video/VideoPlayerPanel.js @@ -478,7 +478,7 @@ Ox.VideoPlayerPanel = function(options, self) { } function getAnnotations() { - return Ox.flatten(self.options.layers.map(function(layer) { + return !self.options.layers ? [] : Ox.flatten(self.options.layers.map(function(layer) { return layer.items.map(function(item) { return {id: item.id, 'in': item['in'], out: item.out, text: item.value}; }); @@ -722,6 +722,10 @@ Ox.VideoPlayerPanel = function(options, self) { self.$videoPanel.toggleElement(1); }; + that.playInToOut = function() { + self.$video.playInToOut(); + }; + return that; } diff --git a/source/UI/json/locale.tr.json b/source/UI/json/locale.tr.json new file mode 100644 index 00000000..7f671f86 --- /dev/null +++ b/source/UI/json/locale.tr.json @@ -0,0 +1,281 @@ +{ + ", doubleclick to edit": ", düzenlemek için çift tıkla", + "Add": "Ekle", + "Add Files": "Dosya Ekle", + "Add Place": "Yer Ekle", + "Add a condition": "koşul ekle", + "Add a group of conditions": "Bir grup koşul ekle", + "Add column after": "Sonrasına sütun ekle", + "Add column before": "Önce sütun ekle", + "Add row above": "Üste satır ekle", + "Add row below": "Altına satır ekle", + "Add {0}": "{0} ekle", + "Adding...": "Ekleniyor..", + "All": "Tüm", + "Alternative Names": "Alternatif İsimler", + "Area": "Alan", + "At Current Position": "Mevcut Konumda", + "Blockquote": "Blok halinde alıntıla", + "Bold": "Kalın", + "Borough": "Mahalle", + "Building": "Bina", + "Bullets": "Madde İşaretleri", + "By Duration": "Süreye göre", + "By Position": "Pozisyona Göre", + "By Text": "Metne gore", + "Cancel": "İptal et", + "Cancel/Deselect": "İptal et/Seçimi kaldır", + "Cancelled": "İptal edildi", + "City": "Şehir", + "Clear": "Temizle", + "Clear Event": "Etkinliği temizle", + "Clear Place": "Yeri Temizle", + "Clearing...": "Temizleniyor", + "Click to hide": "gizlemek için tıklayın", + "Click to pan, doubleclick to zoom": "Kaydırmak için tıklayın, yakınlaştırmak için çift tıklayın", + "Click to select": "Seçmek için tıklayın", + "Click to select, doubleclick to edit": "Seçmek için tıklayın, düzenlemek için çift tıklayın", + "Click to show": "Göstermek için tıklayın", + "Close": "Kapat", + "Complete": "Tamamlandı", + "Country": "Ülke", + "Date": "Tarih", + "Date Created": "Oluşturulma Tarihi", + "Date Modified": "Değiştirilme Tarihi", + "Define": "Tanımla", + "Define Event": "Etkinlik Tanımla", + "Define Place": "Yer Tanımla", + "Delete Annotation": "Ek Açıklamayı Sil", + "Deselect": "Seçimi Kaldır", + "Deselect Annotation": "Ek Açıklamanın Seçimini Kaldır", + "Don't Shuffle": "Karıştırma", + "Done": "Bitti", + "Download": "İndir", + "Download Selection...": "Seçimi İndir...", + "Download Video...": "Video İndir", + "Drag to resize": "Yeniden boyutlandırmak için sürükleyin", + "Drag to resize or click to hide": "Yeniden boyutlandırmak için sürükleyin veya gizlemek için tıklayın", + "Drag to resize or click to toggle map": "eniden boyutlandırmak için sürükleyin veya haritayı değiştirmek için tıklayın", + "Duration": "Süre", + "East": "Doğu", + "Edit": "Kurgula", + "Edit Annotation": "Ek Açıklamayı Kurgula", + "Edit/Submit": "Kurgula/Gönder", + "Editing Options": "Kurgulama Seçenekleri", + "Embed Selection...": "Seçimi Yerleştir", + "End": "Son", + "Enter Fullscreen": "Tam Ekran Gir", + "Event": "Etkinlik", + "Events": "Etkinlikler", + "Examples...": "Örnekler...", + "Exit Fullscreen": "Tam Ekrandan Çık", + "Feature": "Özellik", + "Find": "Bul", + "Find in All {0}": "Tüm {0} İçinde Bul", + "Find in List": "Listede Bul", + "Find in This {0}": "Bu {0}'da Bul", + "Find on Map": "Haritada Bul", + "Find...": "Bul...", + "Find: All": "Bul: Tümü", + "Find: Alternative Names": "Bul: Alternatif İsimler", + "Find: Geoname": "Bul: Geoisim", + "Find: Name": "Bul: İsim", + "Flag": "Bayrak", + "Font Size": "Yazı Tipi Boyutu", + "Generating Documentation...": "Dokümantasyon Oluşturuyor...", + "Geoname": "Geo isim", + "Go One Frame Back": "Bir Kare Geri Git", + "Go One Frame Forward": "Bir Kare İleri Git", + "Go One Line Down": "Bir Satır Aşağı Git", + "Go One Line Up": "Bir Satır Yukarı Git", + "Go One Second Back": "Bir Saniye Geri Git", + "Go One Second Forward": "Bir Saniye İleriye Git", + "Go to First Frame": "İlk Kareye Git", + "Go to In Point": "Giriş Noktasına Git", + "Go to Last Frame": "Son Kareye Git", + "Go to Next Annotation": "Sonraki Açıklamaya Git", + "Go to Next Cut": "Sonraki Kesime Git", + "Go to Next Result": "Sonraki Sonuca Git", + "Go to Out Point": "Çıkış Noktasına Git", + "Go to Poster Frame": "Poster Çerçevesine Git", + "Go to Previous Annotation": "Önceki Ek Açıklamaya Git", + "Go to Previous Cut": "Önceki Kesmeye Git", + "Go to Previous Result": "Önceki Sonuca Git", + "Headline": "Başlık", + "Hide": "Sakla", + "Hide Controls": "Kontrolleri Gizle", + "Hide Labels": "Etiketleri Gizle", + "Home": "Ana Sayfa", + "Home Channel": "Ana Kanal", + "Image": "İmge", + "Import Annotations...": "Ek Açıklamaları İçe Aktar...", + "In Current Selection": "Mevcut Seçimde", + "Insert": "Ekle", + "Insert HTML": "HTML Ekle", + "Insert...": "Ekle...", + "Italic": "İtalik", + "Join Clip(s) at Cuts": "Klip(ler)i Kesimlerde Birleştir", + "Keyboard Shortcuts": "Klavye Kısayolları", + "Keyboard Shortcuts...": "Klavye Kısayolları...", + "Large": "Büyük", + "Large Player": "Büyük Oynatıcı", + "Larger": "Daha Büyük", + "Latitude": "Enlem", + "Limit to": "Sınırla", + "Linebreak": "Satır Sonu", + "Link": "Link", + "List": "Liste", + "Longitude": "Boylam", + "Make Clip(s) Static": "Klip(ler)i Statik Yap", + "Map Options": "Harita Seçenekleri", + "Match": "Eşleme", + "Matches": "Eşlemeler", + "Medium": "Orta", + "Monospace": "Monospace", + "Mute": "Sessiz", + "Mute/Unmute": "Sesi Kapat/Sesi Aç", + "Name": "İsim", + "New Event": "Yeni Etkinlik", + "New Place": "Yeni Yer", + "Next": "Sıradaki", + "Next Channel": "Yeni Kanal", + "Next Result": "Bir Sonraki Sonuç", + "No file selected": "Seçili dosya yok", + "No files selected": "Seçili dosya yok", + "North": "Kuzey", + "Numbers": "Sayılar", + "Open in New Tab": "Yeni Sekmede Aç", + "Options": "Seçenekler", + "Other": "Diğer", + "Paragraph": "Paragraf", + "Pause": "Durdur", + "Paused": "Durduruldu", + "Person": "Kişi", + "Place": "Yer", + "Place or Event": "Yer ya da Etkinlik", + "Play": "Oynat", + "Play Current Track": "Seçili Parçayı Çal", + "Play In to Out": "Giriş-Çıkış Arasında Oynat", + "Play Next Track": "Bir Sonraki Parçayı Çal", + "Play/Pause": "Başlat/Durdur", + "Previous": "Önceki", + "Previous Channel": "Önceki Kanal", + "Previous Result": "Önceki Sonuç", + "Region": "Bölge", + "Reload": "Yeniden Yükle", + "Remove": "Kaldır", + "Remove Event": "Etkinliği Kaldır", + "Remove File": "Dosyayı Kaldır", + "Remove Place": "Yeri Kaldır", + "Remove this column": "Bu sütunu kaldır", + "Remove this condition": "Bu koşulu kaldır", + "Remove this group of conditions": "Bu koşul grubunu kaldır ", + "Remove this row": "Bu satırı kaldır", + "Removing...": "Kaldırıyor...", + "Repeat All": "Hepsini Tekrarla", + "Repeat None": "Hiçbirini Tekrarlama", + "Repeat One": "Birini Tekrarla", + "Reset this condition": "Bu koşulu sıfırla", + "Resolution": "Çözünürlük", + "Restart": "Yeniden Başlat", + "Restore Defaults": "Varsayılanları Geri Yükle", + "Results": "Sonuçlar", + "Resume": "Devam Et", + "Right-to-Left": "Sağdan Sola", + "Run Tests": "Testleri Çalıştır", + "Save Changes": "Değişiklikleri Kaydet", + "Save as Smart List": "Akıllı Liste olarak Kaydet", + "Scale to Fill": "Doldurmak için Ölç", + "Scale to Fit": "Sığacak Şekilde Ölç", + "Scroll to Player": "Oyuncuya Kaydır", + "Select Current Annotation": "Geçerli Ek Açılamayı Seç", + "Select Current Cut": "Geçerli Kesimi Seç", + "Select File": "Dosya Seç", + "Select Next Annotation": "Sonraki Açıklamayı Seç", + "Select Previous Annotation": "Önceki Açıklamayı Seç", + "Set ": "Berlie", + "Set In Point": "Giriş Noktası Belirle", + "Set Out Point": "Çıkış Noktası Belirle", + "Set Poster Frame": "Poster Karesi Belirle", + "Settings": "Ayarlar", + "Show Annotations": "Ek Açıklamayı Göster", + "Show Controls": "Kontrol Çubuğunu Göster", + "Show Dates": "Tarihleri Göster", + "Show Labels": "Etiketleri Göster", + "Show Other": "Diğerini Göster", + "Show People": "İnsanları Göster", + "Show Places": "Yerleri Göster", + "Show Remaining Time": "Kalan Zamanı Göster", + "Show Subtitles": "Altyazıları Göster", + "Show Users": "Kullanıcıları Göster", + "Shuffle": "Karıştır", + "Small": "Küçük", + "Small Player": "Küçük Oynatıcı", + "Smaller": "Daha Küçük", + "Sort Annotations": "Ek Açıklamayı Düzenle", + "South": "Güney", + "Split Clip(s) at Cuts": "Klip(ler)i Kesimlerde Böl", + "Start": "Başlat", + "Street": "Sokak", + "Strike": "Üstünü Çiz", + "Subscript": "Alt Simge", + "Subtitles": "Altyazılar", + "Superscript": "Üst Simge", + "Switch Theme": "Temayı Değiştir", + "Timeline": "Zaman Çizelgesi", + "Title": "Başlık", + "Turn Volume Down": "Sesi Kıs", + "Turn Volume Up": "Sesi Aç", + "Type": "Tür", + "Underline": "Altını Çiz", + "Undo Changes": "Değişiklikleri Geri Al", + "Unmute": "Sesi Aç", + "Untitled": "İsimsiz", + "User": "Kullanıcı", + "Valid": "Geçerli", + "View": "Görüntüle", + "View Live": "Canlı Görüntüle", + "View Source": "Kaynağı Görüntüle", + "View as Grid": "Izgara Olarak Görüntüle", + "View as List": "Liste Olarak Görüntüle", + "Volume": "Ses Seviyesi", + "West": "Batı", + "add": "ekle", + "all": "hepsi", + "and": "ve", + "annotations": "ek açıklamalar", + "any": "herhangi", + "ascending": "artan", + "bracket": "parantez", + "contains": "içerir", + "descending": "azalan", + "does not contain": "içermez", + "does not end with": "ile bitmiyor", + "does not start with": "ile başlamaz", + "ends with": "ile biter", + "file": "dosya", + "files": "dosyalar", + "in": "içinde", + "is": "", + "is after": "sonra", + "is before": "önce", + "is between": "arasında", + "is greater than": "'den büyüktür", + "is less than": "daha azdır", + "is not": "değil", + "is not after": "sonra değil", + "is not before": "önce değil", + "is not between": "arasında değil", + "is not greater than": "daha büyük değil", + "is not less than": "daha az değil", + "items": "öğeler", + "of the following conditions": "aşağıdaki koşullardan", + "order": "sırala", + "sorted by": "göre sırala", + "starts with": "ile başla", + "unknown": "bilinmiyor", + "{0} Century": "Yüzyıl", + "{0} Century BC": "Yüzyıl MÖ", + "{0} Millennium": "{0} Milenyum", + "{0} Millennium BC": "MÖ {0} Milenyum" +} diff --git a/source/UI/svg/markerChapter.svg b/source/UI/svg/markerChapter.svg index a967b034..77c27515 100644 --- a/source/UI/svg/markerChapter.svg +++ b/source/UI/svg/markerChapter.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/source/UI/svg/markerCut.svg b/source/UI/svg/markerCut.svg index 76c0f8a2..0c6ac903 100644 --- a/source/UI/svg/markerCut.svg +++ b/source/UI/svg/markerCut.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/source/UI/svg/markerIn.svg b/source/UI/svg/markerIn.svg index 96874286..31e0a2f6 100644 --- a/source/UI/svg/markerIn.svg +++ b/source/UI/svg/markerIn.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/source/UI/svg/markerInBottom.svg b/source/UI/svg/markerInBottom.svg index 89eab297..9480df8f 100644 --- a/source/UI/svg/markerInBottom.svg +++ b/source/UI/svg/markerInBottom.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/source/UI/svg/markerInTop.svg b/source/UI/svg/markerInTop.svg index 65a50933..97ee7702 100644 --- a/source/UI/svg/markerInTop.svg +++ b/source/UI/svg/markerInTop.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/source/UI/svg/markerOut.svg b/source/UI/svg/markerOut.svg index c0b4a027..693abd25 100644 --- a/source/UI/svg/markerOut.svg +++ b/source/UI/svg/markerOut.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/source/UI/svg/markerOutBottom.svg b/source/UI/svg/markerOutBottom.svg index 6dd8cbb4..e2148e0f 100644 --- a/source/UI/svg/markerOutBottom.svg +++ b/source/UI/svg/markerOutBottom.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/source/UI/svg/markerOutTop.svg b/source/UI/svg/markerOutTop.svg index bae71347..5553753a 100644 --- a/source/UI/svg/markerOutTop.svg +++ b/source/UI/svg/markerOutTop.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/source/UI/svg/markerPosition.svg b/source/UI/svg/markerPosition.svg index 603ab190..cc06236b 100644 --- a/source/UI/svg/markerPosition.svg +++ b/source/UI/svg/markerPosition.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/source/UI/svg/symbolAdd.svg b/source/UI/svg/symbolAdd.svg index 8cd3cbed..4cc62414 100644 --- a/source/UI/svg/symbolAdd.svg +++ b/source/UI/svg/symbolAdd.svg @@ -1,4 +1,4 @@ - + diff --git a/source/UI/svg/symbolArrowDown.svg b/source/UI/svg/symbolArrowDown.svg index e674cbbf..6ff4944d 100644 --- a/source/UI/svg/symbolArrowDown.svg +++ b/source/UI/svg/symbolArrowDown.svg @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/source/UI/svg/symbolArrowLeft.svg b/source/UI/svg/symbolArrowLeft.svg index 7364c468..2c753ba5 100644 --- a/source/UI/svg/symbolArrowLeft.svg +++ b/source/UI/svg/symbolArrowLeft.svg @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/source/UI/svg/symbolArrowRight.svg b/source/UI/svg/symbolArrowRight.svg index addc47a5..c92da4e9 100644 --- a/source/UI/svg/symbolArrowRight.svg +++ b/source/UI/svg/symbolArrowRight.svg @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/source/UI/svg/symbolArrowUp.svg b/source/UI/svg/symbolArrowUp.svg index c84376c5..6d43f62d 100644 --- a/source/UI/svg/symbolArrowUp.svg +++ b/source/UI/svg/symbolArrowUp.svg @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/source/UI/svg/symbolAudio.svg b/source/UI/svg/symbolAudio.svg index 637bbb69..576f8ecb 100644 --- a/source/UI/svg/symbolAudio.svg +++ b/source/UI/svg/symbolAudio.svg @@ -1,4 +1,4 @@ - + diff --git a/source/UI/svg/symbolBook.svg b/source/UI/svg/symbolBook.svg index 6dfa6a68..573a23d4 100644 --- a/source/UI/svg/symbolBook.svg +++ b/source/UI/svg/symbolBook.svg @@ -1,4 +1,4 @@ - + diff --git a/source/UI/svg/symbolBookmark.svg b/source/UI/svg/symbolBookmark.svg index 19051857..28963fca 100644 --- a/source/UI/svg/symbolBookmark.svg +++ b/source/UI/svg/symbolBookmark.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/source/UI/svg/symbolBracket.svg b/source/UI/svg/symbolBracket.svg index 8e069e36..10878007 100644 --- a/source/UI/svg/symbolBracket.svg +++ b/source/UI/svg/symbolBracket.svg @@ -1,4 +1,4 @@ - + diff --git a/source/UI/svg/symbolShuffleNone.svg b/source/UI/svg/symbolShuffleNone.svg index 83a2a741..592ab44b 100644 --- a/source/UI/svg/symbolShuffleNone.svg +++ b/source/UI/svg/symbolShuffleNone.svg @@ -1,4 +1,4 @@ - + diff --git a/source/UI/svg/symbolSquare.svg b/source/UI/svg/symbolSquare.svg index 3416a361..3e7a6e50 100644 --- a/source/UI/svg/symbolSquare.svg +++ b/source/UI/svg/symbolSquare.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/source/UI/svg/symbolStar.svg b/source/UI/svg/symbolStar.svg index a592364c..f5138dbd 100644 --- a/source/UI/svg/symbolStar.svg +++ b/source/UI/svg/symbolStar.svg @@ -1,3 +1,3 @@ - + diff --git a/source/UI/svg/symbolSwitch.svg b/source/UI/svg/symbolSwitch.svg index c8e1ec57..798b6da9 100644 --- a/source/UI/svg/symbolSwitch.svg +++ b/source/UI/svg/symbolSwitch.svg @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/source/UI/svg/symbolSync.svg b/source/UI/svg/symbolSync.svg index b36dcd4f..a7cf0833 100644 --- a/source/UI/svg/symbolSync.svg +++ b/source/UI/svg/symbolSync.svg @@ -1,4 +1,4 @@ - + diff --git a/source/UI/svg/symbolTag.svg b/source/UI/svg/symbolTag.svg index 706096a8..42203f1e 100644 --- a/source/UI/svg/symbolTag.svg +++ b/source/UI/svg/symbolTag.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/source/UI/svg/symbolUndo.svg b/source/UI/svg/symbolUndo.svg index bb513c58..8e8bc87c 100644 --- a/source/UI/svg/symbolUndo.svg +++ b/source/UI/svg/symbolUndo.svg @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/source/UI/svg/symbolUnlock.svg b/source/UI/svg/symbolUnlock.svg index 6084b703..1f2007e8 100644 --- a/source/UI/svg/symbolUnlock.svg +++ b/source/UI/svg/symbolUnlock.svg @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/source/UI/svg/symbolUnmount.svg b/source/UI/svg/symbolUnmount.svg index ed6cfd09..10f263d2 100644 --- a/source/UI/svg/symbolUnmount.svg +++ b/source/UI/svg/symbolUnmount.svg @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/source/UI/svg/symbolUnmute.svg b/source/UI/svg/symbolUnmute.svg index ea571ace..658e7e3f 100644 --- a/source/UI/svg/symbolUnmute.svg +++ b/source/UI/svg/symbolUnmute.svg @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/source/UI/svg/symbolUp.svg b/source/UI/svg/symbolUp.svg index 98f2dec7..c117d311 100644 --- a/source/UI/svg/symbolUp.svg +++ b/source/UI/svg/symbolUp.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/source/UI/svg/symbolUpload.svg b/source/UI/svg/symbolUpload.svg index 1022502d..e67196ac 100644 --- a/source/UI/svg/symbolUpload.svg +++ b/source/UI/svg/symbolUpload.svg @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/source/UI/svg/symbolUser.svg b/source/UI/svg/symbolUser.svg index b58c0d39..59ca035c 100644 --- a/source/UI/svg/symbolUser.svg +++ b/source/UI/svg/symbolUser.svg @@ -1,4 +1,4 @@ - + diff --git a/source/UI/svg/symbolVideo.svg b/source/UI/svg/symbolVideo.svg index 3dd2c89e..ee4d575f 100644 --- a/source/UI/svg/symbolVideo.svg +++ b/source/UI/svg/symbolVideo.svg @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/source/UI/svg/symbolView.svg b/source/UI/svg/symbolView.svg index cc915fd2..4ba47325 100644 --- a/source/UI/svg/symbolView.svg +++ b/source/UI/svg/symbolView.svg @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/source/UI/svg/symbolVolume.svg b/source/UI/svg/symbolVolume.svg index 1b62112c..9c6e9695 100644 --- a/source/UI/svg/symbolVolume.svg +++ b/source/UI/svg/symbolVolume.svg @@ -1,4 +1,4 @@ - + diff --git a/source/UI/svg/symbolVolumeDown.svg b/source/UI/svg/symbolVolumeDown.svg index f5e502e8..5a3cdd1e 100644 --- a/source/UI/svg/symbolVolumeDown.svg +++ b/source/UI/svg/symbolVolumeDown.svg @@ -1,4 +1,4 @@ - + diff --git a/source/UI/svg/symbolVolumeUp.svg b/source/UI/svg/symbolVolumeUp.svg index 5f30b377..522a2604 100644 --- a/source/UI/svg/symbolVolumeUp.svg +++ b/source/UI/svg/symbolVolumeUp.svg @@ -1,4 +1,4 @@ - + diff --git a/source/UI/svg/symbolWarning.svg b/source/UI/svg/symbolWarning.svg index 4226321e..3a982ab9 100644 --- a/source/UI/svg/symbolWarning.svg +++ b/source/UI/svg/symbolWarning.svg @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/tools/build/build.py b/tools/build/build.py index 0b05a9f9..8accbd3d 100755 --- a/tools/build/build.py +++ b/tools/build/build.py @@ -82,8 +82,6 @@ def build_oxjs(downloads=False, geo=False): svg = read_text(path + filename) svg = re.sub('\n\s*', '', svg) svg = re.sub('', '', svg) - # temporary fix for Chrome SVG bug, remove later! - svg = re.sub('width="256" height="256"', 'width="10" height="10" viewBox="0 0 255 255"', svg) # end fix ui_images[filename[:-4]] = svg if filename.startswith('symbolLoading'):