diff --git a/README.md b/README.md
index c1b5599..b44a670 100644
--- a/README.md
+++ b/README.md
@@ -211,7 +211,7 @@ until another one is focused (the APDU list keeps the reader's position:
new messages pin the view to the bottom only while the reader is already
there, so a jump is never pulled away or un-highlighted by the live poll). Rows that carry a recorded change (a
card-side change, or an update that wrote or first observed bytes) also offer
-**Details**: a modal showing the full file path (`MF/EF_ICCID (2FE2)`,
+**Show diff**: a modal showing the full file path (`MF/EF_ICCID (2FE2)`,
`ADF/EF_IMSI (6F07)`, `DF_GSM_ACCESS/EF_KcGPRS (4F52)`, `AID …/4F09` — the DF
named from the EF.DIR labels when known) and the affected unit — the whole
file, or the single record that changed — **before and after** the change, as
diff --git a/README_RUS.md b/README_RUS.md
index b380ccb..06c9f54 100644
--- a/README_RUS.md
+++ b/README_RUS.md
@@ -215,7 +215,7 @@ Files — это таймлайн файловых операций по все
новые сообщения прижимают вид к низу, только пока читатель уже внизу,
поэтому переход не срывается живым опросом и не снимает выделение). У строк с записанным изменением
(изменение со стороны карты либо запись, изменившая или впервые показавшая
-байты) есть кнопка **Details**: окно показывает полный путь файла (`MF/EF_ICCID (2FE2)`,
+байты) есть кнопка **Show diff** («Изменения»): окно показывает полный путь файла (`MF/EF_ICCID (2FE2)`,
`ADF/EF_IMSI (6F07)`, `DF_GSM_ACCESS/EF_KcGPRS (4F52)`, `AID …/4F09` — DF
называется по меткам из EF.DIR, если они есть) и затронутую единицу — файл
целиком или изменившуюся запись — **до и после** изменения в виде hex-вида
diff --git a/frontend/index.html b/frontend/index.html
index 310aee3..56ffbbc 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -2234,7 +2234,7 @@ async function renderFileView() {
}
view.innerHTML = timeline.map(op => {
const diff = op.change_ref
- ? ``
+ ? ``
: '';
return `
${escapeHtml(fileOpLabel(op))}${diff}
@@ -3226,7 +3226,7 @@ function onFilterChange() {
}
// ──────────────────── Versioning ────────────────────
-const PWA_VERSION = '2.6.4';
+const PWA_VERSION = '2.6.5';
const MIN_SERVER_VERSION = '2.3.0';
function parseVersion(v) {
@@ -3273,8 +3273,8 @@ const LANG_RU = {
'Read': 'Чтение',
'Update': 'Запись',
'Changed on card!': 'Изменено на карте!',
+ 'Show diff': 'Изменения',
'Change details': 'Подробности изменения',
- 'Details': 'Подробнее',
'changed': 'изменено',
'newly observed': 'впервые наблюдается',
'never observed': 'не наблюдалось',
diff --git a/frontend/sw.js b/frontend/sw.js
index 04dcd8b..6d927c2 100644
--- a/frontend/sw.js
+++ b/frontend/sw.js
@@ -1,4 +1,4 @@
-const CACHE = 'simtrace-analyser-v78';
+const CACHE = 'simtrace-analyser-v79';
const PRECACHE = [
'index.html',
diff --git a/frontend/tests/comprion.test.js b/frontend/tests/comprion.test.js
index b48c9cf..ca98afa 100644
--- a/frontend/tests/comprion.test.js
+++ b/frontend/tests/comprion.test.js
@@ -342,9 +342,9 @@ test('Files view: the view selector (topbar) and the timeline are wired', () =>
assert.match(src, /\$on\('side-view-select', 'change'/);
assert.match(src, /\$on\('file-view', 'click'/);
assert.match(src, /API\.getSessionFiles\(sid\)/);
- // The trailing link: "Changed on card!" for a card-side change (it opens
- // the change modal), the generic "Details" for an update row.
- assert.match(src, />\$\{op\.kind === 'card_change' \? t\('Changed on card!'\) : t\('Details'\)\}<\/button>/);
+ // The trailing link: "Changed on card!" for a card-side change and
+ // "Show diff" for an update row — both open the change modal.
+ assert.match(src, />\$\{op\.kind === 'card_change' \? t\('Changed on card!'\) : t\('Show diff'\)\}<\/button>/);
assert.match(src, /API\.getSessionFileImage\(STATE\.sessionViewId, fileKey, idx\)/);
assert.match(src, /getSessionFileImage\(id, key, change\)/);
assert.match(src, /files\/image\?key=/);
@@ -359,7 +359,7 @@ test('Files view: strings carry Russian translations', () => {
keys.add(m[1].replace(/\\(['\\])/g, '$1'));
}
for (const s of ['Files', 'Read', 'Update', 'Changed on card!', 'Change details',
- 'Details', 'Close', 'Offset', 'Record', 'Before', 'After', 'Show the change',
+ 'Show diff', 'Close', 'Offset', 'Record', 'Before', 'After', 'Show the change',
'changed', 'newly observed', 'never observed',
'{c} bytes changed, {n} bytes newly observed',
'Showing the first {n} bytes of the image',
diff --git a/pyproject.toml b/pyproject.toml
index 48a918e..4fc67f7 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,7 +4,7 @@ build-backend = "setuptools.backends._legacy:_Backend"
[project]
name = "simtrace-analyser"
-version = "2.6.4"
+version = "2.6.5"
description = "SIMtrace Analyser — APDU trace analyser for GSMTAP/PCAP captures (bundles the simtrace2-pysniff utility)"
readme = {file = "README.md", content-type = "text/markdown"}
license = {text = "GPL-2.0-or-later"}
diff --git a/simtrace_analyser/version.py b/simtrace_analyser/version.py
index 825542d..8aae176 100644
--- a/simtrace_analyser/version.py
+++ b/simtrace_analyser/version.py
@@ -1,3 +1,3 @@
"""Single source of truth for the SIMtrace Analyser version."""
-__version__ = '2.6.4'
+__version__ = '2.6.5'
diff --git a/tests/test_pcap_import.py b/tests/test_pcap_import.py
index 66909c7..33471f3 100644
--- a/tests/test_pcap_import.py
+++ b/tests/test_pcap_import.py
@@ -224,7 +224,7 @@ class TestImportEndpoint(unittest.TestCase):
class TestVersion(unittest.TestCase):
def test_package_version(self):
from simtrace2_pysniff import __version__
- self.assertEqual(__version__, '2.6.4')
+ self.assertEqual(__version__, '2.6.5')
def test_status_includes_version(self):
import os