For 1D signals you can do the translation in the frequency domain, which corresponds to a circular shift. With the proper zero-padding you can do a non-circular shift.
using FFTW: rfft, irfft
using Plots: plot
using DSP: resample
julia> x = randn(50);
julia> function fftshift(x, d)
L = length(x)
irfft(rfft(x) .* exp.(-im * d .* range(0, π, length=L÷2+1)), L)
end
fftshift (generic function with 1 method)
# zero-pad by more than your shift amount
julia> xpad = [x;0];
julia> x2 = fftshift(xpad, 0.4);
# upsample for plotting so you can see between samples
julia> plot([resample(xpad, 8) resample(x2, 8)])
You should be able to do something similar using a 2D FFT.